Estoy trabajando en una placa FPGA y codificación en Verilog. Estoy tratando de usar el MicroJoystick instalado en LogicStartMegaWing, el escudo con Papilio-One 500k (mi placa FPGA). Tengo que hacer tareas simples como aumentar o disminuir una variable de registro en diferentes movimientos del joystick. Inicialmente, estaba ejecutando el código anterior en un bloque alwaya @ (SWITCH), es decir, el bloque se ejecutará siempre que haya un movimiento en el joystick (en este tablero el joystick comparte los pines con cinco interruptores). Esto llevó a la pérdida completa del control del cursor en la pantalla VGA (incrementos o decrementos múltiples muy rápidos), incluso con el menor movimiento del joystick.
Luego ejecuté el mismo código en un bloque always @ (slowclk) donde 'slowclk' es un reloj de 1Hz. Esto condujo a una mejora, ya que hubo incrementos o decrementos finitos y más lentos. Sin embargo, el problema no se resuelve completamente, es decir, en un solo movimiento del joystick hay varios incrementos en el registro.
¿Cómo puedo eliminar este rebote de la entrada a través del joystick? ¿Necesitas ayuda en esto? También estoy poniendo mi código para generar el slowclk y para usar el joystick.
EL CÓDIGO REVISADO COMPLETO:
//This increments/decrements number and displays on seven segment display on
//up/down movement of joystick; in an array of 8 LEDS shifts the glowing LED to
//right or left on left/right movement of joystick
//joystick (i.e. [4:0] SWITCH here) by default gives all ones
// input clock is at 32 Mhz
module Display(
input clk,
input [4:0] SWITCH,
output reg [3:0] Seg7_AN,
output reg Seg7_A,
output reg Seg7_B,
output reg Seg7_C,
output reg Seg7_D,
output reg Seg7_E,
output reg Seg7_F,
output reg Seg7_G,
output Seg7_DP,
output reg [7:0] LED
);
reg [3:0] number;
wire [4:0] clean;
Debounce stable(.clk(clk), .SWITCH(SWITCH), .clean(clean));
initial
begin
LED = 8'b00000001;
end
assign Seg7_DP = 1;
always @ (clean)
begin
if(clean[0]==0)
begin
if (number==9)
number <= 0;
else
number <= number+1;
end
else if (clean[1]==0)
begin
if (number==0)
number <= 9;
else
number <= number -1;
end
else if (clean[3] == 0)
begin
if (LED == 8'b00000001)
LED <= 8'b10000000;
else
LED <= LED >> 1;
end
else if (clean[4]==0)
begin
if (LED == 8'b10000000)
LED <= 8'b00000001;
else
LED <= LED << 1;
end
end
always @ (*)
begin
Seg7_AN <= 4'b0111;
case (number)
0 : begin Seg7_A<=0; Seg7_B<=0 ; Seg7_C<=0 ; Seg7_D<=0 ; Seg7_E<=0 ; Seg7_F<=0 ; Seg7_G<=1 ; end
1 : begin Seg7_A<=1; Seg7_B<=0 ; Seg7_C<=0 ; Seg7_D<=1 ; Seg7_E<=1 ; Seg7_F<=1 ; Seg7_G<=1 ; end
2 : begin Seg7_A<=0; Seg7_B<=0 ; Seg7_C<=1 ; Seg7_D<=0 ; Seg7_E<=0 ; Seg7_F<=1 ; Seg7_G<=0 ; end
3 : begin Seg7_A<=0; Seg7_B<=0 ; Seg7_C<=0 ; Seg7_D<=0 ; Seg7_E<=1 ; Seg7_F<=1 ; Seg7_G<=0 ; end
4 : begin Seg7_A<=1; Seg7_B<=0 ; Seg7_C<=0 ; Seg7_D<=1 ; Seg7_E<=1 ; Seg7_F<=0 ; Seg7_G<=0 ; end
5 : begin Seg7_A<=0; Seg7_B<=1 ; Seg7_C<=0 ; Seg7_D<=0 ; Seg7_E<=1 ; Seg7_F<=0 ; Seg7_G<=0 ; end
6 : begin Seg7_A<=0; Seg7_B<=1 ; Seg7_C<=0 ; Seg7_D<=0 ; Seg7_E<=0 ; Seg7_F<=0 ; Seg7_G<=0 ; end
7 : begin Seg7_A<=0; Seg7_B<=0 ; Seg7_C<=0 ; Seg7_D<=1 ; Seg7_E<=1 ; Seg7_F<=1 ; Seg7_G<=1 ; end
8 : begin Seg7_A<=0; Seg7_B<=0 ; Seg7_C<=0 ; Seg7_D<=0 ; Seg7_E<=0 ; Seg7_F<=0 ; Seg7_G<=0 ; end
9 : begin Seg7_A<=0; Seg7_B<=0 ; Seg7_C<=0 ; Seg7_D<=0 ; Seg7_E<=1 ; Seg7_F<=0 ; Seg7_G<=0 ; end
default : begin Seg7_A<=0; Seg7_B<=0 ; Seg7_C<=0 ; Seg7_D<=0 ; Seg7_E<=0 ; Seg7_F<=0 ; Seg7_G<=1 ; end
endcase
end
endmodule
module Debounce(
clk, SWITCH, clean
);
input wire clk;
input wire [4:0] SWITCH;
output reg [4:0] clean = 0;
reg [18:0] count = 0;
reg [4:0] new = 0;
SlowClock OneKHz (.clk(clk), .slowclk(slowclk));
always @(posedge slowclk)
begin
if (SWITCH != new)
begin
new <= SWITCH;
count <= 0;
end
else if (count == 20)
begin
clean <=new;
count <=0;
end
else
count <= count+1;
end
endmodule
module SlowClock(
input clk,
output reg slowclk
);
reg [63:0] i;
parameter delay = 32000;
initial
begin
slowclk = 0;
i = 64'd0;
end
always @ (posedge clk)
begin
if (i<delay)
begin
i= i+1;
end
else
begin
i = 64'd0;
slowclk = ~slowclk;
end
end
endmodule