目录1. 引言 (1)2. VHDL语言及Quartus II软件介绍 (2)2.1 VHDL语言 (2)2.2 Quartus II软件 (2)3.总体设计思想及流程 (3)4. 具体程序实现模块 (4)4.1倍频器模块 (4)4.2主程序模块 (4)4.3 波形显示模块 (5)4.4频率显示模块 (5)5. 软件仿真 (6)6. 硬件显示 (7)7. 总结与体会 (8)参考文献 (9)附录 (10)附录1. 整体系统原理图 (10)附录2. 主程序 (11)1. 引言信号发生器是一种能够产生多种波形,如三角波、方波、锯齿波、正弦波的仪器。
信号发生器在电路实验和设备检测以及通信、雷达、导航、宇航等领域有广泛的应用。
正因为其在生活中应用的重要性,人们它做了大量的研究,总结出了许多实现方式。
可以基于FPGA 、VHDL、单片机、DOS技能、数字电路等多种方法实现。
简易信号发生器是信号发生器的一种。
可以实现信号发生器的一些基本功能。
本次课程设计要求设计的是一种简易信号发生器。
在本设计中要求设计的简易信号发生器是采用VHDL来实现的简易多功能信号发生器。
它能产生正弦波,三角波和方波。
且对各种波形的要求如下:(1)设计任意信号发生器,使之能够生成正弦波、三角波和方波;(2)电路的外部频率为40MHz,要求信号发生器可产生0-1KHz、1KHz~10KHz、10KHz~1MHz三档频率的信号;(3)要求具有波形选择和频率选择的功能;(4)在同一频率档内,可实现频率的加减;(5)要求显示波形的同时能够进行频率的调节;(6)要求能够显示波形:A——正弦波;B——三角波;C——方波;(7)要求能够显示频率值;(8)可用示波器进行波形的观测。
2. VHDL语言及Quartus II软件介绍2.1 VHDL语言本次设计使用的是VHDL语言。
VHDL 的英文全名是Very-High-Speed Integrated Circuit Hardware Description Language,诞生于1982 年。
1987 年底,VHDL被IEEE 和美国国防部确认为标准硬件描述语言。
VHDL主要用于描述数字系统的结构,行为,功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
VHDL语言的特点是:VHDL 语言功能强大,设计方式多样;VHDL 语言具有强大的硬件描述能力;VHDL 语言具有很强的移植能力;VHDL 语言的设计描述与器件无关;VHDL 语言程序易于共享和复用。
2.2 Quartus II软件本设计中需要用到Quartus II 9.0软件。
Quartus II 是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
此外,Quartus II 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
Altera Quartus II 作为一种可编程逻辑的设计环境, 由于其强大的设计能力和直观易用的接口,越来越受到数字系统设计者的欢迎。
3.总体设计思想及流程本次课程设计按模块式实现,据任务书要求,设计总共分三大步骤完成:(1)产生波形(三种波形:方波、三角波、正弦波)信号;(2)频率控制;(3)显示频率值。
利用VHDL编程,依据基本数字电路模块原理进行整合。
系统各部分所需工作时钟信号由输入系统时钟信号经分频得到,系统时钟输入端应满足输入脉冲信号的要求。
频率控制模块可以实现频率的连续可调,最终送至脉冲发生模块输出脉冲信号,同时将信号的频率输出至数码管显示当前信号的频率值,达到设计课题所要求的输出波形频率可调功能。
如图2.1所示:图3.1总体程序流程图4. 具体程序实现模块4.1倍频器模块由于要求简易信号发生器输出频率达到1MHZ,所以实验箱上的20MHZ的输出过低,无法达到要求。
此时可以采用一个倍频器将20MHZ的频率输出加倍成为128MHZ的频率输出。
具体可以通过Quartus II 9.0软件的ALTPLL模块实现。
原理图如图4.1所示:图 4.1倍频器模块原理图4.2主程序模块主程序用来实现系统的主要功能,包括波形定义分频、频段选择、频率调节以及频率输出等。
主程序见附录1。
主程序原理图如图4.2所示:图 4.2主程序模块原理图其中clk信号为20MHZ的信号经过加倍后的128MHZ的频率。
Key1、key2为频率调节按钮,key1接按钮,当按动key1频率值加1或者减1;key2接拨码开关,用来加减选择,当key2=1时为加,当key2=0时为减。
sel_p[1..0]为频段选择信号,当sel_p[1..0]=00、01、10时,其频段分别为0HZ-1KHZ、1KHZ-10KHZ、10KHZ-1MHZ。
sel_b[1..0]为波形选择信号,当sel_b[1..0]=00、01、10时,波形分别为正弦波、三角波、方波。
4.3 波形显示模块波形显示部分使用的是D/A转换器,将主程序模块的dout[7..0]八位二进制输出转化为模拟信号,通过示波器显示。
4.4频率显示模块频率显示部分使用了一个二进制——十六进制转化显示译码器,将主程序中输出的xianshi[19..0]这20位二进制段码输出转化为十六进制数显示在数码管上。
5. 软件仿真由于程序中计数值test比较大,无法在Quartus II 9.0软件中显示完整,所以我们将程序中的test值改为1,这样可以得到完整的仿真图,而且不改变程序原理。
其中第一频段的初值设置为300HZ,第二频段的初值设置为3000HZ,第三频段的初值设置为30000HZ。
图 5.1第一频段下的正弦波仿真图图5.2 第二频段下的三角波仿真图图5.3第三频段下的方波仿真图6. 硬件显示本课程设计输出由DA0832将数字信号转化为模拟信号,再由示波器显示波形输出。
当引脚锁定完毕后,将程序下载到试验箱中,连好示波器,在输入端输入相应的值即可得到相应的输出波形。
具体的硬件仿真波形如下:正弦波: 频段sel_p[1,0] 频率为6KHZ三角波: 频段sel_p[0,1] 频率为5KHZ 方波: 频段sel_p[0,0] 频率为800HZ本次仿真采64个点所以有的波形不是很光滑,若需要更平滑的波形,可以增加采样点数;而且当频率较高时各种波形会出现失真,示波器上不显示稳定的波形;在硬件运行时产生的干扰,也会导致波形的混乱。
图6.1正弦波硬件仿真结果图6.2三角波硬件仿真结果图6.3方波硬件仿真结果7. 总结与体会近一周的EDA技术课程设计就要结束了,通过这次课程设计,我学到的最重要的东西就是对于这种任务量比较大的程序,一定要认真理解题目的要求。
开始的时候有的要求理解不够透彻,结果导致不能达到老师的要求。
想要修改程序却又根本无从下手,最后还是重新写。
另外还要学会对系统进行分块化处理。
分块思想应在以后其它类似的设计中着重注意应用。
这次EDA技术的课程设计,运用了许多EDA技术的知识,通过这次设计,不仅对以前学过的许多理论知识进行了很全面的检验,明白了许多知识的具体应用,而且还学会了许多新知识。
对EDA技术理解又有了一次提升。
从本次课设中我还学到了工作中要大胆尝试,小心求证。
一旦自己有了一种新的想法一定要非常小心的去检验,发现错误,改正错误,最终达到自己想要的结果。
还有就是在课设中我再一次体会到了团队合作的重要性,因为很多东西的工程量都是很大的,运用到知识很多,单靠个人力量要实现是很困难的,而且时间有限,这就要求我们必须学会具有团队精神,相互学习,因为很多困扰你的问题在讨论中便会迎刃而解。
总之,通过这次EDA技术的课程设计,我自己学会了很多东西,真的是受益匪浅。
我相信通过这次课程设计,我学到的东西绝对不是只在课本上能学到的,有很多东西,尤其是实践性质的,不能仅靠理论,实践是非常必要的,理论与实践相结合,才能得到真正的提高。
这次中遇到了前所未有的问题,但总是会“山重水复疑无路,柳暗花明又一村”。
在就要完成这次设计并通过设计答辩之后,心情万分激动,我深深体会到付出总会有回报。
参考文献[1] 潘松,黄继业.《EDA技术实用教程》.北京:科学出版社,2010.6[2] 刘江海.《EDA技术课程设计》.武汉:华中科技大学出版社,2009.5[3] 姜雪松.《VHDL设计实例与仿真》.北京:机械工业出版社,2007.1[4] 陈耀和.《VHDL语言设计技术》.北京:电子工业出版社,2004.3[5] 谭会生, 张昌凡.《EDA技术及应用》.西安:西安电子科技大学出版社2004.4[6] V olnei A. pedroni 著, 乔庐峰,王志功等译.《VHDL数字电路设计教程》.北京:电子工业出版社2005.9附录附录1. 整体系统原理图附录2. 主程序library ieee;use ieee.std_logic_1164.all;entity generator isport(clk:in std_logic;key1:in std_logic;key2:in std_logic;sel_p:in std_logic_vector(1 downto 0);--频段选择sel_b:in std_logic_vector(1 downto 0); --波形选择dout:out integer range 0 to 255; --波形数字量接dac0832示波器显示xianshi:out integer range 0 to 1000000);--频率值end;architecture bhv of generator issignal num: integer range 0 to 1000000 := 3000;signal test:integer range 0 to 1000000;signal b:std_logic;signal addr:integer range 0 to 63;--采样点选择type hui is array(0 to 63)of integer range 0 to 255;constant sina: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,225,233,239,245,249,252,254,255);constant sanjiao: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);constant fangbo: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); beginprocess(clk)variable count:integer range 0 to 1000000;beginif (clk'event and clk='1') then count:=count + 1;if (count=test) then count:=0;b<= not b;end if;end if;--频率加减控制键--end process;process(key1,key2)beginif (key1'event and key1='1') thenif(key2='1')thennum <= num +1;elsif(key2='0') thennum <= num - 1;end if;end if;end process;--频段选择—process(num,sel_p)variable temp:integer range 0 to 1000000;begintemp:=num;case sel_p iswhen "00" =>if(temp>1000 and temp <=10000)thentemp := temp/10;elsif(temp>100000 and temp <= 1000000)then temp:= temp/1000;end if;if(temp>1000)then temp:=1000;elsif(temp<1)then temp := 1;end if;xianshi <= temp;test <= 128000000/64/2/temp;when "01"=>if(temp>0 and temp <99)thentemp := temp*1000;elsif(temp>=100 and temp<999)thentemp := temp*10;elsif(temp>10000 and temp <=99999)then temp := temp/10;elsif(temp=1000000)thentemp := temp/100;end if;if(temp>10000)then temp:=10000;elsif(temp<1000)then temp := 1000;end if;xianshi <= temp;test <= 128000000/64/2/temp;when "10" => --10000 1000000--if(temp>0 and temp<=99)thentemp := temp*10000;elsif(temp>=100 and temp<=10000)then temp := temp*100;end if;if(temp>1000000)then temp := 1000000;elsif(temp<10000)then temp := 10000;end if;xianshi <= temp;test <= 128000000/64/2/temp;when others=>null;end case;end process;process(b)variable count:integer range 0 to 63;beginif(b'event and b='1')thencount:=count+1;if count=64 thencount:=0;end if;end if;addr<=count;end process;--波形选择—process (b,sel_b,addr)begincase sel_b iswhen "00" =>dout<=sina(addr); when "01" =>dout<=sanjiao(addr); when "10" =>dout<=fangbo(addr); when others =>null;end case;end process;end bhv;。