Cet exercice consiste à réaliser un jeu de ping-pong utilisant les LED et les boutons-poussoirs de la carte Basys3. Voici les règles du jeu :
Sur la vidéo ci-dessous, après quelques échanges, le joueur gauche ne rattrape pas la balle. Le joueur droit gagne la première manche. Ensuite, le joueur droit presse son bouton trop tôt. Le joueur gauche gagne la seconde manche.
Ouvrez le fichier CoCiNum/src/vhdl/Exercices/PingPong/PingPong.vhd
:
cd $HOME/CoCiNum/src/vhdl/Exercices/PingPong
gedit PingPong.vhd &
L’entité PingPong
possède les ports suivants :
Port | Direction | Type | Rôle |
---|---|---|---|
clk_i |
Entrée | Logique | Le signal d’horloge global. |
btn_center_i |
Entrée | Logique | L’état du bouton-poussoir central. |
btn_left_i |
Entrée | Logique | L’état du bouton-poussoir gauche. |
btn_right_i |
Entrée | Logique | L’état du bouton-poussoir droit. |
leds_o |
Sortie | Vecteur de 16 bits | Commandes des seize voyants. |
La direction de la balle sera gérée par un automate avec les états suivants :
IDLE
: état d’attente.LEFT_TO_RIGHT
: la balle se déplace vers la droite.RIGHT_TO_LEFT
: la balle se déplace vers la gauche.L’emplacement de la balle (le numéro de la LED à allumer) sera représenté
par un signal led_index_reg
.
Proposez un graphe d’état modélisant le comportement illustré par la vidéo
ci-dessous, puis traduisez-le en VHDL.
Sachant que la fréquence du signal d’horloge clk_i
est indiquée par le
paramètre générique CLK_FREQUENCY_HZ
de l’entité PingPong
,
réalisez un diviseur de fréquence
pour gérer la vitesse à laquelle on passe d’une LED à la suivante.
Le compteur devra être remis à zéro dans l’état IDLE
pour que le comptage
commence bien à zéro au premier appui sur le bouton de gauche.
Le signal led_index_reg
sera géré de la manière suivante :
IDLE
, affecter la valeur 15 à led_index_reg
(LED de gauche).LEFT_TO_RIGHT
, décrémenter led_index_reg
à chaque cycle du diviseur de fréquence.RIGHT_TO_LEFT
, incrémenter led_index_reg
à chaque cycle du diviseur de fréquence.La gestion de la sortie leds_o
est identique à celle de l’exercice séquenceur lumineux.
À présent, on souhaite détecter la fin d’une manche. Nous allons ajouter deux états à l’automate :
LEFT_WINS
: le joueur de gauche a gagné la manche.RIGHT_WINS
: le joueur de droite a gagné la manche.Dans l’état LEFT_TO_RIGHT
, trois situations peuvent se présenter :
Des conditions similaires s’appliquent pour le joueur de gauche
dans l’état RIGHT_TO_LEFT
.
Dans les états LEFT_WINS
et RIGHT_WINS
, attendre l’appui sur le bouton central
pour revenir à l’état IDLE
.
Proposez un nouveau graphe d’état et mettez à jour la description VHDL.
Modifiez également le diviseur de fréquence pour que son compteur soit remis à zéro à chaque fois qu’un joueur parvient à frapper la balle.
Pour terminer, modifiez la gestion des sorties leds_o
pour allumer
les LED 15 à 12 si le joueur de gauche gagne, et les LED 3 à 0 si le joueur
de droite gagne.
Utiliser de préférence un processus.
Dans un terminal, exécutez les commandes suivantes.
La commande cd
peut être omise si vous êtes déjà dans le dossier PingPong
.
cd $HOME/CoCiNum/src/vhdl/Exercices/PingPong
ghdl -a PingPong.vhd
Modifiez votre fichier source jusqu’à ce qu’il n’y ait plus de message d’erreur.
Démarrez la simulation en utilisant les commandes suivantes :
cd $HOME/CoCiNum/src/vhdl/Exercices/PingPong/tests
make
Le script de test affiche une fenêtre avec une rangée de LED et trois boutons.
Dans des conditions normales, une LED allumée a la couleur verte.
Si une LED s’allume en rouge, cela signifie généralement que le signal leds_o(i)
vaut 'U'
(signal non initialisé), ou 'X'
(valeur indéterminée).
Voir à ce sujet la section sur le type std_logic
.
Agissez sur les boutons et observez l’état des LED.
Vérifiez que vous obtenez le comportement attendu.
Pour afficher les chronogrammes, utilisez la commande suivante :
gtkwave PingPong.ghw
Par défaut, la fenêtre GTKWave n’affiche aucun chronogramme. Déroulez l’arborescence à partir de l’élément top dans le panneau SST en haut à gauche et sélectionnez les signaux à afficher dans la liste Signals en bas à gauche.
Utilisez les boutons de la barre d’outils pour dézoomer: le bouton Zoom fit ajuste l’échelle de temps pour que la durée totale de simulation corresponde à la largeur de la fenêtre.
Voici la liste des fichiers nécessaires à la construction du projet.
Tous ces fichiers sont situés dans des sous-dossiers de CoCiNum/src/vhdl
.
Sous-dossier | Fichier | Rôle |
---|---|---|
Exercices/PingPong |
PingPong.vhd |
Code source de l’entité PingPong et de son architecture. |
Basys3 |
Basys3_Buttons.xdc |
Fichier de contraintes pour Vivado, définition des boutons-poussoirs. |
Basys3 |
Basys3_Clock.xdc |
Fichier de contraintes pour Vivado, définition de l’horloge. |
Basys3 |
Basys3_Leds.xdc |
Fichier de contraintes pour Vivado, définition des LED. |
Si vous ne l’avez pas encore fait, démarrez Vivado à l’aide des commandes suivantes :
cd $HOME/CoCiNum
./scripts/vivado
Créez un nouveau projet en renseignant les informations suivantes :
Page | Champ ou action | Valeur |
---|---|---|
Project Name | Project name | PingPong |
Project location | CoCiNum/vivado |
|
Create project subdirectory | Oui | |
Project Type | RTL Project | |
Add Sources | Add Files | Fichiers .vhd dans le tableau précédent |
Copy sources into project | Non | |
Add Constraints | Add Files | Fichiers .xdc dans le tableau précédent |
Copy constraints files into project | Non | |
Default Part | Family | Artix-7 |
Package | cpg236 | |
Speed | -1 | |
Part | xc7a35tcpg236-1 |
Pour donner une valeur au paramètre générique CLK_FREQUENCY_HZ
de l’entité
PingPong
, exécutez cette commande dans le panneau Tcl Console de Vivado :
set_property generic CLK_FREQUENCY_HZ=100000000 [current_fileset]
Exécutez cette commande dans la console Tcl pour réduire la gravité de certains messages concernant les affectations de broches :
set_msg_config -id {Common 17-55} -new_severity {WARNING}
Générez le fichier binaire à charger dans le FPGA : Flow Navigator → Program and Debug → Generate Bitstream.
Vivado va enchaîner toutes les étapes d’analyse des fichiers sources, de synthèse logique, de placement et routage, pour terminer par la génération d’un fichier binaire à charger dans le FPGA.
À la fin des opérations, la boîte de dialogue Bitstream Generation Completed s’affiche. Choisissez Open Hardware Manager.
Vérifiez que l’interrupteur d’alimentation de votre carte Basys3 est en position OFF. Le cavalier situé à côté de l’interrupteur doit être en position USB.
Reliez le connecteur micro-USB de la carte à un port USB de votre PC. Mettez la carte sous tension.
En haut du panneau Hardware Manager, pressez Open target et choisissez Auto Connect.
Pressez ensuite Program Device.