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
发布了466 篇原创文章 · 获赞 279 · 访问量 75万+

猜你喜欢

转载自blog.csdn.net/qq_35608277/article/details/105399528