简易多功能信号发生器.docx
《简易多功能信号发生器.docx》由会员分享,可在线阅读,更多相关《简易多功能信号发生器.docx(35页珍藏版)》请在冰点文库上搜索。
简易多功能信号发生器
1引言
简易多功能信号发生器是信号发生器的一种,在生产实践和科研领域中有着广泛的应用。
在研制、生产、测试和维修各种电子元件、部件以及整机设备时,都需要有信号源,由它产生不同频率不同波形的电压、电流信号并加到被测器件或设备上,用其他仪器观察、测量被测仪器的输出响应,以分析确定它们的性能参数。
信号发生器是电子测量领域中最基本、应用最广泛的一类电子仪器。
它可以产生多种波形信号,如正弦波、三角波、方波和锯齿波等,因而广泛用于通信、雷达、导航、宇航等领域。
在本设计中它能够产生多种波形,如正弦波,三角波,方波和锯齿波等,并能实现对各种波频率和幅度的改变。
正因为其在生活中应用的重要性,人们它做了大量的研究,总结出了许多实现方式。
可以基于FPGA、VHDL、单片机、DOS技能、数字电路等多种方法实现。
本设计是采用VHDL来实现的简易多功能信号发生器。
它能产生正弦波,三角波,方波和锯齿波。
且对各种波形的要求如下:
(1)根据按键选择不同的波形(实现正弦波,三角波,方波和锯齿波);
(2)各波形的频率范围为100Hz-20KHz;
(3)各波形频率可调(通过按键控制频率的变化,步进值为500Hz);
(4)用LED数码管实时显示输出波形的频率值;
(5)用按键控制实现输出信号的幅度调节(幅度调节为2.5V和5V)。
2EDA技术介绍
2.1EDA介绍
EDA是电子设计自动化(ElectronicDesignAutomation)缩写。
EDA技术是以计算机为工具,根据硬件描述语言HDL(HardwareDescriptionlanguage)完成的设计文件,自动地完成逻辑编译、化简、分割、综合及优化、布局布线、仿真以及对于特定目标芯片的适配编译和编程下载等工作。
硬件描述语言HDL是相对于一般的计算机软件语言,如:
C、PASCAL而言的。
HDL语言使用与设计硬件电子系统的计算机语言,它能描述电子系统的逻辑功能、电路结构和连接方式。
设计者可利用HDL程序来描述所希望的电路系统,规定器件结构特征和电路的行为方式;然后利用综合器和适配器将此程序编程能控制FPGA和CPLD内部结构,并实现相应逻辑功能的的门级或更底层的结构网表文件或下载文件。
目前,就FPGA/CPLD开发来说,比较常用和流行的HDL主要有ABEL-HDL、AHDL和VHDL[1]。
几乎所有适于大学生做的数字逻辑电路实验都可以在计算机上利用EDA(ElectronicDesignAutomatic—电子设计自动化)软件进行设计、仿真,只有极少量外部配件不能在计算机上进行仿真。
因此,在实验前期阶段,即实验预习阶段的主要应用工具是EDA软件,利用EDA软件可以设计、仿真实验课题,进行虚拟实验。
通过虚拟实验使实验者在进入真实实验前就能对预做的实验有相当的了解,甚至可以预测到实验的结果。
这样在实际做实验时,可以把许多设计型实验的难度降低,同时能有更多的时间让实验者动手做实验,研究问题,提高实验效率。
当前数字电路设计已由计算机辅助设计进入到以计算机为主的设计时代。
2.2VHDL基本介绍
VHDL是一种主要的硬件描述语言之一,硬件描述语言(HDL)是各种描述方法中最能体现EDA优越性的描述方法。
所谓硬件描述语言,实际上就是一种描述工具,其描述的对象就是待设计电路系统的逻辑功能,实现该功能的算法,选用的电路结构以及其他各种约束条件等。
通常要求HDL既能描述系统的行为,又能描述系统的结构。
VHDL语言是美国国防部与20世纪80年代后期,出于军事工业需要开发的。
1984年VHDL被IEEE确定为标准的硬件描述语言。
1993年IEEE对VHDL进行了修正,增加了部分新的VHDL命令与属性,增强了对系统的描述能力。
VHDL涵盖面广,抽象描述强,支持硬件的设计,验证,综合和测试。
VHDL能在多级别上对同一逻辑功能进行描述。
VHDL的基本结构包含一个实体和一个结构体,而完整的VHDL结构还包括配置,程序包与库。
各种硬件描述语言中,VHDL的描述能力最强,因此运用VHDL进行复杂电路设计时,往往采用自顶向下结构化的设计方法。
2.3设计工具简介
QuartusII是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三放EDA工具。
此外,QuartusII通过和DSPBuilder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
MaxplusII作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。
目前Altera已经停止了对MaxplusII的更新支持,QuartusII与之相比不仅仅是支持器件类型的丰富和图形界面的改变。
Altera在QuartusII中包含了许多诸如SignalTapII、ChipEditor和RTLViewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了MaxplusII友好的图形界面及简便的使用方法。
AlteraQuartusII作为一种可编程逻辑的设计环境,由于其强大的设计能力和直观易用的接口,越来越受到数字系统设计者的欢迎。
Altera的QuartusII可编程逻辑软件属于第四代PLD开发平台。
该平台支持一个工作组环境下的设计要求,其中包括支持基于Internet的协作设计。
Quartus平台与Cadence、ExemplarLogic、MentorGraphics、Synopsys和Synplicity等EDA供应商的开发工具相兼容。
改进了软件的LogicLock模块设计功能,增添了FastFit编译选项,推进了网络编辑性能,而且提升了调试能力。
3设计流程
3.1设计思想及原理图
基于VHDL语言设计一个简易多功能信号发生器,通过选入输入信号,可以输
出正弦波、三角波、方波和锯齿波四种波形信号。
信号发生器的控制模块可以用数据选择器实现,四种信号的信号选择可以用4选1数据选择器实现。
同时本设计使用原理图的方法,对正弦波、三角波、方波和锯齿波和4选1数据选择器元件进行调用。
简易多功能信号发生器的原理图如下:
图1信号发生器原理图
本设计的主题思想是各个模块分别产生相应的波形,再通过一个4选1数据选择器输出相应的波形。
通过其他按键控制波形的频率和幅度的变化。
3.2正弦波、三角波、方波和锯齿波的实现
3.2.1正弦波设计
(1)正弦波代码设计
正弦波的产生思想是将对模拟波形采样后的编码存入定义好的ROM中,再根据时钟循环的将这些编码顺序输出,在输出端将经过数模转换器转换后的模拟信号接入示波器即可显示正弦波形。
产生正弦波的VHDL代码如下:
libraryieee;
useieee.std_logic_1164.all;
entitysin2is
port(clock,sel:
instd_logic;
dout4:
outintegerrange0to255);
endsin2;
architecturebhvofsin2is
typemem_typeisarray(0to63)ofintegerrange0to255;
constantmem:
mem_type:
=(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,225,233,239,245,249,252,254,255);
signaladdress:
integerrange0to63;
begin
process(clock)
begin
ifclock'eventandclock='1'then
ifaddress>63then
address<=0;
else
ifsel='1'then
address<=address+1;
dout4<=(mem(address))/2;
else
address<=address+1;
dout4<=mem(address);
endif;
endif;
endif;
endprocess;
endbhv;
(2)正弦波的仿真
在QuartusII软件输入上述代码,再通过编译和时序仿真,可得到如下的仿真波形。
由上图仿真图可知时钟信号clk每出现一个上升沿,dout就对外送出一个正弦波采样数据,sel实现了正弦波幅值的调节,sel=’0’时dout输出正弦波采样数据值,sel=’1’时dout输出正弦波采样数据值右移一位的数据值。
上图中的输出制式模拟信号各采样点的数字编码,由于没有经过数模转换,输出结果就如图中所示。
当将程序下载到硬件后,在示波器上就可以显示正弦波形了。
(3)正弦波模块
其中:
clk为正弦波时钟信号输入端,它接收调频模块发过来时钟信号;
sel为输出正弦波信号幅度调节输入端,sel=’1’时幅度为2.5V,sel=’0’时幅度为5V;
dout为正弦波信号输出端。
3.2.2三角波设计
(1)三角波代码设计
三角波的产生思想是将对模拟波形采样后的编码存入定义好的ROM中,再根据时钟循环的将这些编码顺序输出,在输出端将经过数模转换器转换后的模拟信号接入示波器即可显示三角波形。
产生三角波的VHDL代码如下:
libraryieee;
useieee.std_logic_1164.all;
entitysanjiaois
port(clock,sel:
instd_logic;
dout3:
outintegerrange0to255);
endsanjiao;
architecturebhvofsanjiaois
typemem_typeisarray(0to63)ofintegerrange0to255;
constantmem:
mem_type:
=(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);
signaladdress:
integerrange0to63;
begin
process(clock)
begin
ifclock'eventandclock='1'then
ifaddress>63then
address<=0;
else
ifsel='1'then
address<=address+1;
dout3<=(mem(address))/2;
else
address<=address+1;
dout3<=mem(address);
endif;
endif;
endif;
endprocess;
endbhv;
(2)三角波仿真
在QuartusII软件输入上述代码,再通过编译和时序仿真,可得到如下的仿真波形
由上图仿真图可知时钟信号clk每出现一个上升沿,dout就对外送出一个三角波采样数据,sel实现了三角波幅值的调节,sel=’0’时dout输出三角波采样数据值,sel=’1’时dout输出三角波采样数据值右移一位的数据值。
(注明:
由于存在器件延时,上升沿与数据变换略有滞后)
上图中的输出制式模拟信号各采样点的数字编码,由于没有经过数模转换,输出结果就如图中所示。
当将程序下载到硬件后,在示波器上就可以显示三角波形了。
(3)三角波模块
其中:
clk为三角波时钟信号输入端,它接收调频模块发过来时钟信;
sel为输出正弦波信号幅度调节输入端,sel=’1’时幅度为2.5V,sel=’0’时幅度为5V;
dout为三角波信号输出端。
图5三角波模块
仿真图
3.2.3方波设计
(1)方波代码的设计
方波的产生思想是将对模拟波形采样后的编码存入定义好的ROM中,再根据时钟循环的将这些编码顺序输出,在输出端将经过数模转换器转换后的模拟信号接入示波器即可显示方波波形。
产生方波的VHDL代码如下:
libraryieee;
useieee.std_logic_1164.all;
entityfangbois
port(clock,sel:
instd_logic;
dout1:
outintegerrange0to255);
endfangbo;
architecturebhvoffangbois
typemem_typeisarray(0to63)ofintegerrange0to255;
constantmem:
mem_type:
=(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);
signaladdress:
integerrange0to63;
begin
process(clock)
begin
ifclock'eventandclock='1'then
ifaddress>63then
address<=0;
else
ifsel='1'then
address<=address+1;
dout1<=(mem(address))/2;
else
address<=address+1;
dout1<=mem(address);
endif;
endif;
endif;
endprocess;
endbhv;
(2)方波的仿真
在QuartusII软件输入上述代码,再通过编译和时序仿真,可得到如下的仿真波形。
由上图仿真图可知时钟信号clk每出现一个上升沿,dout就对外送出一个方波采样数据,sel实现了方波幅值的调节,sel=’0’时dout输出方波采样数据值,sel=’1’时dout输出方波采样数据值右移一位的数据值。
(注明:
由于存在器件延时,上升沿与数据变换略有滞后)
上图中的输出制式模拟信号各采样点的数字编码,由于没有经过数模转换,输出结果就如图中所示。
当将程序下载到硬件后,在示波器上就可以显示三角波形了。
(3方波模块
其中:
clk为方波时钟信号输入端,它接收调频模块发过来时钟信;
sel为输出方波信号幅度调节输入端,sel=’1’时幅度为2.5V,sel=’0’时幅度为5V;
dout为方波信号输出端。
图7方波模块
3.2.4锯齿波设计
(1)锯齿波代码设计
锯齿波的产生思想是将对模拟波形采样后的编码存入定义好的ROM中,再根据时钟循环的将这些编码顺序输出,在输出端将经过数模转换器转换后的模拟信号接入示波器即可显示锯齿波形。
产生锯齿波的VHDL代码如下:
libraryieee;
useieee.std_logic_1164.all;
entityjuchiis
port(clock,sel:
instd_logic;
dout2:
outintegerrange0to255);
endjuchi;
architecturebhvofjuchiis
typemem_typeisarray(0to63)ofintegerrange0to255;
constantmem:
mem_type:
=(0,4,8,12,16,20,24,28,
32,36,40,44,48,52,56,60,
64,68,72,76,80,84,88,92,
96,100,104,108,112,116,120,124,
128,132,136,140,144,148,152,156,
160,164,168,172,176,180,184,188,
192,198,200,204,208,212,216,220,
224,228,234,238,242,246,250,255);
signaladdress:
integerrange0to63;
begin
process(clock)
begin
ifclock'eventandclock='1'then
ifaddress>63then
address<=0;
else
ifsel='1'then
address<=address+1;
dout2<=(mem(address))/2;
else
address<=address+1;
dout2<=mem(address);
endif;
endif;
endif;
在QuartusII软件输入上述代码,再通过编译和时序仿真,可得到如下的仿真波形。
由上图仿真图可知时钟信号clk每出现一个上升沿,dout就对外送出一个锯齿波采样数据,sel实现了锯齿波幅值的调节,sel=’0’时dout输出锯齿波采样数据值,sel=’1’时dout输出锯齿波采样数据值右移一位的数据值。
(注明:
由于存在器件延时,上升沿与数据变换略有滞后)
上图中的输出制式模拟信号各采样点的数字编码,由于没有经过数模转换,输出结果就如图中所示。
当将程序下载到硬件后,在示波器上就可以显示锯齿波波形了。
(3)锯齿波模块
其中:
clk为锯齿波时钟信号输入端,它接收调频模块发过来时钟信;
sel为输出锯齿波信号幅度调节输入端,sel=’1’时幅度为2.5V,sel=’0’时幅度为5V;
dout为锯齿波信号输出端。
图9锯齿波模块
仿真图
3.3各个控制单元的实现
3.3.1频率控制单元
频率控制单元包括按键识别模块、分频数产生模块和分频模块。
其器件图分别如图10、图11和图12所示。
在按键识别模块中共有4个输入端。
其中:
一个时钟输入端CLK位12MHz,
一个频率调节输入端btn[1..0],
一个使系统输出波形的频率为最大的控制输入端highh
一个使系统输出波形的频率为最小的控制输入端loww。
本课程设计要求输出波形的频率在每按一次相应的按键时,就增加或减少500Hz。
而实验室的硬件设备上的按键都是拨码是按键,即按键按下后一直有效,这显然不能满足要求。
于是按键输入识别模块中用如下的代码实现按键没按一次都能有效的功能。
ifbutton0='0'andbutton1='1'then
ifcnt=40then
cnt<=0;
else
cnt<=cnt+1;
endif;
elsifbutton0='1'andbutton1='0'then
ifcnt=40then
cnt<=0;
else
cnt<=cnt+1;
endif;
以上代码实现的只是频率增长的功能,同理就可以实现频率减小的功能。
当按下按键识别模块中分别使整个系统输出最大和最小频率的波形的控制输入端时,在按相应的使频率增减的按键则实现频率从最大或最小开始增加或减少的功能。
在分频数产生模块中有一个输入端接收从按键识别模块中输出地对频率的控制信号的输入端,一个分频数输出端,五个相应的接数码管以显示系统输出信号的频率的输出端。
当分频数产生模块的输入端接收从按键识别模块中输出地对频率的控制信号后,便产生相应的分频数送到输出端,同时将与分频数相应频率送到与数码管相接的输出端。
其VHDL代码见本课程设计的附录。
在分频模块中有一个系统时钟输入端,一个分频数输入端和一个频率输出端。
分频器的功能主要是根据分频数产生相应的输出频率。
3.3.2波形输出控制单元
波形输出控制单元中只包括一个数据选择器模块。
其器件图如图13所示
图13数据选择器模块
在该模块为4选1的数据选择器,包括4个数据输入端,一个数据选择输入端和一个数据输出端。
其中:
boxing[1..0]为数据选择端(‘00’为方波,‘01’为锯齿波,‘10’为三角波,‘11’为正弦波);
dout1[7..0]为正弦波输入端;
dout2[7..0]为方波输入端;
dout3[7..0]为三角波输入端;
dout4[7..0]为锯齿波输入端;
wave[7..0]为所选波形输出端,接至D/A转换器。
3.4硬件测试
本课程设计是简易多功能信号发生器,其总共有6个输入端和6个输出端。
具体的输入输出端可见图1中所示。
根据引脚所锁定图将系统中的各个输入输出端口锁定到合适的引脚上。
需要注意的是本系统用到了数码管显示,所以应该选定实验箱的模式5。
另外,本实验输入的时钟频率是12MHz。
当引脚锁定完毕后,将程序下载到试验箱中,连好示波器,在输入端输入相应的值即可得到相应的输出波形。
具体的硬件仿真波形如下:
在clk端输入12MHz的时钟信号,当图1的原理图中的bx[1..0]输入“00”时得到的是方波波形,如图15所示。
改变sel的值可以该变输出波形的幅值。
按频率控制单元中介绍的方法可以实现波形频率的改变。
图15方波波形
在clk端输入12MHz的时钟信号,当图1的原理图中的bx[1..0]输入“01”时得到的是锯齿波波形,如图16所示。
改变sel的值可以该变输出波形的幅值。
按频率控制单元中介绍的方法可以实现波形频率的改变。
图16锯齿波波形
在clk端输入12MHz的时钟信号,当图1的原理图中的bx[1..0]输入“10”时得到的是三角波波形,如图17所示。
改变sel的值可以该变输出波形的幅值。
按频率控制单元中介绍的方法可以实