eda信号发生器三角波正弦波方波.docx
《eda信号发生器三角波正弦波方波.docx》由会员分享,可在线阅读,更多相关《eda信号发生器三角波正弦波方波.docx(7页珍藏版)》请在冰豆网上搜索。
eda信号发生器三角波正弦波方波
1引言
简易多功能信号发生器是信号发生器的一种,在生产实践和科研领域中有着广泛的应用。
信号源主要给被测电路提供所需要的已知信号(各种波形),然后用其它仪表测量感兴趣的参数。
可见信号源在电子实验和测试处理中,并不测量任何参数,而是根据使用者的要求,仿真各种测试信号,提供给被测电路,以达到测试的需要。
信号发生器是电子测量领域中最基本、应用最广泛的一类电子仪器。
它可以产生多种波形信号,如正弦波,三角波和方波等,因而广泛用于通信、雷达、导航、宇航等领域。
在本设计中它能够产生多种波形,如正弦波,三角波和方波等,并能实现对各种波频率和幅度的改变。
正因为其在生活中应用的重要性,人们它做了大量的研究,总结出了许多实现方式。
可以基于FPGA、VHDL、单片机、DOS技能、数字电路等多种方法实现。
本设计是采用VHDL来实现的简易多功能信号发生器。
它能产生正弦波,三角波和方波。
且
对各种波形的要求如下:
(1)设计任意信号发生器,使之能够生成正弦波、三角波和方波;
(2)电路的外部频率为40MHz,要求信号发生器可产生0-1KHz、1KHz~10KHz、10KHz~1MHz三档频率的信号;
(3)要求具有波形选择和频率选择的功能;
(4)在同一频率档内,可实现频率的加减;
(5)要求显示波形的同时能够进行频率的调节;
(6)要求能够显示波形:
A——正弦波;B——三角波;C——方波;(7)要求能够显示频率值;
(8)可用示波器进行波形的观测。
2设计流程
2.1设计思想及流程图
本次课程设计按模块式实现,据任务书要求,设计总共分三大步骤完成:
(1)产生波形(三种波形:
方波、三角波、正弦波)信号;
(2)频率控制;
(3)显示频率值。
利用VHDL编程,依据基本数字电路模块原理进行整合。
系统各部分所需工作时钟信号由输入系统时钟信号经分频得到,系统时钟输入端应满足输入脉冲信号的要求。
频率控制模块有多个可选频率,最终送至脉冲发生模块输出脉冲信号,同时将信号的频率输出至数码管显示当前信号的频率值,达到设计课题所要求的输出波形频率可调功能。
如图2-1所示:
图2-1程序流程图
2.2总体功能简述
这个设计运用.vhd文件,实现三角波、正弦波、方波的选择以及频率的选择。
本次课设所做的简易多功能信号发生器,实现3种常见波形正弦波、三角波、方波的功能。
并且输出信号的频率范围为0—1MHz,输出频率可以步进调节;同时具有显示输出波形、频率的功能。
2.3三种波的简述及选择
代码主要采用了ROM的设计思路。
一共描述了256个点,用这256个数据来模拟这三种波,首先,在mem中放入64个数,,然后定义从0到63的信号,当时钟的上升沿达到的时候,则将这64个数一位一位的读出。
然后,由选择信号选择出相应的波形。
原理图如图2-2所示:
图2-2波形选择原理图
2.4分频器的设计
在分频器模块中,运用计数的方法实现分频,通过选择信号选择出相应的频率连接到波形选
择的时钟信号上,并输出频率值在数码管上显示。
原理图如图2-3所示:
3信号发生器的仿真波形
3.1软件调试
在本次课设中,所使用的软件即为前面重点介绍过的QuartusII软件。
本系统的软件功能强大,运用VHDL语言来编写,先在QuartusII对所编的模块一一进行仿真,排除了语法的错误编写和设计逻辑思维的错误,当仿真完确认程序没问题时,再直接下载到FPGA芯片,用FPGA实
验箱进行调试。
采取的就是自顶向下的调试方法,即先单独调试好每一个模块,然后再连接成一个完整的系统再调试。
3.2仿真波形
运用本次选用的QuartusII软件对代码进行调试,即可得出相应的波形。
正弦波信号的波形仿真如图3-1所示:
clk为输入时钟信号;data为输出的正弦波信号波形;sel为00选择正弦波信号;
三角波信号的波形仿真如图3-2所示:
clk为输入时钟信号;data为输出的三角波信号波形;sel为01选择三角波信号;
方波信号的波形仿真如图3-3所示:
clk为输入时钟信号;data为输出的三角波信号波形;sel为10选择方波信号;
clk为输入时钟信号;
clk_out为输出时钟信号;
outp为输出频率;
sel_p为频率选择信号;
3.3硬件测试
本课程设计是简易多功能信号发生器,其总共有6个输入端。
分别为频率选择键sel_p[x,x],每个频率段内的频率值sel_s[x,x]和波形选择键sel_b[x,x]。
输出有DA0832示波器显示波形输出,频率值显示。
根据引脚所锁定图将系统中的各个输入输出端口锁定到合适的引脚上。
需要注意的是本系统用到了数码管显示,所以应该选定实验箱的模式5。
另外,本实验输入的时钟频率是40MHz。
当引脚锁定完毕后,将程序下载到试验箱中,连好示波器,在输入端输入相应的值即可得到相应的输出波形。
具体的硬件仿真波形如下:
正弦波:
频率为6KHZ
三角波频:
率为60KHZ
频率为600HZ
频率为6KHZ
频率为60KHZ
方波波形:
频率为600HZ
频率为6KHZ
频率为60KHZ
频率显示:
600HZ的16进制显示
6KHZ的16进制显示
60KHZ的16进制显示
硬件测试结果分析:
由于时间紧迫取了64个点,点数较少,正弦波频率较低时,出现一定程度的失真,三角波频率较高时出现失真,好像是正弦波波形。
方波时,当频率高时,失真程度较大,当取的点数较多时,情况会明显的改善。
频率显示值是16进制,与10进制的值是相等的。
4总结
EDA技术是当前数字系统设计领域比较火热的一种工具,他可以大大缩短设计需要的时间,降低成本的同时也提高了系统的稳定性。
使用VHDL语言描述硬件系统使得EDA技术有了更为广阔的空间。
本设计使用了基于Altera公司的开发软件工具QuartusII,本系统即实现了可以输出三种波形的简易多功能波形发生器,仿真结果证明,该设计正确有效,可以作为制作实物的理论依据。
对于EDA技QuartusII进行了系统的设计和仿真。
简易波形发生器在生活中各个场合都有着大量的使用术我一直都有着浓厚的兴趣,借做课设的机会,认真的研究了一下这么科学。
发现EDA技术比我们想象中的要有很大的难度。
里面有很多的思想来源于信息电子技术辑算法的设计,需要有很强的C语言编程功底。
学习一门知识要从最基本的体系构架开始,倘若一开始就从顶层设计入手,就会造成很多基本原理、基本概念上的偏差,甚里面的基本知识,包括电路的概念以及寄存器传送的基本知识。
VHDL语言与C语言有很大的不同,但是C语言的编程思想也可以移植到VHDL语言当中来,尤其是一些逻辑会拖延设计的时间,事倍功半。
虽然可设完成了,但我意识到,我对于这门学科只是停留在入门的阶段,想要有更大的发展,要深入的研究,还要更多的努力和实践。
参考文献
[1]潘松,黄继业.EDA技术实用教程.北京:
科学出版社,2002.
[2]甘历.VHDL应用与开发实际.北京:
科学出版社,2003.
[3]
2006.
2007.
孙延鹏,张芝贤.VHDL与可编程逻辑器件应用.航空工业出版社,
[4]赵明富,李立军,石新锋,沈献博.EDA技术基础.北京大学出版社,
[5]黄仁欣.EDA技术实用教程.清华大学出版社,2006.
附录
libraryieee;
useieee.std_logic_1164.all;
entityzuihouisport(clk:
instd_logic;
sel_s:
instd_logic_vector(1downto0);sel_p:
instd_logic_vector(1downto0);sel_b:
instd_logic_vector(1downto0);
dout:
outintegerrange0to255;xianshi:
outintegerrange0to1000000);
end;
architecturebhvofzuihouissignaltest:
integerrange0to1000000;
signalb:
std_logic;
signaladdr:
integerrange0to63;
typehuiisarray(0to63)ofintegerrange0to255;constantsina:
hui:
=(255,254,252,249,245,239,233,225,217,207,197,186,174,162,150,137,124,112,99,87,75,64,53,43,34,26,19,13,8,4,1,0,0,1,4,8,13,19,26,34,43,53,64,75,87,99,112,124,137,150,162,174,186,197,207,217,255,233,239,245,249,252,254,255);
constantsanjiao:
hui:
=(0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,255,248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8);
constantfangbo:
hui:
=(255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
begin
process(clk)
variablecount:
integerrange0to1000000;
begin
ifclk'eventandclk='1'thencount:
=count+1;
if(count=test)thencount:
=0;
b<=notb;
endif;
endif;
endprocess;
process(sel_s,sel_p)
begin
casesel_pis
when"00"=>
if(sel_s="00")thenxianshi<=300;test<=5000;
elsif(sel_s="01")thenxianshi<=600;test<=2500;
elsexianshi<=900;test<=1700;
endif;
when"01"=>
if(sel_s="00")thenxianshi<=3000;test<=500;
elsif(sel_s="01")thenxianshi<=6000;test<=250;
elsexianshi<=9000;test<=170;
endif;
when"10"=>
if(sel_s="00")thenxianshi<=30000;test<=50;
elsif(sel_s="01")thenxianshi<=600000;test<=25;
elsexianshi<=900000;test<=17;
endif;
whenothers=>null;
endcase;endprocess;
process(b)
variablecount:
integerrange0to63;begin
if(b'eventandb='1')thencount:
=count+1;ifcount=64thencount:
=0;
endif;
endif;
addr<=count;
endprocess;process(b,sel_b,addr)begincasesel_biswhen"00"=>dout<=sina(addr);when"01"=>dout<=sanjiao(addr);when"10"=>dout<=fangbo(addr);whenothers=>null;endcase;endprocess;endbhv;