DDS移相信号发生器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DDS移相信号发生器设计
一、实验目的
1.会用VHDL语言编写加法器、寄存器、以及本实验的主程序;
2.能够用Quartus II软件生成PLL20和SIN_ROM元件;
3.熟练掌握本次实验的波形仿真、引脚锁定、编程下载;
4.透彻的理解本次实验的VHDL的含义以及其需要实现的功能,做好硬件测试工作;
5.熟练地掌握实验室里示波器的使用。
二、实验原理
FWORD是8位频率控制字,控制输出信号的频率;PWORD是8位相移控制字,控制输出信号的相移量;ADDER32B和ADDER10B分别为32位和10位加法器;SIN_ROM是存放正弦波数据的ROM,10位数据线,10位地址线,其中的数据文件是LUT10X10.mif,REG32B和REG10B分别是32位和10位寄存器;POUT和FOUT分别为10位输出,可以分别与两个高速D/A相接,它们分别输出参考信号和可移相正弦信号。
三、实验内容
1.完成10位输出数据宽度的移相信号发生器设计,要求使用锁相环,设计正弦波形
数据MIF文件,给出仿真波形,最后进行硬件测试。
2.修改设计,增加幅度控制电路。
3.将此信号发生器改成具有扫频功能的波形发生器,扫速可数控,点频扫频可控。
四、实验步骤
1.创建本次实验所在的文件夹
在桌面创建一个文件夹,取名为DDS。
2.创建工程
File->New Project Wizard(具体的参数设置如下图所示)
3. 使用VHDL 语言编写代码
先创建编写VHDL 语言的文本,编写好代码之后保存,保存的名称即实体名。
File->New
编写好的代码如下: 主代码(DDS ): library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity DDS is
port(CLK2: IN STD_LOGIC;
CLK_DA: OUT STD_LOGIC;
FWORD: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
PWORD: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
FOUT : OUT STD_LOGIC_VECTOR(9 DOWNTO 0);
POUT :OUT STD_LOGIC_VECTOR(9 DOWNTO 0)); END;
ARCHITECTURE one OF DDS IS
COMPONENT PLL20
PORT(inclk0 : in STD_LOGIC :='0';
c0 : OUT STD_LOGIC);
END COMPONENT;
COMPONENT REG32B
PORT(LOAD : IN STD_LOGIC;
DIN : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
DOUT : OUT STD_LOGIC_VECTOR(31 DOWNTO 0)); END COMPONENT;
COMPONENT REG10B
PORT(LOAD : IN STD_LOGIC;
DIN : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
DOUT : OUT STD_LOGIC_VECTOR(9 DOWNTO 0)); END COMPONENT;
COMPONENT ADDER32B
PORT(A : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
B : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
S : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT;
COMPONENT ADDER10B
PORT(A : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
B : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
S : OUT STD_LOGIC_VECTOR(9 DOWNTO 0));
END COMPONENT;
COMPONENT SIN_ROM
PORT(address : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
clock : IN STD_LOGIC;
q : OUT STD_LOGIC_VECTOR(9 DOWNTO 0));
END COMPONENT;
SIGNAL CLK : STD_LOGIC;
SIGNAL F32B : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL D32B : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL DIN32B : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL P10B : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL LIN10B : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL SIN10B : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL DOUT : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL DIN : STD_LOGIC_VECTOR(31 DOWNTO 0);
BEGIN
F32B(27 DOWNTO 20)<=FWORD;
F32B(31 DOWNTO 28)<="0000";
F32B(19 DOWNTO 0)<="00000000000000000000";
P10B(9 DOWNTO 2)<=PWORD;
P10B(1 DOWNTO 0)<="00";
CLK_DA <= CLK;
u1:ADDER32B PORT MAP(A=>F32B,B=>D32B,S=>DIN32B);
u2:REG32B PORT MAP (DOUT=>D32B,DIN=>DIN32B,LOAD=>CLK);
u3:SIN_ROM PORT MAP(address=>SIN10B,q=>FOUT,clock=>CLK);
u4:ADDER10B PORT MAP(A=>P10B,B=>D32B(31 DOWNTO 22),S=>LIN10B);
u5:REG10B PORT MAP(DOUT=>SIN10B,DIN=>LIN10B,LOAD=>CLK);
u6:SIN_ROM PORT MAP(address=>D32B(31 DOWNTO 22),q=>POUT,clock=>CLK); u7:PLL20 PORT MAP(inclk0=>CLK2,c0=>CLK);
END;
其中的例化语句中调用的各类器件代码如下:
ADDER32B:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ADDER32B IS
PORT(A : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
B : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
S : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END;
ARCHITECTURE bhv OF ADDER32B IS
BEGIN
S <= A + B;
END;
ADDER10B:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ADDER10B IS
PORT(A : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
B : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
S : OUT STD_LOGIC_VECTOR(9 DOWNTO 0));
END;
ARCHITECTURE bhv OF ADDER10B IS
BEGIN
S <= A + B;
END;
REG32B:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY REG32B IS
PORT(LOAD : IN STD_LOGIC;
DIN : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
DOUT : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END;
ARCHITECTURE bhv OF REG32B IS
SIGNAL Q1 : STD_LOGIC_VECTOR(31 DOWNTO 0);
BEGIN
PROCESS(LOAD,Q1)
BEGIN
IF LOAD'EVENT AND LOAD ='1'
THEN Q1 <= DIN;
END IF;
END PROCESS;
DOUT <= Q1;
END;
REG10B:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY REG10B IS
PORT(LOAD : IN STD_LOGIC;
DIN : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
DOUT : OUT STD_LOGIC_VECTOR(9 DOWNTO 0));
END;
ARCHITECTURE bhv OF REG10B IS
SIGNAL Q1 : STD_LOGIC_VECTOR(9 DOWNTO 0);
BEGIN
PROCESS(LOAD,Q1)
BEGIN
IF LOAD'EVENT AND LOAD ='1'
THEN Q1 <= DIN;
END IF;
END PROCESS;
DOUT <= Q1;
END;
其中的SIN_ROM和PLL20则是通过Quartus II软件定制得来的,其定制方法如下:
SIN_ROM 的定制:
PLL20的定制:
4.创建波形文件并仿真
1)创建波形文件:
File->New
2)添加节点:
3)选择节点,设置各节点的输入信号,设置好后的图形如下:
4)仿真,仿真后的结果如下:
5.引脚锁定,仿真成功后进行引脚锁定:
Assignments->Pin planner,设置好引脚后如下图:
然后在次全编译主程序:Processing->Start Compilation(快捷键:Ctrl+L) 6.进行硬件下载:Tools->Programmer,按照下图的参数进行设置,然后下载即可
五、实验总结
1.实验结果:
通过观察示波器上的波形,可以得到我们预期的试验结果。
2.实验心得:
1)注意事项:
a.在写加法器(ADDER32B和ADDER10B)是要加入库USE
IEEE.STD_LOGIC_UNSIGNED.ALL,否则在使用“+”编译时会出错。
b.本次实验有2个元件是不需要我们自己编写的,只需要通过Quartus II定制即
可,它们是SIN_ROM和PLL20。
c.定制SIN_ROM时输入时钟是clock,所以在写主代码时要与其相对应,不然
编译时无法通过。
d.添加节点时有些只需要添加总节点就好了,无需每个都添加。
e.在使用示波器有困难时,要及时请教老师或者同学,在课堂上就把它弄懂,
为以后更好的使用打好基础。
2)心得体会:
我们做实验时自己写的代码自己一定要知道它们的含义,了解其要实行的功能,从书本上借鉴的也是一样。
从得到的结果来看,我们要知道它是怎么得来的,
为什么是这种结果,只有这样我们才能真正的学好这门课,才能更好的进步。