Je vous conseille de créer un nouveau projet sous ISE avec les bonnes propriétés.
Notation : P1 = 1 ; P2 = 2 ; P3 = 1 ; P4 = 1
Comme cela est précisé dans le sujet de TD6 les boutons ne produisent pas des impulsions . Voici un travail préliminaire à réaliser avant de poursuivre.
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 :
Ce que vous devez détecter c’est le changement d’état de votre bouton : le passage de 0 à 1. Cette détection ne doit être active que pendant 1 cycle alors que la pression manuelle du bouton va activer un signal pendant quelques dixièmes de seconde, la vitesse de votre doigt ! La détection du changement d’état du bouton correspond à produire une impulsion. Pour 2 instructions PAUSE successives, il faut bien appuyer deux fois sur le bouton. Je vous propose de réaliser un petit circuit qui assure la génération de cette impulsion à l’aide de six bascules D. D’abord il faut éviter les rebonds des boutons.
En première ligne, vous placez 3 bascules D en série à une fréquence de 190 Hz afin de valider la pression sur le bouton pour un échantillonnage de 15 ms environ. Si le signal est à 1 pendant ces 15ms il est validé en sortie par un AND3. Les trois bascules en série fonctionnent comme un registre à décalage. Pour les trois autres bascules en série, à chaque top d’horloge clk, celle du processeur cette fois, les trois bascules mémorisent les trois dernières valeurs du signal échantillonné. Si ces trois valeurs sont 110, il y a une nouvelle pression sur le bouton vous générez alors l’impulsion. Toute autre combinaison sur les 3 dernières valeurs du signal bouton ne relâchera pas l’impulsion.
Ajoutez un schematic de nom pulse. Placez-y 6 bascules D sur deux lignes de 3. Ajoutez deux fils clk et clk190 avec leur I/O Marker. Clk190 est relié au C des 3 premières bascules, clk aux 3 dernières. Un fil inp et son I/O Marker est relié à l’entrée D de la première bascule. Les sorties Q de la première et deuxième bascules se connectent à l’entrée D des bascules suivantes. Les trois sorties Q sont reliées par un AND3. La sortie de ce AND3 devient l’entrée de la 4ième bascule.
Les 3 dernières bascules sont en cascade elles aussi. Ici la sortie de la dernière passe par un INV avant d’être reliée au AND3 afin de détecter la suite b110. Enfin la sortie de ce AND3 est nommée outp. Ajoutez-y un I/O Marker. Nommez vos fils pour la simulation : q0, q1, q2, q3, q4, q5 et o1 pour la sortie un premier AND3. Voici le schéma pour vous guider.
Figure 114 Schéma de votre pulse
En simulant ce composant, vous obtiendrez le chronogramme suivant qui garantit effectivement la création du signal d’impulsion. Pour simuler vous pouvez créer un pulse_tb avec un stimuli pour clk, clk190 et pour le bouton à 1 après un certain temps. Vous pouvez aussi lancer Isim sur pulse.sch, dans ce cas il faut utiliser Force constant et Force clock pour stimuler vos entrées. Pour réduire la durée de simulation, j’ai choisi une clk190 deux fois plus lente que clk. Vous pouvez créer le symbole correspondant. Il faudra le placer sur chacun des fils en entrée BTNi afin de créer une belle impulsion BTN_IMPi lors de la pression sur un des boutons.
Figure 115 Simulation de pulse
Faites valider ce premier circuit simulé avec les fronts montants alignés, la période de outp de 1 et 1 seul cycle!!!
Modification du sujet:
Ajoutez 3 autres leds: 1 led init , 1 led sur 1erbtnOK et1 led sur 2iemebtnOK , chaque led s'allume en fonction de l'avancement du code exact.
Affichez un compte sur l 'afficheur 7 segment F quand la porte est fermée , O quand la porte est ouverte et E en cas d'erreur.
A vous de jouer !!
il faut réaliser le premier circuit qui décode la bonne séquence : BTN0, BTN1, BTN2. Le BTN3 sert comme Reset(RAZ) de votre système. Chaque bouton doit être associé à un circuit pulse avant usage! Vous devez utiliser le clkdiv déjà réalisé au TP4.
Je vous demande de créer pour la FSM 3 symboles : Next_state, sortie, et state à instancier dans la fsm. Placez la fsm et clkdiv et quelques pulse dans votre toplevel. Vérifiez le fichier ucf...
Je vous conseille une approche Bottom-up... on commence par des petits circuits, on crée des symboles et on utilise ces symboles pour construire un circuit plus complexe .... La simulation peut suivre la construction étape par étape!
Réalisez une simulation avec un fichier Testbench de la fsm avec une génération de BTN0 BTN1 et BTN2 par force constant, pour la clk générez le signal par le process, dans le simulateur je veux voir la valeur de l'état courant . validez simulation et sur la carte le contrôleur de séquences.
On décide d'ajouter un signal enable qui autorise ou non la saisie d'une séquence par le switches(7).
Enable = '1' le système réagit
Enable = '0' , le système reste bloqué dans l'état dans lequel il se trouve quelques soient les boutons appuyés...
Proposez une solution avec de nouvelles bascules adaptées au problème (FDE). Modifiez les circuits concernés et adaptez votre .ucf.
Relancez une simulation de fsm avec le signal enable qui se positionne automatiquement à '1' par le fichier testBench après un certain délai que vous choisirez. BTN0 BTN1 et BTN2 toujours par force constant lors de la simulation avant et après la validation du signal enable.
Faire valider la simulation et sur la carte
Implémenter le système qui permette de spécifier le code reconnu sur les switches… chaque paire de switches donne le numéro qui est attendu dans l'ordre de la droite vers la gauche. Seule une permutation des trois BTN est autorisée.
sw(1:0) = numéro du premier btn attendu (compris entre 0 et 2, 3 n'est pas un bouton accepté)
sw(3:2) = numéro du premier btn attendu
sw(5:4) = numéro du premier btn attendu
Un traitement en amont de la fsm est possible afin d'éviter de multiplier le nombre d'entrées qui resteraient constantes...
Faire valider sur la carte avec différentes séquences programmées...