FPGA 去抖模块 verilog代码

`timescale 1ns / 1ps
module key_skew(
    clk    ,
    rst_n  ,
    //其他信号
    key,
    led
    );

    //参数定义
    parameter      DATA_W =         20;
    parameter      CNT20MS_W = 1000000;
    //输入信号定义
    input               clk    ;//50M
    input               rst_n  ;//接的按键,按键按下为1 ,所以复位值为1
    input               key    ;
    //输出信号定义
    output              led   ;

    //输出信号reg定义
    reg                 key_out   ;

    //中间信号定义
    reg                 key_in_r;
    reg                 key_in_r1;
    reg                 key_out;    
    reg[DATA_W-1:0]     cnt_20ms;
    wire                key_press_flag;
 
    //key_in_r  打2拍,去亚稳态, 作为输入信号
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b1)begin
            key_in_r<=0;
        end
        else  begin
            key_in_r<=key;
            key_in_r1<=key_in_r;
        end 
    end
    assign   key_press_flag=key_in_r^key_in_r1;//此处异或,判断是否有按键按下
    //

     //cnt_20ms   不停的数20ms,但是有按键按下的时候重新数。
    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b1)begin
            cnt_20ms<=0;
        end
        else if( cnt_20ms==CNT20MS_W-1||key_press_flag) begin
            cnt_20ms<=0;
        end
        else begin
            cnt_20ms<=cnt_20ms+1;           
        end
    end
    //key_out  20ms 缓存一次key_in_r的值
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b1)begin
            key_out<=0;
        end
        else if( cnt_20ms==CNT20MS_W-1) begin
            key_out<=key_in_r;
        end
        else begin
            key_out<=key_out;
        end
    end
    assign led=key_out;//led就是key_out,wire连起来的
endmodule
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值