En nous inspirant de l’entité CounterDemo
,
nous allons développer une entité StopWatch
capable de compter pendant une
durée de dix minutes et d’afficher le temps au dixième de seconde près.
Le bouton central servira à remettre le chronomètre à zéro ;
l’interrupteur le plus à gauche servira à démarrer ou arrêter le comptage.
L’entrée switches_i
sur la figure ci-dessous correspond aux seize interrupteurs
présents sur la carte Basys3.
La sortie leds_o
correpond aux seize LED.
L’architecture sera composée de sept compteurs dont les rôles sont présentés dans ce tableau :
Compteur | Modulo | Mis à jour toutes les | Durée d’un cycle | Rôle |
---|---|---|---|---|
divider_5ms_inst (en simulation) |
5 | 1 ms | 5 ms | Diviseur général de fréquence |
divider_5ms_inst (pour la synthèse) |
500000 | 10 ns | 5 ms | Diviseur général de fréquence |
divider_20ms_inst |
4 | 5 ms | 20 ms | Balayage des afficheurs sept segments |
divider_100ms_inst |
5 | 20 ms | 100 ms | Diviseur de fréquence pour le comptage du temps |
counter_10x100ms_inst |
10 | 100 ms | 1 s | Chiffre des dixièmes des secondes |
counter_10x1sec_inst |
10 | 1 s | 10 s | Chiffre des unités de secondes |
counter_6x10sec_inst |
6 | 10 s | 1 min | Chiffre des dizaines de secondes |
counter_10x1min_inst |
10 | 1 min | 10 min | Chiffre des minutes |
Le compteur divider_20ms_inst
permettra d’activer à tour de rôle les sorties
disp_select_n_o
pour réaliser un balayage des quatre afficheurs sept segments.
Simultanément, en fonction de la valeur du signal digit_index
, le décodeur
sept segments recevra soit le chiffre des dixièmes de secondes, des unités de secondes,
des dizaines de secondes ou des minutes.
Le compteur counter_10x100ms_inst
sera autorisé à compter à chaque fin de cycle
de divider_100ms_inst
mais seulement si l’entrée switches_i(15)
vaut '1'
.
Lorsque switches_i(15)
vaut '0'
, les compteurs qui mesurent le temps maintiennent
leur valeur stable.
Pour le moment, tous les bits de la sortie leds_o
sont mis à '0'
.
Nous ajouterons la gestion des LED dans l’activité suivante.
Voici la liste des fichiers que nous utiliserons dans cette activité.
Tous ces fichiers sont situés dans des sous-dossiers de CoCiNum/src/vhdl
.
Sous-dossier | Fichier | Rôle |
---|---|---|
Counter |
CounterModN.vhd |
Code source de l’entité CounterModN et de son architecture. |
SegmentDisplay |
SegmentDecoder.vhd |
Code source de l’entité SegmentDecoder et de son architecture. |
StopWatch |
StopWatch.vhd |
Code source de l’entité StopWatch 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. |
Basys3 |
Basys3_SegmentDisplay.xdc |
Fichier de contraintes pour Vivado, définition des afficheurs. |
Basys3 |
Basys3_Switches.xdc |
Fichier de contraintes pour Vivado, définition des interrupteurs. |
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 | StopWatch |
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 |
Dans le fichier StopWatch.vhd
, complétez l’architecture de la manière suivante :
Pour le point 3, nous vous demandons d’utiliser les instructions suivantes :
Signal à affecter | Instruction |
---|---|
inc_100ms |
Affectation simple |
digit |
Affectation avec sélection (with... select ) |
disp_select_n_o(i) |
Affectation conditionnelle (when... else ) |
disp_segments_n_o |
Affectation simple |
disp_point_n_o |
Affectation simple |
Pour réduire la durée de la simulation et éviter de produire des chronogrammes trop longs, nous allons travailler avec une fréquence d’horloge de 1 kHz, nettement inférieure à la réalité.
Dans le fichier StopWatch.vhd
, faites en sorte que le compteur
divider_5ms_inst
ait un modulo égal à 5.
Démarrez le simulateur : Flow Navigator → Simulation → Run Simulation → Run Behavioral Simulation.
Dans la console Tcl, entrez les commandes suivantes, en pressant la touche Entrée pour exécuter chaque commande.
Redémarrer la simulation :
restart
Créer un signal d’horloge de période 1 ms :
add_force -repeat_every 1ms clk_i 0 0us 1 500us
L’entrée btn_center_i
vaudra '1'
au démarrage, et '0'
au bout de 1 ms :
add_force btn_center_i 1 0ms 0 1ms
L’entrée switches_i(15)
passera à 1
au bout d’une seconde, et sera à '0'
entre 4 et 5 s :
add_force switches_i(15) 0 0sec 1 1sec 0 4sec 1 5sec
Exécuter la simulation pendant 3 minutes :
run 180sec
Vérifiez que tous les compteurs fonctionnent, en commençant par celui
situé le plus à gauche sur le schéma.
Observez les signaux cycle_5ms
, cycle_20ms
, cycle_100ms
, cycle_1sec
, cycle_10sec
et cycle_1min
.
Vérifiez la durée qui sépare deux impulsions successives pour chacun
de ces signaux.
Vérifiez que les compteurs de temps ne comptent pas pendant la durée où
switches_i(15)
vaut '0'
.
Observez les bits du signal disp_select_n_o
et vérifiez qu’ils sont actifs
à tour de rôle pendant 5 ms.
Si certains signaux n’ont pas la forme souhaitée, vérifiez votre description VHDL en la comparant au schéma fourni. Corrigez votre description, recompilez-la et recommencez la simulation.
En réalité, la carte Basys3 est équipée d’un oscillateur qui produit un signal d’horloge à 100 MHz.
Avant de passer à la suite, dans le fichier StopWatch.vhd
, faites en sorte que
le compteur divider_5ms_inst
ait un modulo égal à 500000.
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.
Sur la carte Basys3, actionnez l’interrupteur de gauche pour démarrer ou arrêter le comptage.