这是几个基础问题,但是没关系
先看一下逻辑分析仪采集到的按键抖动波形
上图所示的按键抖动时间在10ms
防抖的一种方法是出于抖动状态按键信号维持不动,当电平维持 5ms 以上时认为按键状态被改变。
按键的按下和松开的电平特征是形成了跳变沿,使用两个级联的DK触发器就可以实现
module button
(
input MCLK,
input in_key,
output key_shadow,
output reg Press
);
localparam debanceNum = 100000000/200 ;
assign key_shadow = in_key;
reg [31:0] CNT ;
reg [1:0] key_edge;
always @(posedge MCLK ) begin
key_edge[0] <= in_key;
key_edge[1] <= key_edge[0];
end
always @(posedge MCLK ) begin
if(key_edge == 2'b01 || key_edge == 2'b10)
CNT <= 0;
else if (CNT >= debanceNum) begin
Press <= in_key;
CNT <= 0;
end
else
CNT <= CNT + 1;
end
initial begin
CNT <= 0;
Press <= 0;
key_edge <= 0;
end
endmodule