EDA课程设计-DDS
- 格式:doc
- 大小:1.59 MB
- 文档页数:7
EDA课程设计-----正弦波信号发生器的设计正弦信号源在实验室和电子工程设计中有着十分重要的作用,而传统的正弦信号源根据实际需要一般价格昂贵,低频输出时性能不好且不便于自动调节,工程实用性较差。
本文的设计以较低的成本制作正弦信号发生器,可用作核磁共振中引发磁场测量仪的激励一般的正弦信号,也可作为调制用的教学演示信号源。
正弦波信号发生器采用直接数字频率合成DDS技术,在CPLD上实现正弦信号查找表和地址扫描,经D/A输出可得到正弦信号。
一.设计目的1、了解宏功能模块。
2、学习用fpga实现正弦波信号的发生。
二.正弦波信号发生器的设计思路2.1 dds技术原理DDS(direct digital synthesizer)是从相位概念出发直接合成所需的波形的一种频率合成技术。
一个dds 信号发生器是由:相位累加器、波形数ROM表、D/A 转换器以及模拟低通滤波器LPF 组成, 原理框图如图1 所示。
DDS 技术的核心是相位累加器, 相位累加器在稳定时钟信号的控制下产生读取数据的地址值,随后通过查表变换, 地址值被转化为信号波形的数字幅度序列, 再由数/模变换器(D/A)将代表波形幅度的数字序列转化为模拟电压, 最后经由低通滤波器将D/A 输出的阶梯状波形平滑为所需的连续波形。
其中F 为频率控制字、P 为相位控制字、W 为波形控制字、Fc 为参考时钟频率。
相位累加器在时钟Fc 的控制下以步长F作累加, 输出的值与相位控制字P 和波形控制字W相加后形成查表的地址值, 对波形ROM进行寻址。
波形ROM的输出值即是幅度值, 经过D/A 变换后形成阶梯状的波形, 最后通过低通滤波平滑成所需的波形。
合成信号的波形取决于ROM表中的幅度序列, 通过修改数据可以产生任意波形, 如果要产生多种波形, 只需把所需的多种波形数据存放到波形ROM表中。
本设计希望可以输出正弦波和锯齿波, 输出的波形由波形控制字W控制。
输出波形的频率为:Fout=(Fc*F)/2^N(其中的N 表示相位相位累加器的位数, 本设计采用256 点的相位, 有N=8)整体设计采用VHDL 语言实现, 使用Altera 公司的QuartusII进行设计, 顶层的原理图如图图1 dds的原理图图2 顶层文件的设计2.2 ROM 表的设计与实现ROM表中包含了产生波形需要的幅值序列, 是产生波形的核心模块。
ROM表的设计方式有2 种, 如图2 所示。
第一种是连续型的, 第二种是间隔型的。
不同的ROM表结构需要采用不同的查表方式, 所以ROM表的设计方式决定了相位累加器的构成。
本设计采用了间隔式的存储方式, 并存储了产生产生正弦波、锯齿波的数据。
图3 ROM表中地址存储的2 种方式其中W1- 1 表示第一种波形的第一个相位幅值地址,W1- 2表示第一种波形的第二个相位幅值地址。
W2 表示第2 种波形。
第一种设计采用连续方式:在波形ROM表中先连续存放第一种波形对应相位的所有幅值数据, 然后接下来是第二种波形的所有幅值数据, 依此类推.。
二种设计采用的是间隔式的方式:在波形ROM表中首先存放的是所有波形第一个相位的幅值数据,然后是所有波形第二个相位的幅值数据, 依此类推。
第二种方法采用间隔式存储, 不能连续读取某种波形的相位。
要获得某种波形的连续相位。
只需在第一种的基础上乘以2(左移 1 位), 第 1 种波形的第N 个相位为:2*N, 第二种波形的第N 个相位地址表示为:2*N+1。
ROM 表的实现采用的是Quartus 的MegaWizard 生成。
Mega 是Quartus 中用于RTL 级设计的一个工具, 可以方便的建立许多常用的模块。
本设计采用Mega 生成了一个512 点的ROM表, 如图4 所示。
图4 生成的ROM表的数据ROM表中包含正弦波与锯齿波的数据, 采用间隔式的方式存放。
奇数地址存放正弦波数据, 偶数地址存放锯齿波数据。
2.3相位累加器的设计以及实现由于采用间隔式的ROM表, 所以相位累加器的设计采用的是间隔式的寻址方式。
相位累加器的包括了4 个部分: 累加器、加法器1、乘法器、加法器2。
累加器(ACC)是一个8 位累加器。
加法器1(ADD1) 设计成8位加法器, 作用是把ACC 产生的地址值与相位控制字P 的数值求和。
由于本设计采用了2 种波形, 乘法器(MUL2)把得到的地址乘以2。
如果有N 种波形, 则乘以N。
最后在加法器2(ADD2)中实现波形控制, 控制输出某种波形。
4 个模块全部采用VHDL语言实现。
累加器是整个设计的关键部分, 累加器以频率Fc 进行相位累加, 步长由频率控制字F 控制。
当F=1 时每次地址值增加1,输出波形的频率为:Fc/2^N。
当F=K 时每次地址数增加K, 相位增加频率是F=1 时的K 倍, 输出波形的频率变为:Fc*k/2^N, 是F=1 时的K 倍。
改变F 的值就可以改变输出波形的频率。
但是频率过高, 会导致跳过的相位太多, 一个周期内的相位点数大大减少, 波形的精度降低。
一般F 设置在1 到32 之间比较合适。
如果要进一步提高频率, 可以提高时钟的频率。
累加器的实现采用VHDL 语言编写。
图5 相位累加器的构成2.4仿真与调试全编译一次后进入时序仿真测试,图6是仿真结果,由波形可见,随着每一个时钟上升沿的到来,输出端口将正弦波数据依次输出。
图6 quarts中的仿真结果2.5 硬件测试选择电路模式5,时钟CLK接试验箱的clock0;将DOUT(0)、DOUT(1)…DOUT(7)分别锁定于实验系统上与DAC0832相接的I/O口:PIO24、PIO25、PIO26、PIO27、PIO28、PIO29、PIO30、PIO31.编译下载后,打开±12V电压开关,将CLK的时钟通过实验箱上clock0的跳线选择频率为750KHZ,再将示波器接于实验箱的两个挂钩上就能观察到波形的输出情况,示波器显示如图7图7 显示波形三.VHDL程序描述顶层文件:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SIN ISPORT(CLK:IN STD_LOGIC;DOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END;ARCHITECTURE DACC OF SIN ISCOMPONENT SINDATAPORT(ADDRESS:IN STD_LOGIC_VECTOR(5 DOWNTO 0);INCLOCK:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END COMPONENT;SIGNAL Q1:STD_LOGIC_VECTOR(5 DOWNTO 0);BEGINPROCESS(CLK)BEGINIF CLK'EVENT AND CLK='1' THEN Q1<=Q1+1;END IF;END PROCESS;U1:SINDATA PORT MAP(ADDRESS=>Q1,Q=>DOUT,INCLOCK=>CLK); END;数据文件:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY SINDATA ISPORT(ADDRESS:IN STD_LOGIC_VECTOR(5 DOWNTO 0);INCLOCK:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END SINDATA;ARCHITECTURE SYN OF SINDATA ISSIGNAL SUB_WIRE0:STD_LOGIC_VECTOR(7 DOWNTO 0);COMPONENT LPM_ROMGENERIC (LPM_WIDTH:NATURAL;LPM_WIDTHAD:NATURAL;LPM_ADDRESS_CONTROL:STRING;LPM_OUTDATA:STRING;LPM_FILE:STRING);PORT(ADDRESS:IN STD_LOGIC_VECTOR(5 DOWNTO 0);INCLOCK:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END COMPONENT;BEGINQ<=SUB_WIRE0(7 DOWNTO 0);LPM_ROM_COMPONENT:LPM_ROMGENERIC MAP (LPM_WIDTH=>8,LPM_WIDTHAD=>6,LPM_ADDRESS_CONTROL=>"REGISTERED", LPM_OUTDATA=>"UNREGISTERED",LPM_FILE=>"D:/sin/sin_g.mif")PORT MAP(ADDRESS=>ADDRESS,INCLOCK=>INCLOCK,Q=>SUB_WIRE0);END SYN;四.心得体会:通本次课程设计,我又重新温习了一下用VHDL语言编写程序的方法和步骤,并且又熟悉了一遍试验箱的使用方法以及程序的烧录过程,再加上老师的指导与帮助,获益匪浅。
最后调试的输出波形稳定,感觉很有成就感。
,。