基于FPGA的可逆數(shù)制轉(zhuǎn)碼器設(shè)計(jì)
摘要:針對(duì)二-十進(jìn)制(BCD)數(shù)據(jù)相互轉(zhuǎn)換的FPGA實(shí)現(xiàn)目標(biāo),基于模塊層次化的設(shè)計(jì)思想,提出了一種高效、易于重構(gòu)的可逆轉(zhuǎn)碼器設(shè)計(jì)方案。并在FPGA(Altera DE2)開發(fā)板上成功進(jìn)行了12 b可逆轉(zhuǎn)碼器的設(shè)計(jì)驗(yàn)證,實(shí)驗(yàn)結(jié)果表明該轉(zhuǎn)碼器通過(guò)端口參數(shù)配置就可以完全實(shí)現(xiàn)不同位數(shù)的二-十進(jìn)制(BCD)數(shù)據(jù)間的相互轉(zhuǎn)換。
關(guān)鍵詞:二-十進(jìn)制(BCD);可逆轉(zhuǎn)碼器;FPGA;邏輯單元;TPD
0 引言
在數(shù)字系統(tǒng)的數(shù)據(jù)輸入、運(yùn)算、輸出過(guò)程中,輸入和輸出常用十進(jìn)制形式表達(dá);而在系統(tǒng)內(nèi)部采用二進(jìn)制表示和處理數(shù)據(jù)則更為方便,因此在二進(jìn)制和十進(jìn)制數(shù)據(jù)間的轉(zhuǎn)換就是非常必要的。此外,數(shù)控機(jī)床、智能儀表、電子秤和數(shù)碼管等顯示設(shè)備也會(huì)頻繁地用到十進(jìn)制(BCD)碼與二進(jìn)制(BIN)碼的相互轉(zhuǎn)換。目前,數(shù)字系統(tǒng)中BCD碼和BIN碼的相互轉(zhuǎn)換有3類實(shí)現(xiàn)方法,首先是采用軟件算法的實(shí)現(xiàn)方式,傳統(tǒng)的是用DAA調(diào)節(jié)指令實(shí)現(xiàn),但效率較低,不能滿足一些實(shí)時(shí)應(yīng)用的要求。其次是純硬件運(yùn)算實(shí)現(xiàn)方式,這種實(shí)現(xiàn)方式是數(shù)據(jù)轉(zhuǎn)換運(yùn)算到硬件的直接映射,常采用邏輯運(yùn)算和數(shù)據(jù)移位來(lái)實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換,轉(zhuǎn)換效率較高,可以根據(jù)輸入數(shù)據(jù)位寬進(jìn)行轉(zhuǎn)換器的位數(shù)擴(kuò)展和重構(gòu)。但是在轉(zhuǎn)換數(shù)據(jù)位數(shù)較多時(shí),運(yùn)算量會(huì)顯著增加、硬件實(shí)現(xiàn)代價(jià)也較大、路徑延遲也會(huì)增大、整個(gè)轉(zhuǎn)換器的時(shí)序控制也會(huì)變的比較復(fù)雜,也很難做到可逆轉(zhuǎn)碼運(yùn)算。最后是基于數(shù)據(jù)查找表(Look Up Tabie,LUT)的實(shí)現(xiàn)方式,也就是先把全部或部分轉(zhuǎn)換數(shù)據(jù)列表存儲(chǔ)在存儲(chǔ)器中,然后再根據(jù)轉(zhuǎn)碼器的輸入數(shù)據(jù)(地址碼)直接或間接地從存儲(chǔ)器中取出所需的輸出數(shù)據(jù),這種以查找表為核心的轉(zhuǎn)換器運(yùn)算速度快、算法直接簡(jiǎn)單;但是會(huì)需要大量的存儲(chǔ)器;并且這種實(shí)現(xiàn)方法往往是針對(duì)具體的轉(zhuǎn)換數(shù)據(jù)位寬和單一轉(zhuǎn)換方向來(lái)定制存儲(chǔ)器(ROM)容量和存儲(chǔ)器初始化數(shù)據(jù);一旦需要轉(zhuǎn)換的數(shù)據(jù)位數(shù)和方向發(fā)生變化,就根本無(wú)法實(shí)現(xiàn)轉(zhuǎn)換器的數(shù)據(jù)位數(shù)擴(kuò)展和結(jié)構(gòu)重構(gòu),所有的設(shè)計(jì)就必須重新開始。
基于FPGA的可逆數(shù)制轉(zhuǎn)碼器設(shè)計(jì),充分利用FPGA的結(jié)構(gòu)特點(diǎn)和硬件描述語(yǔ)言(Veilog HDL)的抽象和靈活性;二-十進(jìn)制(BCD)轉(zhuǎn)碼器不但具有可配置雙向轉(zhuǎn)換數(shù)據(jù)的功能,而且還要求轉(zhuǎn)碼器簡(jiǎn)單、高效和易于位數(shù)擴(kuò)展(模塊化重構(gòu))。因此,文中就提出了一個(gè)高效、易于重構(gòu)的二-十進(jìn)制(BCD)可逆轉(zhuǎn)碼器設(shè)計(jì)方案,通過(guò)端口參數(shù)配置和模塊重構(gòu)就能實(shí)現(xiàn)不同位數(shù)的數(shù)據(jù)在二進(jìn)制和十進(jìn)制(BCD)之間相互轉(zhuǎn)換,最后
在FPGA(DE2)開發(fā)板上成功地進(jìn)行了設(shè)計(jì)驗(yàn)證。
1 數(shù)制的轉(zhuǎn)換算法
假設(shè)X=(xn-1,xn-2,…,x0)p表示n位p進(jìn)制數(shù)據(jù),Y=(ym-1,ym-2,…,y0)q表示m位q進(jìn)制數(shù)據(jù),二者之間等值變換的條件為:
這里,X,Y所表示的數(shù)值范圍分別是[0,pn-1]和[0,qm-1]。而在二進(jìn)制編碼體系下,要把一個(gè)n位p進(jìn)制數(shù)據(jù)轉(zhuǎn)換為m位的q進(jìn)制數(shù)據(jù)就要求輸入輸出的數(shù)據(jù)位寬必須滿足m=Ceil[n·logqp]=[n·logqp],這里用“∏”表示整數(shù)上確界Ceil運(yùn)算,輸入輸出數(shù)據(jù)位寬關(guān)系如圖1所示。
圖1中的din=Ceil[log2 p]=[log2 p];dout=Ceil[log2 q]=[log2 q]分別表示1位輸入輸出數(shù)據(jù)的二進(jìn)制位寬,例如1位的八進(jìn)制數(shù)據(jù)需要3 b二進(jìn)制數(shù)表示;而1位的十進(jìn)制數(shù)據(jù)需要4 b二進(jìn)制數(shù)表示,所以X→Y轉(zhuǎn)化的輸入、輸出數(shù)據(jù)位寬(單位:b)分別為:
n·din=n·[log2 p] (2)
m·dout=[n·logq p]·[log2 q] (3)
8421BCD碼是使用4 b二進(jìn)制數(shù)表示1位10進(jìn)制數(shù)(0~9)。如果把n位二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成m位BCD碼(4m位)就要求m位BCD碼所能表示的最大數(shù)不小于n位二進(jìn)制碼所表示最大數(shù),即10m-1≥2n-1,m≥Ceil[lg 2n]=『n·lg 2]。如果12位的二進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制(BCD),根據(jù)式(3)算出輸出m位的十進(jìn)制數(shù)據(jù)m=[n·logq p]=[12·lg2]=4;輸出數(shù)據(jù)位寬m·dout=m·[log2 q]=16 b。
2 二-十進(jìn)制可逆轉(zhuǎn)碼器設(shè)計(jì)
2.1 可逆轉(zhuǎn)碼器的層次化設(shè)計(jì)
在片上數(shù)字系統(tǒng)(SOPC)中實(shí)現(xiàn)二-十進(jìn)制(BCD)碼轉(zhuǎn)換器,就要求設(shè)計(jì)者充分利用硬件(FPGA)的結(jié)構(gòu)特點(diǎn)和硬件描述語(yǔ)言(HDL)所提供的設(shè)計(jì)靈活性;更好地實(shí)現(xiàn)轉(zhuǎn)碼器的簡(jiǎn)單、高效和結(jié)構(gòu)易于擴(kuò)展。為此,針對(duì)FPGA的結(jié)構(gòu)特點(diǎn)提出了以下設(shè)計(jì)思路:以4 b數(shù)據(jù)轉(zhuǎn)換作為基本的可逆轉(zhuǎn)換單元來(lái)適應(yīng)FPGA結(jié)構(gòu)特點(diǎn),而提高邏輯單元利用率、達(dá)到降低硬件代價(jià)的目的;利用Verilog HDL進(jìn)行層次化設(shè)計(jì)描述,以4 b數(shù)據(jù)轉(zhuǎn)換單元為最底層模塊,構(gòu)造出更大的5 b和6 b可逆轉(zhuǎn)換單元(模塊),這樣會(huì)在不增加實(shí)現(xiàn)代價(jià)的前提下,實(shí)現(xiàn)使用大的轉(zhuǎn)碼單元模塊來(lái)簡(jiǎn)化轉(zhuǎn)碼器的結(jié)構(gòu)、方便轉(zhuǎn)碼器的位數(shù)擴(kuò)展;這種設(shè)計(jì)方法就為二-十進(jìn)制(BCD)可逆轉(zhuǎn)碼器的構(gòu)建提供了4 b,5 b和6 b三種不同大小的單元模塊,這會(huì)讓每一個(gè)轉(zhuǎn)換單元模塊都使用到恰到好處(需要小模塊的地方就不會(huì)使用大模塊);有效避免了單元模塊利用率不高的問(wèn)題。
2.2 可逆轉(zhuǎn)碼器的功能模塊設(shè)計(jì)
上述基于FPGA的二-十進(jìn)制(BCD)可逆轉(zhuǎn)碼器設(shè)計(jì)方案,關(guān)鍵就在于要做好最底層模塊(4 b轉(zhuǎn)碼模塊)的優(yōu)化設(shè)計(jì),對(duì)4 b轉(zhuǎn)碼模塊的不同Verilog HDL描述方式也會(huì)帶來(lái)不同的實(shí)現(xiàn)代價(jià);通過(guò)不同描述方式比較最終確定使用結(jié)構(gòu)描述來(lái)實(shí)現(xiàn)4 b可逆轉(zhuǎn)碼模塊(Bin/Bcd_4),根據(jù)參考文獻(xiàn)[4-5,10],采用卡諾圖和Multisim軟件化簡(jiǎn)得到最簡(jiǎn)邏輯函數(shù)式如圖2所示。再通過(guò)4 b轉(zhuǎn)碼模塊層次實(shí)例化分別構(gòu)造5 b轉(zhuǎn)碼模塊(Bin/Bcd_5)和6 b轉(zhuǎn)碼模塊(Bin/Bcd_6),如圖3所示。
2.3 12 b可逆轉(zhuǎn)碼器的結(jié)構(gòu)設(shè)計(jì)
根據(jù)二-十進(jìn)制可逆轉(zhuǎn)碼算法,使用上節(jié)中得到的4 b,5 b和6 b三種二-十進(jìn)制可逆轉(zhuǎn)碼單元模塊,構(gòu)造出12 b二-十進(jìn)制(BCD)可逆轉(zhuǎn)碼器結(jié)構(gòu)如圖4所示,轉(zhuǎn)碼單元模塊的多余輸入端要接地,多余輸出端懸利于轉(zhuǎn)碼器的位數(shù)擴(kuò)展,也可以通過(guò)轉(zhuǎn)碼器的使能端BD/DB的取值分別實(shí)現(xiàn)從二進(jìn)制到十進(jìn)制和從十進(jìn)制到二進(jìn)制的數(shù)制轉(zhuǎn)換。
3 二-十進(jìn)制可逆轉(zhuǎn)碼器的設(shè)計(jì)驗(yàn)證
3.1 可逆轉(zhuǎn)碼器的時(shí)序仿真
使用QuartusⅡ9.1(Full Version)開發(fā)工具;對(duì)于圖4中二-十進(jìn)制(BCD)可逆轉(zhuǎn)碼器,在Altera公司的FPGA(EP2C35F672C6)芯片上進(jìn)行了設(shè)計(jì)驗(yàn)證,驗(yàn)證結(jié)果完全達(dá)到了既定的設(shè)計(jì)目標(biāo);時(shí)序仿真結(jié)果如圖5所示。在圖5(a)中,使能信號(hào)EN=0,轉(zhuǎn)碼器實(shí)現(xiàn)12 b二進(jìn)制數(shù)向4位十進(jìn)制(BCD)數(shù)據(jù)的轉(zhuǎn)換,SW是輸入12 b二進(jìn)制數(shù),LEDR是輸出的4位十進(jìn)制(BCD)數(shù)(15 b,最大值是4 095);在圖5(b)中,使能信號(hào)EN=1,轉(zhuǎn)碼器實(shí)現(xiàn)15 b十進(jìn)制數(shù)(最大4 095)向12 b二進(jìn)制數(shù)據(jù)的轉(zhuǎn)換,SW是輸入15 b十進(jìn)制數(shù)(BCD),LEDR是輸出的12 b的二進(jìn)制數(shù)。
3.2 可逆轉(zhuǎn)碼器的性能分析
使用QuartusⅡ9.1開發(fā)工具和DE2開發(fā)板;對(duì)于所設(shè)計(jì)可逆數(shù)制轉(zhuǎn)碼器通過(guò)模塊的參數(shù)配置,分別測(cè)試了轉(zhuǎn)碼器在完成8 b、10 b和12 b轉(zhuǎn)碼情況下的硬件實(shí)現(xiàn)代價(jià)(占用邏輯單元數(shù)LEs)和最大路徑延遲(TPD),測(cè)試結(jié)果見表1。
表1表明,可逆轉(zhuǎn)碼器的數(shù)據(jù)位寬愈大轉(zhuǎn)碼器就越復(fù)雜,使用的單元模塊就越多,實(shí)現(xiàn)代價(jià)增大,路徑延遲也會(huì)增大,12 b可逆轉(zhuǎn)碼器的最高時(shí)鐘頻率只有50 MHz,而8 b的可逆轉(zhuǎn)碼器最高時(shí)鐘頻率可以達(dá)到75 MHz。
4 結(jié)語(yǔ)
文中提出以3種功能模塊來(lái)構(gòu)造二-十進(jìn)制(BCD)可逆轉(zhuǎn)碼器的設(shè)計(jì)方法,通過(guò)端口參數(shù)配置和模塊重構(gòu)就能實(shí)現(xiàn)不同位數(shù)的數(shù)據(jù)在二進(jìn)制和十進(jìn)制(BCD)之間相互轉(zhuǎn)換。從而使基于FPGA的二-十進(jìn)制(BCD)轉(zhuǎn)碼器的構(gòu)建變得簡(jiǎn)單、靈活??赡孓D(zhuǎn)碼器在EP2C35F672C6芯片上的驗(yàn)證結(jié)果也充分證明了這種設(shè)計(jì)思路的可行性;如果進(jìn)一步在轉(zhuǎn)碼器中插入寄存器而形成流水線結(jié)構(gòu),那么轉(zhuǎn)碼器的運(yùn)算速度就會(huì)有更大提升。