EDA课程设计.docx
- 文档编号:26404763
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:34
- 大小:609.13KB
EDA课程设计.docx
《EDA课程设计.docx》由会员分享,可在线阅读,更多相关《EDA课程设计.docx(34页珍藏版)》请在冰豆网上搜索。
EDA课程设计
HarbinInstituteofTechnology
课程设计
课程名称:
课程设计І
设计题目:
通用信号源设计
院系:
电子与信息工程学院
班级:
设计者:
学号:
指导教师:
设计时间:
2014年4月17日至2014年5月8日
哈尔滨工业大学
2014年5月8日
摘要
在现代电子设计中,信号发生器是电子设计中最常用的的设备,但是并未得到普及,原要是因为,信号发生器功能不够强大,且价格比较高,实验室常用的函数信号发生器,以Max038作为核心元器件,尽管能产生各种波形,缺少调制功能,频率不高,其他的高端的函数信号发生器,采用频率合成技术但是价格过高,并不是广大电子爱好者能够接受的,因此,设计一个实用,通用的信号源发生器是必要的,本文基于FPGA技术、采用频率合成法,利用matlab和和quartusII9.0进行仿真产生,正弦波三角波,方波,锯齿波,还适当的添加了AM、PSK、FM、ASK功能,采用protel进行pcb制版。
关键词:
FPGAMATLABQUARTUSII频率合成,波形产生
第一章直接数字频率合成器
1.1概述:
1917年美国学者J.Tierncy、C.M.Reader和B.Gold提出了以全数学技术从相位概念出发直接合成所需波形的一种新的频率合成原理。
随着技术和水平的提高,一种新的频率合成技术——直接数字频率合成器(DDS)技术得到了飞速发展。
DDS技术是一种把一些列数字形式的信号通过DAC转换成模拟行驶的信号合成技术。
DDS技术具有频率切换时间短,频率分辨率高,频率稳定度高,输出信号的频率和相位可以快速控切换,输出相位可连续,可编程以及灵活性大等优点,它以有别于其他频率合成方法的优越性能和特点成为现代频率合成技术的姣姣者。
DDS广泛用于接受机本振、信号发生器、仪器、通信系统、雷达系统等,尤其适合跳频无线通信系统。
1.2设计任务与要求
设计任务:
设计一个通用通信信号源。
技术参数:
(1)可以产生的信号类型:
方波、三角波、正弦波、锯齿波;AM、FM、ASK、FSK、PSK、16QAM、GMSK
(2)基带信号频率范围:
0~1MHz可调
(3)射频频率范围:
0~300MHz可调
(4)要求给出系统方案的数学模型,分别采用MATLAB和QuartusII进行仿真,给出采用MATLAB实现每种信号的仿真波形,给出采用QUARTUSII仿真得到的PSK的仿真图。
1.3DDS总体框图
直接数字频率合成器程序设计可以有多种的方法来实现,其中所用到的器件和很多基本的算法好思想都是相同的,DDS的工作原理是一致的,只是根据不同的硬件,具体的方法有所区别。
直接频率合成器:
如图1—1所示:
1.频率控制字M和相位控制字分别控制DDS输出正(余)弦波的频率和相位。
2.相位累加器是DDS系统的核心,它是由一个N位字长的加法器和一个N位相位寄存器组成,作用是对频率控制字进行线性累加,每来一个时钟脉冲,相位寄存器以步长M增加。
相位寄存器的输出与相位控制字相加,其结果作为正(余)弦查找表的地址。
3.正(余)弦查找表由ROM构成,内部存有一个完整周期正弦波的数字幅度信息,每个查找表的地址对应正弦波中0~360 °范围内的一个相位点。
查找表把输入的地址信息映射成正(余)弦波的数字幅度信号,同时输出到数模转换器D/A的输入端。
4.D/A转换器输入的是数字量,经转换后输出的是模拟量。
有关D/A转换器的技术性能指标很多,例如分辨率、建立时间、接口形式、偏移量误差以及线性度等等。
分辨率是D/A转换器对输入量变化的敏感程度,与输入数字的位数有关,数字量位数越多,分辨率也就越高,亦即转换器对输入量变化的敏感程度也就越高。
使用时,应根据分辨率的需要来选定转换器的位数。
DAC常可分为8位、10位和12位三种。
本设计使用10位D/A转换器。
1.4DDS与系统输出频率幅度相位的关系
正弦波可表示为:
F=Asin(2Л
),数字量最终转换为模拟量时可表示为:
F=Asin(θk-1+Δθ)(1.1)
式中
为输出正弦波频率,A为输出正弦波的幅度,Δθ为一个时钟周期T的
位增量,即2ЛT。
在实际操作中,对正弦波的一个周期2Л均分为2
等份
故设定相位累加器位数、BΔθ和基准时钟的值,就可以产生任一频率的输出。
系统给出频率为
,将BΔθ表示为频率控制字K,则输出信号波形的频率表示式为:
×K(1.2)
由于本设计中要求基带信号为0-1MHz射频范围为0-300MHz由奈奎斯特抽样定理可以知道要恢复原信号,则必须要求产生基带信号2M以上这里选取2.5M其次要求射频范围0-300M因此要求抽样信号频率大于等于600M,这里选择750M
第二章电路的具体实现
FPGA设计的DDS系统主要由相位累加器及相位/幅度转换电路组成。
根据设计的具体要求,还设计了一个系统控制电路,这一电路可灵活设计,以突出FPGA的优点所在。
另外采用VHDL硬件描述语言实现整个DDS电路,不仅利于设计文档的管理,而且方便设计的修改和扩充,还可以在不同FPGA器件之间实现移植。
利用dds实现任意波形的方法有两种:
一种是利用调制波来实现复杂波形的产生,另外一种是改变波形存储器中的rom或者ram来实现产生任意波形
2.1相位累加器部分
在用FPGA设计DDS电路的时候,相位累加器是决定DDS电路性能的一个关键部分。
小的累加器可以利用FLEX器件的进位链得到快速、高效的电路结构。
然而由于进位链必须位于临近的LAB(逻辑阵列块)和LE(逻辑单元)内,因此长的进位链势必会减少其它逻辑使用的布线资源,同时过长的进位链也会制约整个系统速度的提高。
另一种提高速度的办法是采用流水线技术,即把在一个时钟内要完成的逻辑操作分成几步较小的操作,并插入几个时钟周期来提高系统的数据吞吐率。
但是流水线技术比较适合开环结构的电路,要用在累加器这样的闭环反馈的电路中必须谨慎考虑,以保证设计的准确无误。
综合考虑后,相位累加器采用流水线技术来实现,这样能保证较高的资源利用率,又能提高系统的性能和速度。
设计中整个系统只加入了一级流水线来提高速度。
为了进一步提高速度,在设计相位累加器模块和加法器模块时并没有采用FPGA单元库中16~32位加法器,尽管它们可以很容易地实现高达32位的相位累加器,但当工作频率较高时,它们较大的延时不能满足速度要求,故不可取。
因此这里设计一个新的累加器进行10位累加运算
2.2相位/幅度转换电路
相位/幅度转换电路是DDS电路中的另一个关键部分。
该电路通常采用ROM结构,相位累加器的输出是一种数字式锯齿波,通过取它的若干位作为ROM的地址输入,而后通过查表和运算,ROM就能输出所需波形的量化数据。
在FPGA(针对Altera公司的器件)中,ROM一般由EAB实现,且ROM表的尺寸随地址位数或数据位数的增加成指数递增关系,因此在满足信号性能的前提下,如何有效利用FPGA的有限资源,成为相位/幅度转换电路中最关键的一点。
在设计时可充分利用信号周期内的对称性和算术关系来减少EAB的开销。
相位/幅度转换电路中的主要问题在于ROM的大小。
由于本设计需要输出正弦波三角波方波等,因此这里用了10位字长1024字的ROM表实现
2.3波形表生成
由于DDS中波形表存储器是采用FPGA芯片内部的LPM_ROM实现,故波形表可以VHDL编程的.mif文件形式存入LPM_ROM中,具体实现见附录2。
2.4D/A转换电路
因为要产生两路具有相位差的正弦波,所以必须采用两片D/A转换芯片将两路信号分别转换成模拟量输出。
在此选用转换速率为500ns的芯片AD7521作为数字量到模拟量的转换器件。
2.5系统控制电路
系统控制电路主要是根据是否需要相位调制及频率调制,系统时钟是否需要分频得到所需的基准时钟,频率码的输入方式是串行、并行还是微机接口方式,如何控制输出等具体要求而设计的,其功能实现见图:
图2-1总电路原理框图
第三章各部件电路及仿真
3.0PLL模块
这里锁相环主要使用来进行倍频的,才可以进行抽样,因为pll的特性,能产生稳定的频率输出,再加上FPGA中有pll内核因此这里选择pll模块作为倍频
1.模块框图
2.由于PLL要进行例化这里给出代码
modulepll1(
inclk0,
c0);
inputinclk0;
outputc0;
wire[5:
0]sub_wire0;
wire[0:
0]sub_wire4=1'h0;
wire[0:
0]sub_wire1=sub_wire0[0:
0];
wirec0=sub_wire1;
wiresub_wire2=inclk0;
wire[1:
0]sub_wire3={sub_wire4,sub_wire2};
altpllaltpll_component(
.inclk(sub_wire3),
.clk(sub_wire0),
.activeclock(),
.areset(1'b0),
.clkbad(),
.clkena({6{1'b1}}),
.clkloss(),
.clkswitch(1'b0),
.configupdate(1'b0),
.enable0(),
.enable1(),
.extclk(),
.extclkena({4{1'b1}}),
.fbin(1'b1),
.fbmimicbidir(),
.fbout(),
.locked(),
.pfdena(1'b1),
.phasecounterselect({4{1'b1}}),
.phasedone(),
.phasestep(1'b1),
.phaseupdown(1'b1),
.pllena(1'b1),
.scanaclr(1'b0),
.scanclk(1'b0),
.scanclkena(1'b1),
.scandata(1'b0),
.scandataout(),
.scandone(),
.scanread(1'b0),
.scanwrite(1'b0),
.sclkout0(),
.sclkout1(),
.vcooverrange(),
.vcounderrange());
defparam
altpll_component.clk0_divide_by=2,
altpll_component.clk0_duty_cycle=50,
altpll_component.clk0_multiply_by=15,
altpll_component.clk0_phase_shift="0",
altpll_pensate_clock="CLK0",
altpll_component.inclk0_input_frequency=10000,
altpll_component.intended_device_family="Cyclone",
altpll_component.lpm_type="altpll",
altpll_component.operation_mode="NORMAL",
altpll_component.pll_type="AUTO",
altpll_component.port_activeclock="PORT_UNUSED",
altpll_component.port_areset="PORT_UNUSED",
altpll_component.port_clkbad0="PORT_UNUSED",
altpll_component.port_clkbad1="PORT_UNUSED",
altpll_component.port_clkloss="PORT_UNUSED",
altpll_component.port_clkswitch="PORT_UNUSED",
altpll_component.port_configupdate="PORT_UNUSED",
altpll_component.port_fbin="PORT_UNUSED",
altpll_component.port_inclk0="PORT_USED",
altpll_component.port_inclk1="PORT_UNUSED",
altpll_component.port_locked="PORT_UNUSED",
altpll_component.port_pfdena="PORT_UNUSED",
altpll_component.port_phasecounterselect="PORT_UNUSED",
altpll_component.port_phasedone="PORT_UNUSED",
altpll_component.port_phasestep="PORT_UNUSED",
altpll_component.port_phaseupdown="PORT_UNUSED",
altpll_component.port_pllena="PORT_UNUSED",
altpll_component.port_scanaclr="PORT_UNUSED",
altpll_component.port_scanclk="PORT_UNUSED",
altpll_component.port_scanclkena="PORT_UNUSED",
altpll_component.port_scandata="PORT_UNUSED",
altpll_component.port_scandataout="PORT_UNUSED",
altpll_component.port_scandone="PORT_UNUSED",
altpll_component.port_scanread="PORT_UNUSED",
altpll_component.port_scanwrite="PORT_UNUSED",
altpll_component.port_clk0="PORT_USED",
altpll_component.port_clk1="PORT_UNUSED",
altpll_component.port_clk3="PORT_UNUSED",
altpll_component.port_clk4="PORT_UNUSED",
altpll_component.port_clk5="PORT_UNUSED",
altpll_component.port_clkena0="PORT_UNUSED",
altpll_component.port_clkena1="PORT_UNUSED",
altpll_component.port_clkena3="PORT_UNUSED",
altpll_component.port_clkena4="PORT_UNUSED",
altpll_component.port_clkena5="PORT_UNUSED",
altpll_component.port_extclk0="PORT_UNUSED",
altpll_component.port_extclk1="PORT_UNUSED",
altpll_component.port_extclk2="PORT_UNUSED",
altpll_component.port_extclk3="PORT_UNUSED";
endmodule
使用完这个模块输入频率是100MHz输出最大为750MHz
3.1DDS电路功能模块
1.相位累加器SUM99:
模块如图所示
相位累加器SUM99模块功能:
是一个带有累加功能的10位加法器,它以设定的10位频率控制字K作为步长来进行加法运算,当其和满时,计数器清零,并进行重新运算。
2.
源代码
2、LIBRARYIEEE;
2、USEIEEE.STD_LOGIC_1164.ALL;
3、USEIEEE.STD_LOGIC_UNSIGNED.ALL;
4、ENTITYSUM99IS
5、PORT(K:
INSTD_LOGIC_VECTOR(9DOWNTO0);
6、CLK:
INSTD_LOGIC;
7、EN:
INSTD_LOGIC;
8、RESET:
INSTD_LOGIC;
9、OUT1:
OUTSTD_LOGIC_VECTOR(9DOWNTO0));
10、ENDENTITYSUM99;
11、ARCHITECTUREARTOFSUM99IS
12、SIGNALTEMP:
STD_LOGIC_VECTOR(9DOWNTO0);
13、BEGIN
14、PROCESS(CLK,EN,RESET)IS
15、BEGIN
16、IFRESET='0'THEN
17、TEMP<="0000000000";
18、ELSE
19、IFCLK'EVENTANDCLK='1'THEN
20、IFEN='1'THEN
21、TEMP<=TEMP+K;
22、ENDIF;
23、ENDIF;
24、ENDIF;
25、OUT1<=TEMP;
26、ENDPROCESS;
27、ENDARCHITECTUREART;
3、波形仿真:
3.2相位寄存器模块
1、相位寄存器原理框图如图所示:
FPGA各逻辑单元的连线存在延时,因此,多路跳变产生竞争冒险,就会产生毛刺,而且电容电感对毛刺没有过滤作用,因此毛刺会送到下一级,而且会累加,因此加入D触发器,采用信号同步法进行消除毛刺。
程序源代码:
2、LIBRARYIEEE;
3、USEIEEE.STD_LOGIC_1164.ALL;
4、ENTITYREGIS
5、PORT(D:
INSTD_LOGIC_VECTOR(5DOWNTO0);
6、CLK:
INSTD_LOGIC;
7、Q:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));
8、ENDENTITYREG;
9、ARCHITECTUREARTOFREGIS
10、BEGIN
11、PROCESS(CLK)IS
12、BEGIN
13、IF(CLK'EVENTANDCLK='1')THEN
14、Q<=D;
15、ENDIF;
16、ENDPROCESS;
17、ENDARCHITECTUREART;
3、仿真图:
3.3正弦查找表
1.框图
2、源代码:
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=>"sine.mif",
intended_device_family=>"Cyclone",
lpm_hint=>"ENABLE_RUNTIME_MOD=NO",
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;
3、仿真结果:
附正弦查表生成C语言代码:
#include
#include
#definePI3.141592
#defineDE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 课程设计