如何检测一键按?

时间:2016-09-14 04:36:55

标签: verilog counter

我有一个在nexys4上运行的秒表电路,我可以用启动,停止和复位按钮控制它。因此,如果我点击开始,计数器开始计数直到停止或重置命中。我试图添加一个功能,当我按下另一个按钮时,计数器仅增加1位。现在时钟太快了,所以当我按下增量按钮时,它会增加多次,因为它检测到每个时钟边缘按下按钮。无论按下按钮多长时间,如何只按一下按钮?我需要一个去抖动电路吗?

由于

1 个答案:

答案 0 :(得分:1)

您需要的是上升沿检测器和一些去抖逻辑。 我将从上升沿检测器开始,因为这将解决大部分问题。

reg [3:0] resync;
reg       inc_cntr;
always @ (posedge clk)
begin 
   resync <= {resync{2:0},inc_btn};  // This will clock in the inc_btn signal and remove metastability.
   inc_cntr <= ~resync[3] & resync[2]; // Only high when the resync[3] was low and resent[2] is high.  
end

这无法解决的问题是,当按钮从上到下发生转换时,按钮会反弹很多。看看这个是为了理解去抖动。 Switch Debouncing

在这两个主题之间,你应该能够设计一个好的按钮过滤器。