按鍵消抖電路設計——你們遇到的都是偽消抖


   最近要用上一個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攻城獅之家

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM