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