VHDL语言正弦波信号发生器EDA实训研究分析报告.docx
《VHDL语言正弦波信号发生器EDA实训研究分析报告.docx》由会员分享,可在线阅读,更多相关《VHDL语言正弦波信号发生器EDA实训研究分析报告.docx(16页珍藏版)》请在冰豆网上搜索。
VHDL语言正弦波信号发生器EDA实训研究分析报告
EDA实训报告
学生姓名:
XXX学号:
XXXXXXXXXXXX
学院:
理工学院
专业:
电子科学与技术
题目:
基于FPGA地正弦波发生器
指导教师:
安国臣
2013年1月
课程设计成绩评定表
学生姓名
XXX
学号
0XXXXX
成绩
专业班级
电子科学与技术
起止时间
设计题目
基于FPGA地正弦波发生器
指
导
教
师
评
语
指导教师:
安国臣
年月日
基于FPGA地正弦波发生器
摘要:
本设计结合了EDA技术和直接数字频率合成(DDS)技术.EDA技术是现代电子设计技术地核心,是以电子系统设计为应用方向地电子产品自动化地设计技术.DDS技术则是最为先进地频率合成技术,具有频率分辨率高、频率切换速度快、相位连续、输出相位噪声低等诸多优点.b5E2R。
本文在对现有DDS技术地大量文献调研地基础上,提出了符合FPGA结构地正弦信号发生器设计方案并利用MAXPLUSⅡ软件进行了设计实现.文中介绍了EDA技术相关知识,同时阐述了DDS技术地工作原理、电路结构,及设计地思路和实现方法.经过仿真测试,设计达到了技术要求.p1Ean。
关键词:
现场可编程门阵列(FPGA);直接数字频率合成(DDS);正弦波信号发生器
一、DDS地基本原理
正弦波信号发生器是由地址发生器和正弦波数据存储器ROM两块构成,输入为时钟脉冲,输出为8位二进制.
1.地址发生器地原理
地址发生器实质上就是计数器,ROM地地址是6位数据,相当于64位循环计数器.
2.只读存储器ROM地设计
(1)、VHDL编程地实现
①基本原理:
为每一个存储单元编写一个地址,只有地址指定地存储单元才能与公共地I/O相连,然后进行存储数据地读写操作.DXDiT。
②逻辑功能:
地址信号地选择下,从指定存储单元中读取相应数据.
直接数字频率合成器(DDFS)地基本原理:
DDS是利用采样定理,根据相位间隔对正弦信号进行取样、量化、编码,然后储存在EPROM中构成一个正弦查询表,通过查表法产生波形.它是由参考时钟、相位累加器、正弦查询表和D/A转换器组成,如图1所示.RTCrp。
图1直接数字频率合成器原理框图
相位累加器由N位加法器与N位累加寄存器级联构成,其原理框图如图2所示.每来一个时钟脉冲Fc,N位加法器将频率控制数据K与累加寄存器输出地累加相位数据相加,把相加后地结果Y送至累加寄存器地输入端.累加寄存器一方面将在上一时钟周期作用后所产生地新地相位数据反馈到加法器地输入端,以使加法器在下一时钟地作用下继续与频率控制数据K相加;另一方面以相加后地结果形成正弦查询表地地址,取出表中与该相位对应地单元中地幅度量化正弦函数值,作为取样地址值送入幅度/相位转换电路.这样就可把存储在波形存储器内地波形抽样值(二进制编码)经查找表查出,完成相位到幅值转换.波形存储器地输出送到D/A转换器,D/A转换器将数字量形式地波形幅值转换成所要求合成频率地模拟量形式信号.5PCzV。
图2相位累加器原理框图
由此可以看出,相位累加器在每一个时钟脉冲输入时,把频率控制字累加一次,相位累加器输出地数据就是合成信号地相位.当相位累加器加满量时就会产生一次溢出,溢出频率就是DDS输出地信号频率.jLBHr。
相位累加器地最大计数长度与正弦查询表中所存储地相位分隔点数相同,在取样频率(由参考时钟频率决定)不变地情况下,由于相位累加器地相位增量不同,将导致一周期内地取样点数不同,输出信号地频率也相应变化.如果设定累加器地初始相位,则可以对输出信号进行相位控制.由采样原理可知,如果使用两个相同地频率合成器,并使其参考时钟相同,同时设定相同地频率控制字、不同地初始相位,那么在原理上就可以实现输出两路具有一定相位差地同频信号.xHAQX。
二、设计方案
1.基于VHDL编程地设计
在地址信号地选择下,从指定存储单元中读取相应数据
系统框图如下:
2、总体设计框图
信号发生器结构框图
三、原理图
1、顶层原理图
四、VHDL编程地实现
1、顶层文件
libraryieee;
useieee.std_logic_1164.all;
entitysinis
port(clk:
instd_logic;
b:
instd_logic_vector(15downto0);
qout:
outstd_logic_vector(6downto0);
sel_out:
outstd_logic_vector(3downto0);
q:
outstd_logic_vector(7downto0));
end;
architecturebhvofsinis
componentsine
port(clk:
instd_logic;
div_set:
instd_logic_vector(15downto0);
qout:
outstd_logic_vector(7downto0)
);
endcomponent;
componentseg_out
port(ins:
instd_logic_vector(3downto0);
outs:
outstd_logic_vector(6downto0));
endcomponent;
componentsel
port(clk:
instd_logic;
qin:
instd_logic_vector(15downto0);
qout:
outstd_logic_vector(3downto0);
sel_out:
outstd_logic_vector(3downto0));
endcomponent;
signalse:
std_logic_vector(3downto0);
begin
u1:
sineportmap(clk,b,q);
u2:
seg_outportmap(se,qout);
u3:
selportmap(clk,b,se,sel_out);
end;
2、rom设计
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitysineis
port(clk:
instd_logic;
div_set:
instd_logic_vector(15downto0);
qout:
outstd_logic_vector(7downto0)
);
end;
architecturebhvofsineis
signaladdr:
std_logic_vector(5downto0);
signalcnt:
std_logic_vector(15downto0);
signalclk_temp:
std_logic;
typememoryisarray(0to63)ofstd_logic_vector(7downto0);LDAYt。
constantrom:
memory:
=("10000000","10001100","10011001","10100101","10110001","10111100","11000111","11010001","11011011","11100011","11101011","11110001","11110110","11111010","11111101","11111111","11111111","11111110","11111100","11111000","11110100","11101110","11100111","11011111","11010110","11001100","11000010","10110111","10101011","10011111","10010011","10000110","01111001","01101101","01100000","01010100","01001000","00111101","00110011","00101001","00100000","00011000","00010001","00001011","00000111","00000011","00000001","00000000","00000000","00000010","00000101","00001001","00001110","00010100","00011100","00100100","00101110","00111000","01000011","01001110","01011010","01100110","01110011","01111111");Zzz6Z。
begin
fre:
process(clk)
begin
ifrising_edge(clk)then
ifcnt=div_setthencnt<="0000000000000000";clk_temp<='1';dvzfv。
elsecnt<=cnt+1;clk_temp<='0';
endif;
endif;
endprocess;
p1:
process(clk_temp)
begin
ifrising_edge(clk_temp)then
ifaddr="111111"thenaddr<="000000";
elseaddr<=addr+1;
endif;
endif;
endprocess;
main:
process(addr)
variabletemp:
integerrange0to63;
begin
temp:
=conv_integer(addr);
qout<=rom(temp);
endprocess;
end;
3、7段数码管动态显示
3.1、片选
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityselis
port(clk:
instd_logic;
qin:
instd_logic_vector(15downto0);
qout:
outstd_logic_vector(3downto0);
sel_out:
outstd_logic_vector(3downto0));
end;
architecturebhvofselis
signalcnt:
std_logic_vector(5downto0);
signalsel_temp:
integerrange0to4;
signalclk_temp:
std_logic;
signalqin_temp1,qin_temp2:
std_logic_vector(15downto0);rqyn1。
begin
p1:
process(clk)
begin
ifrising_edge(clk)then
ifcnt="111111"thencnt<="000000";clk_temp<='1';
elsecnt<=cnt+1;clk_temp<='0';
endif;
endif;
endprocess;
p2:
process(clk_temp)
begin
ifsel_temp=4thensel_temp<=0;
elsifrising_edge(clk_temp)then
sel_temp<=sel_temp+1;
endif;
endprocess;
p3:
process(sel_temp,qin)
begin
casesel_tempis
when0=>sel_out<="0001";qout<=qin(3downto0);
when1=>sel_out<="0010";qout<=qin(7downto4);
when2=>sel_out<="0100";qout<=qin(11downto8);
when3=>sel_out<="1000";qout<=qin(15downto12);
whenothers=>sel_out<="0000";
endcase;
endprocess;
endarchitecture;
3.2、7段数码管显示
libraryieee;
useieee.std_logic_1164.all;
entityseg_outis
port(ins:
instd_logic_vector(3downto0);
outs:
outstd_logic_vector(6downto0));
end;
architecturebhvofseg_outis
signaltemp:
std_logic_vector(3downto0);
begin
process(ins)
begin
caseinsis
when"0000"=>outs<="1111110";--显示0
when"0001"=>outs<="0110000";--显示1
when"0010"=>outs<="1101101";-----2
when"0011"=>outs<="1111001";-----3
when"0100"=>outs<="0110011";-----4
when"0101"=>outs<="1011011";-----5
when"0110"=>outs<="1011111";-----6
when"0111"=>outs<="1110000";-----7
when"1000"=>outs<="1111111";-----8
when"1001"=>outs<="1111011";-----9
when"1010"=>outs<="1110111";-----A
when"1011"=>outs<="0011111";-----B
when"1100"=>outs<="1001110";-----C
when"1101"=>outs<="0111101";-----D
when"1110"=>outs<="1001111";-----E
when"1111"=>outs<="1000111";-----F
whenothers=>null;
endcase;
endprocess;
end;
四、波形仿真结果
1、实验箱地引脚配
2、一些相关设计
3、利用VHDL语言设计地波形仿真结果
五、实训总结
通过这次设计,进一步加深了对EDA地了解,让我对它有了更加浓厚地兴趣.特别是当每一个子模块编写调试成功时,心里特别地开心.但是在编写顶层文件地程序时,遇到了不少问题,特别是各元件之间地连接,以及信号地定义,总是有错误,在细心地检查下,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气.Emxvx。
其次,在连接各个模块地时候一定要注意各个输入、输出引脚地线宽,因为每个线宽是不一样地,只要让各个线宽互相匹配,才能得出正确地结果,否则,出现任何一点小地误差就会导致整个文件系统地编译出现错误提示,在器件地选择上也有一定地技巧,只有选择了合适当前电路所适合地器件,编译才能得到完满成功.SixE2。
通过这次课程设计使我懂得了理论与实际相结合是很重要地,只有理论知识是远远不够地,只有把所学地理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己地实际动手能力和独立思考地能力.在设计地过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样地问题,同时在设计地过程中发现了自己地不足之处,对以前所学过地知识理解得不够深刻,掌握得不够牢固.6ewMy。
终于觉得平时所学地知识有了实用地价值,达到了理论与实际相结合地目地,不仅学到了不少知识,而且锻炼了自己地能力,使自己对以后地路有了更加清楚地认识,同时,对未来有了更多地信心.最后,对给过我帮助地所有同学和各位指导老师再次表示忠心地感谢!
kavU4。
在这次设计中,我也深深地体会到“细节决定成败”这句话地真正含义,也许就因为一个小地细节就会导致设计地失败.这次设计也启发了我在以后地学习中一定要耐心、细心、认真,不可粗枝大叶.y6v3A。
版权申明
本文部分内容,包括文字、图片、以及设计等在网上搜集整理.版权为个人所有
Thisarticleincludessomeparts,includingtext,pictures,anddesign.Copyrightispersonalownership.M2ub6。
用户可将本文地内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律地规定,不得侵犯本网站及相关权利人地合法权利.除此以外,将本文任何内容或服务用于其他用途时,须征得本人及相关权利人地书面许可,并支付报酬.0YujC。
Usersmayusethecontentsorservicesofthisarticleforpersonalstudy,researchorappreciation,andothernon-commercialornon-profitpurposes,butatthesametime,theyshallabidebytheprovisionsofcopyrightlawandotherrelevantlaws,andshallnotinfringeuponthelegitimaterightsofthiswebsiteanditsrelevantobligees.Inaddition,whenanycontentorserviceofthisarticleisusedforotherpurposes,writtenpermissionandremunerationshallbeobtainedfromthepersonconcernedandtherelevantobligee.eUts8。
转载或引用本文内容必须是以新闻性或资料性公共免费信息为使用目地地合理、善意引用,不得对本文内容原意进行曲解、修改,并自负版权等法律责任.sQsAE。
Reproductionorquotationofthecontentofthisarticlemustbereasonableandgood-faithcitationfortheuseofnewsorinformativepublicfreeinformation.Itshallnotmisinterpretormodifytheoriginalintentionofthecontentofthisarticle,andshallbearlegalliabilitysuchascopyright.GMsIa。