本帖最后由 dan_xb 于 2016-9-22 14:43 编辑
这个是我一直应用的防抖代码,很稳定:
module key (
input clk_50, //50MHz
input key_in, //Key High input
output trig_out //Paulse output
);
reg [19:0] counter; //20ms@50MHz = 1000000 cycle = 0xF4240
always @(posedge clk_50)
begin
if(key_in == 0)
counter <= 0;
else if(counter < 20'hF5000)
counter <= counter + 1;
end
assign trig_out = (counter == 20'hF4240 )? 1 : 0;
endmodule
解释一下,计数器计数时间为20ms
当Key=0时,计数器复位
当Key=1时,计数器开始计数
当计数到20ms时,计数停止,脉冲发出
只有当Key=0时,计数器才回复位,这是为了防止一直按着连发脉冲
如果计数中途Key掉下去,那么计数器复位,重新开始计数,防抖
|