文獻(xiàn)標(biāo)識(shí)碼: A
DOI:10.16157/j.issn.0258-7998.2017.03.010
中文引用格式: 王申卓,,胡春林,,胡廣垠,等. 基于CORDIC改進(jìn)算法的NCO設(shè)計(jì)[J].電子技術(shù)應(yīng)用,,2017,,43(3):43-47.
英文引用格式: Wang Shenzhuo,Hu Chunlin,,Hu Guangyin,,et al. Design of NCO based on improved CORDIC algorithm[J].Application of Electronic Technique,2017,,43(3):43-47.
0 引言
數(shù)控振蕩器(Numerically Controlled Oscillator,NCO)是信號(hào)處理系統(tǒng)的重要組成部分,。隨著現(xiàn)代通信系統(tǒng)的不斷發(fā)展,,NCO憑借其相位可連續(xù)線性變化、頻率分辨率高,、全數(shù)字化處理等優(yōu)越特性,,在圖像處理、快速傅里葉變換,、直接數(shù)字頻率合成器等設(shè)計(jì)中得到了廣泛應(yīng)用,。
傳統(tǒng)數(shù)控振蕩器的實(shí)現(xiàn)方法為只讀存儲(chǔ)器查找表法(ROM LUT),,如圖1所示。這種方法在對(duì)分辨率要求不高的情況下,,是一種簡(jiǎn)單的實(shí)現(xiàn)方式,。但是若要進(jìn)一步提高分辨率,就會(huì)消耗大量的ROM資源,;此外,,存儲(chǔ)器讀取速度的瓶頸也限制了NCO的輸出速度。而CORDIC算法易于使用數(shù)字電路實(shí)現(xiàn),,僅通過(guò)簡(jiǎn)單的加減法和移位操作就可以完成多種硬件電路難以直接實(shí)現(xiàn)的復(fù)雜運(yùn)算,,因此在NCO的設(shè)計(jì)中也得到了很好的應(yīng)用。本文將對(duì)傳統(tǒng)CORDIC算法進(jìn)一步改進(jìn),,并結(jié)合改進(jìn)方法提出一種適合于硬件實(shí)現(xiàn)的數(shù)控振蕩器的設(shè)計(jì)方法,,從而提高輸出精度和運(yùn)算速度。
1 CORDIC算法原理
坐標(biāo)旋轉(zhuǎn)數(shù)字計(jì)算(Coordinate Rotation Digital Computer,,CORDIC)首次由Jack Volder于1959年提出,,1971年Walther統(tǒng)一了CORDIC算法的形式。CORDIC的基本思想是通過(guò)一系列只與運(yùn)算基數(shù)有關(guān)的固定小角度的不斷偏擺從而逼近期望角度,,此算法具有線性收斂域和序列特性[3],。
CORDIC算法的基本原理是運(yùn)用了Givens旋轉(zhuǎn)法則。假設(shè)給定向量A(x0,,y0),,當(dāng)旋轉(zhuǎn)過(guò)一定角度θ后得到新向量B(x1,y1),,如圖2所示,。
根據(jù)旋轉(zhuǎn)變換法則,可得式(1):
當(dāng)N→∞時(shí),,KN收斂于一個(gè)常數(shù),,即KN≈0.607 252 935。當(dāng)?shù)螖?shù)N得到確定,,KN的值也就確定了,,可以把它看作一個(gè)常數(shù),所以只要提前計(jì)算出定標(biāo)因子KN,,就能正確地使用式(6)進(jìn)行CORDIC求值運(yùn)算,。可見(jiàn)對(duì)于每一次小角度θi的旋轉(zhuǎn)運(yùn)算,,實(shí)際上只與δi2-i運(yùn)算有關(guān),這在硬件上的反映就是加/減法和移位操作,。
最后,,通過(guò)引入?yún)?shù)z表示當(dāng)前角度和期望角度的偏差值,,來(lái)確定下一次旋轉(zhuǎn)的方向,即判斷δ的符號(hào),。令zi+1=zi-θi(z0=θ,,i=0,1,,…,,N-1),當(dāng)z≥0時(shí),,δ=+1,;當(dāng)z≤0時(shí),δ=-1,。若經(jīng)過(guò)多次旋轉(zhuǎn)后,,就可以得到與期望角度充分接近的旋轉(zhuǎn)向量。如果選取初始值(x0,,y0)=(KN,,0),在進(jìn)行N次迭代運(yùn)算后,,結(jié)果將收斂于(sinθ,,cosθ)。
2 CORDIC算法改進(jìn)
2.1 算法迭代結(jié)構(gòu)
由CORDIC算法的原理可以看出,,此算法每一次的運(yùn)算結(jié)構(gòu)相似,,具有可迭代的特性。對(duì)于傳統(tǒng)的反饋結(jié)構(gòu),,每次運(yùn)算都利用同一組硬件反復(fù)進(jìn)行迭代,,此結(jié)構(gòu)占用硬件資源少,能夠在一定程度上縮小電路面積,。但是由于需要不斷向輸入端反饋輸出數(shù)據(jù),,而且還需要一個(gè)狀態(tài)機(jī)來(lái)跟蹤全部迭代過(guò)程,會(huì)導(dǎo)致整個(gè)系統(tǒng)運(yùn)行速度降低,,吞吐量減小,。如果需要實(shí)現(xiàn)高速高精度的輸出,就必須采用高速全流水線結(jié)構(gòu),,如圖3所示,。流水線結(jié)構(gòu)的每一級(jí)迭代都使用單獨(dú)的運(yùn)算單元,與反饋結(jié)構(gòu)相比,,雖然消耗了較多的硬件資源,,但換來(lái)的是運(yùn)算速度提高,吞吐量增大,,特別適合在硬件上實(shí)現(xiàn)[4],。
此外,,有限次數(shù)的迭代運(yùn)算通常無(wú)法完全消除累加角度與期望角度間的誤差,因此我們引入殘余角誤差ε,,并將式(4)改寫(xiě)為:
由式(8)可以看出,,隨著迭代次數(shù)或者流水級(jí)數(shù)的不斷增加,近似誤差ε的趨勢(shì)是減小的,,角度累加所得到的值會(huì)逐漸逼近期望角度,,CORDIC算法的精度也會(huì)不斷提高。但是考慮到實(shí)際設(shè)計(jì)中不能無(wú)限制增加流水線級(jí)數(shù),,一方面流水線級(jí)數(shù)過(guò)多會(huì)降低系統(tǒng)整體運(yùn)算速度,,另一方面流水增加至一定級(jí)數(shù)后,對(duì)精度的提高微乎其微,,但是卻消耗了大量的硬件資源,,因此必須選擇適合的流水線級(jí)數(shù),來(lái)控制硬件成本和計(jì)算復(fù)雜度,。根據(jù)Yu Hen Hu提出ε的上界[8]:
其中AN-1為最后一次的旋轉(zhuǎn)角度,,N為旋轉(zhuǎn)次數(shù)。為了達(dá)到所需要的精度,,我們選擇N=16,,即通過(guò)16級(jí)并行流水線結(jié)構(gòu)來(lái)實(shí)現(xiàn)CORDIC算法。
2.2 覆蓋角度擴(kuò)展
CORDIC算法每一級(jí)的角度旋轉(zhuǎn)由式(3)得到了確定,,表1中列舉了其中的部分角度,。
式(3)是關(guān)于i的遞減函數(shù),將這些角度累加,,當(dāng)i→∞時(shí):
可見(jiàn)CORDIC算法能夠計(jì)算角度的收斂域?yàn)閇-99.88°,,99.88°],而我們需要輸出整個(gè)圓周范圍內(nèi)角度的正余弦值,,顯然常規(guī)的方法無(wú)法滿足,。
利用三角函數(shù)的對(duì)稱性,通過(guò)象限轉(zhuǎn)移的方法就能夠?qū)⒂?jì)算角度擴(kuò)展至[-π,,π],。文獻(xiàn)[5]將[-π,π]映射至[0,,π/4],,但是在最后對(duì)輸出的一組數(shù)據(jù)是否交換或改變符號(hào)需要進(jìn)行判斷,而文獻(xiàn)[7]中將[-π,,π]映射至[0,,π/8],但需要對(duì)產(chǎn)生的常數(shù)因子進(jìn)行補(bǔ)償。本文將整個(gè)圓周[-π,,π]劃分為8個(gè)象限(如圖4所示),,并將所有角度映射至[-π/4,π/4],,即1號(hào)和8號(hào)象限,并同時(shí)對(duì)初始值X0和Y0進(jìn)行處理,。這樣既不會(huì)產(chǎn)生額外的常數(shù)因子,,也不需要在最后對(duì)輸出結(jié)果進(jìn)行數(shù)據(jù)交換或符號(hào)改變。
利用三角函數(shù)的對(duì)稱性,,根據(jù)θ所在象限,,對(duì)初始值分別做如表2的處理。
這樣的數(shù)據(jù)預(yù)處理過(guò)程雖然會(huì)消耗一定的硬件資源,,但特別適合流水線結(jié)構(gòu)的CORDIC算法,,對(duì)提高整個(gè)系統(tǒng)的速度有很大幫助。
2.3 計(jì)算數(shù)據(jù)位擴(kuò)展
在實(shí)際電路的實(shí)現(xiàn)中,,由于CORDIC算法每一級(jí)迭代使用的都是有限精度的代數(shù)計(jì)算,,就導(dǎo)致了另外一種誤差,這種因數(shù)據(jù)位寬有限而產(chǎn)生的誤差稱為舍入誤差,。所以除了增加迭代次數(shù)以外,,還可以通過(guò)擴(kuò)展CORDIC算法數(shù)據(jù)的位寬來(lái)提高精度。舍入誤差σ的大小與運(yùn)算數(shù)據(jù)的位寬b有關(guān),,根據(jù)σ=2-b-1這一關(guān)系式可知,,操作數(shù)的位寬每擴(kuò)展一位,就能夠?qū)⑸崛胝`差縮小為原來(lái)的一半,。當(dāng)增加流水的級(jí)數(shù)無(wú)法大幅提高算法精度時(shí),,擴(kuò)展CORDIC計(jì)算數(shù)據(jù)位寬是另一種很好的方法,如圖5所示,。
在本設(shè)計(jì)中,,由于NCO后端接入了混頻模塊,輸出數(shù)據(jù)必須為16位與之匹配,,但是在CORDIC內(nèi)部迭代計(jì)算時(shí),,我們把數(shù)據(jù)擴(kuò)展至20位,最后對(duì)輸出結(jié)果截位處理,,然后再送入下一級(jí),。通過(guò)對(duì)數(shù)據(jù)位寬擴(kuò)展4位的方法,可以有效地提高運(yùn)算精度,。
3 基于CORDIC改進(jìn)算法的NCO系統(tǒng)結(jié)構(gòu)
NCO主要用于產(chǎn)生正,、余弦信號(hào),本設(shè)計(jì)基于CORDIC改進(jìn)算法,由前端處理,、CORDIC迭代以及輸出處理這3個(gè)部分組成,,其系統(tǒng)結(jié)構(gòu)如圖6。當(dāng)輸入不同的頻率控制字時(shí),,NCO輸出波形的頻率也隨之改變,。
在前端處理中,我們采用了24位相位累加器以保證頻率分辨率達(dá)到要求,,并通過(guò)判斷相位值的高3位θ[23:21],,將目標(biāo)角度映射至[-π/4,π/4]區(qū)間,具體映射方法見(jiàn)表2,;而修正因子可以根據(jù)式(7)求出,,由于算法的流水級(jí)數(shù)事先已經(jīng)確定,所以只要將N=16代入就可以準(zhǔn)確的得到KN,,再通過(guò)數(shù)據(jù)預(yù)處理確定X0和Y0的初始值,,從而在迭代之前就完成對(duì)輸出結(jié)果的補(bǔ)償,進(jìn)一步提高整個(gè)系統(tǒng)的速度,。
第二部分為16級(jí)CORDIC流水線,,它是整個(gè)系統(tǒng)的核心,流水線結(jié)構(gòu)中的每一行相當(dāng)于CORDIC算法中的一級(jí)迭代,,其硬件結(jié)構(gòu)如圖7所示,。每一級(jí)電路包括三個(gè)加/減法器和兩個(gè)移位器,其中Ai表示各級(jí)基本旋轉(zhuǎn)角度值,,Sign為各級(jí)運(yùn)算的加/減控制信號(hào),,它的符號(hào)由Zi的最高位確定。
最后一部分對(duì)數(shù)據(jù)舍入截位,,并輸出正,、余弦兩路信號(hào)。本設(shè)計(jì)適用于多種旋轉(zhuǎn)精度的需求,,靈活性好,,資源利用率高,全并行流水的結(jié)構(gòu)具有速度快,、吞吐量大的特點(diǎn),。
4 系統(tǒng)仿真及性能分析
本設(shè)計(jì)根據(jù)圖5,在Xilinx ISE 14.7環(huán)境下搭建軟件平臺(tái),,采用Verilog HDL硬件描述語(yǔ)言完成編譯綜合,,使用Modelsim SE 10.1c進(jìn)行功能仿真驗(yàn)證,最后通過(guò)MATLAB R2012b對(duì)結(jié)果進(jìn)行分析,。
在Xilinx ISE中完成代碼編寫(xiě)后,,調(diào)用Modelsim進(jìn)行軟件仿真,,當(dāng)輸入不同頻率控制字,得到NCO產(chǎn)生的正余弦信號(hào)結(jié)果如圖8所示,。從圖中可以看出,,生成的 I、Q兩路波形信號(hào)具有完全正交性,,并且經(jīng)過(guò)角度映射后實(shí)現(xiàn)了整個(gè)圓周區(qū)間的覆蓋,,完全可以替代基于查找表的傳統(tǒng)NCO設(shè)計(jì)方式。
本文選用Xilinx Virtex-4芯片,,經(jīng)過(guò)Xilinx ISE對(duì)代碼編譯綜合后,,得到設(shè)計(jì)所消耗的硬件資源及最高工作頻率等信息。在16位小數(shù)精度,、16級(jí)流水迭代的情況下,傳統(tǒng)CORDIC算法設(shè)計(jì)而成的NCO使用了1 021個(gè)邏輯單元,,而基于CORDIC改進(jìn)算法的NCO模塊使用了904個(gè)邏輯單元,,節(jié)省了約11.46%的硬件資源。從表3可以看出,,采用經(jīng)過(guò)優(yōu)化后的CORDIC算法,,系統(tǒng)最高頻率可達(dá)287.64 MHz,比基于查表法及常規(guī)CORDIC算法NCO的性能分別提高了354.6%和144.3%,。
最后將Modelsim仿真得出的數(shù)據(jù)在[-π,,π]之間平均采樣5 000個(gè)點(diǎn)并導(dǎo)入MATLAB,經(jīng)過(guò)處理后得到圖9,。再?gòu)腫-π/4,,π/4]中選取若干角度進(jìn)行誤差對(duì)比分析,如表4所示,。
I,、Q通路正余弦值的誤差主要由迭代次數(shù)以及位寬的限制引起,通過(guò)對(duì)表4的數(shù)據(jù)分析可知,,傳統(tǒng)算法在使用24位小數(shù)位的情況下進(jìn)行運(yùn)算,,誤差達(dá)到10-4;而基于本文的CORDIC改進(jìn)算法僅使用16位數(shù)據(jù)位寬就能夠?qū)⒕忍嵘?0-5~10-6的數(shù)量級(jí),,所以本設(shè)計(jì)在提高精度的同時(shí)還減少了硬件資源的消耗,,在精度和面積上均具有一定的優(yōu)勢(shì)。
5 結(jié)束語(yǔ)
本文在傳統(tǒng)CORDIC算法基礎(chǔ)上,,提出改進(jìn)方案并應(yīng)用于數(shù)字控制振蕩器的設(shè)計(jì),,通過(guò)仿真驗(yàn)證及性能分析證明其可行性。實(shí)驗(yàn)結(jié)果表明,,本設(shè)計(jì)進(jìn)一步提升了系統(tǒng)的速度和精度,,并在一定程度上減少了硬件資源消耗,。目前,該NCO模塊已經(jīng)成功的應(yīng)用于某DDC芯片的產(chǎn)品中,,并且表現(xiàn)出良好的性能及穩(wěn)定性,。
參考文獻(xiàn)
[1] LIU Y,F(xiàn)AN L,,MA T.A modified CORDIC FPGA implementation for wave generation[J].Circuits,,Systems and Signal Processing,2014,,33(1):321-329.
[2] Pramod Kumar Meher,,Sang Yoon Park.CORDIC designs for fixed angle[J].IEEE Transaction on Very Large Scale Integration(VLSI) System,2013,,21(2):217-227.
[3] 張曉彤,,辛茹.基于改進(jìn)混合式CORDIC算法的直接數(shù)字頻率合成器設(shè)計(jì)[J].電子學(xué)報(bào),2008,,36(6):1144-1148.
[4] KAUSHIK B,,RAKESH B.Architectural design and FPGA implementation of radix-4 CORDIC proseccor[J].Micropro-cessors and Microsystems,2010,,34(2-4):96-101.
[5] 徐成,,秦云川.免縮放因子雙步旋轉(zhuǎn)CORDIC算法[J].電子學(xué)報(bào),2014,,42(7):1441-1445.
[6] 張朝柱,,韓吉南,燕慧智.高速高精度固定角度旋轉(zhuǎn)CORDIC算法的設(shè)計(jì)與實(shí)現(xiàn)[J].電子學(xué)報(bào),,2016,,44(2):485-490.
[7] MAHARATNA K,BANERJEE S,,GRASS E,,et al.Modified virtually scaling-free adaptive CORDIC rotator algorithm and architecture[J].IEEE Transaction on Circits Systems for Video Technolog,2005,,15(11):1463-1474.
[8] HU H Y.The quantization effects of the CORDIC algorithm[J].IEEE Transactions on Signal Processing,,1992,40:834-844.
作者信息:
王申卓,,胡春林,,胡廣垠,徐大誠(chéng)
(蘇州大學(xué) 電子信息學(xué)院,,江蘇 蘇州215000)