L’étape suivante consiste à mettre en place les compteurs nécessaires au décompte des secondes et minutes. Nous aurons besoin de quatre compteurs en cascade, un pour chaque chiffre du temps mesuré :
Nous allons faire l’hypothèse que l’entrée clk_i
du minuteur est reliée à un oscillateur de fréquence 1 kHz.
Celui-ci constituera la seule référence pour la mesure du temps.
Lors du décompte, il faudra commander la mise à jour des compteurs de temps une fois toutes les mille périodes d’horloge. Pour ce faire, nous utiliserons un compteur modulo 1000 placé en amont du compteur des unités des secondes.
UpDownCounter
Nous allons créer une entité UpDownCounter
que nous pourrons réutiliser pour chacun des compteurs présentés
plus haut. Nous avons représenté ses entrées/sorties ci-dessous :
Les instances de l’entité UpDownCounter
pourront compter soit dans le sens croissant
(en activant l’entrée up_i
), soit dans le sens décroissant (en activant l’entrée down_i
).
Le paramètre générique VALUE_MAX
permet de régler la valeur maximale que pourra prendre chaque compteur.
Pour créer un compteur modulo 10, il suffit de fixer VALUE_MAX
à 9.
La sortie value_o
donne la valeur instantanée du compteur.
La sortie cycle_o
passe à '1'
à chaque fois que le compteur s’apprête à commencer un nouveau cycle de comptage, c’est-à-dire :
up_i
vaut '1'
et value_o
est égale à VALUE_MAX
,down_i
vaut '1'
et value_o
est égale à 0.La figure ci-dessous représente une architecture possible pour ce compteur :
Ouvrez le fichier UpDownCounter.vhd
:
cd $HOME/CoCiNum/src/vhdl/Pomodoro
gedit UpDownCounter.vhd &
Dans le fichier UpDownCounter.vhd
, complétez l’architecture en vous conformant
au schéma ci-dessus.
Nous vous recommandons de procéder dans cet ordre :
value_o
et cycle_o
.
Utilisez deux instructions d’affectation concurrentes :
une affectation simple pour value_o
et une affectation conditionnelle pour cycle_o
.p_value_reg
qui assure la mise à jour
du signal value_reg
(voir à ce sujet la page Compteurs et diviseurs de fréquence).Expliquez l’intérêt d’utiliser un signal intermédiaire value_reg
au lieu de manipuler directement le port value_o
.
Dans un terminal, exécutez les commandes suivantes.
La commande cd
peut être omise si vous êtes déjà dans le dossier Pomodoro
.
cd $HOME/CoCiNum/src/vhdl/Pomodoro
ghdl -a UpDownCounter.vhd
Si nécessaire, modifiez le fichier UpDownCounter.vhd
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/Pomodoro/tests/UpDownCounter
make
Cette commande n’ouvre pas de nouvelle fenêtre. Elle exécute un scénario de test et enregistre les séquences de valeurs des signaux.
Une fois la simulation terminée, affichez les chronogrammes :
gtkwave -S UpDownCounter.tcl UpDownCounter.ghw
Observez l’évolution des valeurs des signaux. S’ils sont conformes au comportement attendu, vous pouvez passer à la suite. Dans le cas contraire, corrigez la description du compteur et relancez la simulation jusqu’à ce que vous obteniez des chronogrammes corrects.
Sur la figure ci-dessous, nous avons représenté la mise en cascade de cinq compteurs.
Pour le moment, la sortie cycle_o
de chaque compteur est reliée à l’entrée down_i
du suivant.
À l’exception du compteur modulo 1000 (tout en bas de la figure), leurs entrées up_i
sont toutes à '0'
.
Ce circuit réalise ainsi un décompte sur une durée non réglable de cent minutes.
Les sorties des compteurs des minutes et secondes sont reliées aux entrées des décodeurs sept segments
par l’intermédiaire des signaux minutes_tens
, minutes_ones
, seconds_tens
et seconds_ones
.
Afficher la légende des schémas.
Sur la figure, vous observez qu’entre la sortie cycle_o
d’un compteur
et l’entrée down_i
du suivant, il y a toujours deux signaux reliés ensemble
(par exemple, cycle_minutes_ones
et down_minutes_tens
).
En principe, un seul signal serait suffisant. Nous avons procédé de cette manière car dans la suite du développement, nous allons insérer entre ces signaux les éléments nécessaires au réglage du temps.
Dans le fichier Pomodoro.vhd
, complétez l’architecture de manière à reproduire
la structure de la figure.
Vous devrez retirer les affectations des signaux minutes_tens
,
minutes_ones
, seconds_tens
et seconds_ones
.
Dans un terminal, exécutez les commandes suivantes.
La commande cd
peut être omise si vous êtes déjà dans le dossier Pomodoro
.
cd $HOME/CoCiNum/src/vhdl/Pomodoro
ghdl -a UpDownCounter.vhd ../SegmentDisplay/SegmentDecoder.vhd Pomodoro.vhd
Si nécessaire, modifiez le fichier Pomodoro.vhd
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/Pomodoro/tests/Pomodoro
make
Pour arrêter la simulation, refermez la fenêtre contenant les afficheurs sept segments. Il est alors possible de regarder les chronogrammes plus en détail.
gtkwave -S Pomodoro.tcl Pomodoro.ghw