按键消抖实现(verilog)

按键消抖

按键是FPGA实验工程中常见的电子元器件,通常用作系统复位信号或者控制。外部信号的输入。按键消抖主要针对的是机械弹性开关(按下去,一旦松开就会弹上去),当机械触点断开、闭合时,由于机械触点的弹性作用,按键开关在闭合时不会立刻稳定的接通,在断开时也不会一下子断开。按键在闭合和断开的瞬间会有一连串的抖动,为了保证系统能够正确识别按键开关,必须进行消抖处理。
按键消抖分为硬件消抖和软件消抖,硬件消抖会使用额外的器件,占用空间,增加布局布线复杂度。这里讲的是软件消抖,适用于按键比较多的情况。

verilog实现消抖

主要是通过一个延时计数器,当在某个延时时间内按键没有发生抖动此时可以认为按键稳定,可以输出。

这里假定按键的默认状态为0,被按下后为1。
按键抖动时长小于20ms,也即使用20ms的消抖时间

实现代码如下

module debounce(
    input           clk,//12Mhz
    input           rst_n,
    input           key_in,
    output          key_flag
);
parameter   JITTER  =   240;//12Mhz / (1/20ms)
reg   [1:0]     key_r;
wire             change;
reg   [15:0]    delay_cnt;
always @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        key_r <= 0;
    end
    else begin
        key_r <= {key_r[0],key_in};
    end
end
assign  change = (~key_r[1] & key_r[0]) | (key_r[1] & ~key_r[0]);
always @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        delay_cnt <= 0;
    end
    else if(change == 1'b1)
        delay_cnt <= 0;
    else if(delay_cnt == JITTER)
        delay_cnt <= delay_cnt;
    else 
        delay_cnt <= delay_cnt + 1;
end
assign  key_flag = ((delay_cnt == JITTER - 1) && (key_in == 1'b1))? 1'b1: 
1'b0;
endmodule

你可能感兴趣的:(数字ic,fpga开发)