FPGA按键消抖

1、按键消抖原理图

在这里插入图片描述
在这里插入图片描述

2、代码编写

module key_debounce(
    input sys_clk,
    input sys_rst_n,

    input key,

    output reg key_filter
);


//parameter define
parameter CNT_MAX = 20'd100_0000; //消抖时间 20ms

//reg define
reg [19:0] cnt ;
reg key_d0; //将按键信号延迟一个时钟周期
reg key_d1; //将按键信号延迟两个时钟周期

always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n) begin
        key_d0 <= 1'b1;
        key_d1 <= 1'b1;
    end
    else begin
        key_d0 <= key;
        key_d1 <= key_d0;
    end
end

always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n) begin
        cnt <= CNT_MAX;
    end
    else if (key_d0 != key_d1) begin
         cnt <= CNT_MAX;
    end
    else begin
        if(cnt > 20'd0) begin
            cnt <= cnt -1'd1;
        end
        else begin
            cnt <= 20'd0;
        end
    end
end

always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n) begin
        key_filter <= 1'b1;
    end
    else if (cnt == 20'd0) begin
        key_filter <= key_d1;
    end
    else begin 
         key_filter <= key_filter;
    end
end
endmodule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值