文獻標識碼: A
DOI:10.16157/j.issn.0258-7998.2017.03.010
中文引用格式: 王申卓,胡春林,胡廣垠,等. 基于CORDIC改進算法的NCO設計[J].電子技術應用,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 引言
數控振蕩器(Numerically Controlled Oscillator,NCO)是信號處理系統的重要組成部分。隨著現代通信系統的不斷發展,NCO憑借其相位可連續線性變化、頻率分辨率高、全數字化處理等優越特性,在圖像處理、快速傅里葉變換、直接數字頻率合成器等設計中得到了廣泛應用。
傳統數控振蕩器的實現方法為只讀存儲器查找表法(ROM LUT),如圖1所示。這種方法在對分辨率要求不高的情況下,是一種簡單的實現方式。但是若要進一步提高分辨率,就會消耗大量的ROM資源;此外,存儲器讀取速度的瓶頸也限制了NCO的輸出速度。而CORDIC算法易于使用數字電路實現,僅通過簡單的加減法和移位操作就可以完成多種硬件電路難以直接實現的復雜運算,因此在NCO的設計中也得到了很好的應用。本文將對傳統CORDIC算法進一步改進,并結合改進方法提出一種適合于硬件實現的數控振蕩器的設計方法,從而提高輸出精度和運算速度。
1 CORDIC算法原理
坐標旋轉數字計算(Coordinate Rotation Digital Computer,CORDIC)首次由Jack Volder于1959年提出,1971年Walther統一了CORDIC算法的形式。CORDIC的基本思想是通過一系列只與運算基數有關的固定小角度的不斷偏擺從而逼近期望角度,此算法具有線性收斂域和序列特性[3]。
CORDIC算法的基本原理是運用了Givens旋轉法則。假設給定向量A(x0,y0),當旋轉過一定角度θ后得到新向量B(x1,y1),如圖2所示。
根據旋轉變換法則,可得式(1):
當N→∞時,KN收斂于一個常數,即KN≈0.607 252 935。當迭代次數N得到確定,KN的值也就確定了,可以把它看作一個常數,所以只要提前計算出定標因子KN,就能正確地使用式(6)進行CORDIC求值運算。可見對于每一次小角度θi的旋轉運算,實際上只與δi2-i運算有關,這在硬件上的反映就是加/減法和移位操作。
最后,通過引入參數z表示當前角度和期望角度的偏差值,來確定下一次旋轉的方向,即判斷δ的符號。令zi+1=zi-θi(z0=θ,i=0,1,…,N-1),當z≥0時,δ=+1;當z≤0時,δ=-1。若經過多次旋轉后,就可以得到與期望角度充分接近的旋轉向量。如果選取初始值(x0,y0)=(KN,0),在進行N次迭代運算后,結果將收斂于(sinθ,cosθ)。
2 CORDIC算法改進
2.1 算法迭代結構
由CORDIC算法的原理可以看出,此算法每一次的運算結構相似,具有可迭代的特性。對于傳統的反饋結構,每次運算都利用同一組硬件反復進行迭代,此結構占用硬件資源少,能夠在一定程度上縮小電路面積。但是由于需要不斷向輸入端反饋輸出數據,而且還需要一個狀態機來跟蹤全部迭代過程,會導致整個系統運行速度降低,吞吐量減小。如果需要實現高速高精度的輸出,就必須采用高速全流水線結構,如圖3所示。流水線結構的每一級迭代都使用單獨的運算單元,與反饋結構相比,雖然消耗了較多的硬件資源,但換來的是運算速度提高,吞吐量增大,特別適合在硬件上實現[4]。
此外,有限次數的迭代運算通常無法完全消除累加角度與期望角度間的誤差,因此我們引入殘余角誤差ε,并將式(4)改寫為:
由式(8)可以看出,隨著迭代次數或者流水級數的不斷增加,近似誤差ε的趨勢是減小的,角度累加所得到的值會逐漸逼近期望角度,CORDIC算法的精度也會不斷提高。但是考慮到實際設計中不能無限制增加流水線級數,一方面流水線級數過多會降低系統整體運算速度,另一方面流水增加至一定級數后,對精度的提高微乎其微,但是卻消耗了大量的硬件資源,因此必須選擇適合的流水線級數,來控制硬件成本和計算復雜度。根據Yu Hen Hu提出ε的上界[8]:
其中AN-1為最后一次的旋轉角度,N為旋轉次數。為了達到所需要的精度,我們選擇N=16,即通過16級并行流水線結構來實現CORDIC算法。
2.2 覆蓋角度擴展
CORDIC算法每一級的角度旋轉由式(3)得到了確定,表1中列舉了其中的部分角度。
式(3)是關于i的遞減函數,將這些角度累加,當i→∞時:
可見CORDIC算法能夠計算角度的收斂域為[-99.88°,99.88°],而我們需要輸出整個圓周范圍內角度的正余弦值,顯然常規的方法無法滿足。
利用三角函數的對稱性,通過象限轉移的方法就能夠將計算角度擴展至[-π,π]。文獻[5]將[-π,π]映射至[0,π/4],但是在最后對輸出的一組數據是否交換或改變符號需要進行判斷,而文獻[7]中將[-π,π]映射至[0,π/8],但需要對產生的常數因子進行補償。本文將整個圓周[-π,π]劃分為8個象限(如圖4所示),并將所有角度映射至[-π/4,π/4],即1號和8號象限,并同時對初始值X0和Y0進行處理。這樣既不會產生額外的常數因子,也不需要在最后對輸出結果進行數據交換或符號改變。
利用三角函數的對稱性,根據θ所在象限,對初始值分別做如表2的處理。
這樣的數據預處理過程雖然會消耗一定的硬件資源,但特別適合流水線結構的CORDIC算法,對提高整個系統的速度有很大幫助。
2.3 計算數據位擴展
在實際電路的實現中,由于CORDIC算法每一級迭代使用的都是有限精度的代數計算,就導致了另外一種誤差,這種因數據位寬有限而產生的誤差稱為舍入誤差。所以除了增加迭代次數以外,還可以通過擴展CORDIC算法數據的位寬來提高精度。舍入誤差σ的大小與運算數據的位寬b有關,根據σ=2-b-1這一關系式可知,操作數的位寬每擴展一位,就能夠將舍入誤差縮小為原來的一半。當增加流水的級數無法大幅提高算法精度時,擴展CORDIC計算數據位寬是另一種很好的方法,如圖5所示。
在本設計中,由于NCO后端接入了混頻模塊,輸出數據必須為16位與之匹配,但是在CORDIC內部迭代計算時,我們把數據擴展至20位,最后對輸出結果截位處理,然后再送入下一級。通過對數據位寬擴展4位的方法,可以有效地提高運算精度。
3 基于CORDIC改進算法的NCO系統結構
NCO主要用于產生正、余弦信號,本設計基于CORDIC改進算法,由前端處理、CORDIC迭代以及輸出處理這3個部分組成,其系統結構如圖6。當輸入不同的頻率控制字時,NCO輸出波形的頻率也隨之改變。
在前端處理中,我們采用了24位相位累加器以保證頻率分辨率達到要求,并通過判斷相位值的高3位θ[23:21],將目標角度映射至[-π/4,π/4]區間,具體映射方法見表2;而修正因子可以根據式(7)求出,由于算法的流水級數事先已經確定,所以只要將N=16代入就可以準確的得到KN,再通過數據預處理確定X0和Y0的初始值,從而在迭代之前就完成對輸出結果的補償,進一步提高整個系統的速度。
第二部分為16級CORDIC流水線,它是整個系統的核心,流水線結構中的每一行相當于CORDIC算法中的一級迭代,其硬件結構如圖7所示。每一級電路包括三個加/減法器和兩個移位器,其中Ai表示各級基本旋轉角度值,Sign為各級運算的加/減控制信號,它的符號由Zi的最高位確定。
最后一部分對數據舍入截位,并輸出正、余弦兩路信號。本設計適用于多種旋轉精度的需求,靈活性好,資源利用率高,全并行流水的結構具有速度快、吞吐量大的特點。
4 系統仿真及性能分析
本設計根據圖5,在Xilinx ISE 14.7環境下搭建軟件平臺,采用Verilog HDL硬件描述語言完成編譯綜合,使用Modelsim SE 10.1c進行功能仿真驗證,最后通過MATLAB R2012b對結果進行分析。
在Xilinx ISE中完成代碼編寫后,調用Modelsim進行軟件仿真,當輸入不同頻率控制字,得到NCO產生的正余弦信號結果如圖8所示。從圖中可以看出,生成的 I、Q兩路波形信號具有完全正交性,并且經過角度映射后實現了整個圓周區間的覆蓋,完全可以替代基于查找表的傳統NCO設計方式。
本文選用Xilinx Virtex-4芯片,經過Xilinx ISE對代碼編譯綜合后,得到設計所消耗的硬件資源及最高工作頻率等信息。在16位小數精度、16級流水迭代的情況下,傳統CORDIC算法設計而成的NCO使用了1 021個邏輯單元,而基于CORDIC改進算法的NCO模塊使用了904個邏輯單元,節省了約11.46%的硬件資源。從表3可以看出,采用經過優化后的CORDIC算法,系統最高頻率可達287.64 MHz,比基于查表法及常規CORDIC算法NCO的性能分別提高了354.6%和144.3%。
最后將Modelsim仿真得出的數據在[-π,π]之間平均采樣5 000個點并導入MATLAB,經過處理后得到圖9。再從[-π/4,π/4]中選取若干角度進行誤差對比分析,如表4所示。
I、Q通路正余弦值的誤差主要由迭代次數以及位寬的限制引起,通過對表4的數據分析可知,傳統算法在使用24位小數位的情況下進行運算,誤差達到10-4;而基于本文的CORDIC改進算法僅使用16位數據位寬就能夠將精度提升至10-5~10-6的數量級,所以本設計在提高精度的同時還減少了硬件資源的消耗,在精度和面積上均具有一定的優勢。
5 結束語
本文在傳統CORDIC算法基礎上,提出改進方案并應用于數字控制振蕩器的設計,通過仿真驗證及性能分析證明其可行性。實驗結果表明,本設計進一步提升了系統的速度和精度,并在一定程度上減少了硬件資源消耗。目前,該NCO模塊已經成功的應用于某DDC芯片的產品中,并且表現出良好的性能及穩定性。
參考文獻
[1] LIU Y,FAN 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] 張曉彤,辛茹.基于改進混合式CORDIC算法的直接數字頻率合成器設計[J].電子學報,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] 徐成,秦云川.免縮放因子雙步旋轉CORDIC算法[J].電子學報,2014,42(7):1441-1445.
[6] 張朝柱,韓吉南,燕慧智.高速高精度固定角度旋轉CORDIC算法的設計與實現[J].電子學報,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.
作者信息:
王申卓,胡春林,胡廣垠,徐大誠
(蘇州大學 電子信息學院,江蘇 蘇州215000)