Paso 2: Botones y variedad de posición
Para el botón y módulo de matriz de posición, hay dos entradas de usuario, uno para mover la posición a la izquierda y otro para mover la posición a la derecha. Esto se logró mediante el uso de los botones en la DE2-115. Para compensar las imprecisiones causadas por la mecánica de los botones, necesitábamos les debounce. Cuando se pulsa un botón, oscilará hasta niveles fuera causando muchas aristas positivas. Esto es corregido contra rebotes que sólo creará un borde positivo por empuje. El debouncing código es una adaptación de código en la Página Web de FPGA 4 Fun. Se utilizó una máquina de estado finito para asignar en la posición de una matriz de 3 bits. El bit 3 es la salida del módulo y corresponde a la posición de nuestro objeto movible.
Debouncer fuente: http://www.fpga4fun.com/Debouncer2.html
Código:
alambre L_idle = (L_state == L_sync_1);
alambre L_cnt_max = & L_cnt; verdadera cuando todos los bits de PB_cnt de 1
REG [15:0] R_cnt;
alambre R_idle = (R_state == R_sync_1);
alambre R_cnt_max = & R_cnt;
siempre clk)
if(L_idle)
L_cnt < = 0; nada va
otra cosa
comenzar
L_cnt < = L_cnt + 16' d1; algo está pasando, incrementar el contador
if(L_cnt_max) L_state < = ~ L_state; Si el contador es maximizado, PB cambiado!
final
siempre clk)
if(R_idle)
R_cnt < = 0; nada va
otra cosa
comenzar
R_cnt < = R_cnt + 16' d1; algo está pasando, incrementar el contador
if(R_cnt_max) R_state < = ~ R_state; Si el contador es maximizado, PB cambiado!
final
asignar L_down = ~ L_idle & L_cnt_max & ~ L_state;
asignar R_down = ~ R_idle & R_cnt_max & ~ R_state;
REG [0:3] Y1;
parámetro [3:0] A = 3' b001, B = 3' b010, C = 3' b100, D = 3' b000;
siempre a (clk del posedge)
comenzar
Case(Y1)
A:
if(L_down)
comenzar
hacia fuera = B;
Y1 = B;
final
B: iniciar
Si (R_down)
comenzar
hacia fuera = A;
Y1 = A;
final
if(L_down)
comenzar
a = C;
Y1 = C;
final
final
C:
Si (R_down)
comenzar
hacia fuera = B;
Y1 = B;
final
D: empezar
Y1 = B;
hacia fuera = B;
final
endcase
final
endmodule