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