先看框图,按键消抖意思就是前面和后面会有一系列信号抖动,中间才是我们要的信号。这里预设中间需要的信号>20ms。用计数器计数,key_in低电平就开始计数,高电平就清零。等计数器能计数到M-1(20ms)时输出一个高电平。
这个按键消抖verilog代码不难写
module key_filter
#(parameter CNT_MAX = 20'd999_999)
(
input wire sys_clk,
input wire sys_rst_n,
input wire key_in,
output reg key_flag
);
reg [19:0] cnt_20ms;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 0)
cnt_20ms <= 20'd0;
else if(key_in == 1'b1)
cnt_20ms <= 20'd0;
else if(key_in == CNT_MAX)
cnt_20ms <= CNT_MAX;
else
cnt_20ms <= cnt_20ms + 20