一、背景介绍
在FPGA中,经常利用按键开关去复位或者控制小灯等功能。由于通常所使用的开关为机械弹性开关,当按下或松开按键时,由于弹片的物理特性,不能立即闭合或断开,往往会在断开或闭合的短时间内产生机械抖动,抖动有可能会引起电路的误判,因此需要对按键进行消抖。
按键去抖的思路是检测到按下(弹起)时延时 一段时间(20ms),再检测,如果状态仍为按下(弹起),则确认是按下(弹起)的;如果状态为弹起(按下)的,则确认是干扰,无按键按下(弹起)。
二、Verilog设计
module key_debounce(
input clk, //FPGA clock : 50M
input key,
output wire debounced_key
);
reg [31:0] delay_cnt; //dealy cnt for 20ms
reg key_reg;
reg key_value;
always @(posedge clk ) begin
key_reg <= key;
if(key_reg != key) //detect the key state changed
delay_cnt <= 32'd1000000; //delay cnt initial time :20ms
else if(key_reg == key) begin
if(delay_cnt > 32'd0)
delay_cnt <= delay_cnt - 1'b1;
else
delay_cnt <= delay_cnt;
end
end
always @(posedge clk ) begin
if(delay_cnt == 32'd1) //the key state keep steady for 20ms
key_value <= key;
else
key_value <= debounced_key;
end
assign debounced_key = key & key_value ;
endmodule
三、参考资料
1. 正点原子逻辑设计指南v1.9 p89