简易DDS信号原设计
的有关信息介绍如下:利用FPGA+DAC,设计一个DDS信号发生器。
要求:
分辨率优于1Hz
ROM表长度8位、宽度十位
输出频率优于100kHz(每周期大于50个点)
显示信号频率/频率控制字(可切换)
直接输入频率控制字或者输出频率
DDS原理
若对一正弦波形进行采样,每周期为 m 个采样点,分别记为 1~m。 对应每次参考时钟 f c , 输出一个采样点,输出图中所示的一个周期的正弦,需要 m 个时钟周期,则输出的波形频率为 f a =f c/m。对于这种情况, 每次时钟到来时,相位累加器加 1 ,则就会在第 i 个时钟周期输出 第 i 个采样点( i = 1~m) ,第 m + 1 个时钟输出第 1 个采样点,以此循坏,这时的相位累加器实 际上是步进为 1 的模 m 计数器。 如果每次时钟到来时, 总是间隔一个采样点输出,即相位累 加器的步进为 2 ,这时在第 i 个周期输出第 2i 个采样点,输出波形如图 1. 2 的波形 b,显然波 形 b 的频率是 a 的 2 倍,即 f b = 2 f a 。
综上所述,如果相位累加器的步进为 B, 则输出波形的频率为 B×f a , f a 是最小的输 出频率称为频率分辨率或步进间隔, B 为频率控制字。给定不同的频率控制字即可输出不同 的频率。频率输出公式为: f 0 = fc/m* B
在实际设计中,如果累加器长度为N ,则可以有2N 个存储单元存储采样数据,如果我们 对一个周期的波形进行2N 个点的采样,即m = 2N , 此时输出频率f o 和系统时钟频率f c ,相 fc f0 = N B 2 位累加器长度N 以及频率控制字B的关系为: 为了使波形输出不失真,根据奈奎 斯特定理, B最高为2 N - 1 。另外要提高DDS 的精度,就需要分母越大越好,即采样点的个数 越多,越接近实际波形。但实际上不可能提供如此之多的存储空间,这就需要对采样点进行量 化。如图1 (c) 所示,如果量化单位为K,则前K 个点的值总是相同的,为采样值1 ,第二组K 个 采样点的值为采样值2 ,以此类推,第i 组K 个采样点的值为采样值i , 共需要m/K个存储单元 来存储m/K个采样点。
DDS 的杂散来源之一就是相位累加器相位舍位造成的杂散。现有的频率控制主要采用 二进制频率控制原理。这是因为 FPGA 采用二进制的数据处理机制以及波形存储器的二进 制寻址方式,所以通常情况下 mK、m、K 都是二进制整数,如 m = 2^N ,这就要求对计算结果 进行十进制近似取舍,造成了波形发生器的输出频率以及频率分辨率存在无法消除的误差。
DDS 以数控振荡器的方式,产生频率、相位可控 制的正弦,电路包括了基准时钟源、相位累加器、相位调制器、正弦ROM 查找表、D/A 转换 器和低通滤波器等。 频率控制字N 和相位控制字M 分别控制DDS 所输出的正弦波的频率和相 位。DDS 系统的核心是相位累加器,它由一个N 位累加器与N 位相位寄存器构成。时钟脉冲 每触发一次, 累加器便将频率控制数据与相位寄存器输出的累加相位数据相加, 然后把相加 后的结果送至相位寄存器的数据输入端。 相位寄存器将累加器在上一个时钟作用后所产生的 新相位数据反馈到累加器的输入端, 以使加法器在下一个时钟的作用下继续与频率控制数据 相加。 这样, 相位累加器在参考时钟的作用下将进行线性相位累加, 当相位累加器累加满时, 就会产生一次溢出, 以完成一个周期性的动作, 这个周期就是DDS 合成信号的一个频率周期, 相位累加器的溢出频率就是DDS 输出的信号频率。 相位寄存器的输出与相位控制字相加, 结 果作为正弦查找表的地址。 查找表由ROM 构成, 其内部存有一个完整周期正弦波的数字幅度 信息, 每个查找表的地址对应正弦波中的一个相位点。 查找表把输入地址信息映射成正弦波 幅度信号, 同时输出到D/A 转换器的输入端, 通过D/A 可将数字量形式的波形幅值转换成所 要求的合成频率模拟量形式信号。 低通滤波器用于衰减和滤除不需要的取样分量, 以便输出 频谱纯净的正弦波信号。
相位累加器由 N 位全加器和 N 位累加寄存器级联而成, 对频率控制字的 2 进制码进行累加运算,是典型的反馈电路。在每个系统时钟沿 Fclk 的控制下,N 位加法器将频率控制字 X 与累加寄存器输出的相位数据相加, 把相加后的结果再送至累加寄存器, 累加寄存器中新的相位数据既反馈到加法器的输入端, 以使加法器在下一Fclk 时钟周期中继续与频率控制字X 相加, 同时累加寄存器的高M 位数值, 将作为查找ROM 表中取样数据的地址值。
ROM 查找表中储存着一个完整周期的正弦波幅度信息, 通过取得的采样地址值进行查表, 从 ROM 表中输出相应的波形采样数据(Fout) , 送入 D/A 转换器,DAC 输出阶梯波形, 再通过低通滤波器将波形数据转换成符合要求的模拟波形。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY M_ADD IS
PORT (cp:IN STD_LOGIC;
M: IN STD_LOGIC_VECTOR(23 DOWNTO 0);
en:IN STD_LOGIC;
clr:IN STD_LOGIC;
O: OUT STD_LOGIC_VECTOR(23 DOWNTO 0) );
END M_ADD;
ARCHITECTURE one OF M_ADD IS
signal temp:STD_LOGIC_VECTOR(23 DOWNTO 0);
signal M_temp:STD_LOGIC_VECTOR(23 DOWNTO 0);
BEGIN
PROCESS(clr,en,M,cp)
begin
M_temp<=M;
if clr='1' then
temp<="000000000000000000000000";
elsif (en='1'and (cp'event and cp='1'))then
temp<=temp+M_temp;
end if;
O<=temp;
end process;
END one;
波形ROM示意图 其中步长的概念即为对数字波形查表的相位增量, 由累加器对相位增量进行累加, 每个时钟周期产生的累加器的高 M 位数值作为查表地址, 两个查表周期之间就存在一个相位增量, 当相位累加器加满时就会产生一次溢出, 即相位寄存器每经过2N /X 个Fclk 时钟周期后回到初始状态, 相应的ROM 查找表经过一个循 18 环回到初始位置, 整个 DDS 系统输出一个正弦波, 这样就完成了一个波形采样值的查表和输出, 这个周期就是DDS 产生波形的一个频率周期。
当ROM地址线上的地址(相位)改变时,数据线上输出相应的量化值(幅度量化序列)。需要指出的是因为波形 ROM 的存储容量有限,相位累加器的字长一般不等于朋M地址线的位数因此在这个过程当中也又会引入相位截断误差D/A转换器将波形ROM输出的幅度量化序列转化成对应的电平输出。将数字信号转换成模拟信号。但输出波形是一个阶梯波形,必须经过抗镜像滤波,滤除输出波形中的镜像才能得到一个平滑的波形。抗镜像滤波器一般是一个低通滤波器,它要求在输出信号的带宽内有较平坦的幅频特性,在输出镜像频率处有足够的抑止。
ROM表规定长8位、宽10位,利用matlab通过下列公式计算出正弦rom表
a=2*pi/256;
b=[0:a:2*pi];
y=(sin(b)+1)*1023/2 得数取整后建立rom表如图:
数据计数选通端
逻辑电路图:
输入的进制转换
通过乘法器将输入的六位数整合转换为24位2进制数,即M值,模块图如图
最终电路图中包含rom的输出和频率的频率控制字的切换输出(十进制显示),电路图如图所示:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY xuantong IS
PORT (p1,p2:IN STD_LOGIC;
q1,q2,q3,q4: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
O: OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );
END xuantong;
ARCHITECTURE one OF xuantong IS
BEGIN
PROCESS(p1,p2)
begin
if p1='0'and p2='0' then
o<=q1;
end if;
if p1='1'and p2='0' then
o<=q2;
end if;
if p1='0'and p2='1' then
o<=q3;
end if;
if p1='1'and p2='1' then
o<=q4;
end if;
end process;
END one;
仿真说明:123分别为高三位和第三位三个计数器的使能端,4为高三位和第三位的选择端,clr为清零,cp为脉冲端,4为0,个位到百位在使能端为高时计数,4为1时千位到十万位分别计数。