基于CORDIC改进算法的DDS设计
摘 要: 采用CORDIC算法实时计算正弦值的方法,替代传统DDS中的正弦查找表,显著节省了硬件资源,极大提高了转换速度以及DDS的频率和相位分辨率。将基于改进的并行流水结构的CORDIC算法作为IP应用于高端DDS芯片中,同时利用Matlab的M语言进行仿真与调试,可以直观地看到该改进算法的输出波形。
关键词: 直接数字频率合成;CORDIC算法;Matlab
传统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项,迭代的最后再将其乘入。这样就得到:
从公式(7)而来的是CORDIC算法的迭代结构,在传统的迭代结构中随着迭代次数的增加,其查找表的地址也随之增加,查找表中存放旋转的角度集。必须有一个状态机来跟踪迭代过程,这将导致运行速度降低,不适合高速高精度的要求[6]。
采用流水线结构,能够在执行进程的同时输入数据,从而极大提高程序的运行效率。迭代性流水线结构如图2所示。
3 Matlab软件实现CORDIC算法仿真
Matlab是矩阵实验室(Matrix Laboratory)的简称,是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括Matlab和Simulink两大部分。Matlab的应用范围非常广,包括信号和图像处理、通信、控制系统设计、测试和测量、财务建模和分析以及计算生物学等众多应用领域。本文利用Matlab的M语言进行CORDIC算法的仿真,其优势在于仿真结果易于观察,充分利用可以有效的加快设计进程。
本程序遵照上述CORDIC算法编写, 采用文件的方式编写,下面是部分源程序。仿真输出波形如图3所示。
function[x,y]=get_sincos(Angle,precision)%Initial Angle and
precision
InitialAngle=Angle*pi/180;%Coneversion to radian
K=1.0;
for i=1:precision
cordic_table{i}.k=K;
cordic_table{i}.phase_rads=atan(K);
K=0.5*K;
end;
x=0.60725293510314;y=0;%Initial Value when computing
sin/cos
acc_phase_rads=InitialAngle;
…
for i=-90:1:90
[x,y]=get_sincos_fxp(i,22);
xx(j)=x;
yy(j)=y;
j=j+1;
end;
figure(1)
plot(xx,′r′)
hold on
plot(yy,′b′)
hold off
在传统DDS设计的基础上,用CORDIC算法取代传统的查找表,提升了转换速度和精度,同时基于改进的并行流水线型的CORDIC,进一步提升了转换速度,在大部分转换角度固定的情况下,对初始值进行优化可以节省1/3的硬件资源。该设计已经作为IP应用于高端DDS芯片中。
- 基于流水线CORDIC算法的正交幅度调制解调在FPGA上的设计实现(06-05)
- 基于CORDIC算法的光相位检测及FPGA实现(06-05)
- 一种CORDIC协处理器核的设计与实现(09-12)
- 数字频率信号校正的FPGA实现(11-23)
- 一种基于DDS技术的信号发生器研究与实现(03-30)
- ADI常用DDS的线性扫频特性比较研究(04-16)