多语言展示
当前在线:771今日阅读:91今日分享:37

简易DDS信号原设计

利用FPGA+DAC,设计一个DDS信号发生器。要求:分辨率优于1HzROM表长度8位、宽度十位输出频率优于100kHz(每周期大于50个点)显示信号频率/频率控制字(可切换)直接输入频率控制字或者输出频率
工具/原料

FPGA+DAC、电脑、quartus

理论分析
1

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

2

在实际设计中,如果累加器长度为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 ,这就要求对计算结果 进行十进制近似取舍,造成了波形发生器的输出频率以及频率分辨率存在无法消除的误差。

3

DDS 以数控振荡器的方式,产生频率、相位可控 制的正弦,电路包括了基准时钟源、相位累加器、相位调制器、正弦ROM 查找表、D/A 转换 器和低通滤波器等。 频率控制字N 和相位控制字M 分别控制DDS 所输出的正弦波的频率和相 位。DDS 系统的核心是相位累加器,它由一个N 位累加器与N 位相位寄存器构成。时钟脉冲 每触发一次, 累加器便将频率控制数据与相位寄存器输出的累加相位数据相加, 然后把相加 后的结果送至相位寄存器的数据输入端。 相位寄存器将累加器在上一个时钟作用后所产生的 新相位数据反馈到累加器的输入端, 以使加法器在下一个时钟的作用下继续与频率控制数据 相加。 这样, 相位累加器在参考时钟的作用下将进行线性相位累加, 当相位累加器累加满时, 就会产生一次溢出, 以完成一个周期性的动作, 这个周期就是DDS 合成信号的一个频率周期, 相位累加器的溢出频率就是DDS 输出的信号频率。 相位寄存器的输出与相位控制字相加, 结 果作为正弦查找表的地址。 查找表由ROM 构成, 其内部存有一个完整周期正弦波的数字幅度 信息, 每个查找表的地址对应正弦波中的一个相位点。 查找表把输入地址信息映射成正弦波 幅度信号, 同时输出到D/A 转换器的输入端, 通过D/A 可将数字量形式的波形幅值转换成所 要求的合成频率模拟量形式信号。 低通滤波器用于衰减和滤除不需要的取样分量, 以便输出 频谱纯净的正弦波信号。

4

相位累加器由 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 ISsignal temp:STD_LOGIC_VECTOR(23 DOWNTO 0);signal M_temp:STD_LOGIC_VECTOR(23 DOWNTO 0);    BEGINPROCESS(clr,en,M,cp)beginM_temp<=M;if clr='1' thentemp<="";elsif (en='1'and (cp'event and cp='1'))thentemp<=temp+M_temp;end if;O<=temp;end process;END one;

系统实现
1

ROM表规定长8位、宽10位,利用matlab通过下列公式计算出正弦rom表a=2*pi/256;b=[0:a:2*pi];y=(sin(b)+1)*1023/2 得数取整后建立rom表如图:

2

数据计数选通端

3

逻辑电路图:

4

输入的进制转换通过乘法器将输入的六位数整合转换为24位2进制数,即M值,模块图如图

5

最终电路图中包含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 ISBEGINPROCESS(p1,p2)beginif p1='0'and p2='0'  theno<=q1;end if;if p1='1'and p2='0'  theno<=q2;end if;if p1='0'and p2='1'  theno<=q3;end if;if p1='1'and p2='1'  theno<=q4;end if;end process;END one;

仿真图

仿真说明:123分别为高三位和第三位三个计数器的使能端,4为高三位和第三位的选择端,clr为清零,cp为脉冲端,4为0,个位到百位在使能端为高时计数,4为1时千位到十万位分别计数。

注意事项

注意设计要求

推荐信息