按键消抖电路设计——你们遇到的都是伪消抖

   最近要用上一个key消抖的功能。于是找到了之前写的并放入博客的程序,发现居然全部有问题。http://www.cnblogs.com/sepeng/p/3477215.html —— 有问题,包括很多的网上程序也是有问题,不缺乏一些有名气的网咖的程序。包括某权某金等。

  绝大部分程序是      相隔N久采集一次和上一次采集的数据进行比较,而不是在N的这个时间段检测这输入数据是不是稳定的。

所以今天上传一个正确的代码,0->1   1->0 都可以消抖。

 1 module key_data_in  (
 2                     clock ,
 3                     rst_n ,
 4                     key_in ,
 5                     key_data
 6                     );
 7 input         clock ; 
 8 input         rst_n ; 
 9 input         key_in ; 
10 
11 output     reg    key_data ; 
12 
13 reg     key_reg0, key_reg1 ; 
14 wire     key_h  , key_l ; 
15 always @ (posedge clock or negedge rst_n)
16     if (!rst_n) begin 
17             key_reg0     <= 1'd0 ; 
18             key_reg1     <= 1'd0 ; 
19             end 
20     else begin 
21             key_reg1     <= key_reg0 ; 
22             key_reg0     <= key_in ; 
23             end
24 assign key_h = (key_reg0 & key_reg1) ? 1'd1 : 1'd0 ; 
25 assign key_l = (~(key_reg0 | key_reg1)) ? 1'd1 : 1'd0 ; 
26 
27 reg     [18:0]  tim_cnt ; 
28 always @ (posedge clock or negedge rst_n)
29     if (!rst_n) begin 
30             tim_cnt        <= 19'd0 ; 
31             key_data     <= 1'd0 ; 
32             end 
33     else  if (key_h| key_l)begin
34             if (&tim_cnt) 
35                 key_data<= key_reg1 ; 
36             else 
37                 tim_cnt <= tim_cnt + 19'd1 ; 
38             end 
39     else 
40             tim_cnt        <= 19'd0 ;     
41             
42 endmodule 

  之所以用19bit计时,是因为我的是50m时钟, f=20ns。所以这个程序最大消抖2^19*20ns=10ms

      需要者根据自己的需要来修改延时值

欢迎加入: FPGA广东交流群:162664354

      FPGA开发者联盟: 485678884

    微信公众号:FPGA攻城狮之家

 

 

原文地址:https://www.cnblogs.com/sepeng/p/5795270.html