Si les boutons poussoirs sont des composants très simples à utiliser, ils possèdent tout de même un inconvénient de taille, ils sont sujets aux rebonds, c'est à dire qu'ils ont la désagréable habitude de ne pas passer directement de leur état ouvert à leur état fermé. Pendant une durée généralement inférieure à la milliseconde, il va en effet osciller plusieurs fois entre les deux états :
Allure du signal obtenu lors de l'appui sur un bouton poussoir.
Si cela ne pose pas de problème pour des applications simples, par exemple allumer une LED, ou commander un relais par le biais d'un transistor, cela en pose en revanche avec les circuits fonctionnant sur changement d'état d'un signal, ceux-ci risquant d’interpréter chaque rebond comme un appui sur le bouton. Les boutons poussoir et les commutateurs disponibles sur la carte Basys3 ne disposent pas de circuit d’anti-rebond. Par conséquent, les rebonds doivent être traités à l’aide du FPGA. Pour ce TP, vous allez créer un module vhdl d’anti-rebond pour traiter les boutons utilisés pour contrôler le digicode. La seconde partie de ce composant permet aussi de générer un signal d’impulsion qui détecte le moment où le bouton est appuyé. Une première horloge bridée permet de réduire les rebonds mécaniques, c’est un signal Enable qui ralenti le fonctionnement comme pour un afficheur. L'horloge du système permet quant à elle de produire une impulsion pendant un cycle.
Voici un schematic qui réalise cette architecture. Inspirez vous de ce schémas pour construire un module vhdl btn_pulse qui fait la même chose. Vous pourrez ensuite instanciez 5 fois ce module pour chacun des bouton de la carte. Je vous suggère de déclarer les signal Q0... Q5 et d'utiliser un process sur clk.
Figure 34 Schéma de votre pulse
En simulant ce composant, j'ai le chronogramme suivant qui garantit effectivement la création du signal d’impulsion. Ici j'ai forcé le signal E 2 fois moins rapide que l'horloge mais c'est encore trop rapide pour une utilisation sur la carte. Néanmoins ça permettra de tester votre architecture en quelques clock.
Figure 35 Simulation de pulse
Faire valider la simulation de votre code btn_pulse. Ouvrez également le schematic afin de comprendre ce que VIVADO a généré, ça devrait ressembler à mon schematic!
Il vous faut utiliser l'entrée E afin d'étalonner le signal produit par la bouton! Je vous propose de le faire à la fréquence de 1/190 de seconde, c'est aussi la fréquence utilisée par l'afficheur 7segments sur les 4 afficheurs.
Vous allez créer une nouvelle source VHDL appelée Enable190 avec une entrée clock, une sortie E190 et une sortie clk190. On utilisera E190 pour l'instant qui produit une impulsion durant 10ns et à la fréquence de 190Hz. Le clk190 est une clock de fréquence 190Hz qui sera utilisée dans la FSM de l'afficheur plus tard.
Pour diviser la clock, il suffit d'utiliser un compteur sur lequel on choisit le poids du fil de sortie qui correspond à la division voulue : Q0 division par 2, Q1 division par 4 etc... Ici il faut prendre le fil Q18 avec une fréquence initiale de 100Mhz.
Ce code de division de clock est bien connu en voici une version complétée pour générer aussi le Enable, implémentez le et simulez le sur une durée suffisante afin d'en valider le fonctionnement.
library IEEE; use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
entity clkdiv is
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
E190, clk190 : out STD_LOGIC);
end clkdiv;
architecture clkdiv of clkdiv is
signal clkin: std_logic :='0';
begin
--clock divider
process(clk,reset)
variable q: std_logic_vector(23 downto 0):= X"000000";
begin
if reset ='1' then
q := X"000000";
clkin <= '0';
elsif clk'event and clk = '1' then
q := q+1;
if Q(18)='1' and clkin='0' then
E190 <= '1' ;
else
E190 <= '0';
end if;
end if;
clkin<= Q(18);
end process;
clk190 <= clkin;
end clkdiv;
Cette fois vous avez tous les composants nécessaires pour créer votre toplevel , il suffit d'instancier et de relier ces composants. Simulez, visualisez et testez sur la carte avant de valider par l'enseignant. Vérifiez votre fichier xdc afin de manipuler les boutons dans l'ordre de numérotation que vous avez défini.
Dans un PORT MAP on peut utiliser open afin de laisser un port de sortie non connecté.
Au lieu d'afficher l'ouverture sur une led , je vous demande de déclencher un chenillard pendant 2 secondes environ sur les 8 LED, Le signal période 4hz produit au TP4 peut être utile...
Vous allez devoir construire en fin de séance ( ou chez vous dans la semaine ) un afficheur de mots de 16 bits sur les 4 afficheurs de la carte Basys3
Vous utiliserez le signal clk190 de fréquence 190 Hz, comme horloge de référence et à chaque top votre automate enverra une tranche de 4 bits sur l'afficheur suivant en mettant à jour l'anodes an en fonction.
Voici le schéma de votre automate qui alimentera votre x7seg. Construisez vote FSM en VHDL, Associez ce composant avec x7seg du TP1 et clkdiv du TP5. Testez le sur votre carte en affichant par exemple la valeur des switches qui vous permettra d’obtenir un mots de 16 bits , celui-ci sera envoyé comma data(15:0) à votre afficheur.
N'hésitez pas à échanger sur le forum afin de préparer cet afficheur ;-)