总体思路:
1.先探测按键是否按下与松开
2.计时,计到一定数值(一般为10-20ms)再计进行探测,如果仍为按下或松开的值,则识别为按键的确有变化,否则为毛刺.
对于第一步没有什么疑问,都是要先进行按键是否变化的一个判断,对于第二步,在网上产生了大致两种思路:
1.第一次探测到按键变化,则进行计数计数到10ms,然后输出此时的按键值
2.每探测到变化,均重新使能计数器计数,当计数器达到10ms后输出此时的按值.
在网上看到一篇按键消抖的文章, 作者在里面贴出了一段老外写的代码,是VHDL写的,我觉得比较简练,暂时也没有想到什么弊端.我把代码转成了verilog语言,如下:
module debounce_style2 (
clk,
rst_n,
pin_in,
pin_out
);
input clk, rst_n;
input pin_in;
output pin_out;
parameter DELAY_TIME_10MS = 16'd199_999;
reg pin_reg;
reg [15:0] delay_counter;
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
pin_reg <= 1'b1;
else if (delay_counter == DELAY_TIME_10MS)
pin_reg <= ~pin_reg;
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
delay_counter <= 'd0;
else if (delay_counter == DELAY_TIME_10MS)
delay_counter <= 'd0;
else if (pin_reg ^ pin_in)
delay_counter <= delay_counter + 1;
else
delay_counter <= 'd0;
end
assign pin_out = pin_reg;
endmodule