《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 通信與網(wǎng)絡(luò) > 設(shè)計(jì)應(yīng)用 > 基于CORDIC改進(jìn)算法的NCO設(shè)計(jì)
基于CORDIC改進(jìn)算法的NCO設(shè)計(jì)
2017年電子技術(shù)應(yīng)用第3期
王申卓,胡春林,胡廣垠,徐大誠(chéng)
蘇州大學(xué) 電子信息學(xué)院,江蘇 蘇州215000
摘要: 數(shù)控振蕩器(NCO)已經(jīng)被廣泛應(yīng)用于數(shù)字信號(hào)處理、軟件無(wú)線(xiàn)電系統(tǒng)等諸多領(lǐng)域中。針對(duì)基于傳統(tǒng)CORDIC(Coordinate Rotation Digital Computer)算法的NCO存在工作頻率較低、精度不高、且消耗資源多等缺點(diǎn),通過(guò)對(duì)CORDIC算法進(jìn)一步優(yōu)化改進(jìn),提出了一種NCO的設(shè)計(jì)方法,將覆蓋角度擴(kuò)展至整個(gè)圓周范圍,實(shí)現(xiàn)了幅度與相位之間分別對(duì)應(yīng),且輸出的正余弦波形具有完全正交性。實(shí)驗(yàn)結(jié)果表明,設(shè)計(jì)的NCO具有運(yùn)算速度快,消耗硬件資源較少,結(jié)構(gòu)簡(jiǎn)單易于使用硬件電路實(shí)現(xiàn)的優(yōu)勢(shì),最高頻率比基于傳統(tǒng)CORDIC算法的NCO提高了114.3%,并將精度提高至10-5~10-6的數(shù)量級(jí)。
中圖分類(lèi)號(hào): TN402
文獻(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.
Design of NCO based on improved CORDIC algorithm
Wang Shenzhuo,Hu Chunlin,Hu Guangyin,Xu Dacheng
School of Electronic and Information Engineering,Soochow University,Suzhou 215000,China
Abstract: Numerically Controlled Oscillator(NCO) has been widely applied in many fields,including digital signal processing and software defined radio. NCO based on the conventional CORDIC has disadvantages of low operation frequency, low precision, and high consumption of resources. To solve these problems, a design of NCO is presented in this paper by improving the conventional CORDIC, the phase and amplitude of a one-to-one corespondence is realized, extends the convergence range to the entire circumference, and the sine and cosine waveforms are completely orthogonal. The simulation results showed that the design has advantages of high speed, low resource usage and simple structure, the maximum clock frequency is 114.3% higher than the NCO which is based on the traditional CORDIC algorithm, and the accuracy is improved to 10-5~10-6.
Key words : NCO;CORDIC algorithm;precision;pipeline

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)算速度。

wdz6-t1.gif

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所示。

wdz6-t2.gif

    根據(jù)旋轉(zhuǎn)變換法則,可得式(1):

wdz6-gs1-7.gif

    當(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=zii(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]。

wdz6-t3.gif

    此外,有限次數(shù)的迭代運(yùn)算通常無(wú)法完全消除累加角度與期望角度間的誤差,因此我們引入殘余角誤差ε,并將式(4)改寫(xiě)為:

    wdz6-gs8.gif

    由式(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]

    wdz6-gs9.gif

其中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中列舉了其中的部分角度。

wdz6-b1.gif

    式(3)是關(guān)于i的遞減函數(shù),將這些角度累加,當(dāng)i→∞時(shí):

    wdz6-gs10.gif

    可見(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ù)因子wdz6-gs10-x1.gif進(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)改變。

wdz6-t4.gif

    利用三角函數(shù)的對(duì)稱(chēng)性,根據(jù)θ所在象限,對(duì)初始值分別做如表2的處理。

wdz6-b2.gif

    這樣的數(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所示。

wdz6-t5.gif

    在本設(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輸出波形的頻率也隨之改變。

wdz6-t6.gif

    在前端處理中,我們采用了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的最高位確定。

wdz6-t7.gif

    最后一部分對(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ì)方式。

wdz6-t8.gif

    本文選用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%。

wdz6-b3.gif

    最后將Modelsim仿真得出的數(shù)據(jù)在[-π,π]之間平均采樣5 000個(gè)點(diǎn)并導(dǎo)入MATLAB,經(jīng)過(guò)處理后得到圖9。再?gòu)腫-π/4,π/4]中選取若干角度進(jìn)行誤差對(duì)比分析,如表4所示。

wdz6-t9.gif

wdz6-b4.gif

    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)

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。