盛業(yè)斐
(南京郵電大學(xué) 海外教育學(xué)院,江蘇 南京 210023)
坐標(biāo)旋轉(zhuǎn)數(shù)字運算法(Coordinate Rotation Digital Computer,CORDIC)是一種坐標(biāo)旋轉(zhuǎn)算法,常用來計算向量旋轉(zhuǎn)、三角與反三角函數(shù)以及乘、除法等初等函數(shù)值[1]。隨著現(xiàn)代電子通信技術(shù)的發(fā)展,特別是數(shù)字通信領(lǐng)域,包括OFDM信道估計與均衡、峰值因子降低(Crest Factor Reduction,CFR)、數(shù)字預(yù)失真(Digital Pre-Distortion,DPD)、接收機載波同步與相位補償、直接序列擴頻捕獲與跟蹤等場景,對數(shù)字通信信號的處理往往涉及到復(fù)數(shù)乘除法、矩陣QR分解及相位補償?shù)冗\算[2]。CORDIC算法由于低復(fù)雜度、精度和延遲的可控性得到了大規(guī)模應(yīng)用。然而,CORDIC算法形式多樣,包括三種坐標(biāo)形式和兩種旋轉(zhuǎn)模式,分別對應(yīng)著不同的初等函數(shù)運算結(jié)構(gòu)。雖然J.Walther在1971年給出了CORDIC算法在三種坐標(biāo)系下的統(tǒng)一數(shù)學(xué)表達式[3],可以方便地在軟件編程上實現(xiàn)不同的CORDIC運算,但是在實際應(yīng)用中特別是在通信物理層信號處理前端,CORDIC運算往往需要在FPGA硬件中實現(xiàn)。常規(guī)做法是根據(jù)不同函數(shù)運算需求設(shè)計特定的RTL代碼,導(dǎo)致代碼靈活性和可移植性受到了極大限制。盡管市面上FPGA生產(chǎn)廠家已經(jīng)將CORDIC算法IP核集成到各自的EDA開發(fā)工具中,用戶可以免費調(diào)用,但是不同廠家提供的IP核之間無法兼容,加之用戶無法獲得其IP源碼,進而無法在不同廠家平臺開發(fā)之間進行移植,且代碼仿真效率不高。本文根據(jù)CORDIC各種運算形式和特性,利用SystemVerilog語言實現(xiàn)了CORDIC算法通用IP核制作,大大提高了RTL代碼的可讀性、靈活性和可移植性,并且在FPGA中進行了仿真驗證和性能分析。
CORDIC是一種依靠角度旋轉(zhuǎn)逼近計算目標(biāo)的算法[4]。它的基本推導(dǎo)來自直角坐標(biāo)系下的坐標(biāo)旋轉(zhuǎn)變換。xoy坐標(biāo)系點(x1,y1)旋轉(zhuǎn)θ角度后到點(x2,y2),則點(x1,y1)到點(x2,y2)的變換滿足:
如果忽略cosθ對系統(tǒng)的影響,得到偽變換形式為:
令tanθi=(1/2)i,每次旋轉(zhuǎn)arctan((1/2)i)角度,累計旋轉(zhuǎn)角度與給定的角度θ之差記為z。
當(dāng)z>0,則下一次旋轉(zhuǎn)對應(yīng)于第i+1次將沿反方向旋轉(zhuǎn),且旋轉(zhuǎn)角度為-arctan((1/2)i)。如此經(jīng)過多次變換后,最終旋轉(zhuǎn)角度將無限逼近(1/2)i,此時z數(shù)值也將趨于0。偽變換與旋轉(zhuǎn)變換區(qū)別在于受到旋轉(zhuǎn)因子cosθi的影響,多次變換后的結(jié)果值將會產(chǎn)生總的幅度畸變因子為:
當(dāng)N→+∞時,上述值趨向于0.607 3,即畸變補償因子為K=1.647。
經(jīng)過如上簡化后,計算點(x1,y1)旋轉(zhuǎn)θ角度后的坐標(biāo)值,只需要經(jīng)過N次旋轉(zhuǎn),旋轉(zhuǎn)角度分別為θ1,θ2,θ3,…,θN。其中,每旋轉(zhuǎn)一個角度只需要進行一次判斷、兩次移位操作和三次加(減)法。與其他計算方法相比,無需使用乘法器和大量的查找表,大大降低了硬件實現(xiàn)的復(fù)雜度,因此得到了大規(guī)模應(yīng)用。
以上推導(dǎo)為CORDIC算法在圓周坐標(biāo)系下的表達式。J.Walther在1971年給出了CORDIC算法在圓周坐標(biāo)、線性坐標(biāo)和雙曲坐標(biāo)共3種坐標(biāo)系下統(tǒng)一數(shù)學(xué)表達式:
針對3種不同坐標(biāo)系,基于旋轉(zhuǎn)和向量模式得到以下6種不同的CORDIC形式。它在各種不同模式下取不同的輸入量,對應(yīng)不同輸出結(jié)果作為初等函數(shù)運算,最終歸納出其對應(yīng)關(guān)系如表1所示。例如,要計算sinθ的數(shù)值,從表1可以看出其對應(yīng)旋轉(zhuǎn)模式且μ=1,每次旋轉(zhuǎn)角度為arctan2-i,di=sign(z(i)),初始輸入值為x0=1/K,y0=0,z0=θ。經(jīng)過N次旋轉(zhuǎn)后最終結(jié)果為:
則xN即為最終計算結(jié)果。
常見支持可編程邏輯門陣列(Field Programable Gate Array,F(xiàn)PGA)開發(fā)的硬件描述語言有VHDL和Verilog兩種。SystemVerilog簡稱為SV語言,建立在Verilog語言的基礎(chǔ)上,是IEEE 1364 Verilog-2001標(biāo)準(zhǔn)的擴展增強,兼容Verilog 2001,于2009年成為了IEEE 1800-2009標(biāo)準(zhǔn)[5]。目前,SystemVerilog語言發(fā)展已經(jīng)逐漸成熟,幾乎所有的RTL編譯和仿真器均支持它。SystemVerilog將硬件描述語言(Hardware Description Language,HDL)與現(xiàn)代高層級驗證語言(Hardware Verification Language,HVL)結(jié)合起來[6],支持多維壓縮數(shù)組的操作,使得原來使用Verilog需要多種重復(fù)性的操作,直接通過generate循環(huán)對寄存器數(shù)組操作,大大精簡了代碼量,提升了代碼可維護性、靈活性和可移植性[7]。本文充分利用SystemVerilog語言特點,結(jié)合各種CORDIC算法形式,實現(xiàn)了CORDIC算法IP核的制作,并且通過Quartus II和Modelsim對代碼進行綜合與仿真,在FPGA中進行了驗證和性能分析。
表1 CORDIC算法不同形式關(guān)系總結(jié)表
根據(jù)表1給出3種坐標(biāo)系及其對應(yīng)的2種模式,共有6種不同CORDIC算法結(jié)構(gòu)。本文充分對比6種不同結(jié)構(gòu)的核心共性,結(jié)合J.Walther提出的統(tǒng)一表達式,利用支持現(xiàn)代高層級驗證語言的SystemVerilog進行硬件RTL描述,設(shè)計了CORDIC算法硬件IP核。以下將從CORDIC算法硬件實現(xiàn)流程出發(fā),對設(shè)計的IP核進行仿真驗證,最后給出本IP核性能分析。
根據(jù)理論推導(dǎo),設(shè)計CORDIC算法IP核的硬件功能框圖如圖1所示,主要包括常量計算與存儲、輸入數(shù)據(jù)預(yù)處理、流水線CORDIC以及輸出數(shù)據(jù)處理等部分。
圖1 CORDIC算法硬件實現(xiàn)架構(gòu)
3.1.1 常量計算與存儲
從J.Walther提出的CORDIC統(tǒng)一表達式出發(fā),根據(jù)表1提出的6種結(jié)構(gòu)形式可知,不同坐標(biāo)系對應(yīng)著不同的旋轉(zhuǎn)角度因子常量e(i)和伸縮因子K,不同旋轉(zhuǎn)模式對應(yīng)著不同的模式符號di。因此,實現(xiàn)CORDIC算法IP核的制作,首先需要針對表1提出的6種結(jié)構(gòu)計算6組e(i)、K、di常量表。另外,由于在硬件FPGA中實現(xiàn)時考慮到速度與資源的平衡,一般采用定點運算,需要對e(i)、K、di常量進行定點化。本設(shè)計充分利用SystemVerilog支持現(xiàn)代高層級驗證的特點,設(shè)計18個二維寄存器數(shù)組來存取定點化后的e(i)、K、di常量,并且根據(jù)6種結(jié)構(gòu)的CORDIC分別進行宏定義,由用戶在代碼編譯之前根據(jù)需要選擇不同的宏來配置不同其需要的運算模式。
3.1.2 輸入數(shù)據(jù)預(yù)處理
輸入數(shù)據(jù)預(yù)處理是對用戶輸入數(shù)據(jù)進行等價變換,防止CORDIC溢出和迭代不收斂。例如,利用CORDIC計算sinθ,由表1可知對應(yīng)于圓周坐標(biāo)系的CORDIC,且有μ=1,e(i)=arctan2-i,每次旋轉(zhuǎn)的角度為±arctan2-i。經(jīng)過無數(shù)次迭代旋轉(zhuǎn)后,角度旋轉(zhuǎn)之和最大值為:
因此,如果輸入角度不在這個范圍,可以利用三角函數(shù)性質(zhì),總能將其轉(zhuǎn)換后滿足θ∈[-π/2,π/2]。
3.1.3 CORDIC算法核心模塊處理
從式(1)可以看出,每旋轉(zhuǎn)一個角度只需要進行一次判斷、兩次移位操作和三次加(減)法,硬件結(jié)構(gòu)如圖2所示。N次旋轉(zhuǎn)共需N級架構(gòu)相同的操作模塊,其硬件延時為N個時鐘周期,且前一級運算結(jié)果作為后一級輸入,不存在反饋過程。在FPGA硬件實現(xiàn)時,非常合適用流水線的方式去完成,N次旋轉(zhuǎn)共需要N級流水線。
圖2 單級CORDIC算法核心模塊硬件結(jié)構(gòu)
為了驗證本設(shè)計CORDIC算法RTL代碼功能與時序的正確性,本文以經(jīng)過14次旋轉(zhuǎn)的CORDIC算法實現(xiàn)除法運算為例,在Matlab中產(chǎn)生256點隨機定點數(shù)作為硬件仿真中被除數(shù)和除數(shù)點,并以文本形式保存。編寫Testbench仿真程序,將該文件讀取后以特定時序送入CORDIC算法模塊,最終硬件仿真所得結(jié)果如圖3所示。
圖3 CORDIC算法IP核時序仿真結(jié)果
將硬件仿真結(jié)果與Matlab計算結(jié)果進行對比,得到相對誤差曲線如圖4所示,統(tǒng)計得到相對誤差平均值為0.072%,說明本設(shè)計的CORDIC算法完全符合實際應(yīng)用的需求。
圖4 軟硬件仿真結(jié)果對比
以除法和反正切角度計算為例,硬件輸入以16比特定點量化,根據(jù)不同旋轉(zhuǎn)次數(shù)N,對本設(shè)計的CORDIC算法IP核代碼進行配置,利用Quarters II硬件編譯器對其進行綜合布局布線,得到資源損耗與性能結(jié)果如表2所示。從表2可以看出,隨著旋轉(zhuǎn)次數(shù)N的增加,硬件資源使用會越來越多,計算精度將越來越高,但是FPGA能最大工作時鐘仍能維持在200 MHz以上,完全符合IP化的要求。
表2 CORDIC算法IP核性能分析表
本文首先通過對CORDIC算法統(tǒng)一表達式進行研究,總結(jié)了CORDIC算法在不同坐標(biāo)系、不同模式下所對應(yīng)的計算對象及其之間的聯(lián)系。然后,利用SystemVerilog將表征不同CORDIC結(jié)構(gòu)的旋轉(zhuǎn)角度因子常量e(i)、伸縮因子K和旋轉(zhuǎn)模式符號di以二維寄存器組進行統(tǒng)一化存取,并設(shè)計宏定義提供用戶配置接口,最終實現(xiàn)CORDIC算法IP核制作,并且在FPGA中進行了仿真驗證和性能分析。硬件仿真和實際應(yīng)用證明,本設(shè)計的IP核由于采用SystemVerilog語言描述,大大提高了RTL代碼的可讀性、靈活性和可移植性,在通信和信號處理領(lǐng)域具有一定的參考和應(yīng)用價值。