基于FPGA的可逆數制轉碼器設計
摘要:針對二-十進制(BCD)數據相互轉換的FPGA實現目標,基于模塊層次化的設計思想,提出了一種高效、易于重構的可逆轉碼器設計方案。并在FPGA(Altera DE2)開發(fā)板上成功進行了12 b可逆轉碼器的設計驗證,實驗結果表明該轉碼器通過端口參數配置就可以完全實現不同位數的二-十進制(BCD)數據間的相互轉換。
關鍵詞:二-十進制(BCD);可逆轉碼器;FPGA;邏輯單元;TPD
0 引言
在數字系統的數據輸入、運算、輸出過程中,輸入和輸出常用十進制形式表達;而在系統內部采用二進制表示和處理數據則更為方便,因此在二進制和十進制數據間的轉換就是非常必要的。此外,數控機床、智能儀表、電子秤和數碼管等顯示設備也會頻繁地用到十進制(BCD)碼與二進制(BIN)碼的相互轉換。目前,數字系統中BCD碼和BIN碼的相互轉換有3類實現方法,首先是采用軟件算法的實現方式,傳統的是用DAA調節(jié)指令實現,但效率較低,不能滿足一些實時應用的要求。其次是純硬件運算實現方式,這種實現方式是數據轉換運算到硬件的直接映射,常采用邏輯運算和數據移位來實現數據轉換,轉換效率較高,可以根據輸入數據位寬進行轉換器的位數擴展和重構。但是在轉換數據位數較多時,運算量會顯著增加、硬件實現代價也較大、路徑延遲也會增大、整個轉換器的時序控制也會變的比較復雜,也很難做到可逆轉碼運算。最后是基于數據查找表(Look Up Tabie,LUT)的實現方式,也就是先把全部或部分轉換數據列表存儲在存儲器中,然后再根據轉碼器的輸入數據(地址碼)直接或間接地從存儲器中取出所需的輸出數據,這種以查找表為核心的轉換器運算速度快、算法直接簡單;但是會需要大量的存儲器;并且這種實現方法往往是針對具體的轉換數據位寬和單一轉換方向來定制存儲器(ROM)容量和存儲器初始化數據;一旦需要轉換的數據位數和方向發(fā)生變化,就根本無法實現轉換器的數據位數擴展和結構重構,所有的設計就必須重新開始。
基于FPGA的可逆數制轉碼器設計,充分利用FPGA的結構特點和硬件描述語言(Veilog HDL)的抽象和靈活性;二-十進制(BCD)轉碼器不但具有可配置雙向轉換數據的功能,而且還要求轉碼器簡單、高效和易于位數擴展(模塊化重構)。因此,文中就提出了一個高效、易于重構的二-十進制(BCD)可逆轉碼器設計方案,通過端口參數配置和模塊重構就能實現不同位數的數據在二進制和十進制(BCD)之間相互轉換,最后
在FPGA(DE2)開發(fā)板上成功地進行了設計驗證。
1 數制的轉換算法
假設X=(xn-1,xn-2,…,x0)p表示n位p進制數據,Y=(ym-1,ym-2,…,y0)q表示m位q進制數據,二者之間等值變換的條件為:
這里,X,Y所表示的數值范圍分別是[0,pn-1]和[0,qm-1]。而在二進制編碼體系下,要把一個n位p進制數據轉換為m位的q進制數據就要求輸入輸出的數據位寬必須滿足m=Ceil[n·logqp]=[n·logqp],這里用“∏”表示整數上確界Ceil運算,輸入輸出數據位寬關系如圖1所示。
圖1中的din=Ceil[log2 p]=[log2 p];dout=Ceil[log2 q]=[log2 q]分別表示1位輸入輸出數據的二進制位寬,例如1位的八進制數據需要3 b二進制數表示;而1位的十進制數據需要4 b二進制數表示,所以X→Y轉化的輸入、輸出數據位寬(單位:b)分別為:
n·din=n·[log2 p] (2)
m·dout=[n·logq p]·[log2 q] (3)
8421BCD碼是使用4 b二進制數表示1位10進制數(0~9)。如果把n位二進制數據轉換成m位BCD碼(4m位)就要求m位BCD碼所能表示的最大數不小于n位二進制碼所表示最大數,即10m-1≥2n-1,m≥Ceil[lg 2n]=『n·lg 2]。如果12位的二進制數轉換成十進制(BCD),根據式(3)算出輸出m位的十進制數據m=[n·logq p]=[12·lg2]=4;輸出數據位寬m·dout=m·[log2 q]=16 b。
2 二-十進制可逆轉碼器設計
2.1 可逆轉碼器的層次化設計
在片上數字系統(SOPC)中實現二-十進制(BCD)碼轉換器,就要求設計者充分利用硬件(FPGA)的結構特點和硬件描述語言(HDL)所提供的設計靈活性;更好地實現轉碼器的簡單、高效和結構易于擴展。為此,針對FPGA的結構特點提出了以下設計思路:以4 b數據轉換作為基本的可逆轉換單元來適應FPGA結構特點,而提高邏輯單元利用率、達到降低硬件代價的目的;利用Verilog HDL進行層次化設計描述,以4 b數據轉換單元為最底層模塊,構造出更大的5 b和6 b可逆轉換單元(模塊),這樣會在不增加實現代價的前提下,實現使用大的轉碼單元模塊來簡化轉碼器的結構、方便轉碼器的位數擴展;這種設計方法就為二-十進制(BCD)可逆轉碼器的構建提供了4 b,5 b和6 b三種不同大小的單元模塊,這會讓每一個轉換單元模塊都使用到恰到好處(需要小模塊的地方就不會使用大模塊);有效避免了單元模塊利用率不高的問題。
評論