Verilog实现软件消抖(野火)

软件消抖

时序图

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

代码

key_filter.v文件

module  key_filter
(
    input   wire    sys_clk     ,
    input   wire    sys_rst_n   ,
    input   wire    key_in      ,

    output  reg     key_flag    
);

reg     [19:0]  cnt;



always@(posedge sys_clk or negedge sys_rst_n) 
    if(sys_rst_n == 1'b0)
        cnt <= 20'd0;
    else    if(key_in == 1'b1)
        cnt <= 20'd0;
    else    if(cnt == 20'd999_999) //key_in处于低电平的情况
        cnt <= 20'd999_999;
    else
        cnt <= cnt + 20'd1;


always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        key_flag <= 1'b0;
    else    if(cnt == 20'd999_998) //当计数器计数到999_998时即20ms,key_flag产生一个脉冲信号
        key_flag <= 1'b1;
    else
        key_flag <= 1'b0;


endmodule

tb_key_filter.v文件

`timescale 1ns/1ns
module tb_key_filter();

//声明变量
reg     sys_clk;
reg     sys_rst_n;
reg     key_in;
wire    key_flag;

reg     [27:0]  tb_cnt;


//初始化变量
initial 
    begin
        sys_clk      = 1'b0;
        sys_rst_n   <= 1'b0;
        #20
        sys_rst_n   <= 1'b1;
    end

//系统时钟初始化,周期为20ns
always #10 sys_clk = ~sys_clk;

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        tb_cnt <= 28'd0;
    else    if(tb_cnt == 28'd2_500_000)
        tb_cnt <= 28'd0;
    else
        tb_cnt <= tb_cnt + 28'd1;

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        key_in <= 1'b1;
    else    if((tb_cnt > 28'd250_000) && (tb_cnt < 28'd500_000))
        key_in <= {$random} % 2;
    else    if((tb_cnt > 28'd500_000) && (tb_cnt < 28'd1_750_000))
        key_in <= 1'b0;
    else    if((tb_cnt > 28'd1_750_000) && (tb_cnt < 28'd2_000_000))
        key_in <= {$random} % 2;
    else
        key_in <= 1'b1;



//实例化
key_filter  key_filter_inst
(
    .sys_clk    (sys_clk)   ,
    .sys_rst_n  (sys_rst_n) ,
    .key_in     (key_in)    ,

    .key_flag   (key_flag)
);

endmodule
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值