Dans cette activité, nous allons réaliser un circuit qui compte le nombre d’appuis successifs sur un bouton-poussoir. Le nombre d’appuis sera affiché en hexadécimal sur un afficheur 7 segments.
Dans la vidéo ci-dessus, à la 26ème seconde, le comptage passe directement de 7 à A. Ce problème est dû au fait que le bouton-poussoir peut rebondir plusieurs fois avant de se stabiliser. Dans cette activité, nous allons d’abord créer un détecteur d’appui simple, puis un filtre anti-rebonds.
Le circuit sera composé d’instances des entités suivantes :
EventDetector
(à développer) servira à détecter l’instant où l’utilisateur presse ou relâche un bouton.CompteurModuloN
(fournie) comptera le nombre d’appuis détectés.SegmentDecoder
(fournie) convertira le nombre d’appuis en un vecteur pour un afficheur 7 segments.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 |
---|---|---|
EventDetector |
EventDetector.vhd |
Code source de l’entité EventDetector . |
EventDetector |
EventDetector_Simple.vhd |
Code source de l’architecture Simple pour l’entité EventDetector . |
EventDetector |
EventDetector_Debouncer.vhd |
Code source de l’architecture Debouncer pour l’entité EventDetector . |
EventDetector |
EventDetectorDemo.vhd |
Code source de l’entité EventDetectorDemo et de son architecture. |
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. |
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_SegmentDisplay.xdc |
Fichier de contraintes pour Vivado, définition des afficheurs. |
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 | EventDetectorDemo |
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 cet exercice, nous allons décrire un circuit capable d’indiquer
si un port d’entrée logique vient de changer de valeur.
L’entité EventDetector
est déclarée dans le fichier EventDetector.vhd
.
Elle possède les ports suivants :
Port | Direction | Type | Rôle |
---|---|---|---|
clk_i |
Entrée | Logique | Le signal d’horloge global du circuit. |
src_i |
Entrée | Logique | L’entrée dont on souhaite détecter les changements. |
on_evt_o |
Sortie | Logique | Indicateur de passage à l’état '1' . |
off_evt_o |
Sortie | Logique | Indicateur de passage à l’état '0' . |
status_o |
Sortie | Logique | État de l’entrée lorsqu’elle s’est stabilisée. |
La sortie on_evt_o
sera active pendant une période d’horloge
pour indiquer que l’entrée src_i
vient de passer à '1'
.
La sortie off_evt_o
sera active pendant une période d’horloge
pour indiquer que l’entrée src_i
vient de passer à '0'
.
Le comportement attendu est représenté sur le chronogramme ci-dessous :
L’entité EventDetector
possède également un paramètre générique DURATION
de type entier qui sera utilisé plus tard dans la version avec anti-rebonds.
Le détecteur d’événements utilisera un signal interne src_reg
, vecteur de deux
bits, qui correspondra à deux copies retardées de l’entrée src_i
:
Proposez le schéma d’un circuit réalisant ce comportement.
Indice : vous l’avez déjà réalisé dans une activité précédente.
Dans le fichier EventDetector_Simple.vhd
, complétez l’architecture
Simple
de manière à réaliser le comportement représenté sur le
chronogramme ci-dessus.
Comme il n’y a pas d’entrée de réinitialisation, la valeur initiale de src_reg
sera précisée dans la déclaration.
Dans la console Tcl, indiquez à Vivado que l’entité principale pour la simulation
est EventDetector
avec l’architecture Simple
:
set_property top EventDetector [get_filesets sim_1]
set_property top_arch Simple [get_filesets sim_1]
Démarrez le simulateur et exécutez les commandes ci-dessous.
restart
add_force -repeat_every 10ns clk_i 0 0ns 1 5ns
add_force src_i 0 0ns 1 40ns 0 100ns
run 200ns
Vérifiez que les chronogrammes sont conformes aux attentes.
Le fait de séparer l’entité et l’architecture dans des fichiers distincts perturbe un peu le fonctionnement de Vivado. À la fin de chaque simulation, fermez le simulateur en utilisant ces deux commandes :
close_sim -force
reset_simulation -simset sim_1 -mode behavioral
Si vous oubliez la commande reset_simulation
, Vivado ne tiendra pas compte
des modifications que vous ferez dans l’architecture.
En reprenant les indications données dans les activités précédentes,
synthétisez le circuit EventDetectorDemo
et testez son fonctionnement sur
la carte Basys3.
Utilisez le bouton central pour incrémenter le compteur.
Occasionnellement, vous observerez qu’un appui sur le bouton provoque plusieurs incrémentations du compteur. En effet, lorsque vous pressez le bouton, celui-ci peut rebondir plusieurs fois avant de se stabiliser. Du point de vue du détecteur d’appuis, ces rebonds sont considérés comme des appuis distincts.
Ouvrez à présent le fichier EventDetector_Debouncer.vhd
.
L’architecture Debouncer
implémente la même entité EventDetector
que
l’architecture Simple
.
Elle utilisera le paramètre générique DURATION
qui définira le nombre de
périodes d’horloge maximum d’un rebond.
L’anti-rebonds sera réalisé au moyen des éléments suivants :
on_timer_reg
qui comptera le nombre de cycles consécutifs pendant lesquels le signal src_i
vaut '1'
.off_timer_reg
qui comptera le nombre de cycles consécutifs pendant lesquels le signal src_i
vaut '0'
.Vous devrez réaliser chaque compteur sous la forme d’un processus en vous
référant au chapitre sur les compteurs.
Vous ne devrez pas réutiliser l’entité CompteurModuloN
.
Le comportement attendu est le suivant :
on_timer_reg
et off_timer_reg
sont à zéro.clk_i
:
src_i
vaut '0'
:
on_timer_reg
.off_timer_reg
s’il est inférieur à DURATION
.src_i
vaut '1'
:
on_timer_reg
s’il est inférieur à DURATION
.off_timer_reg
.La machine à états sera construite en respectant le graphe d’états ci-dessous :
Les signaux on_evt_o
, off_evt_o
et status_o
seront affectés de manière combinatoire
en fonction de l’état courant.
Ils seront à '1'
dans les états où ils sont mentionnés et à '0'
dans les autres états.
En vous inspirant des exemples du chapitre Automates,
complétez l’architecture Debouncer
de manière à réaliser le comportement
représenté sur le graphe d’états ci-dessus.
Dans la console Tcl, indiquez à Vivado que l’entité principale pour la simulation
est EventDetector
avec l’architecture Debouncer
et avec un paramètre DURATION
égal à 5 :
set_property top EventDetector [get_filesets sim_1]
set_property top_arch Debouncer [get_filesets sim_1]
set_property generic DURATION=5 [get_filesets sim_1]
Démarrez le simulateur et exécutez les commandes ci-dessous.
restart
add_force -repeat_every 10ns clk_i 0 0ns 1 5ns
add_force src_i 0 0ns 1 40ns 0 60ns 1 70ns 0 110ns 1 120ns 0 250ns 1 270ns 0 280ns 1 320ns 0 330ns
run 400ns
Vérifiez que les chronogrammes sont conformes aux attentes.
À la fin de chaque simulation, fermez le simulateur en utilisant ces deux commandes :
close_sim -force
reset_simulation -simset sim_1 -mode behavioral
Dans le fichier EventDetectorDemo.vhd
, modifiez l’instance
detector_inst
pour qu’elle utilise l’architecture Debouncer
.
Dans une clause generic map
,
associez le paramètre DURATION
à une valeur
entière égale au nombre de périodes d’horloge pour une durée de 20 millisecondes.
On rappelle que la fréquence de clk_i
est 100 MHz.
En reprenant les indications données dans les activités précédentes,
synthétisez le circuit EventDetectorDemo
et testez son fonctionnement sur
la carte Basys3.
Dans les sections qui précèdent, nous vous avons demandé de développer
l’anti-rebonds en utilisant deux compteurs.
En réalité, on observe que les valeurs de off_timer_reg
et on_timer_reg
sont
utilisées dans des états différents de l’automate.
Afin d’optimiser le circuit, nous proposons de fusionner ces deux compteurs
en un unique compteur timer_reg
:
OFF_STABLE
, ON_EVENT
et ON_UNSTABLE
,
timer_reg
se comportera comme on_timer_reg
.ON_STABLE
, OFF_EVENT
et OFF_UNSTABLE
,
timer_reg
se comportera comme off_timer_reg
.Modifiez le fichier EventDetector_Debouncer.vhd
.
Vérifier en simulation que le comportement de l’architecture est toujours conforme à la version à deux compteurs. Synthétisez le circuit et testez son fonctionnement sur la carte Basys3.