程式碼下載
版本 2.0:debounce.vhd (3.1 KB)
增加異步低電平有效復位
使穩定時間的解析度更高且更易於指定
版本 1.0:debounce_v1.vhd (2.4 KB)
首次公開發布
特點
- 用於消除機械開關和按鈕抖動的 VHDL 原始碼
- 輸入需要穩定的可設定時間
- 可設定的系統時脈頻率
介紹
使用機械開關作為使用者介面是一種普遍的做法。然而,當這些開關被啟動時,觸點在進入穩定狀態之前經常會相互反彈或彈跳。這裡介紹的解彈跳組件(Debounce Component)是一個簡單的數位邏輯電路,可以解決這種暫時的模糊性(將 FPGA 或 CPLD 與按鈕或其他開關連接時的常見任務)。圖 1 展示了整合到系統中的解彈跳組件的典型範例。該元件是使用 Quartus Prime 17.0.0 Lite Edition 設計的。
圖 1. 範例實現
操作原理
圖 2 說明了解彈跳電路。它會連續將按鈕的邏輯電平計時到 FF1,然後計時到 FF2。因此,FF1和 FF2 總是儲存按鈕的最後兩個邏輯電平。當這兩個值在指定時間內保持相同時,FF3 被啟用,穩定值將被記錄到結果輸出。
XOR 閘和計數器完成計時。如果按鈕的電平發生變化,FF1 和 FF2 的值在一個時脈週期內會有所不同,從而透過 XOR 閘清除計數器。如果按鈕電平不變(即 FF1 和 FF2 為相同邏輯電平),則 XOR 閘釋放計數器的同步清除,計數器開始計數。計數器繼續以這種方式遞增,直到(1)達到指定時間並啟用輸出暫存器,或(2)由於按鈕的邏輯電平尚未穩定而被 XOR 閘中斷並清除。
圖 2. 解彈跳組件電路
配置
解彈跳元件是透過設定 ENTITY 中的 GENERIC 參數來配置的。參數說明如表 1 所示。大多數開關在啟動後 10ms 內達到穩定的邏輯電平,因此 stable_time 參數的預設值反映了這一點。
表 1. 通用參數說明
連接埠說明
表 2 描述了解彈跳組件的連接埠。
表 2. 連接埠說明
重置
reset_n 輸入連接埠必須具有邏輯高電平,解彈跳組件才能運作。此連接埠上的低邏輯電平會非同步重置組件。重設期間,此組件清除三個觸發器,將輸出結果設為「0」。一旦解除復位,解彈跳組件就會恢復運作。
結論
這個簡單的解彈跳邏輯電路解決了可程式邏輯的機械開關彈跳問題。
附錄:版本 1.0 的附加資料
此設計的版本 1.0 使用 N 位元計數器的大小來決定驗證按鈕穩定性所需的時間。圖 3 描述了該電路。當計數器遞增到其進位位元被置位時,它會禁止自身進一步遞增並啟用輸出暫存器 FF3。電路保持在這種狀態,直到不同的按鈕值被記錄到 FF1,透過 XOR 閘清除計數器。
圖 3. 版本 1.0 解彈跳電路
對於這種方法,計數器的大小和時脈頻率共同決定了驗證按鈕穩定性的時間段 P。公式 1 描述了這種關係。
在典型應用中,時鐘週期數很大,因此可以安全地忽略載入 FF2 和 FF3 所產生的額外兩個時脈週期。
大多數開關在啟動後 10ms 內達到穩定的邏輯電平。假設我們有一個 50MHz 時鐘,我們需要計數 0.01*50,000,000 = 500,000 個時鐘週期才能達到 10ms。19 位元計數器可以滿足此要求。使用計數器的進位引腳(如圖 1 所示),無需評估計數器的整個輸出匯流排。採用此方法,實際執行的時間為 219+2 / 50,000,000 = 10.49ms。
解彈跳通常不需要高水準的分辨率,因此使用進位引腳來識別驗證時間所引入的相對較小的誤差對於大多數應用來說是足夠的。然而,如果需要更高的時間分辨率,版本 2.0 可以滿足此要求。