传统DDS是由美国学者Tierney 等提出,采用查找表结构实现,很难满足数字信号处理领域中高精度、高分辨率、实时运算的要求。而采用基于CORDIC算法的DDS结构可以很容易地满足这些要求,且易于采用流水线技术,因此这一技术越来越多的用于雷达等电子系统中[1]。本文提出了一种基于CORDIC算法的16位流水线并行结构的DDS,取代传统ROM查找表,实现了高速度和资源占用率低的要求。利用Matlab工具进行仿真分析,不仅能直观地看出输出波形,而且加快了设计进程。
1 DDS的基本结构
DDS的基本结构如图1所示,主要包括:参考频率源、相位累加器、ROM正弦查找表、D/A转换器及低通滤波器。频率控制字K决定了相位累加器的步进大小。每一个时钟周期,相位寄存器中的数值就累加一个步长K,与初始相位相加后送入正弦查找表,正弦查找表一般是一个可编程存储器,存有相应的正弦波数据。存储器将输入的相位信息转换为地址信息,再将地址映射为正弦幅度值,经过D/A转换器生成阶梯波形,然后经过低通滤波器得到频率的连续波形。
这种结构的缺点是ROM的容量与相位码的位数成指数关系,而大容量的ROM意味着系统高功耗、高成本、低稳定性。因此人们寻求直接计算正余弦值来代替ROM查找表。相位幅度转换主要有查表法、多项式展开法以及CORDIC算法[2]。CORDIC算法在硬件实现上只需移位和加减运算即可得到正余弦值,容易在VLSI芯片上实现。
2 CORDIC算法的原理及改进
CORDIC(The Co-ordinate Rotation Digital Computer)算法由J.Volder[3]1959年在美国航空控制系统设计中提出,是一种用于计算运算函数的循环迭代算法。CORDIC算法的基本概念是将目标旋转角分解为一组预定单元旋转角的加权和,用这组预先规定的基本角度的线性组合逼近。该算法的巧妙之处在于基本角的选取恰好使每次矢量以基本角度旋转后,新矢量坐标值的计算仅需要简单的移位和加减法就能完成[4]。
其中p称为CORDIC算法的旋转增益。实际的算法中不可能做无穷迭代,因此实际的增益与迭代次数有关,当迭代次数逐渐增大时,p就不断逼近1.647。由于n不可能无穷大,因此会引入误差。在迭代的过程中可以忽略cosθn项,迭代的最后再将其乘入。这样就得到: