2016-09-14 110 views
0

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

感谢

回答

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

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

+0

因此,如果我检测到按钮按下一个状态机并将输出状态发送到计数器以告诉它该做什么(计数,停止或增量),那么该去哪里?我可以把它扔进状态机吗?或者我应该这样做,因为它是自己的模块,当按下递增按钮时,将其发送到该模块(使用去抖动器)并将输出发送到计数器,告诉它增加1?这是一个基本的框图,它是如何工作的:http://imgur.com/a/b7iOe(控制器持有状态机) – user2817437

+0

好吧,我除了debouncer之外还有它的工作!去抖动器会直接放在“inc_cntr <=〜resync [3]&resync [2]”行之后,还是作为它自己的模块? – user2817437

+0

我会让你的debouncer成为一个单独的模块,因为你可能在你的下一个按钮项目中重用它。我会在同步器后反弹。所以预订inc_cntr脉冲会很好。你不想让debouncer变得稳定,syncronizer可以防止这种情况发生。 –