EDA信号发生器程序说明书.docx
《EDA信号发生器程序说明书.docx》由会员分享,可在线阅读,更多相关《EDA信号发生器程序说明书.docx(26页珍藏版)》请在冰豆网上搜索。
![EDA信号发生器程序说明书.docx](https://file1.bdocx.com/fileroot1/2023-1/23/d2833d77-b495-436d-90ba-b12b28b0b182/d2833d77-b495-436d-90ba-b12b28b0b1821.gif)
EDA信号发生器程序说明书
1引言
EDA技术作为现代电子设计的核心,它依赖于功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言HDL为系统逻辑描述手段完成的设计文件,自动的完成设计文件,自动的完成逻辑编译,逻辑化简,逻辑分割,逻辑综合,结构综合(布局布线),以及逻辑优化和仿真测试,直到完成既定的电子线路系统功能。
随着基于FPGA的EDA技术的发展和应用领域不断的扩大与深入,EDA技术在电子信息、通信、自动控制及计算机应用等领域的重要性日益突出。
随着技术市场与人才市场对EDA技术的需求不断提高,产品的市场效率和技术要求也将会影响到教学与科研。
本设计是一个基于VHDL的采用自顶向下设计方法实现的多功能函数信号发生器,该设计方法具有外围电路简单,程序修改灵活和调试容易等特点,并通过计算机仿真和实验证明了设计的正确性。
2题目分析
2.1设计目的
设计一个信号发生器,用于产生正弦波、方波、三角波、锯齿波信号。
2.2设计要求
本设计是采用VHDL来实现的简易多功能信号发生器。
它能产生正弦波,三角波,方波和锯齿波。
且对各种波形的要求如下:
(1)根据按键选择不同的波形(实现正弦波,三角波,方波和锯齿波);
(2)各波形的频率范围为100Hz-20KHz;
(3)各波形频率可调(通过按键控制频率的变化,步进值为500Hz);
(4)用LED数码管实时显示输出波形的频率值;
(5)用按键控制实现输出信号的幅度调节(幅度调节为2.5V和5V)。
3硬件电路设计
3.1原理图的实现
由题目分析可知,要完成整体设计,可通过QuartusⅡ设计出以下各个模块的原理图:
(1)分频器的原理图
(2)地址发生器的原理图
(3)正弦波发生器的原理图
(4)方波信号发生器的原理图
(5)锯齿波信号发生器的原理图
(6)三角波信号发生器的原理图
(7)四选一选择器原理图
其中各波形数据存储ROM的HEX数据文件分别如下各图所示:
经过对设计要求的仔细分析与思考,把以上各模块根据其功能和设计思路设计出总的系统原理图如图3-5所示:
图3-5系统综合原理图
3.2各种波形的实现
3.2.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;
3.2.2正弦波仿真结果
图3-6正弦波时序仿真图
观察输出的仿真结果可以看出,输出依次为对正弦波采样后的编码数值,这样经过模数转换,当将程序下载到硬件后,在示波器上就可以显示正弦波形了。
3.2.3三角波的代码
三角波的产生思想是将对模拟波形采样后的编码存入定义好的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;
3.2.4三角波仿真结果
图3-7三角波仿真图
仿真图
观察输出的仿真结果可以看出,输出依次为对三角波采样后的编码数值,这样经过模数转换,当将程序下载到硬件后,在示波器上就可以显示三角波形了。
3.2.5方波波的代码
方波波的产生思想是将对模拟波形采样后的编码存入定义好的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;
3.2.6方波仿真结果
图3-8方波仿真图
仿真图
观察输出的仿真结果可以看出,输出依次为对方波采样后的编码数值,这样经过模数转换,当将程序下载到硬件后,在示波器上就可以显示方波形了。
3.2.7锯齿波的代码
锯齿波的产生思想是将对模拟波形采样后的编码存入定义好的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;
endprocess;
endbhv;
3.2.8锯齿波仿真结果
图3-9锯齿波仿真图
仿真图
观察输出的仿真结果可以看出,输出依次为对锯齿波采样后的编码数值,这样经过模数转换,当将程序下载到硬件后,在示波器上就可以显示锯齿波形了。
3.3各个控制单元的实现
3.3.1频率控制单元
频率控制单元包括按键输入识别模块、分频数产生模块和分频模块。
其器件图分别如图3-103-113-12所示。
在按键输入识别模块中共有4个输入端。
其中一个时钟输入端,以一个频率调节输入端,一个使系统输出波形的频率为最大的控制输入端和一个使系统输出波形的频率为最小的控制输入端。
本课程设计要求输出波形的频率在每按一次相应的按键时,就增加或减少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波形输出控制单元
波形输出控制单元中只包括一个数据选择器模块。
其器件图如图3-13所示。
图3-13数据选择器模块
在该模块为4选1的数据选择器,包括4个数据输入端,一个数据选择输入端和一个数据输出端。
其功能是根据数据选择输入端输入的数据来选择相应的数据送到输出端。
从而实现数据的选择输出。
其代码如下:
libraryieee;
useieee.std_logic_1164.all;
entitymux4is
port(boxing:
instd_logic_vector(1downto0);
dout1,dout2,dout3,dout4:
inintegerrange0to255;
wave:
outintegerrange0to255);
endmux4;
architecturebhvofmux4is
begin
withboxingselect
wave<=dout1when"00",
dout2when"01",
dout3when"10",
dout4when"11",
nullwhenothers;
endbhv;
3.4整体仿真部分
最终将所有的模块按照图2连结组合到一起后,利用EDA软件QuartusⅡ进行仿真,得其整体的仿真结果如下图3-14所示。
由整体的仿真结果可以看出,当sel选择“01”时,观察输出的数值可以知道,此时输出三角波;当幅度调节输入键control为‘1’有效时,输出的数值变为原本该输出的数值的一半,例如图中当control刚开始有效时,输出的数值是48,就是原本该输出的数值96(88+8=96)的一半;另外对应观察输出每个数值的宽度的大小,可以发现与其频率的大小成对应关系。
综上所述,可知仿真结果正确,可以进行下一步的管脚锁定和硬件下载。
4硬件测试
本课程设计是简易多功能信号发生器,其总共有6个输入端和6个输出端。
具体的输入输出端可见图3-5中所示。
根据引脚所锁定图将系统中的各个输入输出端口锁定到合适的引脚上。
需要注意的是本系统用到了数码管显示,所以应该选定实验箱的模式5。
另外,本实验输入的时钟频率是12MHz。
当引脚锁定完毕后,将程序下载到试验箱中,连好示波器,在输入端输入相应的值即可得到相应的输出波形。
具体的硬件仿真波形如下:
在clk端输入12MHz的时钟信号,当sel取“00”时,示波器显示输出为正弦波,如下图4-1所示,改变control的值,可以改变输出正弦波的幅值。
通过
图4-1示波器显示正弦波波形
对输入端识别模块的输入控制改变,可以达到对正弦波形频率的改变。
在clk端输入12MHz的时钟信号,当sel取“01”时,示波器显示输出为三角波,如下图4-2所示,改变control的值,可以改变输出三角波的幅值。
通过对输入端识别模块的输入控制改变,可以达到对三角波形频率的改变。
图4-2示波器显示三角波波形
图4-3示波器显示方波波形
在clk端输入12MHz的时钟信号,当sel取“10”时,示波器显示输出为方波,如下图4-3所示,改变control的值,可以改变输出方波的幅值。
通过对输入端识别模块的输入控制改变,可以达到对方波形频率的改变。
图18示波器显示方波波形
在clk端输入12MHz的时钟信号,当sel取“11”时,示波器显示输出为锯齿波,如下图4-4所示,改变control的值,可以改变输出锯齿波的幅值。
通过对输入端识别模块的输入控制改变,可以达到对锯齿波形频率的改变。
5设计结论
本设计以函数信号发生器的功能为设计对象,运用EDA技术的设计方法,进行各种波形的输入设计、设计处理和器件编程。
在VHDL语言的编写中按照语言描述规范,实现了几种波形的软件设计和具体逻辑元件结构的硬件映射。
结合FPGA的开发集成环境QuartusⅡ软件,产生了函数信号发生器的各种信号,同时完成了时序和功能仿真,并在GW48-EDA型实验开发系统上实现的波形仿真。
实验表明采用该方法能准确的产生正弦波、三角波、方波、锯齿波等设计产生的波形,并且对产生的波形能够进行调频和调幅,实现了信号发生器的功能。
本设计的函数信号发生器在设计上由于设计时考虑的不够全面,虽然完成了函数信号的产生,但不够完善。
要做成完整实用的信号源还应考虑设计包含的功能有:
(1)用键盘输入编辑生成上述4种波形(同周期)的线性组合波形;
(2)具有波形存储功能;
(3)输出波形幅度可调,步进调整;
(4)具有显示输出波形的类型、重复频率(周期)和幅度的功能;
(5)用键盘或其他输入装置产生任意波形;
(6)波形占空比可调等。
6课题总结
EDA是电子设计自动化的一门技术,他是利用可编程元器件如CPLD、FPGA,硬件描述语言如VHDL,来设计具有一定功能的硬件电路。
经过这次课程设计,加深了我对EDA技术的认识让,我对VHDL语言也更加熟练,如IF语句、WITH…SELE语句、例化语句等。
提高了我的模块化设计的思想和自顶向下的设计思想,将各个功能做成一个模块,如分频器、多路选择器、波形数据ROM等,在顶层将各个功能模块连接,实现最终设计。
随着基于CPLD的EDA技术的发展和应用领域的扩大与深入,EDA技术在电子信息、通信、自动控制及计算机等领域的重要性日益突出。
作为一个学电子信息专业的学生,我们必须不断地去了解更多的新产品信息,这就更加要求我们对EDA有个全面的认识。
参考文献
[1].VokneiA.Pedroni.《VHDL数字电路设计教程》.电子工业出版社,2008.5
[2].潘松,黄继业.《EDA技术实用教程》(第二版).科学出版社,2005.2
[3].焦素敏.《EDA应用技术》.清华大学出版社,2002.4
附录
方波
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;
正弦波
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;