按鍵消抖VERILOG實現


對於消抖,有很多種寫法。今天分享一下我的寫法。

基本思路:

1. 看圖

                                

                                  圖1                                                   圖2                                    圖3

  圖1 是理想的按鍵按下信號變化,圖2是FPGA采集到的按鍵按下的信號變化。圖3是一個外部干擾導致的一個錯誤。

      用什么辦法能把圖2中延續到我們圖1中一樣的信號呢,又怎樣濾除圖3中的干擾呢?

  在各位前輩的苦思下,總結出一個最好的解決辦法,就是延遲消抖:如果抖動在一定范圍內,系統不認為是一個正確的按鍵。

  正好今天我也是以延遲消抖的辦法來設計。 如圖3

       

  依照前輩們的經驗,抖動時間一般會少於20ms. 也就是說,如果數據穩定20ms,認為可以采集該數據。

  設計基本思想,如果計數計數到20'HF_FFFF,則認為此時狀態是穩定的狀態。若計數計數到中間某值,輸入有變化,則計數器會清零,重新計數。則等按鍵穩定20‘hf_ffff個時鍾為止。下面給出按鍵的程序

 1 `define UD #1
 2 module key_jitter(
 3      input clkin,
 4      
 5      input key_in,
 6      output key_value,
 7      output [15:0] tout
 8 );
 9 
10 // inner signal
11 reg [1:0] key_in_r;
12 wire pp;
13 reg [19:0] cnt_base;
14 reg key_value_r;
15 
16 //內部信號
17 always @(posedge clkin)
18     key_in_r<= `UD {key_in_r[0],key_in};
19 
20 // 檢測有輸入有沒有變化
21 assign pp = key_in_r[0]^key_in_r[1]; 
22 
23 //延遲計數器
24 always @(posedge clkin)
25     if(pp==1'b1)
26        cnt_base <= `UD 20'd0;
27     else
28        cnt_base <= `UD cnt_base + 1;
29 
30 //輸出
31 always @(posedge clkin)
32    if(cnt_base==20'hf_ffff)
33         key_value_r <= `UD key_in_r[0];
34 
35 assign key_value = key_value_r;
36 endmodule 

 

 


免責聲明!

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



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