文獻(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ù)線(xiàn)性變化、頻率分辨率高、全數(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)的固定小角度的不斷偏擺從而逼近期望角度,此算法具有線(xià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)高速高精度的輸出,就必須采用高速全流水線(xiàn)結(jié)構(gòu),如圖3所示。流水線(xiàn)結(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ú)限制增加流水線(xiàn)級(jí)數(shù),一方面流水線(xiàn)級(jí)數(shù)過(guò)多會(huì)降低系統(tǒng)整體運(yùn)算速度,另一方面流水增加至一定級(jí)數(shù)后,對(duì)精度的提高微乎其微,但是卻消耗了大量的硬件資源,因此必須選擇適合的流水線(xiàn)級(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í)并行流水線(xiàn)結(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ú)法滿(mǎn)足。
利用三角函數(shù)的對(duì)稱(chēng)性,通過(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ì)稱(chēng)性,根據(jù)θ所在象限,對(duì)初始值分別做如表2的處理。
這樣的數(shù)據(jù)預(yù)處理過(guò)程雖然會(huì)消耗一定的硬件資源,但特別適合流水線(xiàn)結(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)生的誤差稱(chēng)為舍入誤差。所以除了增加迭代次數(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流水線(xiàn),它是整個(gè)系統(tǒng)的核心,流水線(xiàn)結(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)