文献标识码: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)