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