消除抖动模块code

消抖部分code

复制代码
`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2025/01/19 20:58:44
// Design Name: 
// Module Name: key_filter
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module key_filter
    #(
        parameter   CNT_MAX =   20'd999_999
    )
    
    (

    input   wire    sys_clk         ,
    input   wire    sys_rst_n       ,
    input   wire    key_in          ,
    
    output  reg     key_flag

    );
    
    reg [19:0]  cnt_20ms    ;
    
    always@( posedge sys_clk or negedge sys_rst_n )
    begin
        if( sys_rst_n == 1'b0 )
        begin
            cnt_20ms    <=  20'd0   ;
        end
        else    if( key_in == 1'b1 )
        begin
            cnt_20ms    <=  20'd0   ;
        end
        else   if( cnt_20ms == CNT_MAX && key_in == 1'b0 )
        begin
            cnt_20ms    <=  cnt_20ms    ;
        end
        else
        begin
            cnt_20ms    <=  cnt_20ms    +   1'b1    ;
        end
    end
    
    always@( posedge sys_clk or negedge sys_rst_n )
    begin
        if( sys_rst_n == 1'b0 )
        begin
            key_flag    <=  1'b0    ;
        end
        else    if( cnt_20ms == CNT_MAX - 1'b1 )
        begin
            key_flag    <=  1'b1    ;
        end
        else
        begin
            key_flag    <=  1'b0    ;
        end
    end
    
endmodule

tb

复制代码
`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2025/01/19 21:28:47
// Design Name: 
// Module Name: tb_key_filter
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module tb_key_filter();

    parameter   CNT_1MS        =       20'd19          ,
                 CNT_11MS       =       20'd69          ,
                 CNT_41MS       =       20'd149         ,
                 CNT_51MS       =       20'd199         ,
                 CNT_60MS       =       20'd249         ;
                                                                                                             
    wire        key_flag        ;
    reg         sys_clk         ;
    reg         sys_rst_n       ;
    reg         key_in          ;
    
    reg [21:0]  tb_cnt          ;
    
    initial
    begin
        sys_clk     =       1'b1        ;
        sys_rst_n   <=      1'b0        ;
        #20     ;
        sys_rst_n   <=      1'b1        ;
    end  
    always #10 sys_clk  =   ~sys_clk    ;
    
    //tb_cnt模拟抖动
    always@(posedge sys_clk or negedge sys_rst_n )
    begin
        if( sys_rst_n == 1'b0 )
        begin
            tb_cnt  <=  22'd0   ;
        end
        else if( tb_cnt == CNT_60MS )
        begin
            tb_cnt  <=  22'd0   ;
        end
        else 
        begin
            tb_cnt  <=  tb_cnt  + 1'b1  ;
        end       
    end 
    
    // key_in   模拟案件输入
    always@( posedge sys_clk or negedge sys_rst_n )
    begin
        if( sys_rst_n == 1'b0 )
        begin
            key_in  <=      1'b1        ;    
        end
        else if( (tb_cnt >= CNT_1MS && tb_cnt <= CNT_11MS)
                    ||
                 (tb_cnt >= CNT_41MS && tb_cnt <= CNT_41MS) 
               )
        begin
            key_in  <=      {$random}%2 ;
        end
        else if( tb_cnt >= CNT_11MS && tb_cnt <= CNT_41MS )
        begin
            key_in  <=      1'b0        ;
        end
        else
        begin
            key_in  <=      1'b1        ;
        end
        
    end                                                                                                                                          

    key_filter
    #(
        .CNT_MAX    (20'd24)
    )
    
    key_filter_inst
    (
        .sys_clk        (sys_clk)       ,
        .sys_rst_n      (sys_rst_n)     ,
        .key_in         (key_in)        ,
        
        .key_flag       (key_flag)
    );

endmodule

结果

相关推荐
FPGA-ADDA10 小时前
第四篇:嵌入式系统常用通信接口详解(I2C、SPI、UART、RS232/485、CAN、USB)
人工智能·单片机·嵌入式硬件·fpga开发·信息与通信
421!19 小时前
ESP32学习笔记之GPIO
开发语言·笔记·单片机·嵌入式硬件·学习·算法·fpga开发
dMing`20 小时前
基于FPGA的简易数据采集系统
fpga开发·fpga·adc·dac
LCMICRO-133108477461 天前
长芯微LD9689完全P2P替代AD9689,是一款双通道、14位、2.0 GSPS/2.6 GSPS模数转换器(ADC)
网络·单片机·嵌入式硬件·网络协议·fpga开发·硬件工程·高速adc
萨文 摩尔杰1 天前
GPS原理学习
学习·fpga开发
Huangichin1 天前
跟着Gemini学System Verilog
fpga开发
LCMICRO-133108477462 天前
长芯微LDC90810完全P2P替代ADC128D818,是一款八通道系统监控器,专为监控复杂系统状态而设计。
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·模数转换芯片adc
s09071362 天前
保姆级教程十二:USB摄像头接入!ZYNQ+OpenCV+FPGA硬件加速图像处理实战(视觉终极篇)
图像处理·opencv·fpga开发·zynq·硬件加速
CoderIsArt2 天前
FPGA-based 量子电路仿真
fpga开发
碎碎思2 天前
升级版流水灯:用FPGA控制上千颗RGB LED
fpga开发