1.简介
通常我们所使用的开关为机械弹性开关, 当我们按下或松开按键时, 由于弹片的物理特性,不能立即闭合或断开,往往会在断开或闭合的短时间内产生机械抖动,消除这种抖动的过程即称为按键消抖。
2.方法
一般情况下,抖动的总时间会持续20ms以内,按下按键后,等20ms过去了再取键值就行了。
3.Verilog实现
module key_debounce(
input sys_clk ,
input sys_rst_n ,
input key , //外部输入的按键值
output reg key_value , //消抖后的按键值
output reg key_flag //消抖后的按键值有效标志
);
reg [19:0] cnt ;
reg [1:0]key_reg ;
always @ (posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
key_reg <= 'b0;
else begin
key_reg[0] <= key;
key_reg[1] <= key_reg[0];
end
end
always @ (posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
cnt <= 20'd0;
else begin
if(key_reg[0] != key_reg[1]) //检测到按键状态发生变化
cnt <= 20'd100_0000; //则将计数器置为 20'd100_0000,即延时20ms
else begin //如果当前按键值和前一个按键值一样,即按键没有发生变化
if(cnt > 20'd0) //则计数器递减到 0
cnt <= cnt - 1'b1;
else
cnt <= 20'd0;
end
end
end
//将消抖后的最终的按键值送出去
always @ (posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n) begin
key_value <= 1'b1;
key_flag <= 1'b0;
end
//在计数器递减到 1 时送出按键值
else if(cnt == 20'd1) begin
key_value <= key;
key_flag <= 1'b1;
end
else begin
key_value <= key_value;
key_flag <= 1'b0;
end
end
endmodule