基于DDS的数字移相信号发生器.docx
- 文档编号:25130908
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:17
- 大小:212.03KB
基于DDS的数字移相信号发生器.docx
《基于DDS的数字移相信号发生器.docx》由会员分享,可在线阅读,更多相关《基于DDS的数字移相信号发生器.docx(17页珍藏版)》请在冰豆网上搜索。
基于DDS的数字移相信号发生器
EDA课程设计
课题名称_基于DDS的数字移相信号发生器
专业_电子信息工程
班级
学号
姓名
成绩
指导教师
2014年5月7日
一、课程设计目的3
二、设计任务3
三、工作原理及模块分析3
1、频率预置与调节电路4
2、累加器4
3、波形存储器4
4、D/A转换器5
四、相关程序5
1、加法器5
(1)ADD105
(2)ADD327
2、寄存器8
(1)REG10B8
(2)REG32B10
3、ROM12
4、主程序14
五、仿真结果:
16
六、引脚配置和下载17
七、实验心得18
、课程设计目的
1、进一步熟悉QuartusU的软件使用方法;
2、熟悉利用VHDL设计数字系统并学习LPM_ADD_SUB_PMROMLPM_FF勺使用方法;
3、学习FPGA硬件资源的使用和控制方法;
4、掌握DDES本原理,学习利用此原理进行信号发生器的设计
二、设计任务
完成10位输出数据宽度的频率可调的移相正弦信号发生器,通过按键调节频率和初始相位,实现相位和频率可调的正弦信号发生器
三、工作原理及模块分析
直接数字频率合成器(DDS是通信系统中常用到的部件,利用DDS可以制成很有用的信号源。
与模拟式的频率锁相环PLL相比,它有许多优点,突出为
(1)频率的切换迅速;
(2)频率稳定度高。
一个直接数字频率合成器由相位累加器、波形ROMD/A转换器和低通滤波器构成。
DDS的原理框图如下所示:
fc
图1直接数字频率合成器原理图
其中K为频率控制字,fc为时钟频率,N为相位累加器的字长,D为ROM数据位及D/A转换器的字长。
相位累加器在时钟fc的控制下以步长K作为累加,输出N位二进制码作为波形ROM勺地址,对波形ROMS行寻址,波形ROM输出的幅码S(n)经D/A转换器变成梯形波S(t),再经低通滤波器平滑后就可以得到合成的信号波形了。
合成的信号波形形状取决于波形ROM中存放的幅码,因此用DDS可以产生任意波形。
本设计中直接利用D/A转换器得到输出波形,省略了低通滤波器这一环节。
1、频率预置与调节电路
不变量K被称为相位增量,也叫频率控制字。
DDS方程为:
f0=fcK/2n,f0为输出频率,fc为时钟频率。
当K=1时,DDS俞出最低频率(也既频率分辩率)为fc/2n
DDS勺最大输出频率由Nyguist采样定理决定,即fc/2,也就是说K的最大值为2n-1.因此,只要N足够大,DDS可以得到很细的频率间隔。
要改变DDS的输出频率,只要改变频率控制字K即可。
2、累加器
相位累加器的原理图如下图
fc
图2相位累加器原理图
相位累加器由N为加法器与N位寄存器级联构成。
每来一个时钟脉冲fc,加法器将频率控制字与寄存器输出的累加相位数据相加,再把相加后的结果送至
寄存器的数据输入端,寄存器将加法器在上一个时钟作用后所产生的下数据反馈到加法器的输入端;以使加法器在下一个时钟作用下继续频率控制字进行相加。
这样,相位累加器在时钟的作用下,进行相位累加,当相位累加器累加满量时,就产生一次溢出,完成一个周期性的动作,这个周期应为uk=2n/GCD(2N;k),其中GCD表示最大公约数。
3、波形存储器
用相位累加器输出的数据作为波形存储器的取样地址进行波形的相位一一幅值转换,即可在给定的时间上确定输出的波形的抽样幅值。
N位的寻址ROM目
当于把00---3600的正弦信号离散成具有2n样值的序列,若波形ROM有D位数据位,则2n个样值的幅值以D位二进制数值固化在ROM中,按照地址的不同可以输出相宜相位的正弦信号的幅值。
相位----幅值变换原理图如下所示。
图3相位-幅度变换原理图
4、D/A转换器
D/A转换器的作用是把已经合成的正弦波的数字量转换成模拟量,正弦幅度
量化序列S(n)经D/A转换后变成了包络为正弦波的阶梯波S(t),S(t)的周期
为T=uk*Tc.。
需要注意的是,频率合成器对D/A转换器的分辨率有一定的要求,D/A转换器的分辨率越高,合成的正弦波S(t)台阶数就越多,输出波形的精
度也就越高。
四、相关程序
1、加法器
(1)ADD10
LIBRARYieee;
USEieee.std_logic_1164.all;
LIBRARYlpm;
USElpm.all;
ENTITYADD10IS
PORT
(
dataa:
INSTD_LOGIC_VECTOR(9DOWNTO0);
datab:
INSTD_LOGIC_VECTOR(9DOWNTO0);
result:
OUTSTD_LOGIC_VECTOR(9DOWNTO0)
);
ENDADD10;
ARCHITECTURESYNOFadd10IS
SIGNALsub_wireO:
STD_LOGIC_VECTOR(9DOWNTO0);
COMPONENTlpm_add_sub
GENERIC
(lpm_direction:
STRING;lpm_hint:
STRING;
lpm_type:
STRING;
lpm_width:
NATURAL
);
PORT
(
dataa:
INSTD_LOGIC_VECTOR(9DOWNTO0);
datab:
INSTD_LOGIC_VECTOR(9DOWNTO0);
result:
OUTSTD_LOGIC_VECTOR(9DOWNTO0)
);
ENDCOMPONENT;
BEGIN
result<=sub_wire0(9DOWNTO0);lpm_add_sub_component:
lpm_add_sub
GENERICMAP
(
lpm_direction=>"ADD",
lpm_hint=>"ONE_INPUT_IS_CONSTANT=NO,CIN_USED=NO",lpm_type=>"LPM_ADD_SUB",
lpm_width=>10
)
PORTMAP
(
dataa=>dataa,
datab=>datab,
result=>sub_wire0
);
ENDSYN;
2)ADD32
LIBRARYieee;
USEieee.std_logic_1164.all;
LIBRARYlpm;
USElpm.all;
ENTITYADD32IS
PORT
(
dataa
:
INSTD_LOGIC_VECTOR(31DOWNTO0);
datab
:
INSTD_LOGIC_VECTOR(31DOWNTO0);
result
:
OUTSTD_LOGIC_VECTOR(31DOWNTO0)
ENDADD32;
ARCHITECTURESYNOFadd32IS
SIGNALsub_wire0:
STD_LOGIC_VECTOR(31DOWNTO0);
COMPONENTlpm_add_sub
GENERIC(
lpm_direction:
STRING;lpm_hint:
STRING;
lpm_type:
STRING;
lpm_width:
NATURAL
);
PORT
(
dataa:
INSTD_LOGIC_VECTOR(31DOWNTO0);
datab:
INSTD_LOGIC_VECTOR(31DOWNTO0);
result:
OUTSTD_LOGIC_VECTOR(31DOWNTO0));
ENDCOMPONENT;
BEGIN
result<=sub_wire0(31DOWNTO0);lpm_add_sub_component:
lpm_add_subGENERICMAP
(lpm_direction=>"ADD",lpm_hint=>"ONE_INPUT_IS_CONSTANT=NO,CIN_USED=NO",lpm_type=>"LPM_ADD_SUB",lpm_width=>32
)
PORTMAP
(dataa=>dataa,datab=>datab,result=>sub_wire0
);
ENDSYN;
2、寄存器
(1)REG10B
LIBRARYieee;
USEieee.std_logic_1164.all;
LIBRARYlpm;
USElpm.all;
ENTITYREG10BIS
PORT
clock
:
INSTD_LOGIC;
data:
INSTD_LOGIC_VECTOR(9DOWNTO0);
q:
OUTSTD_LOGIC_VECTOR(9DOWNTO0)
);
ENDREG10B;
ARCHITECTURESYNOFreg10bIS
SIGNALsub_wire0:
STD_LOGIC_VECTOR(9DOWNTO0);
COMPONENTlpm_ff
GENERIC
(
lpm_fftype:
STRING;
lpm_type:
STRING;
lpm_width:
NATURAL);
PORT
(
clock:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(9DOWNTO0);
data:
INSTD_LOGIC_VECTOR(9DOWNTO0));
ENDCOMPONENT;
BEGINq<=sub_wire0(9DOWNTO0);lpm_ff_component:
lpm_ffGENERICMAP
(lpm_fftype=>"DFF",lpm_type=>"LPM_FF",lpm_width=>10
)
PORTMAP
(clock=>clock,data=>data,q=>sub_wire0
);
ENDSYN;
(2)REG32B
LIBRARYieee;
USEieee.std_logic_1164.all;
LIBRARYlpm;
USElpm.all;
ENTITYREG32BIS
PORT
(
clock:
INSTD_LOGIC;
data:
INSTD_LOGIC_VECTOR(31DOWNTO0);
q:
OUTSTD_LOGIC_VECTOR(31DOWNTO0)
);
ENDREG32B;
ARCHITECTURESYNOFreg32bIS
SIGNALsub_wire0:
STD_LOGIC_VECTOR(31DOWNTO0);COMPONENTlpm_ff
GENERIC
(
lpm_typelpm_width
:
STRING;
:
NATURAL
);
PORT
(
clock:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(31DOWNTO0);
data:
INSTD_LOGIC_VECTOR(31DOWNTO0));
ENDCOMPONENT;
BEGINq<=sub_wire0(31DOWNTO0);lpm_ff_component:
lpm_ffGENERICMAP
(lpm_fftype=>"DFF",lpm_type=>"LPM_FF",lpm_width=>32
)
PORTMAP
(
clock=>clock,data=>data,q=>sub_wire0
);ENDSYN;
3、ROM
LIBRARYieee;
USEieee.std_logic_1164.all;
LIBRARYaltera_mf;
USEaltera_mf.all;
ENTITYROMIS
PORT
(
address:
INSTD_LOGIC_VECTOR(9DOWNTO0);clock:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(9DOWNTO0)
);
ENDROM;
ARCHITECTURESYNOFromIS
SIGNALsub_wire0:
STD_LOGIC_VECTOR(9DOWNTO0);
COMPONENTaltsyncram
GENERIC
(
address_aclr_a:
STRING;init_file:
STRING;
intended_device_family:
STRING;lpm_hint:
STRING;
lpm_type:
STRING;
numwords_a:
NATURAL;
operation_mode:
STRING;
outdata_aclr_a:
STRING;
outdata_reg_a:
STRING;
widthad_a:
NATURAL;
width_a:
NATURAL;
width_byteena_a
:
NATURAL
);
PORT(
clock0:
INSTD_LOGIC;
address_a:
INSTD_LOGIC_VECTOR(9DOWNTO0);q_a:
OUTSTD_LOGIC_VECTOR(9DOWNTO0)
);
ENDCOMPONENT;
BEGINq<=sub_wire0(9DOWNTO0);altsyncram_component:
altsyncramGENERICMAP(
address_aclr_a=>"NONE",init_file=>"LUT10X10.MIF",intended_device_family=>"Cyclone",lpm_hint=>"ENABLE_RUNTIME_MOD=YES,INSTANCE_NAME=NONE",lpm_type=>"altsyncram",numwords_a=>1024,operation_mode=>"ROM",outdata_aclr_a=>"NONE",outdata_reg_a=>"CLOCK0",widthad_a=>10,width_a=>10,width_byteena_a=>1
)
PORTMAP(clock0=>clock,address_a=>address,q_a=>sub_wire0
);ENDSYN;
4、主程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGiC_UNSIGNED.ALL;
ENTITYDDS_SIN_YANGTIANJUN_CHENYAOSHUAIIS
PORT(CLK:
INSTD_LOGIC;--系统时钟
FWORD:
INSTD_LOGIC_VECTOR(7DOWNTO0频);率--控制字
PWORD:
INSTD_LOGIC_VECTOR(7DOWNTO相0);位--控制字
FOUT:
OUTSTD_LOGIC_VECTOR(9DOWNTO0可);-移-相正弦信号输出
POUT:
OUTSTD_LOGIC_VECTOR(9DOWNTO0);
CLKOUT:
OUTSTD_LOGIC);参考信号输出
ENDDDS_SIN_YANGTIANJUN_CHENYAOSHUAI;
ARCHITECTUREoneOFDDS_SIN_YANGTIANJUN_CHENYAOSHUAIIS
COMPONENTREG32B--3位2锁存器
PORT
(
clock:
INSTD_LOGIC;
data:
INSTD_LOGIC_VECTOR(31DOWNTO0);
q:
OUTSTD_LOGIC_VECTOR(31DOWNTO0)
);
ENDCOMPONENT;
COMPONENTREG10B--1位0锁存器
PORT
(
clock:
INSTD_LOGIC;
data:
INSTD_LOGIC_VECTOR(9DOWNTO0);
q:
OUTSTD_LOGIC_VECTOR(9DOWNTO0)
);
ENDCOMPONENT;
COMPONENTADD32--3位2加法器
PORT
(
dataa:
INSTD_LOGIC_VECTOR(31DOWNTO0);
datab:
INSTD_LOGIC_VECTOR(31DOWNTO0);
result:
OUTSTD_LOGIC_VECTOR(31DOWNTO0)
);
ENDCOMPONENT;
COMPONENTADD10--10位加法器的设计
PORT
(
dataa:
INSTD_LOGIC_VECTOR(9DOWNTO0);
datab:
INSTD_LOGIC_VECTOR(9DOWNTO0);
result:
OUTSTD_LOGIC_VECTOR(9DOWNTO0)
);
ENDCOMPONENT;
COMPONENTROM--位10地址10位数据正弦信号数据ROM
PORT
(
address:
INSTD_LOGIC_VECTOR(9DOWNTO0);
clock:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(9DOWNTO0)
);
ENDCOMPONENT;
SIGNALF32B,D32B,DIN32B:
STD_LOGIC_VECTOR(31DOWNTO0);
SIGNALP10B,LIN10B,SIN10B:
STD_LOGIC_VECTOR(9DOWNTO0);
BEGIN
CLKOUT<=CLK;
F32B(27DOWNTO20)v=FWORD;
F32B(31DOWNTO28)<="0000";
F32B(19DOWNTO0)<="00000000000000000000";
P10B(9DOWNTO2)<=PWORD;
P10B(1DOWNTO0)<="00";
u1:
ADD32PORTMAP(dataa=>F32B,datab=>D32B,result=>DIN32B);
u2:
REG32BPORTMAP(q=>D32B,data=>DIN32B,clock=>CLK);
u3:
ROMPORTMAP(address=>SIN10B,q=>FOUT,clock=>CLK);
u4:
ADD10PORTMAP(dataa=>P10B,datab=>D32B(31DOWNTO
22),result=>LIN10B);
u5:
REG10BPORTMAP(q=>SIN10B,data=>LIN10B,clock=>CLK);
u6:
ROMPORTMAP(address=>D32B(31DOWNTO
22),q=>POUT,clock=>CLK);
ENDone;
五、仿真结果:
图4仿真波形
图5引脚配置
图6下载
TekJL
kAAAAAAAAAAAAAAAzJ«
.■■•JLl^
2.50
图7实际波形
经实际硬件验证,可通过按键改变频率和相位的值而改变正弦信号发生器输出波形的频率和相位。
七、实验心得
实验涉及了对LPM_ADD_SUBLPMROMLPM_F宏模块的使用、例化方法的
使用,完成DDS数字移相信号发生器。
实验中需要注意的问题有很多,例如需要保证ROM中的数据要至少1024个,保证正弦信号的完整性;在引脚配置中注意选择16进制的按键和10位D/A的引脚。
本实验从设计到仿真验证在到硬件验证,让我们逐步深刻地了解DDS移相信号发生器的原理。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 DDS 数字 相信 发生器