基于DSP_Builder数字信号处理课程设计文档格式.docx
《基于DSP_Builder数字信号处理课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《基于DSP_Builder数字信号处理课程设计文档格式.docx(13页珍藏版)》请在冰点文库上搜索。
(一).AM调制的设计
AM幅度调制函数信号可以用式F=Fdr×
(1+Fam×
m)来表述,其中,Fdr、
Fam、F分别是被调制的载波信号,需要被调制的信号和调制后AM的输出信号,它们都是有符号数,m是调制度,0<
m<
1。
s(t)=m(t)*sin(t)其中m(t)是1或者是0,sin(t)是载波
观察s(t)如果有波形输入的是1没波形是0。
基于DSPBuilder的数字的AM系统如下图所示
元器件的主要参数设定在这里省略介绍仿真如下图所示:
通过matlab转化成VHDL语言通过Quartus2并下到板上验证,在这里需要添加几个模块一是分频器因为我们晶振频率较高反映在数码管上分辨不出所以叫频率降低,二是把8位的二进制传化成三位的十进制数,三是把十进制的数显示在数码管上;
最后通过引脚分配输入端口有时钟clock、使能端sw,一个数字
输入拨码开光,输出有四个数码管显示。
通过图形编辑法最终的实现电路为下图所示:
Rom中的mif表格:
分配引脚:
波形仿真:
下载到板上进行验证:
可以看到的数码管的数字在以不同的值在跳动,调制前的数据没有变,调制后的数据和0交替跳动,因为输入的数字信号是1和1交替变化的,因此出现了这样的结果。
(二).DDS控制电路的设计
DDS,即直接数字合成器,是采用数字技术的一种新型频率合成技术,他通过控制频率、相位增量的步长,产生各种不同频率的信号。
它的优点在于:
有较高的频率分辨率;
可以实现快速的频率切换;
在频率改变时能够保持相位的连续;
很容易实现频率、相位和幅度的数控调制等。
目前可采用专用芯片或可编程逻辑芯片实现DDS,专用的DDS芯片产生的信号波形、功能和控制方式固定,常不能满足具体需要。
FPGA具有器件规模大、工作速度快及可编程的硬件特点,并且开发周期短,易于升级,因为非常适合用于实现DDS。
DDS(直接数值合成器)信号发生器,通过不同的频率控制字产生各种不同频率的信号。
主要由16位加法器、16位寄存器正弦波形数据查找表(LUT)、
频率控制字组成,并且其输出计算波形为:
c(t)=cos(2pKft)。
2.1DDS原理:
2N c
DDS的结构原理图如图2.1所示,DDS以数控振荡器的方式,产生频率、相位和幅度可控的正弦波。
电路包括了相位累加器、相位调制器、正弦ROM查找表、基准时钟源等组成。
其中前三者是DDS结构中的数字部分,具有数字控制频率合成的功能。
D/A
正弦ROM查找表
相位字输入
频率字输入
基准时钟
相位调制器
相位累加器
图2.1基本DDS结构框图
如图2.1所示,DDS系统的核心是相位累加器,完成相位累加过程。
在基准时钟的控制下,频率控制字由累加器累加,以得到相应的相位数据,相位调制器接收相位累加器的相位输出,主要用于信号的相位调制,其输出的数据作为取样地址来寻址正弦ROM查找表,完成相位-幅度变换,输出不同的幅度编码;
再经过D/A转换器得到相应的阶梯波;
最后经低通滤波器对阶梯进行平滑处理,即可得到由频率控制字决定的连续变换输出的正弦波。
由以上原理可以得到DDS的输出频率f
out
=BDq×
f
2N
clk
,式中,BDq
是频率的
控制字,它与系统时钟频率呈正比;
fclk是系统基准时钟的频率值;
N是相位
累加器数据位宽,也是频率输入字的数据位宽。
2.2DSPBuilder简介:
DSPBuilder是美国Altera公司推出的一个面向DSP开发的系统级工具,他作为Matlab的一个Simulink工具箱,使得用FPGA设计DSP系统完全通过
Simulink的图形化界面进行建模、系统级仿真,设计模型可直接向VHDL硬件描述语言转换,并自动调用QuartusⅡ等EDA设计软件,完成综合、网表生成以及器件适配乃至FPGA的配置下载,使得系统描述与硬件实现有机的融合为一体,充分体现了现代电子技术自动化开发的特点与优势。
基于DSPBuilder的DDS设计与仿真
基于DSPBuilder的DDS系统如图2.2所示:
图2.2DDS直接频率合成器DSPBuilder/MatlabSimulink模型仿真图如下图2.3:
图2.3DDS仿真图
最后通过引脚分配输入端口有时钟clock,输出由三个数码管显示。
最后分配引脚下载到板上验证实验现象引脚分配如下图:
通过matlab得到下载到DE2板子上的数据:
下载到DE2板子上,观察实验现象可以看到数码管显示的是同scope里面出来的波形一直的数据,数据我通过matlab显示出来,对照可以看到其变化一致。
五.设计结论
本设计使用了DSP Builder,建立了基于DDS,AM调制系统模型,使用
QuartusⅡ下到板上进行验证,结果表明该模型可以正确地产生AM调制信号、
DDS信号。
本方案最大的特点是采用了DSPBuilder,它作为一个算法级的设计工具,只需在Simulink中进行图形化设计,仿真通过后,即可使用SignalCompiler把MATLAB/Simulink模型文件(.mdl)转换成相应的硬件描述语言VHDL设计文件(.vhd),以及用于控制综合与编译的TCL脚本。
根据这些文件后续步骤可以由QuartusⅡ自己完成。
大大减少了编程的复杂度,使硬件描述更加的直观。
此外,本方案采用DDS技术,获得了较高的频率分辨率,同设计方法简单快捷,降低了实现的复杂度,而且便于修改和功能扩充。
通过该设计使我全面熟悉、掌握VHDL语言基本知识,掌握利用VHDL语言对信号发生器的编程和时序逻辑电路编程,把编程和实际结合起来,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高动手能力,培养使用设计综合电路的能力,养成提供文档资料的习惯和规范编程的思想。
通过了本次实验使我对程序设计有了新的认识与体会,做实验不单单是在软件上运行出结果就表明对了,当其与硬件连接后能否对应现象也是非常重要的,我们不仅要学好软件,也要将硬件部分做好,多学习,多思考,在今后的运用中也将会更加的得心应手。
总之,这次课程设计我受益匪浅。
源程序:
AM调制的分频器:
libraryieee;
useieee.std_logic_1164.all;
entityclk_1_genisport(
clkin:
instd_logic;
clkout:
outstd_logic);
endclk_1_gen;
architecturebehave_clk_1_genofclk_1_genisconstantN:
Integer:
=24999999;
signalCounter:
IntegerRANGE0TON;
signalClk:
Std_Logic;
begin
process(clkin)begin
ifrising_edge(clkin)then--每计到4个(0~3)上升沿,输出信号翻转一次ifCounter=Nthen
Counter<
=0;
Clk<
=NOTClk;
else
=Counter+1;
endif;
endif;
endprocess;
clkout<
=Clk;
endbehave_clk_1_gen;
DDS调制的分频器:
=390624;
ifrising_edge(clkin)thenifCounter=Nthen
clkout<
8选3选择器:
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityeigth_to_3isport(
input:
instd_logic_vector(7downto0);
output:
outstd_logic_vector(3downto0);
output1:
output2:
outstd_logic_vector(3downto0)
);
endentityeigth_to_3;
architecturethreeofeigth_to_3issignals:
integerrange0to999;
signals1:
integerrange0to15;
signals2:
signals3:
begin
s<
=conv_integer(input);
s1<
=s/100;
s2<
=(srem100)/10;
s3<
=(srem10);
output<
=conv_std_logic_vector(s1,4);
output1<
=conv_std_logic_vector(s2,4);
output2<
=conv_std_logic_vector(s3,4);
end;
数码管显示:
entitynum_7segisport(
c:
instd_logic_vector(3downto0);
hex:
outstd_logic_vector(6downto0));
endnum_7seg;
architecturebehave_num_7segofnum_7segisbegin
withc(3downto0)select
hex<
="
1000000"
when"
0000"
--"
0"
"
1111001"
0001"
1"
0100100"
0010"
2"
0110000"
0011"
3"
0011001"
0100"
4"
0010010"
0101"
5"
0000010"
0110"
6"
1111000"
0111"
7"
0000000"
1000"
8"
0010000"
1001"
9"
1111111"
when others;
--"
"
endbehave_num_7seg;