Activité : circuits séquentiels

Comptage des appuis sur un bouton

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 :

Créer un projet Vivado

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

Détecteur d’événement simple

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 :

Détecteur d'événements

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.

Architecture

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 :

Détecteur d'événements simple (détail)

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.

Simulation

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.

Synthèse et test sur le matériel

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.

Filtre anti-rebonds

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.

Architecture

L’anti-rebonds sera réalisé au moyen des éléments suivants :

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 :

  1. Au démarrage on_timer_reg et off_timer_reg sont à zéro.
  2. À chaque front montant de clk_i :
    • Si src_i vaut '0' :
      • Mettre à zéro on_timer_reg.
      • Incrémenter off_timer_reg s’il est inférieur à DURATION.
    • Si src_i vaut '1' :
      • Incrémenter on_timer_reg s’il est inférieur à DURATION.
      • Mettre à zéro off_timer_reg.

La machine à états sera construite en respectant le graphe d’états ci-dessous :

Anti-rebond : graphe d'éats

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.

Simulation

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

Synthèse et test sur le matériel

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.

Améliorations

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 :

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.