按键消抖电路设计——你们遇到的都是伪消抖
最近要用上一个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攻城狮之家