Étape 2: Boutons et tableau de Position
Pour le bouton poussoir et le module array de position, il y a deux entrées de l’utilisateur, un pour déplacer la position vers la gauche et l’autre pour déplacer la position vers la droite. Ceci a été accompli en utilisant les boutons sur le DE2-115. Pour compenser les inexactitudes causées par les mécaniciens des boutons, il nous fallait debounce eux. Lorsqu’un bouton est enfoncé, il oscillera jusqu'à ce qu’il aplanit causant de nombreuses arêtes positives. Ceci est corrigé par debouncing qui ne fera que créer un bord positif par poussoir. Le code antirebonds est une adaptation du code sur le site Web de FPGA 4 Fun. Nous avons utilisé une machine à états finis pour assigner où la position est dans un tableau de 3 bits. Le tableau 3 bit est la sortie du module et correspond à la position de notre objet mobile.
Debouncer Source : http://www.fpga4fun.com/Debouncer2.html
Code :
fil L_idle = (L_state == L_sync_1) ;
fil L_cnt_max = & L_cnt ; true lorsque tous les bits de PB_cnt sont de 1
reg [15:0] R_cnt ;
fil R_idle = (R_state == R_sync_1) ;
fil R_cnt_max = & R_cnt ;
toujours clk)
if(L_idle)
L_cnt < = 0 ; rien ne se passe
d’autre
commencer
L_cnt < = L_cnt + 16' d1 ; quelque chose se passe, il incrémente le compteur
if(L_cnt_max) L_state < = ~ L_state ; Si le compteur est maxed, PB a changé !
fin
toujours clk)
if(R_idle)
R_cnt < = 0 ; rien ne se passe
d’autre
commencer
R_cnt < = R_cnt + 16' d1 ; quelque chose se passe, il incrémente le compteur
if(R_cnt_max) R_state < = ~ R_state ; Si le compteur est maxed, PB a changé !
fin
assigner L_down = ~ L_idle & L_cnt_max & ~ L_state ;
assigner R_down = ~ R_idle & R_cnt_max & ~ R_state ;
reg [0:3] Y1 ;
paramètre [3:0] A = 3' b001, B = 3' b010, C = 3' b100, D = 3' b000 ;
toujours @ (posedge clk)
commencer
case(Y1)
A:
if(L_down)
commencer
sortir = B ;
Y1 = B ;
fin
B: commencer
Si (R_down)
commencer
sortir = A ;
Y1 = A ;
fin
if(L_down)
commencer
sortir = C ;
Y1 = C ;
fin
fin
C:
Si (R_down)
commencer
sortir = B ;
Y1 = B ;
fin
D: commencer
Y1 = B ;
sortir = B ;
fin
ENDCASE
fin
endmodule