程式碼下載
二進位到 BCD 轉換器(設計的頂層 VHDL):binary_to_bcd.vhd (5.8 KB)
二進位到 BCD 數位轉換器(必須包含在專案中):binary_to_bcd_digit.vhd (3.2 KB)
特點
- 二進位轉二進位編碼的十進位(BCD)轉換器元件的 VHDL 原始碼
- 可配置二進位輸入數字的大小
- 可配置 BCD 輸出位數
介紹
這詳細介紹了二進位到 BCD 轉換器電路,以 VHDL 編寫,用於 CPLD 和 FPGA。此元件透過並行介面從使用者邏輯讀取二進制數並輸出等效的 BCD 值。它是使用 Quartus II 版本 13.1.0 設計的。資源需求取決於實施情況。圖 1 說明了整合到系統中的二進位到 BCD 轉換器的典型範例。參考另一文章提供了使用此二進位到 BCD 轉換器製作多位七段顯示驅動器的範例設計。
圖 1. 範例實現
工作原理
此二進位到 BCD 轉換器背後的概念是將數字從一個移位暫存器移位到另一個移位暫存器,最高有效位元(MSB)優先。
假設你將一個數字從一個二進位暫存器一次一位地移到另一個二進位暫存器。每次移入一位,都會將暫存器中的目前數字加倍,並增加新的位。一旦移入了所有位,新的暫存器就包含原始數字。
該元件完成相同的過程來執行二進位到 BCD 的轉換。它每次移動一位。每次移位,它都會將暫存器的目前值加倍並加上新的位元。一旦將整個數字轉移,新的 BCD 數字就等於原始二進位數字。
由於每個 4bit BCD 數字的最大值為 9,因此,如果加倍過程的結果大於 9,則元組件需要進行調整。在這種情況下,1 被移入下一個更大的 BCD 數字的暫存器,並且當前數字的暫存器被調整以包含適當的值。表 1 列出了期望的結果。
如表所示,如果目前值是 0-4,則簡單的移位就會產生正確的值。如果大於 4,則需要對下一位進行操作,並且暫存器的三個 MSB 的邏輯輸入需要額外的邏輯。 LSB 總是接收從原始數字移入的下一位,在表中表示為「X」。
圖 2 顯示了用於實現該邏輯的電路。右下角的附加觸發器儲存了使能輸入的先前值,以便當 ena 訊號首次被斷言(ena = ‘1’和 prev_ena = ‘0’)時,電路可以清除暫存器以初始化轉換。
圖 2. 單數二進位到 BCD 轉換器邏輯
上述邏輯是一個單數二進位到 BCD 轉換器,包含在 binary_to_bcd_digit.vhd 檔案中。更高層級的 binary_to_bcd.vhd 檔案為 BCD 輸出的每個數字實例化單數位元轉換器,並將它們級聯在一起以形成多個二進位到 BCD 轉換器。此更高層級的邏輯還鎖存來自用戶邏輯的初始二進位值並將其儲存在移位暫存器中。它控制單數轉換器的使能,並從二進位移位暫存器執行適當數量的移位。最後輸出結果。圖 3 說明了這個概念。
圖 3. 多位二進位到 BCD 轉換器
設定二進制數大小和 BCD 位數
ENTITY 中的通用參數位元設定二進位輸入埠的寬度,定義轉換器所接受的二進位數範圍。
ENTITY 中的通用參數數字設定 bcd 輸出埠的寬度,定義轉換器輸出的 BCD 數字範圍。
這些參數所需的大小取決於應用程式。決定這些參數的大小有兩種常見情況:(1)計算表示所需二進位數範圍所需的 BCD 數字,或(2)計算驅動所需數量的 BCD 數字所需的二進位輸入大小。
根據位計算數字
在第一種情況下,使用者知道他的二進位輸入數字的大小,並且需要確定適當的 BCD 數字來表示他的輸入範圍。表示特定數量的二進位位元所需的最大 BCD 數字由公式 1 定義。
答案總是向上捨入(例如,14bit 需要 0.301*14 = 4.214,向上捨入為 5 位數字)。
根據數字計算位
在第二種情況下,使用者知道需要驅動多少個 BCD 數字,並且必須確定適當的二進位輸入大小來表示這些數字。表示特定數字所需的最大二進位位數由公式 2 定義。
答案總是向上捨入(例如,4 位數字需要 3.322*4 = 13.288,向上捨入為 14bit )。
二進位輸入和 BCD 輸出大小不匹配
如果轉換器指定的 BCD 位數設定為超過表示二進位輸入範圍所需的位數,則最高有效 BCD 數字將始終輸出「0000」。這樣的話,輸出總是正確的,只是範圍會比需要的更大,浪費邏輯。
如果為二進位輸入指定的位數超出了 BCD 數字可以表示的最大數,則任何過大的二進位輸入數都會溢出輸出。輸出的最高有效數字被截斷。例如,如果二進位範圍設定為 4 位,而 BCD 範圍設定為 1 位,則二進位輸入「1100」(十進位 12)將導致輸出「0010」(十進位 2)。
連接埠說明
表 2 描述了二進位到 BCD 轉換器的連接埠。
表 2. 連接埠說明
執行轉換
圖 4 描繪了一個範例轉換。在此範例中,二進位輸入配置為 10 位,BCD 輸出配置為 3 位。二進位輸入設定為“1110101000”(十進位936)。一旦 ena 輸入被斷言,二進位到 BCD 轉換器就會鎖存二進位值並開始轉換,並透過斷言 busy 訊號來表示。轉換完成後,轉換器將結果輸出到 bcd 端口,本例中為「100100110110」(十進位 936)。它取消斷言忙碌訊號以表明結果可用且轉換器已準備好接受另一次轉換。
圖 4. 轉換時序圖範例
轉換速度
由通用參數位元定義的二進位輸入埠的大小決定了轉換的速度。每次轉換需要 2 個位元 + 2 個系統時脈週期才能完成。
如果使用者邏輯將 ena 訊號保持為高電平,則轉換器在前一次轉換結束時立即開始另一次轉換。處理連續轉換的最大速率是位元 + 3 個時脈週期,因為組件需要一個額外的時脈週期才能識別出 ena 訊號已置位。
重置
為了使二進位到 BCD 轉換器元件能夠運行,reset_n 輸入連接埠必須具有邏輯高電平。此連接埠上的低邏輯電平非同步重置該元件。在重設期間,此元件將 busy 連接埠保持高位,以指示二進位到 BCD 轉換器不可用。任何正在進行的轉換都將中止,並且 bcd 輸出連接埠將被清除。一旦從重設狀態釋放,當二進位到 BCD 轉換器準備再次運作時,busy 埠就會失效。
總結
此二進位到 BCD 轉換器是一個可程式邏輯元件,可將二進位轉換為其等效的 BCD 數。二進位輸入數的範圍和BCD輸出值的範圍都是可設定的。
有關文章
7-Segment Display Driver for Multiple Digits (VHDL) - 此設計使用此處描述的二進位到 BCD 轉換器來驅動多個七段顯示數字。