首先,做两个假定,以方便后面的描述:
- 假定按键的默认状态为0,被按下后为1
- 假定按键抖动时长小于20ms,也即使用20ms的消抖时间
方案1:在按键电平稳定的情况下,当第一次检测到键位电平变化,开始20ms计时,计时时间到后将按键电平更新为当前电平
方案2:在20ms计时的过程中,有任何的电平变化都立即复位计时
方案3:在有电平变化时立即改变按键输出电平,并开始20ms计时,忽略这其中抖动
1、方案1代码:
module debounce(
input wire clk, nrst,
input wire key_in,
output reg key_out
);
// 20ms parameter
// localparam TIME_20MS = 1_000_000;
localparam TIME_20MS = 1_000; // just for test
// variable
reg [20:0] cnt;
reg key_cnt;
// debounce time passed, refresh key state
always @(posedge clk or negedge nrst) begin
if(nrst == 0)
key_out
关注
打赏