ZyboPong : jeu Pong sur Zybo avec Vivado

Introduction

Il s'agit de réaliser un clone élémentaire du jeu Pong apparu à la fin des années 1970.

La vidéo suivante présente le cahier des charges de ce mini-projet et donne des indications sur la génération des signaux nécessaires à l'affichage d'une image sur un écran connecté en VGA.

Création de l'IP du projet

Créer un projet de type RTL (comme dans l'exemple précédent) et le nommer ZyboPong.

Note : le projet créé est totalement vierge et doit être configuré pour cibler une carte Zybo comme dans le projet VHDL vu précédemment.

Créer un module IP capable de s'interconnecter au Processing System via un bus AXI comme cela a été vu dans l'exercice précédent.

Ce qui change par rapport au projet de l'exercice précédent :

  • le nom de l'ip, ici : ipPong
  • le nombre de registres accessibles (boite de dialogue Add Interfaces) : 16

Une fois l'ip en cours d'édition, on ne repart pas sur la création complète d'un fichier source contenant le comportement de l'ip mais on ajoute le fichier suivant : ipPong_core.vhd

Notes :

  • il est conseillé d'enregistrer le fichier ipPong_core.vhd dans le dossier hdl de l'ip,
  • l'ajout se fait de la même façon que la création, c'est à dire en cliquant sur Add files au lieu de Create file (revoir l'exercice précédent lors de la création du fichier décrivant le PWM).

Afin de gagner du temps, remplacer les fichiers ipPong_v1_0.vhd et ipPong_v1_0_S00_AXI.vhd présents dans le dossier hdl de l'IP nouvellement créé par ceux là : ipPong_v1_0.vhd et ipPong_v1_0_S00_AXI.vhd

Il s'agit maintenant de :

  • Compléter le code de ipPong_core.vhd pour générer les signaux x, y, hs et vs en procédant par étapes :
    • réaliser le comptage sur x pour que x évolue à la fréquence de 25MHz dans l'intervalle 0 à PIXELS_PER_LINE - 1 puis valider par une simulation,
    • imbriquer le comptage sur y dans celui des passages par 0 de x pour que y couvre l'intervalle 0 à LINES_PER_FRAME - 1 puis valider par une simulation en estimant convenablement le temps de simulation nécessaire à la validation,
    • ajouter les changements d'états des signaux hs et vs aux endroits opportuns des opérations de comptage sur x et y,
    • valider l'ensemble par une simulation.
  • Compléter le process de génération du triplets rouge, vert, bleu pour afficher la ligne du filet et valider par une simulation.

Packager l'IP et quitter l'éditeur d'IP.

Diagramme fonctionnel du projet

De retour dans le projet ZyboPong, utiliser l'outil Create Block Design pour créer la structure matérielle complète de l'application :

  • ajouter un IP Zynq Processing System,
  • ajouter un IP ipPong,
  • ajouter un IP AXI GPIO mappé sur les boutons poussoirs de la carte Zybo.

Il faudra aussi créer les ports de sortie pour les sigaux sortants de l'instance de l'ipPong avec VGA_HS et VGA_VS comme scalaire et VGA_R, VGA_G, VGA_B avec un format vectoriel.

Avant la synthèse, l'implémentation puis la génération du bitstream, il faut ajouter le fichier de contraintes permettant de spécifier les broches pour la connexion à la prise VGA : vga_pinout.xdc

Terminer l'application Vivado HLx :

  • Lancer la synthèse puis l'implémentation et enfin la génération du fichier de bitstream.
  • Exporter l'architecture matérielle en intégrant le fichier de bitstream.
  • Programmer le fichier de configuration dans le FPGA à partir de Vivado afin de valider l'affichage du filet.
  • Editer à nouveau l'IP Pong et modifier le fichier ipPong_Core.vhd aux endroits spécifiés pour assurer l'affichage des raquettes et de la balle (attention à bien utiliser les signaux temporaires).
  • Implémenter à nouveau et regérer le fichier de bitstream.
  • Programmer le FPGA et vérifier que les raquettes et la balle s'affiche (au moins partiellement).

Programme C de l'application

Dans le SDK, créer un projet vide (Empty Project) nommé ZyboPong (revoir la procédure vue lors de l'exercice précédent si nécessaire).

Pour vous aider, récupérer le programme C zybopong.c en choisissant Enregistrer sous... et enregistrer-le dans le dossier ZyboPong.sdk\ZyboPong\src du projet.

Compléter le programme étape par étape en commençant par assurer le déplacement des raquettes, puis celui de la balle.

Notes :

  • Lorsqu'un joueur ne renvoie pas la balle, faire repartir la balle du milieu de l'écran vers le joueur qui vient de la manquer.
  • En cas de difficulté dans la programmation des déplacements de la balle, procéder par étapes en commençant par faire rebondir la balle sur les côtés gauche et droit de l'écran puis en haut et en bas de l'écran.