對於消抖,有很多種寫法。今天分享一下我的寫法。
基本思路:
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
