国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

一種基于SystemVerilog的CORDIC算法IP核實現(xiàn)方案*

2020-03-25 07:35:06盛業(yè)斐
通信技術(shù) 2020年1期
關(guān)鍵詞:常量代碼坐標(biāo)系

盛業(yè)斐

(南京郵電大學(xué) 海外教育學(xué)院,江蘇 南京 210023)

0 引 言

坐標(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中進行了仿真驗證和性能分析。

1 CORDIC算法原理

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é)果。

2 SystemVerilog介紹

常見支持可編程邏輯門陣列(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é)表

3 CORDIC算法IP核制作與驗證

根據(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核性能分析。

3.1 CORDIC算法IP核硬件實現(xiàn)

根據(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)

3.2 CORDIC算法IP核硬件RTL仿真驗證

為了驗證本設(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é)果對比

3.3 CORDIC算法IP核性能分析

以除法和反正切角度計算為例,硬件輸入以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核性能分析表

4 結(jié) 語

本文首先通過對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)用價值。

猜你喜歡
常量代碼坐標(biāo)系
科學(xué)照亮世界
——卡文迪什測定萬有引力常量
創(chuàng)世代碼
動漫星空(2018年11期)2018-10-26 02:24:02
創(chuàng)世代碼
動漫星空(2018年2期)2018-10-26 02:11:00
創(chuàng)世代碼
動漫星空(2018年9期)2018-10-26 01:16:48
創(chuàng)世代碼
動漫星空(2018年5期)2018-10-26 01:15:02
解密坐標(biāo)系中的平移變換
坐標(biāo)系背后的故事
基于重心坐標(biāo)系的平面幾何證明的探討
低氧低分壓環(huán)境下泡塑吸附火焰原子吸收光譜法測定常量金
西藏科技(2015年1期)2015-09-26 12:09:20
極坐標(biāo)系下移動機器人的點鎮(zhèn)定
喀喇| 南昌县| 麻栗坡县| 陵水| 措勤县| 溧阳市| 施秉县| 壶关县| 涟源市| 弥勒县| 历史| 永修县| 田林县| 乐都县| 射阳县| 抚远县| 溆浦县| 乐平市| 汾西县| 抚顺市| 密云县| 平凉市| 定日县| 耒阳市| 邵东县| 阿巴嘎旗| 翁牛特旗| 永德县| 游戏| 浮梁县| 丰原市| 长沙市| 香格里拉县| 儋州市| 阳高县| 胶州市| 岑巩县| 永昌县| 屏山县| 綦江县| 嘉祥县|