EDA实习报告函数发生器.docx
《EDA实习报告函数发生器.docx》由会员分享,可在线阅读,更多相关《EDA实习报告函数发生器.docx(26页珍藏版)》请在冰点文库上搜索。
![EDA实习报告函数发生器.docx](https://file1.bingdoc.com/fileroot1/2023-6/27/a3f63d6e-ea25-418a-9830-0c8f52dbce9c/a3f63d6e-ea25-418a-9830-0c8f52dbce9c1.gif)
EDA实习报告函数发生器
EDA技术
实习报告
学院:
电气信息工程学院
专业:
电子信息工程专业
班级:
信息11
姓名:
学号:
指导教师:
赵玉刚
实验日期:
2013.10.28—11.01
目录
一、引言
二、实习题目
三、实习目的
四、实习技术与要求
4.1实习技术
4.1.1FPGA简介
4.1.2VHDL简介
4.1.3VHDL程序语言基本设计
4.1.4设计工具
4.2设计要求
五、实现过程
5.1软件里程
5.2系统设计
5.3主要函数语句分析
六、功能及代码
6.1多路选择器(mux2)
6.2方波发生器
6.3三角波发生器
6.4锯齿波发生器
6.5正弦波发生器
6.6顶层文件
七、仿真及硬件测试
八、总结及心得体会
九、参考文献
函数信号发射器的VHDL设计
一、引言
函数信号发生器是一种能能够产生多种波形,如三角波、锯齿波、矩形波(含
方波)、正弦波的电路被称为函数信号发生器。
信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。
例如在通信、广播、电视系统中,都需要射频(高频)发射,这里的射频波就是载波,把音频(低频)、视频信号或脉冲信号运载出去,就需要能够产生高频的振荡器。
在工业、农业、生物医学等领域内,如高频感应加热、熔炼、淬火、超声诊断、核磁共振成像等,都需要功率或大或小、频率或高或低的信号发生器。
本设计采用FPGA来设计制作多功能信号发生器。
该信号发生器可以产生三角波、方波。
二、实习题目:
函数信号发射器的VHDL设计
三、实习目的:
通过设计一函数发生器能够产生方波、三角波、锯齿波和三角波。
熟练掌握VHDL硬件语言的编写,并学会QuartusⅡ的基本操作过程。
运用数字逻辑电路的设计方法对学过知识的综合运用,学会撰写实习报告和总结。
四、实习技术与要求:
4.1实习技术:
4.1.1FPGA简介
FPGA(Field-ProgrammableGateArray)即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。
它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
与传统们阵列和掩模可编程门阵列(MPGA)相比,FPGA具有很多的优点,传统门阵列可以用来设计任何电路,但是只能在工厂中一次性编程,而且还需要针对该电路的特定的掩模。
FPGA是标准通用器件。
使用其代替MPGA,可以将设计时间由几个月缩短至几小时,并且使设计更加简单,从而减少了错误修改和设计指标变更的花费。
FPGA器件在结构上,由逻辑功能块排列为阵列,它的结构可以分为三个部分:
可编程快CLB(ConfigurableLogicBlocks)、可编程I/O模块IOB(InputBlock)和可编程内部连线PI(ProgrammableInterconnect)。
CLB在器件中排列为阵列,周围有环形内部连线,IOB分布在四周的管脚上。
FPGA也存在缺点,FPGA中,每个可编程的点都有电阻和电容。
电阻和电容的使用减慢了信号的传输速度,所以FPGA的速度比传统门阵列要低,而且,FPGA中互联延迟是不可预测的。
FPGA的基本特点主要有:
一、采用FPGA设计ASIC电路,用户不需要投片生产,就能得到合用的芯片。
二、FPGA可做其它全定制或半定制ASIC电路的中试样片。
三、FPGA内部有丰富的触发器和I/O引脚。
四、FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。
五、FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。
使用FPGA时,可以根据不同的配置模式,采用不同的编程方式。
加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。
掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。
FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM编程器即可。
当需要修改FPGA功能时,只需换一片EPROM即可。
这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。
因此,FPGA的使用非常灵活。
FPGA有多种配置模式:
并行主模式为一片FPGA加一片EPROM的方式;主从模式可以支持一片PROM编程多片FPGA;串行模式可以采用串行PROM编程FPGA;外设模式可以将FPGA作为微处理器的外设,由微处理器对其编程。
4.1.2VHDL简介
VHDL(VeryHighSpeedIntegratedCircuitHardwareDescriptionLanguage,超高速集成电路硬件描述语言)是一种用来描述数字系统行为和结构的硬件描述语言,被广泛的运用于描述和仿真各种数字系统,小到几个门,大到许多复杂集成电路相连的系统。
VHDL诞生于1982年,是由美国国防部开发的一种快速设计电路的工具,目前已经成为IEEE(TheInstituteofElectricalandElectronicsEngineers)的一种工业标准硬件描述语言。
相比传统的电路系统的设计方法,VHDL具有多层次描述系统硬件功能的能力,支持自顶向下(ToptoDown)和基于库(LibraryBased)的设计的特点,因此设计者可以不必了解硬件结构。
从系统设计入手,在顶层进行系统方框图的划分和结构设计,在方框图一级用VHDL对电路的行为进行描述,并进行仿真和纠错,然后在系统一级进行验证,最后再用逻辑综合优化工具生成具体的门级逻辑电路的网表,下载到具体的FPGA器件中去,从而实现可编程的专用集成电路(ASIC)的设计。
4.1.3VHDL程序语言基本设计
一个VHDL语言的设计程序描述的是一个电路单元,这个电路单元可以是一个门电路,或者是一个计数器,也可以是一个CPU,一般情况下,一个完整的VHDL语言程序至少包括实体、结构体和程序包三个部分。
实体给出电路单元的外部输入输出接口信号和引用信息,结构体给出了电路单元的内部结构和信号的行为特点,程序包定义在设计结构体和实体中将用到的常数、数据类型、子程序和设计好的电路单元等。
第一部分是程序包,程序包是用VHDL语言编写的共享文件,定义在设计结构体和实体中将要用到的常数、数据类型、子程序和设计好的电路单元等,放在文件目录名称为IEEE的程序包库中。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
第二部分是程序的实体,定义电路单元的输入/输出引脚名称。
程序的实体名称可以任意取,但必须与VHDL程序的文件名称相同。
实体的标示符是ENTITY,实体以ENTITY开头,以END结束。
ENTITYfulladderIS
PORT(a,b,Ci:
instd_logic;
Co,s:
outstd_logic_vector(7downto0));
ENDfulladder;
其中,定义了a,b,Ci为输入信号引脚,定义Co,s为输出信号引脚。
第三部分是程序的结构体,具体描述电路的内部结构和逻辑功能。
结构体有三种描述方式,分别是行为(BEHAVIOR)描述方式、数据流(DATAFLOW)描述方式和结构描述方式。
其中数据流描述方式又被称为寄存器(RTL)描述方式。
结构体以表示ARCHITECHTURE开头,以END结尾。
结构体的名称可以任取。
architecturebehavoffulladderis
BEGIN
s<=axorbxorCi;
Co<=(aandb)or(aandCi)or(bandCi);
ENDfulladder
上面程序段中结构体的描述方式属于程序流描述方式。
以上三段程序是一个完整的VHDL程序段,实现的功能是一位全加器。
本设计中设置了两种种波形,分别是三角波、方波。
两种波形通过一个2选1数据选择器来实现选择性输出。
4.1.4设计工具简介
本次设计是基于Altera公司的QuartusII软件。
QuartusII是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
QuartusII支持Altera的IP核,包含了LPM/MegaFuction宏功能模块库,使用它,可以简化设计的复杂性,加快设计速度。
QuartusII平台支持一个工作组环境下的设计要求,其中包括支持基于Internet的协作设计。
此外,QuartusII通过和DSPBuilder工具与Matlab/SIMULINK相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统开发,集系统级设计、嵌入式软件设计、可编程逻辑设计于一体,是一种综性的开发平台。
4.1.2设计要求:
(1)产生方波、三角波、锯齿波和正弦波的VHDL模块程序
(2)输出波形选择模块程序
(3)完成顶层、底层设计,仿真出结果
(4)选择合适的D/A转换器观察波形
五、实现过程:
5.1软件设计流程:
1.弄清设计原理图。
2.分别编写四选一数字选择器、方波发生器、三角波发生器、锯齿波发生器、
正弦波发生器并作为低层文件。
3.建顶层文件,并调用底层文件,定义信号量进行列话语句。
4.生成实验原理电路图。
5.进行嵌入式逻辑分析,并改变其波形种类和频率。
5.2系统设计:
基于VHDL语言设计一个多功能信号发生器,通过选择输入信号,可以输出三角波、方波两种信号。
信号发生器的控制模块可以选用数据选择器实现,4种信号的数据选择可以使用4选1数据选择器实现。
5.3主要函数语句分析
在程序设计中,主要使用的函数语句有两种:
If-else语句和case-when语句。
这两种语句也是VHDL程序设计中常用的语句。
二者都属于流程控制语句。
流程控制语句通过条件控制开关决定是否执行一条或几条语句或重复执行一条或几条语句或跳过一条或几条语句。
IF语句是一种条件语句,它根据语句中所设置的一种或多种条件,有选择地执行指定的顺序语句。
IF语句的语句结构有以下三种:
IF条件句Then--第一种IF语句结构
顺序语句
ENDIF
IF条件句Then--第二种IF语句结构
顺序语句
ELSE
顺序语句
ENDIF
IF条件句Then--第三种IF语句结构
顺序语句
ELSIF条件句Then
顺序语句
...
ELSE
顺序语句
ENDIF
CASE语句根据满足的条件直接选择多项顺序语句中的一项执行,CASE语句的结构如下:
CASE表达式IS
When选择值=>顺序语句
When选择值=>顺序语句
...
ENDCASE
当执行到CASE语句时,首先计算表达式的值,然后根据条件句中与之相同的选择值。
执行对应的顺序语句,最后结束CASE语句。
表达式可以是一个整数类型或枚举类型的值,也可以是由这些数据类型的值构成的数组。
六、功能及代码:
6.1四选一多路选择器(choice4_2):
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;--程序包
entitychoice4_1is--定义实体
port(s:
instd_logic_vector(1downto0);--信号选择端口s
d1,d2,d3,d4:
instd_logic_vector(7downto0);--d1d2d3d4分别连接四个波形发生模块
y:
outstd_logic_vector(7downto0));--定义输出信号端口
endchoice4_1;
architecturebehavofchoice4_1is--结构体
begin
process(s)
begin
casesis--casewhen语句进行信号位的选择
when"00"=>y<=d1;
when"01"=>y<=d2;
when"10"=>y<=d3;
when"11"=>y<=d4;
whenothers=>null;
endcase;
endprocess;--进程结束
endbehav;--结构体结束
四选一选择器
6.2方波发生器
功能:
产生方波,是通过交替送出全0和全1实现的,每32个时钟翻转一次
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entityfangbois
port(clkf,rf:
instd_logic;
qf:
outstd_logic_vector(7downto0)
);
endentity;
architecturebehavoffangbois
signala:
bit;
begin
process(clkf,rf)--计数分频
variablecnt:
integerrange0to32;
begin
if(rf='0')then
a<='0';
elsifclkf'eventandclkf='1'then
ifcnt<31then--进行32分频
cnt:
=cnt+1;
else
cnt:
=0;
a<=nota;
endif;
endif;
endprocess;
process(clkf,a)--信号输出
begin
ifclkf'eventandclkf='1'then
ifa='1'then
qf<="11111111";
else
qf<="00000000";
endif;
endif;
endprocess;
endbehav;
方波原理图
6.3三角波信号发生器
功能:
产生的三角波以64个时钟为一个周期,输出q每次加减8。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitysanjiaobois
port(clks:
instd_logic;--时钟信号
rs:
instd_logic;--复位信号
qs:
outstd_logic_vector(7downto0));--输出信号
endentity;
architecturebehaofsanjiaobois
begin
process(clks,rs)
variabletmp:
std_logic_vector(7downto0);
variablea:
std_logic;
begin
if(rs='0')then
tmp:
="00000000";
elsifclks'eventandclks='1'then
if(a='0')then
if(tmp="11111000")then--tmp=248
tmp:
="11111111";
a:
='1';--信号计数完成,下一次改成递减
else
tmp:
=tmp+8;--递增
endif;
else
iftmp="00000111"then--tmp=7
tmp:
="00000000";
a:
='0';--信号计数完成,下一次改成递增
else
tmp:
=tmp-8;--递减
endif;
endif;
endif;
qs<=tmp;--信号输出
endprocess;
endbeha;
三角波原理图
6.4锯齿波发生器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;--程序包
entityjuchibois
port(clkj,rj:
instd_logic;--定义clk、reset为输入信号
qj:
outstd_logic_vector(7downto0));--定义q为输出信号
endjuchibo;--实体
architecturebehavofjuchibois
begin
process(clkj,rj)--定义进程
variabletmp:
std_logic_vector(7downto0);--定义变量,8位
begin
ifrj='0'then--如果复位信号为0,tmp为0
tmp:
="00000000";
elsifrising_edge(clkj)then--捕捉时钟上升沿
iftmp="11111111"then--如果tmp递增至最大,增归零
tmp:
="00000000";
else--否则,tmp继续递增
tmp:
=tmp+1;
endif;
endif;
qj<=tmp;--q等于变量tmp
endprocess;--进程结束
endbehav;--结构体结束
锯齿波原理图
6.5正弦波发生器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitysinis
port(clksin,rsin:
instd_logic;
da:
outBIT_vector(7downto0));
endentity;
architecturebehavofsinis
signala:
bit;
begin
process(clksin,rsin)--计数分频
variablecnt:
integerrange0to256;
begin
if(rsin='0')then
a<='0';
elsifclksin'eventandclksin='1'then
ifcnt<4then--进行分频
cnt:
=cnt+1;
else
cnt:
=0;
a<=nota;
endif;
endif;
endprocess;
--process(clksin,a)
process(a)
variabletmp:
std_logic_vector(7downto0);
variabled:
BIT_vector(7downto0);
begin
--ifa='0'then
--d:
="00000000";
--elsifclksin'eventandclksin='1'then
ifa'eventanda='1'then
iftmp="00111111"then
tmp:
="00000000";
else
tmp:
=tmp+1;
endif;
casetmpis
when"00000000"=>d:
="11111111";
when"00000001"=>d:
="11111110";
when"00000010"=>d:
="11111100";
when"00000011"=>d:
="11111001";
when"00000100"=>d:
="11110101";
when"00000101"=>d:
="11101111";
when"00000110"=>d:
="11101001";
when"00000111"=>d:
="11100001";
when"00001000"=>d:
="11011001";
when"00001001"=>d:
="11001111";
when"00001010"=>d:
="11000101";
when"00001011"=>d:
="10111010";
when"00001100"=>d:
="10101110";
when"00001101"=>d:
="10100010";
when"00001110"=>d:
="10010110";
when"00001111"=>d:
="10001010";
when"00010000"=>d:
="01111100";
when"00010001"=>d:
="01100000";
when"00010010"=>d:
="01100011";
when"00010011"=>d:
="01010111";
when"00010100"=>d:
="01001011";
when"00010101"=>d:
="01000000";
when"00010110"=>d:
="00110101";
when"00010111"=>d:
="00101011";
when"00011000"=>d:
="00100010";
when"00011001"=>d:
="00011010";
when"00011010"=>d:
="00010011";
when"00011011"=>d:
="00001101";
when"00011100"=>d:
="00001000";
when"00011101"=>d:
="00000001";
when"00011110"=>d:
="00000001";
when"00011111"=>d:
="00000000";
when"00100000"=>d:
="00000000";
when"00100001"=>d:
="00000001";
when"00100010"=>d:
="00000001";
when"00100011"=>d:
="00001000";
when"00100100"=>d:
="00001101";
when"00100