Hinder undvika spel (2 / 9 steg)
Steg 2: Knappar och Position Array
För tryckknapp och position array module finns det två användare ingångar, en för att flytta positionen till vänster och en för att flytta position till höger. Detta uppnåddes med hjälp av tryckknapparna på DE2-115. För att kompensera för de felaktigheter som orsakas av mekaniken i knapparna, behövde vi Dämpningstid dem. När en knapp trycks, kommer det svänger tills det planar ut orsakar många positiva kanter. Detta korrigeras av debouncing som kommer bara att skapa en positiv kant per push. Debouncing koden var anpassad från koden på webbplatsen för FPGA 4 Fun. Vi använde en ändlig tillståndsmaskin för att tilldela där positionen är i en 3 bitmatris. 3 bitars matrisen är produktionen av modulen och motsvarar positionen för våra rörliga objekt.
Debouncer Källa: http://www.fpga4fun.com/Debouncer2.html
Kod:
tråd L_idle = (L_state == L_sync_1);
tråd L_cnt_max = & L_cnt; sant när alla bitar av PB_cnt är 1: s
REG [15:0] R_cnt;
tråd R_idle = (R_state == R_sync_1);
tråd R_cnt_max = & R_cnt;
alltid clk)
IF(L_idle)
L_cnt < = 0; ingenting som händer
annat
börja
L_cnt < = L_cnt + 16' d1; något är på gång, ökar värdet för räknaren
IF(L_cnt_max) L_state < = ~ L_state; om räknaren är maxade ut, ändras PB!
slutet
alltid clk)
IF(R_idle)
R_cnt < = 0; ingenting som händer
annat
börja
R_cnt < = R_cnt + 16' d1; något är på gång, ökar värdet för räknaren
IF(R_cnt_max) R_state < = ~ R_state; om räknaren är maxade ut, ändras PB!
slutet
tilldela L_down = ~ L_idle & L_cnt_max & ~ L_state;
tilldela R_down = ~ R_idle & R_cnt_max & ~ R_state;
REG [0:3] Y1;
parameter [3:0] A = 3' b001, B = 3' b010, C = 3' b100, D = 3' b000;
alltid @ (posedge clk)
börja
Case(Y1)
A:
IF(L_down)
börja
ut = B;
Y1 = B;
slutet
B: börja
om (R_down)
börja
ut = A;
Y1 = A;
slutet
IF(L_down)
börja
ut = C;
Y1 = C;
slutet
slutet
C:
om (R_down)
börja
ut = B;
Y1 = B;
slutet
D: börja
Y1 = B;
ut = B;
slutet
ENDCASE
slutet
endmodule