基于DDS的数字移相信号发生器.docx

上传人:b****3 文档编号:6066214 上传时间:2023-05-09 格式:DOCX 页数:18 大小:293.14KB
下载 相关 举报
基于DDS的数字移相信号发生器.docx_第1页
第1页 / 共18页
基于DDS的数字移相信号发生器.docx_第2页
第2页 / 共18页
基于DDS的数字移相信号发生器.docx_第3页
第3页 / 共18页
基于DDS的数字移相信号发生器.docx_第4页
第4页 / 共18页
基于DDS的数字移相信号发生器.docx_第5页
第5页 / 共18页
基于DDS的数字移相信号发生器.docx_第6页
第6页 / 共18页
基于DDS的数字移相信号发生器.docx_第7页
第7页 / 共18页
基于DDS的数字移相信号发生器.docx_第8页
第8页 / 共18页
基于DDS的数字移相信号发生器.docx_第9页
第9页 / 共18页
基于DDS的数字移相信号发生器.docx_第10页
第10页 / 共18页
基于DDS的数字移相信号发生器.docx_第11页
第11页 / 共18页
基于DDS的数字移相信号发生器.docx_第12页
第12页 / 共18页
基于DDS的数字移相信号发生器.docx_第13页
第13页 / 共18页
基于DDS的数字移相信号发生器.docx_第14页
第14页 / 共18页
基于DDS的数字移相信号发生器.docx_第15页
第15页 / 共18页
基于DDS的数字移相信号发生器.docx_第16页
第16页 / 共18页
基于DDS的数字移相信号发生器.docx_第17页
第17页 / 共18页
基于DDS的数字移相信号发生器.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于DDS的数字移相信号发生器.docx

《基于DDS的数字移相信号发生器.docx》由会员分享,可在线阅读,更多相关《基于DDS的数字移相信号发生器.docx(18页珍藏版)》请在冰点文库上搜索。

基于DDS的数字移相信号发生器.docx

基于DDS的数字移相信号发生器

EDA课程设计

课题名称_基于DDS的数字移相信号发生器

专业_电子信息工程______

班级__________________

学号_

姓名_____

成绩__________________

指导教师__________

2014年5月7日

一、课程设计目的

1、进一步熟悉QuartusⅡ的软件使用方法;

2、熟悉利用VHDL设计数字系统并学习LPM_ADD_SUB、LPMROM、LPM_FF的使用方法;

3、学习FPGA硬件资源的使用和控制方法;

4、掌握DDS基本原理,学习利用此原理进行信号发生器的设计

二、设计任务

完成10位输出数据宽度的频率可调的移相正弦信号发生器,通过按键调节频率和初始相位,实现相位和频率可调的正弦信号发生器

三、工作原理及模块分析

直接数字频率合成器(DDS)是通信系统中常用到的部件,利用DDS可以制成很有用的信号源。

与模拟式的频率锁相环PLL相比,它有许多优点,突出为

(1)频率的切换迅速;

(2)频率稳定度高。

一个直接数字频率合成器由相位累加器、波形ROM、D/A转换器和低通滤波器构成。

DDS的原理框图如下所示:

图1直接数字频率合成器原理图

其中K为频率控制字,fc为时钟频率,N为相位累加器的字长,D为ROM数据位及D/A转换器的字长。

相位累加器在时钟fc的控制下以步长K作为累加,输出N位二进制码作为波形ROM的地址,对波形ROM进行寻址,波形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、累加器

相位累加器的原理图如下图

图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_wire0:

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_sub

GENERICMAP

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;

BEGIN

q<=sub_wire0(9DOWNTO0);

lpm_ff_component:

lpm_ff

GENERICMAP

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_fftype:

STRING;

lpm_type:

STRING;

lpm_width:

NATURAL

);

PORT

clock:

INSTD_LOGIC;

q:

OUTSTD_LOGIC_VECTOR(31DOWNTO0);

data:

INSTD_LOGIC_VECTOR(31DOWNTO0)

);

ENDCOMPONENT;

BEGIN

q<=sub_wire0(31DOWNTO0);

lpm_ff_component:

lpm_ff

GENERICMAP

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;

BEGIN

q<=sub_wire0(9DOWNTO0);

altsyncram_component:

altsyncram

GENERICMAP(

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(7DOWNTO0);--相位控制字

FOUT:

OUTSTD_LOGIC_VECTOR(9DOWNTO0);--可移相正弦信号输出

POUT:

OUTSTD_LOGIC_VECTOR(9DOWNTO0);

CLKOUT:

OUTSTD_LOGIC);--参考信号输出

ENDDDS_SIN_YANGTIANJUN_CHENYAOSHUAI;

ARCHITECTUREoneOFDDS_SIN_YANGTIANJUN_CHENYAOSHUAIIS

COMPONENTREG32B--32位锁存器

PORT

clock:

INSTD_LOGIC;

data:

INSTD_LOGIC_VECTOR(31DOWNTO0);

q:

OUTSTD_LOGIC_VECTOR(31DOWNTO0)

);

ENDCOMPONENT;

COMPONENTREG10B--10位锁存器

PORT

clock:

INSTD_LOGIC;

data:

INSTD_LOGIC_VECTOR(9DOWNTO0);

q:

OUTSTD_LOGIC_VECTOR(9DOWNTO0)

);

ENDCOMPONENT;

COMPONENTADD32--32位加法器

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)<=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(31DOWNTO22),result=>LIN10B);

u5:

REG10BPORTMAP(q=>SIN10B,data=>LIN10B,clock=>CLK);

u6:

ROMPORTMAP(address=>D32B(31DOWNTO22),q=>POUT,clock=>CLK);

ENDone;

五、仿真结果:

图4仿真波形

由仿真结果来看改变相位和频率输入,相应输出的频率和相位也跟随着相应的变化。

故仿真结果正确。

六、引脚配置和下载

图5引脚配置

图6下载

图7实际波形

经实际硬件验证,可通过按键改变频率和相位的值而改变正弦信号发生器输出波形的频率和相位。

七、实验心得

实验涉及了对LPM_ADD_SUB、LPMROM、LPM_FF宏模块的使用、例化方法的使用,完成DDS数字移相信号发生器。

实验中需要注意的问题有很多,例如需要保证ROM中的数据要至少1024个,保证正弦信号的完整性;在引脚配置中注意选择16进制的按键和10位D/A的引脚。

本实验从设计到仿真验证在到硬件验证,让我们逐步深刻地了解DDS移相信号发生器的原理。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2