最近要用上一个key消抖的功能。于是找到了之前写的并放入博客的程序,发现居然全部有问题。http://www.cnblogs.com/sepeng/p/3477215.html —— 有问题,包括很多的网上程序也是有问题,不缺乏一些有名气的网咖的程序。包括某权某金等。
绝大部分程序是 相隔N久采集一次和上一次采集的数据进行比较,而不是在N的这个时间段检测这输入数据是不是稳定的。
所以今天上传一个正确的代码,0->1 1->0 都可以消抖。
module key_data_in (
clock ,
rst_n ,
key_in ,
key_data
);
input clock ;
input rst_n ;
input key_in ; output reg key_data ; reg key_reg0, key_reg1 ;
wire key_h , key_l ;
always @ (posedge clock or negedge rst_n)
if (!rst_n) begin
key_reg0 <= 'd0 ;
key_reg1 <= 'd0 ;
end
else begin
key_reg1 <= key_reg0 ;
key_reg0 <= key_in ;
end
assign key_h = (key_reg0 & key_reg1) ? 'd1 : 1'd0 ;
assign key_l = (~(key_reg0 | key_reg1)) ? 'd1 : 1'd0 ; reg [:] tim_cnt ;
always @ (posedge clock or negedge rst_n)
if (!rst_n) begin
tim_cnt <= 'd0 ;
key_data <= 'd0 ;
end
else if (key_h| key_l)begin
if (&tim_cnt)
key_data<= key_reg1 ;
else
tim_cnt <= tim_cnt + 'd1 ;
end
else
tim_cnt <= 'd0 ; endmodule
之所以用19bit计时,是因为我的是50m时钟, f=20ns。所以这个程序最大消抖2^19*20ns=10ms
需要者根据自己的需要来修改延时值
欢迎加入: FPGA广东交流群:162664354
FPGA开发者联盟: 485678884
微信公众号:FPGA攻城狮之家