简易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

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<="000000000000000000000000";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、数据计数选通端

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

5、最终电路图中包含rom的输出和频率的频率控制字的切换输出(十进制显示),电路图如图所示:LIBRARY I呶蓟鹭毵EEE;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;
