李武旭,李 宏
(四川九洲空管科技有限責(zé)任公司,四川 綿陽 621000)
現(xiàn)場(chǎng)可編程門陣列(FPGA)具備極強(qiáng)的并行處理能力,被廣泛運(yùn)用于雷達(dá)、通信和測(cè)量等領(lǐng)域中,尤其對(duì)實(shí)時(shí)性要求較高的應(yīng)用中。在這些應(yīng)用中可能涉及到對(duì)數(shù)運(yùn)算。目前,在FPGA上實(shí)現(xiàn)對(duì)數(shù)變換的方法主要有查表法[1-2]、CORDIC[3-4]和線性近似法[5]等。查表法所需要的存儲(chǔ)單元隨著精度的增加或輸入值范圍的增大而呈指數(shù)增加。CORDIC[3]法的實(shí)現(xiàn)結(jié)構(gòu)簡(jiǎn)單,但計(jì)算精度與迭代次數(shù)直接相關(guān),處理延時(shí)和邏輯資源花銷也會(huì)增加。線性近似法由于本身的缺陷導(dǎo)致精度有限,且近似曲線的設(shè)計(jì)過程復(fù)雜。
本文介紹一種采用分段擬合方式實(shí)現(xiàn)任意底對(duì)數(shù)變換的近似方法,并聯(lián)合System Generator、MATLAB和Simulink等工具進(jìn)行設(shè)計(jì)與驗(yàn)證協(xié)同開發(fā),將近似曲線的設(shè)計(jì)、理論模擬仿真、算法FPGA實(shí)現(xiàn)以及算法仿真驗(yàn)證等過程統(tǒng)一起來,并通過修改參數(shù)設(shè)計(jì)出不同底和精度要求的對(duì)數(shù)變換。
在數(shù)字系統(tǒng)中,數(shù)據(jù)通常采用2種二進(jìn)制表示形式定點(diǎn)數(shù)和浮點(diǎn)數(shù)。浮點(diǎn)數(shù)格式由符號(hào)位(S)、偏移指數(shù)位(E)和尾數(shù)位(M)三部分組成[6]。單精度浮點(diǎn)數(shù)格式的x可表示為:
x=(-1)s2(E-127)(1+M)
(1)
對(duì)于任意非負(fù)數(shù)x(S=0),其以a(a>0,且a1)為底的對(duì)數(shù)logax可分為以2為底的對(duì)數(shù)轉(zhuǎn)換和對(duì)數(shù)底變換2個(gè)處理過程,即:
(2)
通常,連續(xù)函數(shù)可以通過麥克勞林級(jí)數(shù)進(jìn)行近似表示,則對(duì)數(shù)函數(shù)log2(1+t)的麥克勞林級(jí)數(shù)可表示為:
-1 (3) 此外,因?yàn)閷?duì)數(shù)log2(1+t)的麥克勞林級(jí)數(shù)存在公因式t。若定義輔助函數(shù)faux(t)為: (4) 則式(2)可重寫為: (5) 輔助函數(shù)faux(t)是由無窮項(xiàng)多項(xiàng)式構(gòu)成的冪級(jí)數(shù),在實(shí)際中,精確的計(jì)算faux(t)是不現(xiàn)實(shí)的,即使對(duì)faux(t)的級(jí)數(shù)進(jìn)行截?cái)?,也需進(jìn)行復(fù)雜的冪運(yùn)算,故必須對(duì)faux(t)的計(jì)算方法進(jìn)行簡(jiǎn)化[7]。在[0,1)范圍內(nèi),輔助函數(shù)faux(t)的曲線呈非線性連續(xù)變化且單調(diào)遞減(見圖1),采用曲線擬合方法對(duì)faux(t)曲線進(jìn)行近似。為了降低計(jì)算復(fù)雜度,faux(t)擬合曲線的階數(shù)應(yīng)盡量小,而faux(t)呈非線性變化,直接采用一次多項(xiàng)式擬合效果肯定不理想,故將t取值區(qū)間均分為D段,按區(qū)間分段進(jìn)行一次擬合。圖1中分別顯示了4種情況下的擬合效果。 圖1 輔助函數(shù)的理論曲線和擬合結(jié)果 圖1分別顯示了faux(t)的理論曲線、擬合曲線及其兩者間差異。從圖1可看出,二次擬合誤差在±5.8×10-3以內(nèi);當(dāng)分段數(shù)為4、8和16時(shí),一次擬合誤差分別在±3.4×10-3、±9.4×10-4和±2.5×10-4以內(nèi)。與二次擬合相比,一次擬合的擬合誤差隨著分段數(shù)增加而減小,且可獲得更好的近似結(jié)果,也具有更低的計(jì)算復(fù)雜度。因此,分段一次擬合方法更適用對(duì)輔助函數(shù)faux(t)進(jìn)行近似。可見,輔助函數(shù)擬合曲線是一個(gè)分段函數(shù),其表達(dá)式為: (6) 通過輔助函數(shù)的近似處理,可將對(duì)數(shù)快速計(jì)算過程進(jìn)一步化簡(jiǎn)為: (7) 本文采用的目標(biāo)FPGA為Xilinx的Kintex-7系列XC7K325T,其包含運(yùn)算單元DSP48E1。每個(gè)DSP48E1均包含1個(gè)25位寬的預(yù)加法器(Pre-Adder)、25×18位寬的乘法器和48位寬的累加器(Accumulator)等。對(duì)數(shù)計(jì)算的數(shù)據(jù)位寬和運(yùn)算結(jié)構(gòu)應(yīng)適應(yīng)DSP48E1的特性,需對(duì)常數(shù)和運(yùn)算結(jié)果進(jìn)行量化,但引入量化誤差。 (8) 在FPGA實(shí)現(xiàn)時(shí),通過簡(jiǎn)單的位裁剪處理實(shí)現(xiàn)這種轉(zhuǎn)換關(guān)系,不需要占用額外的邏輯資源。結(jié)合式(7)和式(8)并經(jīng)簡(jiǎn)化后,可得新的快速對(duì)數(shù)變換表達(dá)式: (9) 在計(jì)算過程中,以M的高W位作為地址從ROM中實(shí)時(shí)獲取。 而除以D運(yùn)算可轉(zhuǎn)換為右移W位操作,無需除法器,不占用額外FPGA邏輯資源。對(duì)數(shù)變換過程主要以定點(diǎn)數(shù)乘法和加法為主,不存在其他復(fù)雜的運(yùn)算過程,其原理框圖如圖2所示。 圖2 快速對(duì)數(shù)變換的FPGA實(shí)現(xiàn)原理框圖 基于硬件描述語言(HDL)代碼編寫的傳統(tǒng)FPGA開發(fā)方式,要求開發(fā)人員對(duì)處理算法和硬件有深入認(rèn)識(shí),開發(fā)周期比較長(zhǎng)。當(dāng)發(fā)生算法改動(dòng)或硬件平臺(tái)改變時(shí),需要從源代碼入手進(jìn)行修改,工作量大,維護(hù)困難。System Generator作為高性能的數(shù)字信號(hào)處理(DSP)系統(tǒng)快速建模與實(shí)現(xiàn)工具,是DSP高層系統(tǒng)和Xilinx FPGA 之間的橋梁,能夠使設(shè)計(jì)人員快速開發(fā)出高性能的FPGA來實(shí)現(xiàn)DSP算法,可在MATLAB/Simulink 環(huán)境下對(duì)算法級(jí)系統(tǒng)進(jìn)行圖形化建模和系統(tǒng)級(jí)仿真[8]。System Generator通過簡(jiǎn)易的圖形化設(shè)計(jì)方式代替HDL開發(fā)的方式,避免了代碼可讀性差的缺點(diǎn),方便成熟設(shè)計(jì)的共享和移植。System Generator是Xilinx提供的FPGA硬件開發(fā)工具,使開發(fā)人員能夠在Simulink開發(fā)環(huán)境下,通過圖形化的方式搭建快速對(duì)數(shù)變換的系統(tǒng)模型,并生成針對(duì)Xilinx FPGA優(yōu)化的參數(shù)化設(shè)計(jì)。與原理框圖的組成略有差異,這個(gè)System Generator模型由輸入/輸出接口、數(shù)據(jù)分割處理、以2為底對(duì)數(shù)轉(zhuǎn)換、對(duì)數(shù)換底變換、異常檢測(cè)處理和System Generator標(biāo)志等模塊組成。輸入/輸出接口使用Gateway In和Gateway Out模塊實(shí)現(xiàn)Simulink和System Generator之間的數(shù)據(jù)傳遞,也用于確定用戶邏輯設(shè)計(jì)的邊界(相當(dāng)于HDL代碼中的頂層輸入/輸出端口定義)。System Generator標(biāo)志允許用戶設(shè)置系統(tǒng)和仿真參數(shù),包括目標(biāo)開發(fā)平臺(tái)、目標(biāo)器件、工作時(shí)鐘等,還用于調(diào)用代碼生成器將Gateway In和Gateway Out之間的模型轉(zhuǎn)換為HDL代碼。 快速對(duì)數(shù)變換的輸入采用單精度浮點(diǎn)數(shù)格式,中間計(jì)算結(jié)果和轉(zhuǎn)換輸出則采用定點(diǎn)數(shù)格式。對(duì)數(shù)運(yùn)算對(duì)負(fù)數(shù)無意義,零的對(duì)數(shù)轉(zhuǎn)換結(jié)果為負(fù)無窮(由于定點(diǎn)數(shù)的數(shù)值范圍有限而無法正確表示),通過異常檢測(cè)處理模塊來識(shí)別這2種特殊情況,同時(shí)它們的轉(zhuǎn)換結(jié)果用比正常值更小的其它數(shù)值代替。 在傳統(tǒng)FPGA開發(fā)方式下,快速對(duì)數(shù)變換實(shí)現(xiàn)分為3個(gè)獨(dú)立過程,首先需通過MATLAB對(duì)算法進(jìn)行模擬仿真驗(yàn)證,計(jì)算出參數(shù)A、c0、c1和c2并進(jìn)行量化,接著編寫HDL代碼進(jìn)行FPGA實(shí)現(xiàn),然后編寫Testbench文件通過邏輯仿真工具對(duì)FPGA設(shè)計(jì)進(jìn)行邏輯仿真驗(yàn)證。一旦FPGA平臺(tái)或者對(duì)數(shù)變換設(shè)計(jì)需求改變,很可能造成邏輯設(shè)計(jì)發(fā)生變化并須重新進(jìn)行設(shè)計(jì)與驗(yàn)證。這種方式需要設(shè)計(jì)師使用多種開發(fā)軟件平臺(tái)單獨(dú)、串行地開展算法設(shè)計(jì)、FPGA實(shí)現(xiàn)和邏輯仿真驗(yàn)證工作,開發(fā)效率低,非常不便于快速對(duì)數(shù)變換設(shè)計(jì)的共享和移植。 System Generator結(jié)合MATLAB和Simulink構(gòu)建出FPGA設(shè)計(jì)與驗(yàn)證聯(lián)合開發(fā)環(huán)境。System Generator以圖形化的方式完成FPGA邏輯設(shè)計(jì),并利用大量的MATLAB函數(shù)和Simulink模塊完成算法理論模擬仿真、產(chǎn)生測(cè)試激勵(lì)和開展設(shè)計(jì)效果分析。在該開發(fā)環(huán)境下,快速對(duì)數(shù)變換的整個(gè)設(shè)計(jì)包含模型初始化配置模塊、測(cè)試激勵(lì)產(chǎn)生模塊、浮點(diǎn)數(shù)對(duì)數(shù)變換模塊、快速對(duì)數(shù)變換模塊和對(duì)數(shù)轉(zhuǎn)換誤差分析模塊等部分,其中模型仿真初始化配置模塊采用m文件形式,其余模塊均采用Simulink和System Generator模塊進(jìn)行圖形化設(shè)計(jì),如圖3所示。 圖3 快速對(duì)數(shù)變換的聯(lián)合設(shè)計(jì)與驗(yàn)證模型 在Simulink環(huán)境下,測(cè)試激勵(lì)同時(shí)傳遞給浮點(diǎn)數(shù)對(duì)數(shù)變換模塊和快速對(duì)數(shù)變換模塊進(jìn)行仿真,通過對(duì)數(shù)轉(zhuǎn)換誤差分析模塊可顯示出快速對(duì)數(shù)轉(zhuǎn)換和理論對(duì)數(shù)轉(zhuǎn)換的計(jì)算結(jié)果,并分析兩者之間的差異情況。圖4顯示了2個(gè)模塊進(jìn)行以10為底對(duì)數(shù)轉(zhuǎn)換結(jié)果,從圖中可以看出兩者的轉(zhuǎn)換結(jié)果基本一致,說明快速對(duì)數(shù)轉(zhuǎn)換的算法有效且System Generator系統(tǒng)模塊設(shè)計(jì)正確。 圖4 快速對(duì)數(shù)轉(zhuǎn)換和理論計(jì)算結(jié)果 此外,以浮點(diǎn)數(shù)對(duì)數(shù)變換結(jié)果為參照,分析了不同對(duì)數(shù)轉(zhuǎn)換的絕對(duì)誤差和相對(duì)誤差情況,圖5(a)和圖5(b)顯示了相同分段擬合情況下以10為底對(duì)數(shù)和自然對(duì)數(shù)2種計(jì)算的絕對(duì)誤差情況。對(duì)比圖5(a)和圖5(c)可看出,隨著擬合分段數(shù)的增加,對(duì)數(shù)轉(zhuǎn)換的絕對(duì)誤差會(huì)改善,與理論分析一致。 圖5 快速對(duì)數(shù)轉(zhuǎn)換和理論計(jì)算的誤差情況 通過System Generator標(biāo)志調(diào)用代碼生成器將快速對(duì)數(shù)變換的系統(tǒng)模型轉(zhuǎn)換為HDL代碼,并產(chǎn)生VIVADO工程。在VIVADO開發(fā)環(huán)境中,對(duì)快速對(duì)數(shù)變換模塊的HDL代碼進(jìn)行邏輯仿真,其結(jié)果如圖6所示。快速對(duì)數(shù)變換模塊需花費(fèi)12個(gè)時(shí)鐘周期正確完成以10為底的對(duì)數(shù)轉(zhuǎn)換,其計(jì)算結(jié)果與理論值誤差很小,并能夠識(shí)別出負(fù)數(shù)和零對(duì)數(shù)轉(zhuǎn)換的異常情況。 圖6 快速對(duì)數(shù)轉(zhuǎn)換的邏輯仿真結(jié)果 在VIVADO中,對(duì)HDL代碼進(jìn)行綜合后,以10為底的對(duì)快速對(duì)數(shù)變換所使用的FPGA邏輯資源如表1所述。 表1 FPGA邏輯資源使用情況 本文提出利用浮點(diǎn)數(shù)的特點(diǎn)和對(duì)數(shù)轉(zhuǎn)換的性質(zhì),將任意底對(duì)數(shù)轉(zhuǎn)換過程轉(zhuǎn)換為以2為底的對(duì)數(shù)轉(zhuǎn)換和對(duì)數(shù)底變換2個(gè)步驟,利用分段擬合方法對(duì)以2為底的對(duì)數(shù)變換進(jìn)行近似,使任意底對(duì)數(shù)轉(zhuǎn)換能夠在FPGA上以有限的乘法和加法簡(jiǎn)單實(shí)現(xiàn)。同時(shí),聯(lián)合System Generator、MATLAB和Simulink開展任意底對(duì)數(shù)變換進(jìn)行FPGA實(shí)現(xiàn)的設(shè)計(jì)與驗(yàn)證聯(lián)合開發(fā),該開發(fā)方法能夠顯著提高FPGA開發(fā)效率,便于FPGA設(shè)計(jì)的共享和移植,在工程實(shí)際中具有一定的推廣意義。2 輔助函數(shù)的近似計(jì)算
3 基于FPGA的對(duì)數(shù)變換設(shè)計(jì)優(yōu)化
4 快速對(duì)數(shù)運(yùn)算的FPGA設(shè)計(jì)與驗(yàn)證
5 對(duì)數(shù)變換的FPGA設(shè)計(jì)與驗(yàn)證聯(lián)合開發(fā)
6 結(jié)束語