Décompter les secondes

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.

L’entité 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 :

L'entité UpDownCounter

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 :

La figure ci-dessous représente une architecture possible pour ce compteur :

Architecture du compteur/décompteur

Afficher la légende des schémas.

Compléter la description du 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 :

  1. Commencez par la gestion des sorties value_o et cycle_o. Utilisez deux instructions d’affectation concurrentes : une affectation simple pour value_o et une affectation conditionnelle pour cycle_o.
  2. Ajoutez ensuite le processus 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.

Vérifier la syntaxe

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.

Simuler le fonctionnement du compteur

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.

Mise en place des compteurs dans le minuteur

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.

Instanciation des compteurs

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.

Compléter la description du minuteur

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.

Vérifier la syntaxe

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.

Simuler le fonctionnement du circuit

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