按键消抖
按键是FPGA实验工程中常见的电子元器件,通常用作系统复位信号或者控制。外部信号的输入。按键消抖主要针对的是机械弹性开关(按下去,一旦松开就会弹上去),当机械触点断开、闭合时,由于机械触点的弹性作用,按键开关在闭合时不会立刻稳定的接通,在断开时也不会一下子断开。按键在闭合和断开的瞬间会有一连串的抖动,为了保证系统能够正确识别按键开关,必须进行消抖处理。
按键消抖分为硬件消抖和软件消抖,硬件消抖会使用额外的器件,占用空间,增加布局布线复杂度。这里讲的是软件消抖,适用于按键比较多的情况。
verilog实现消抖
主要是通过一个延时计数器,当在某个延时时间内按键没有发生抖动此时可以认为按键稳定,可以输出。
这里假定按键的默认状态为0,被按下后为1。
按键抖动时长小于20ms,也即使用20ms的消抖时间
实现代码如下
module debounce(
input clk,//12Mhz
input rst_n,
input key_in,
output key_flag
);
parameter JITTER = 240;//12Mhz / (1/20ms)
reg [1:0] key_r;
wire change;
reg [15:0] delay_cnt;
always @(posedge clk or negedge rst_n)begin
if(rst_n == 1'b0)begin
key_r <= 0;
end
else begin
key_r <= {key_r[0],key_in};
end
end
assign change = (~key_r[1] & key_r[0]) | (key_r[1] & ~key_r[0]);
always @(posedge clk or negedge rst_n)begin
if(rst_n == 1'b0)begin
delay_cnt <= 0;
end
else if(change == 1'b1)
delay_cnt <= 0;
else if(delay_cnt == JITTER)
delay_cnt <= delay_cnt;
else
delay_cnt <= delay_cnt + 1;
end
assign key_flag = ((delay_cnt == JITTER - 1) && (key_in == 1'b1))? 1'b1:
1'b0;
endmodule