基于CORDIC算法的数控振荡器的FPGA设计.doc
上传人:sy****28 上传时间:2024-09-14 格式:DOC 页数:6 大小:171KB 金币:18 举报 版权申诉
预览加载中,请您耐心等待几秒...

基于CORDIC算法的数控振荡器的FPGA设计.doc

基于CORDIC算法的数控振荡器的FPGA设计.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

18 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

基于CORDIC算法的数控振荡器的FPGA设计数控振荡器在数字信号处理中有着广泛的应用。本文研究并实现了基于CORDIC算法的流水线型数控振荡器。仿真和验证结果表明,该方法较之查找表法精度高,且结构简单、耗费资源少,非常易于FPGA实现。引言由于具有频率精度高、转换时间短、频谱纯度高以及频率相位易编程等特点,数控振荡器(NCO)被广泛应用于软件无线电数字上、下变频以及各种频率和相位数字调制解调系统中。NCO传统的实现方法主要有查表法、多项式展开法或近似法,但这些方法在速度、精度、资源方面难以兼顾。而采用CORDIC算法来实现超函数时,则无需使用乘法器,它只需要一个最小的查找表(LUT),利用简单的移位和相加运算,即可产生高精度的正余弦波形,尤其适合于FPGA的实现。数控振荡器原理NCO的目标是产生频率可变的正、余弦波样本,(n=0,1,2...)。式中,fLO为本地振荡频率,fS为输入信号的采样频率。如图1所示,NCO主要包括3个模块:1.相位累加器对输入频率控制字M不断累加,得到以该频率字为步进的数字相位。2.相位相加器将相位寄存器中的数字相位与相位控制字相加,得到偏移后的当前相位。设系统的时钟频率为fc,频率控制字为M,相位寄存器位数为N,则数控振荡器输出信号频率为。根据Nyquist抽样定理,fs最大值为1/2fc,而在实际设计中,一般不应大于时钟频率的1/4。其频率分辨率为,根据此式,在系统时钟频率不变的情况下,相位寄存器位数N越大,产生信号的频率分辨率越高。图1数字控制振荡器结构图3.函数发生模块,对当前相位进行对应幅度转换后,可以输出任意函数的波形。函数发生模块最直接的实现方法是只读存储器查找表(ROMLUT)法,将正、余弦波形的抽样存放在ROM中,并通过一个DAC周期地进行输出,从而产生输出波形。如输出信号幅度位数为a,相位地址位数n所需查找表的大小为a×2n。结合上文结论可知,频率分辨率越高,所需要的ROM越大,和n为指数增长关系。可见,ROMLUT法很难兼顾功耗、性能、成本三方面,而CORDIC算法的应用能够很好地解决这一问题。CORDIC算法原理CORDIC(坐标旋转数字计算机)算法是JackVolder于1959年提出的,主要用于计算三角函数,双曲函数及其他的一些基本函数。J.Walther于1971年提出了统一的CORDIC形式。该算法的具体原理如下:如图2所示,初始向量a(x0,y0)(注意y0=0)经n次旋转后得到向量b(xN,yN)qi。设第i次旋转的角度为qi,根据J.Walther的推导得到迭代方程组:(1)且累积后最终结果为(2)通过选择tan(qi)=±2-i可以得到,x和y的方程现在可以利用一个简单的管状移位器和一个算术逻辑单元(ALU)来实现。此外,只需要使用一个相对简单的、事先计算好的反正切表,即可消除超函数的计算。图2CORDIC算法原理示意图同时还要判断旋转的方向,以满足Z变量由初始值逐步趋于零,需要通过下式来引入和估计一个简单的符号变量d:di=sgn(zi)。(3)经过上面2步,得到如下迭代方程:(4)最后确定初始条件(5)则当N→时,迭代后结果为:(xi,yi)→(cos(q),sin(q))。综合以上推导可见,只要选取合适的N,计算出相应的初始值(x0,y0),以及相对应的反正切值,就可以利用简单的移位加法操作和流水线结构实现上述的迭代方程式,计算出已知角度Z的正、余弦值,且这样的电路结构非常易于FPGA实现。应用MATLAB进行功能仿真和参数设计FPGA设计流程中,应先利用MATLAB进行功能仿真,按照系统要求,以先验的方式确定系统参数,测试系统性能是非常必要的,可以有效提高FPGA硬件设计的效率和电路质量,避免不必要的重复劳动。本系统采用40M的晶振,要求输出9.7M的正、余弦波,输出幅值为18位二进制数。在实际系统中,由于有限的相位字长和有限的量化电平,相位和量化误差总是存在的,而且这些误差会导致杂散噪声出现在频谱中期望的分量之间,这些靠近期望分量的杂散信号会降低数字合成器的无杂散动态范围(SFDR)。本系统要求输出波形SFDR大于90dB。因此还需要确定两个系统参数。第一个参数是CORDIC迭代次数N。显然,迭代次数N越大,精度越高,资源消耗也越多,所以要选取合适的N值。另一个参数是当前相位Z的范围。在实现过程中可以利用三角函数的一些对称性质对相位进行象限转换,将当前相位统一到更小的范围内,例如1/2圆,1/4圆,甚至1/8圆,配合少量LUT,达到用较少迭代次数实现更高精度的目的,代价是电路的复杂度将会增加。通过将CORDIC迭代过程、相位计算,以及相位截断、量化字长等的误差等因素引入MATLAB