衡 園,吳建成,楊志軍
(廣東工業(yè)大學(xué) 廣東省微納加工技術(shù)與裝備重點(diǎn)實(shí)驗(yàn)室,廣東 廣州 510006)
隨著復(fù)雜控制系統(tǒng)開(kāi)發(fā)的需求日益增大,現(xiàn)場(chǎng)可編程邏輯門陣列(FPGA,field programmable gate array)與基于模型設(shè)計(jì)的聯(lián)系也越來(lái)越緊密[1]。在simulink仿真過(guò)程中由于浮點(diǎn)運(yùn)算的精度比較高,所以模型大多都采用浮點(diǎn)數(shù)格式。當(dāng)要將模型下載到硬件平臺(tái)中時(shí),則需將算法模型的數(shù)據(jù)類型轉(zhuǎn)化成定點(diǎn)數(shù)格式。隨著FPGA的性能發(fā)展,現(xiàn)有的FPGA器件支持浮點(diǎn)運(yùn)算,但浮點(diǎn)算法在FPGA硬件上實(shí)現(xiàn)時(shí)會(huì)占用大量的FPGA芯片內(nèi)部資源[2],因此使用FPGA來(lái)實(shí)現(xiàn)復(fù)雜控制算法時(shí),首先需要將算法的數(shù)據(jù)類型轉(zhuǎn)化為定點(diǎn)數(shù)格式。數(shù)據(jù)類型由浮點(diǎn)轉(zhuǎn)化到定點(diǎn)數(shù)過(guò)程中不可避免地會(huì)產(chǎn)生精度損失,因此需要對(duì)算法模型計(jì)算精度進(jìn)行評(píng)估,選擇合適的數(shù)據(jù)位寬,使得FPGA在消耗盡量少的內(nèi)部資源時(shí),同時(shí)滿足控制算法精度要求[3]。借助simulink中定點(diǎn)工具(Fixed-Point Tool)箱對(duì)算法模型數(shù)據(jù)動(dòng)態(tài)范圍進(jìn)行分析,并會(huì)給出其建議的數(shù)據(jù)定點(diǎn)位寬,然后人為地在其建議的數(shù)據(jù)位寬基礎(chǔ)上適當(dāng)增減位寬,使算法內(nèi)各部分既能滿足精度要求,又能使數(shù)據(jù)的位寬控制在合適的范圍內(nèi),以實(shí)現(xiàn)在將算法部署到FPGA上時(shí)不會(huì)造成其內(nèi)部資源的浪費(fèi)[4]。
如圖1所示,運(yùn)動(dòng)控制算法模型主要由4部分組成,即運(yùn)動(dòng)規(guī)劃曲線、位置反饋數(shù)據(jù)輸入、控制算法、結(jié)果輸出。該算法模型已在實(shí)際平臺(tái)進(jìn)行驗(yàn)證,能較好地控制平臺(tái)的運(yùn)動(dòng)。該控制算法有兩個(gè)輸入端,其實(shí)際物理意義是位置,因算法內(nèi)部進(jìn)行計(jì)算時(shí)采用的是標(biāo)準(zhǔn)單位米(m),而平臺(tái)實(shí)際運(yùn)動(dòng)的距離一般在幾十厘米左右,所以可知帶入算法模型的數(shù)值為小數(shù),在算法內(nèi)部進(jìn)行一系列積分、微分、加減乘除運(yùn)算后,小數(shù)位長(zhǎng)將會(huì)非常大[5]。在simulink仿真過(guò)程中為保證數(shù)據(jù)精度,采用的是雙精度浮點(diǎn)型(double型)[6]。當(dāng)要在FPGA中實(shí)現(xiàn)浮點(diǎn)運(yùn)算時(shí),考慮到會(huì)大量浪費(fèi)FPGA內(nèi)部資源等因素,因而需要對(duì)算法中的數(shù)據(jù)類型進(jìn)行定點(diǎn)化處理[7]。
與浮點(diǎn)數(shù)相比,定點(diǎn)數(shù)的小數(shù)點(diǎn)在數(shù)據(jù)的位置是固定的,沒(méi)有浮點(diǎn)數(shù)尾數(shù)對(duì)齊和歸一化問(wèn)題,所以在硬件實(shí)現(xiàn)時(shí),其性能更高。但是,由于定點(diǎn)數(shù)表示數(shù)據(jù)范圍較小,在實(shí)際運(yùn)算過(guò)程容易出現(xiàn)溢出和病態(tài)方程等問(wèn)題[8]。
為了將圖1模型中的控制算法部分集成到FPGA,需要在使用simulink中的HDL coder庫(kù)將控制算法轉(zhuǎn)換成HDL語(yǔ)言之前進(jìn)行前期準(zhǔn)備工作[9]。(1) 需要檢查模塊兼容性。HDL code庫(kù)作為simulink模型庫(kù)中的子庫(kù),其中的功能模塊并非齊全[10]。因此在使用HDL code庫(kù)重新搭建控制算法時(shí),可能存在HDL code庫(kù)中沒(méi)有的模塊,這時(shí)就需要對(duì)原算法模型做相應(yīng)的轉(zhuǎn)換。(2) 找出可能無(wú)法定點(diǎn)化的函數(shù)模型。例如,在進(jìn)行三角函數(shù)、除法以及求根等運(yùn)算時(shí),需要將其轉(zhuǎn)換成能夠定點(diǎn)化的算法,如查表法等[11]。
在對(duì)控制算法模型進(jìn)行重新搭建后,在sumulink中將圖1中運(yùn)動(dòng)規(guī)劃曲線、位置反饋數(shù)據(jù)輸入部分的輸入信號(hào)連接重建的算法模型,做一次仿真,此時(shí)simulink會(huì)根據(jù)輸入數(shù)據(jù)的范圍得到算法模型各部分?jǐn)?shù)據(jù)范圍。Fixed-Point Tool首先根據(jù)仿真結(jié)果收集數(shù)據(jù)的范圍,然后根據(jù)數(shù)據(jù)的范圍給出其建議的數(shù)據(jù)位寬[12]。如圖2所示,給出內(nèi)部數(shù)據(jù)信號(hào)直方圖信息。
圖2中左上部分給出了信號(hào)仿真過(guò)程中出現(xiàn)的最大值和最小值,以及定點(diǎn)化數(shù)據(jù)位寬等信息。左下角給出信號(hào)數(shù)據(jù)對(duì)應(yīng)的直方圖,右邊部分給出了直方圖中指定信號(hào)的詳細(xì)信息,如建議數(shù)據(jù)類型、數(shù)據(jù)建議范圍以及數(shù)據(jù)上溢、下溢的可視化圖形[13]。
在Fixed-Point Tool工具中可以根據(jù)其操作流程在算法模型各部分使用建議的數(shù)據(jù)位寬,然后做一次仿真,工具會(huì)自動(dòng)比較定點(diǎn)化模型與未定點(diǎn)化之前的double型模型的輸出結(jié)果,如圖3所示。
由圖3可知,控制算法在做定點(diǎn)化前后其輸出結(jié)果的曲線基本吻合。圖4給出了比較結(jié)果的詳情,可以看到,控制算法在整個(gè)仿真的時(shí)間數(shù)據(jù)內(nèi)將誤差范圍控制在±0.008,只有較短的時(shí)間超出范圍。由于本算法模型是應(yīng)用在控制領(lǐng)域,對(duì)數(shù)據(jù)的精度要求較高,如果數(shù)據(jù)精度達(dá)不到要求,那么最終的控制效果將會(huì)非常差,甚至可能導(dǎo)致算法失效[14]。
控制算法在FPGA上實(shí)現(xiàn),其關(guān)鍵問(wèn)題在于保證算法精度的情況下將浮點(diǎn)數(shù)轉(zhuǎn)換成能在FPGA運(yùn)行的定點(diǎn)數(shù)。在使用Fixed-Point Tool定點(diǎn)化時(shí)首先需要設(shè)置轉(zhuǎn)化成定點(diǎn)數(shù)的位寬,然后工具根據(jù)給定的數(shù)據(jù)位寬分配算法中數(shù)據(jù)的整數(shù)、小數(shù)各部分所占的位寬[15]。由于控制算法內(nèi)部是復(fù)雜的數(shù)學(xué)運(yùn)算,輸入和輸出的數(shù)據(jù)范圍會(huì)出現(xiàn)差別很大的情況。例如,輸入是小數(shù),輸出可能是比較大的整數(shù)的情況。此時(shí)如果按照Fixed-Point Tool在轉(zhuǎn)換成定點(diǎn)數(shù)前將算法各部分設(shè)置成統(tǒng)一長(zhǎng)度的位寬顯然是不合適的。如果將位寬設(shè)置得較長(zhǎng),可以保證內(nèi)部數(shù)據(jù)的精度,但考慮到最終將算法部署到FPGA中,采用較長(zhǎng)的位寬將耗費(fèi)大量FPGA內(nèi)部資源,并且增加算法在FPGA中計(jì)算的延時(shí);若采用較短的位寬,那么在經(jīng)過(guò)算法計(jì)算后數(shù)據(jù)的精度可能達(dá)不到要求[16]。因此,需要根據(jù)算法內(nèi)部各部分?jǐn)?shù)據(jù)范圍動(dòng)態(tài)地設(shè)置其位寬長(zhǎng)度,這樣既能保證數(shù)據(jù)位寬在合適的范圍內(nèi),又能保數(shù)據(jù)定點(diǎn)化后的精度。
圖 2 內(nèi)部數(shù)據(jù)信號(hào)分析Fig.2 Internal data signal analysis
圖 3 定點(diǎn)前后輸出結(jié)果曲線重合度Fig.3 Output coincidence curve before and after fixed point
圖 4 建議數(shù)據(jù)位寬時(shí)的誤差Fig.4 Error when recommending data width
如圖2所示,在Fixed-Point Tool中設(shè)置轉(zhuǎn)化的定點(diǎn)位寬為16位,可以看到其給出的建議位寬都是16位格式。fixdt(X,Y,Z)中X表示符號(hào)位(0表示無(wú)符號(hào),1表示有符號(hào)),Y表示數(shù)據(jù)位寬,如設(shè)置數(shù)據(jù)位寬為16位,Z表示小數(shù)位的長(zhǎng)度。圖2中可以看到sum:Output數(shù)據(jù)給出的數(shù)據(jù)位寬格式fixdt(1,16,17),說(shuō)明如果要保證數(shù)據(jù)定點(diǎn)化達(dá)到設(shè)定精度需要17位的小數(shù),然而數(shù)據(jù)位寬只有16位。通過(guò)圖2左下角的直方圖分析,“Potential Underflows”一項(xiàng)的數(shù)據(jù)位21,說(shuō)明如果采用16位的數(shù)據(jù)位寬做定點(diǎn)化時(shí)將會(huì)出現(xiàn)數(shù)據(jù)溢出的情況。此時(shí)需要適當(dāng)增加sum:Output的數(shù)據(jù)位寬,解決數(shù)據(jù)溢出問(wèn)題,使數(shù)據(jù)都在定點(diǎn)數(shù)的表示范圍內(nèi)。
根據(jù)上述分析,對(duì)算法內(nèi)部其他部分做相同的調(diào)整,使數(shù)據(jù)都在對(duì)應(yīng)數(shù)據(jù)位寬的表示范圍內(nèi)。此時(shí),再次對(duì)定點(diǎn)化前后的數(shù)據(jù)做對(duì)比,結(jié)果如圖5所示。從圖5中可以看到經(jīng)過(guò)人為適當(dāng)調(diào)整數(shù)據(jù)的位寬,定點(diǎn)前后數(shù)據(jù)誤差控制在-3.5×10-6以下,能夠滿足控制算法所需的精度要求。
圖 5 自定義數(shù)據(jù)位寬時(shí)的誤差Fig.5 Error in custom data bit width
針對(duì)控制算法在FPGA上實(shí)現(xiàn)過(guò)程中數(shù)據(jù)類型轉(zhuǎn)換問(wèn)題,在使用simulink中Fixed-Point Tool對(duì)數(shù)據(jù)范圍進(jìn)行提取和給定參考定點(diǎn)數(shù)據(jù)位寬基礎(chǔ)上,人為地對(duì)算法內(nèi)部各部分的數(shù)據(jù)位寬做適當(dāng)?shù)恼{(diào)整,從而使算法既能保證較高的精度,又能解決Fixed-Point Tool采用統(tǒng)一較長(zhǎng)位寬時(shí)造成FPGA內(nèi)部資源的不必要消耗和延時(shí)問(wèn)題,實(shí)現(xiàn)了復(fù)雜控制算法部署到FPGA上實(shí)現(xiàn)高速、高精度運(yùn)算。