2016-09-14 131 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可以防止這種情況發生。 –