简易DDS信号原设计

 时间:2024-11-14 12:38:51

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

工具/原料

FPGA+DAC、电脑、quartus

理论分析

1、DDS原理若对一正弦波形进行采样,每周期为m个采样点,分别记为1~m。对应每次参考时钟fc,输出一个采样点,输出图中所示的一个周期的正弦,需要m个时钟周期,则输出的波形频率为fa=fc/m。对于这种情况,每次时钟到来时,相位累加器加1,则就会在第i个时钟周期输出第i个采样点(i=1~m),第m+1个时钟输出第1个采样点,以此循坏,这时的相位累加器实际上是步进为1的模m计数器。如果每次时钟到来时,总是间隔一个采样点输出,即相位累加器的步进为2,这时在第i个周期输出第2i个采样点,输出波形如图1.2的波形b,显然波形b的频率是a的2倍,即fb=2fa。综上所述,如果相位累加器的步进为B,则输出波形的频率为B×fa,fa是最小的输出频率称为频率分辨率或步进间隔,B为频率控制字。给定不同的频率控制字即可输出不同的频率。频率输出公式为:f0=fc/m*B

简易DDS信号原设计

2、在实际设计中,如果累加器长度为N,则可以有2N个存储单元存储采样数据,如果我们对一个周期的波形进行2N个点的采样,即m=2N,此时输出频率fo和系统时钟频率fc,相fcf0=NB2位累加器长度N以及频率控制字B的关系为:为了使波形输出不失真,根据奈奎斯特定理,B最高为2N-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可将数字量形式的波形幅值转换成所要求的合成频率模拟量形式信号。低通滤波器用于衰减和滤除不需要的取样分量,以便输出频谱纯净的正弦波信号。

简易DDS信号原设计

4、相位累加器由N位全加器和N位累加寄存器级联淤撸睾伽而成,对频率控制字的2进制码进行累加运算,是典型的反馈电路。在每个系统时钟沿Fclk的控制下,N位加法器将频率控制字X与楷洫烷悖累加寄存器输出的相位数据相加,把相加后的结果再送至累加寄存器,累加寄存器中新的相位数据既反馈到加法器的输入端,以使加法器在下一Fclk时钟周期中继续与频率控制字X相加,同时累加寄存器的高M位数值,将作为查找ROM表中取样数据的地址值。ROM查找表中储存着一个完整周期的正弦波幅度信息,通过取得的采样地址值进行查表,从ROM表中输出相应的波形采样数据(Fout),送入D/A转换器,DAC输出阶梯波形,再通过低通滤波器将波形数据转换成符合要求的模拟波形。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYM_ADDISPORT(cp:INSTD_LOGIC;M:INSTD_LOGIC_VECTOR(23DOWNTO0);en:INSTD_LOGIC;clr:INSTD_LOGIC;O:OUTSTD_LOGIC_VECTOR(23DOWNTO0));ENDM_ADD;ARCHITECTUREoneOFM_ADDISsignaltemp:STD_LOGIC_VECTOR(23DOWNTO0);signalM_temp:STD_LOGIC_VECTOR(23DOWNTO0);BEGINPROCESS(clr,en,M,cp)beginM_temp<=M;ifclr='1'thentemp<="000000000000000000000000";elsif(en='1'and(cp'eventandcp='1'))thentemp<=temp+M_temp;endif;O<=temp;endprocess;ENDone;

简易DDS信号原设计

5、波形ROM示意图其中步长的概念即为对数字波形查表的相位增量,由累加器对相位增量进行累加,每个时钟周期产生的累加器的高M位数值作为查表地址,两个查表周期之间就存在一个相位增量,当相位累加器加满时就会产生一次溢出,即相位寄存器每经过2N/X个Fclk时钟周期后回到初始状态,相应的ROM查找表经过一个循18环回到初始位置,整个DDS系统输出一个正弦波,这样就完成了一个波形采样值的查表和输出,这个周期就是DDS产生波形的一个频率周期。当ROM地址线上的地址(相位)改变时,数据线上输出相应的量化值(幅度量化序列)。需要指出的是因为波形ROM的存储容量有限,相位累加器的字长一般不等于朋M地址线的位数因此在这个过程当中也又会引入相位截断误差D/A转换器将波形ROM输出的幅度量化序列转化成对应的电平输出。将数字信号转换成模拟信号。但输出波形是一个阶梯波形,必须经过抗镜像滤波,滤除输出波形中的镜像才能得到一个平滑的波形。抗镜像滤波器一般是一个低通滤波器,它要求在输出信号的带宽内有较平坦的幅频特性,在输出镜像频率处有足够的抑止。

简易DDS信号原设计

系统实现

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

简易DDS信号原设计

简易DDS信号原设计

2、数据计数选通端

简易DDS信号原设计

3、逻辑电路图:

简易DDS信号原设计

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

简易DDS信号原设计

简易DDS信号原设计

5、最终电路图中包含rom的输出和频率擢爻充种的频率控制字的切换输出(十进制显示),电路图如图所示:LIBRARYI呶蓟鹭毵EEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYxuantongISPORT(p1,p2:INSTD_LOGIC;q1,q2,q3,q4:INSTD_LOGIC_VECTOR(3DOWNTO0);O:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDxuantong;ARCHITECTUREoneOFxuantongISBEGINPROCESS(p1,p2)beginifp1='0'andp2='0'theno<=q1;endif;ifp1='1'andp2='0'theno<=q2;endif;ifp1='0'andp2='1'theno<=q3;endif;ifp1='1'andp2='1'theno<=q4;endif;endprocess;ENDone;

简易DDS信号原设计

仿真图

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

简易DDS信号原设计

MATLAB改变坐标轴标注和改变网格线属性 MATLAB怎么开启在窗口标题中显示文件路径 51单片机虚拟开发板proutes:[11]独立按键 matlab是什么编程语言 matlab 数据类型小谈
热门搜索
午夜电影街 幸福家庭图片 服装店收银台图片 卿本佳人电影 铜镜图片