消除抖动模块code

打印 上一主题 下一主题

主题 1043|帖子 1043|积分 3129

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
消抖部分code
  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2025/01/19 20:58:44
  7. // Design Name:
  8. // Module Name: key_filter
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module key_filter
  22.     #(
  23.         parameter   CNT_MAX =   20'd999_999
  24.     )
  25.    
  26.     (
  27.     input   wire    sys_clk         ,
  28.     input   wire    sys_rst_n       ,
  29.     input   wire    key_in          ,
  30.    
  31.     output  reg     key_flag
  32.     );
  33.    
  34.     reg [19:0]  cnt_20ms    ;
  35.    
  36.     always@( posedge sys_clk or negedge sys_rst_n )
  37.     begin
  38.         if( sys_rst_n == 1'b0 )
  39.         begin
  40.             cnt_20ms    <=  20'd0   ;
  41.         end
  42.         else    if( key_in == 1'b1 )
  43.         begin
  44.             cnt_20ms    <=  20'd0   ;
  45.         end
  46.         else   if( cnt_20ms == CNT_MAX && key_in == 1'b0 )
  47.         begin
  48.             cnt_20ms    <=  cnt_20ms    ;
  49.         end
  50.         else
  51.         begin
  52.             cnt_20ms    <=  cnt_20ms    +   1'b1    ;
  53.         end
  54.     end
  55.    
  56.     always@( posedge sys_clk or negedge sys_rst_n )
  57.     begin
  58.         if( sys_rst_n == 1'b0 )
  59.         begin
  60.             key_flag    <=  1'b0    ;
  61.         end
  62.         else    if( cnt_20ms == CNT_MAX - 1'b1 )
  63.         begin
  64.             key_flag    <=  1'b1    ;
  65.         end
  66.         else
  67.         begin
  68.             key_flag    <=  1'b0    ;
  69.         end
  70.     end
  71.    
  72. endmodule
复制代码
tb
  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2025/01/19 21:28:47
  7. // Design Name:
  8. // Module Name: tb_key_filter
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module tb_key_filter();
  22.     parameter   CNT_1MS        =       20'd19          ,
  23.                  CNT_11MS       =       20'd69          ,
  24.                  CNT_41MS       =       20'd149         ,
  25.                  CNT_51MS       =       20'd199         ,
  26.                  CNT_60MS       =       20'd249         ;
  27.                                                                                                             
  28.     wire        key_flag        ;
  29.     reg         sys_clk         ;
  30.     reg         sys_rst_n       ;
  31.     reg         key_in          ;
  32.    
  33.     reg [21:0]  tb_cnt          ;
  34.    
  35.     initial
  36.     begin
  37.         sys_clk     =       1'b1        ;
  38.         sys_rst_n   <=      1'b0        ;
  39.         #20     ;
  40.         sys_rst_n   <=      1'b1        ;
  41.     end  
  42.     always #10 sys_clk  =   ~sys_clk    ;
  43.    
  44.     //tb_cnt模拟抖动
  45.     always@(posedge sys_clk or negedge sys_rst_n )
  46.     begin
  47.         if( sys_rst_n == 1'b0 )
  48.         begin
  49.             tb_cnt  <=  22'd0   ;
  50.         end
  51.         else if( tb_cnt == CNT_60MS )
  52.         begin
  53.             tb_cnt  <=  22'd0   ;
  54.         end
  55.         else
  56.         begin
  57.             tb_cnt  <=  tb_cnt  + 1'b1  ;
  58.         end      
  59.     end
  60.    
  61.     // key_in   模拟案件输入
  62.     always@( posedge sys_clk or negedge sys_rst_n )
  63.     begin
  64.         if( sys_rst_n == 1'b0 )
  65.         begin
  66.             key_in  <=      1'b1        ;   
  67.         end
  68.         else if( (tb_cnt >= CNT_1MS && tb_cnt <= CNT_11MS)
  69.                     ||
  70.                  (tb_cnt >= CNT_41MS && tb_cnt <= CNT_41MS)
  71.                )
  72.         begin
  73.             key_in  <=      {$random}%2 ;
  74.         end
  75.         else if( tb_cnt >= CNT_11MS && tb_cnt <= CNT_41MS )
  76.         begin
  77.             key_in  <=      1'b0        ;
  78.         end
  79.         else
  80.         begin
  81.             key_in  <=      1'b1        ;
  82.         end
  83.         
  84.     end                                                                                                                                          
  85.     key_filter
  86.     #(
  87.         .CNT_MAX    (20'd24)
  88.     )
  89.    
  90.     key_filter_inst
  91.     (
  92.         .sys_clk        (sys_clk)       ,
  93.         .sys_rst_n      (sys_rst_n)     ,
  94.         .key_in         (key_in)        ,
  95.         
  96.         .key_flag       (key_flag)
  97.     );
  98. endmodule
复制代码
结果


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表