FPGA VHDL 简易波形发生器 简易信号发生器 EDA课设.docx

上传人:b****8 文档编号:28528843 上传时间:2023-07-18 格式:DOCX 页数:18 大小:177.20KB
下载 相关 举报
FPGA VHDL 简易波形发生器 简易信号发生器 EDA课设.docx_第1页
第1页 / 共18页
FPGA VHDL 简易波形发生器 简易信号发生器 EDA课设.docx_第2页
第2页 / 共18页
FPGA VHDL 简易波形发生器 简易信号发生器 EDA课设.docx_第3页
第3页 / 共18页
FPGA VHDL 简易波形发生器 简易信号发生器 EDA课设.docx_第4页
第4页 / 共18页
FPGA VHDL 简易波形发生器 简易信号发生器 EDA课设.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

FPGA VHDL 简易波形发生器 简易信号发生器 EDA课设.docx

《FPGA VHDL 简易波形发生器 简易信号发生器 EDA课设.docx》由会员分享,可在线阅读,更多相关《FPGA VHDL 简易波形发生器 简易信号发生器 EDA课设.docx(18页珍藏版)》请在冰豆网上搜索。

FPGA VHDL 简易波形发生器 简易信号发生器 EDA课设.docx

FPGAVHDL简易波形发生器简易信号发生器EDA课设

简易信号发生器

1引言

信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的使用。

它能够产生多种波形,如三角波、锯齿波、矩形波(含方波)、正弦波等,在电路实验和设备检测中具有十分广泛的用途。

例如在通信、广播、电视系统中,都需要射频(高频)发射,这里的射频波就是载波,把音频(低频)、视频信号或脉冲信号运载出去,就需要能够产生高频的振荡器。

在工业、农业、生物医学等领域内,如高频感应加热、熔炼、淬火、超声诊断、核磁共振成像等,都需要功率或大或小、频率或高或低的信号发生器。

本设计采用FPGA来设计制作多功能信号发生器。

该信号发生器可以产生锯齿波、三角波、方波等波形。

2FPGA简介

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作为微处理器的外设,由微处理器对其编程。

3VHDL&Verilog简介

VHDL(VeryHighSpeedIntegratedCircuitHardwareDescriptionLanguage,超高速集成电路硬件描述语言)是一种用来描述数字系统行为和结构的硬件描述语言,被广泛的运用于描述和仿真各种数字系统,小到几个门,大到许多复杂集成电路相连的系统。

VHDL诞生于1982年,是由美国国防部开发的一种快速设计电路的工具,目前已经成为IEEE(TheInstituteofElectricalandElectronicsEngineers)的一种工业标准硬件描述语言。

相比传统的电路系统的设计方法,VHDL具有多层次描述系统硬件功能的能力,支持自顶向下(ToptoDown)和基于库(LibraryBased)的设计的特点,因此设计者可以不必了解硬件结构。

从系统设计入手,在顶层进行系统方框图的划分和结构设计,在方框图一级用VHDL对电路的行为进行描述,并进行仿真和纠错,然后在系统一级进行验证,最后再用逻辑综合优化工具生成具体的门级逻辑电路的网表,下载到具体的FPGA器件中去,从而实现可编程的专用集成电路(ASIC)的设计。

Verilog也是一种流行的硬件描述语言,他是由工业界开发的,1984年,Verilog作为一种私用的硬件描述语言,由GatewayDesignAutomation公司给出,1988年,Synopsis公司为Verilog开发了综合工具。

1995年,Verilog成为IEEE的一个标准。

Verilog适合算法级,寄存器级,逻辑级,门级和版图级等各个层次的设计和描述。

VHDL的语法是基于ADA语言的,而Verilog的语法是基于C语言的。

由于是基于C语言,所以它更容易掌握,但是VHDL语言在设计和描述大型系统时具有突出优势。

目前两种语言各占一半市场份额,两种语言都可以满足数字系统设计者的需求。

本设计中采用VHDL语言进行设计。

4设计工具简介

本次设计是基于Altera公司的QuartusII软件。

QuartusII是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。

QuartusII支持Altera的IP核,包含了LPM/MegaFuction宏功能模块库,使用它,可以简化设计的复杂性,加快设计速度。

QuartusII平台支持一个工作组环境下的设计要求,其中包括支持基于Internet的协作设计。

此外,QuartusII通过和DSPBuilder工具和Matlab/SIMULINK相结合,可以方便地实现各种DSP使用系统;支持Altera的片上可编程系统开发,集系统级设计、嵌入式软件设计、可编程逻辑设计于一体,是一种综性的开发平台。

5系统设计

基于VHDL语言设计一个多功能信号发生器,通过选择输入信号,可以输出递增锯齿波、递减锯齿波、三角波、方波等四种信号。

信号发生器的控制模块可以选用数据选择器实现,4种信号的数据选择可以使用4选1数据选择器实现。

5.1VHDL程序语言基本设计

一个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程序段,实现的功能是一位全加器。

5.2波形发生器设计

采用DDS技术可以很方便地产生各种高质量的波形。

DDS技术是从相位概念出发之结合成所需要波形的一种频率合成技术。

以正弦波为例,首先要按照一定的采样点数将正弦波形一个周期的数据信息存于ROM表中,表中包含着一个周期正弦波的数字幅度信息,每个地址对应正弦波中0到360度范围内的一个相位点的幅度值,查找表时即是把输入的地址相位信息映射成正弦波幅度的数字量信号,通过设置的输出端口输出。

在实物设计中,可以使用D/A接口来实现波形信号的输出。

为简化设计过程,本设计并未采用DDS技术,而是采用描点输出的方式,实现波形发生器的设计。

程序中设置一个波形的起始点,经过比较、计算得出波形的其他数值,将这些点依次连续输出,从而实现波形的仿真。

以递增锯齿波为例,首先定义初始点为tmp=“00000000”;在时钟上升沿到来时,执行tmp<=tmp+1;语句,同时将tmp输出,当

tmp=“11111111”;时,将tmp值清零,执行下一个循环。

在本设计中,采用QuartusII软件仿真,所以可以通过波形文件直观的反映出输出的数字量的变化情况,以达到波形输出的仿真。

设计中分别对四种波形进行编程,编译无误后,封装生成模块文件,以供在后面的顶层电路设计中使用。

图5-1四种波形封装图块

本设计中设置了四种波形,分别是递增锯齿波、递减锯齿波、三角波、方波。

四种波形通过一个4选1数据选择器来实现选择性输出。

5.3四选一数据选择器设计

可以采用集成四选一数据选择器CT54153/CT74153,也可以使用软件编程生成模块的方式实现数据四选一的功能。

在本设计中采用后者,程序中,为每一种波形分配一个通道,并为之赋予一唯一的代码,当在sel端输入不同的代码时,被选中的通道打开,响应的波形发生模块产生波形。

entitymux41is

port(sel:

instd_logic_vector(2downto0);--定义输入端口sel

d1,d2,d3,d4:

instd_logic_vector(7downto0);--定义输入端口d1,d2,d3,d4

q:

outstd_logic_vector(7downto0));--定义输出端口

endmux41;

architecturebehavofmux41is

begin

process(sel)

begin

caseselis

when"001"=>q<=d1;

when"010"=>q<=d2;

when"011"=>q<=d3;

when"100"=>q<=d4;

whenothers=>null;

endcase;

endprocess;图5-2四选一数据选择器封装图块

endbehav;

以上为四选一数据选择器程序段,其中sel端口为外部输入选择信号,d1,d2,d3,d4分别连接四个波形发生模块,以二进制形式给sel幅值,选择相应的通道。

q为输出端口,将波形信息的数字代码输出。

5.4程序设计

图5-3系统流程图

5.5主要函数语句分析

在程序设计中,主要使用的函数语句有两种:

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语句。

表达式可以是一个整数类型或枚举类型的值,

也可以是由这些数据类型的值构成的数组。

5.6系统顶层文件

将上述5个模块(递增锯齿波sawtooth_adder、递减锯齿波sawtooth_minus、三角波triangle、方波square、4选1数据选择器mux41)封装成为模块文件,供顶层电路调用。

可以得到以下顶层文件电路:

图5-4系统顶层电路图

6系统仿真

通过选择不同的sel值,可以实现不同的波形输出。

仿真中reset复位信号一直置高电平,即没有仿真复位情况。

输入的选择信号为1时,信号发生器顶层电路的仿真输出波形为递增锯齿波。

输出的波形线性递增。

图6-1递增锯齿波仿真波形

输入的选择信号为2时,信号发生器顶层电路的仿真输出波形为递减锯齿波。

输出的波形线性递减。

图6-2递减锯齿波仿真波形

输入的选择信号为3时,信号发生器顶层电路的仿真输出波形为三角波。

输出的波形线性减小到最小值0后,再线性增加。

图6-3三角波仿真波形

输入的选择信号为4时,信号发生器顶层电路的仿真输出波形为方波。

输出的波形为周期性的全0或全1。

(在仿真中,只有将CLK信号频率取得很高的时候,才可以清晰地看出仿真效果。

图6-4方波仿真波形

7设计总结

7.1小结

FPGA是当前数字系统设计领域比较火热的一种工具,它可以大大缩短设计需要的时间,降低成本的同时也提高了系统的稳定性。

使用VHDL语言描述硬件系统使得FPGA技术有了更广阔的使用领域。

本设计使用了基于Altera公司的FPGA系列,采用Altera公司提供的系统开发工具QuartusII软件进行了系统的设计和仿真。

数字信号发生器在实验室以及工业场所都被大量使用着,本系统即实现了可以输出四种波形的简易多功能波形发生器,仿真结果证明,该设计正确有效,可以作为制作实物的理论依据。

但由于设计者能力有限,本系统仍然有着很多可改进的地方,比如可以升级为输出频率、幅值可调的波形,或者输出任意波形以更贴近实际情况。

7.2心得体会

对FPGA一直都有着浓厚的兴趣,借做课设的机会,认真的研究了一下这门科学。

发现FPGA技术比我想象中的要有很大的难度。

里面有很多的思想来源于信息电子技术里面的基本知识,包括门电路的概念以及寄存器传送的基本知识。

VHDL语言和C语言有很大的不同,但是C语言的编程思想也可以移植到VHDL语言中,尤其是一些逻辑算法的设计,需要有很强的C语言编程功底。

学习一门知识要从最基本的体系架构开始,倘若一开始就从顶层设计入手,就会造成很多基本原理、基本概念上的偏差,甚至会拖延学习设计的时间,事倍功半。

虽然课设完成了,但是我意识到,我对FPGA技术仅仅只是停留在入门的阶段,想要有更大的发展,更深入的研究,还需要更多的努力和实践。

参考文献

[1]蒋小燕,俞伟钧.EDA技术及VHDL.南京:

东南大学出版社.2008年12月.

[2]李国丽,朱维勇.EDA和数字系统设计.北京:

机械工业出版.2005年3月.

[3]江国强.EDA技术和实验.北京:

电子工业出版社.2005年1月.

[4]欧伟明.基于MCU、FPGA、RTOS的电子系统设计方法和实例.北京:

北京航空航天大学出版社.2007年4月.

[5]CharlesH.Roth,Jr、LizyKurianJohn著,金明录译.数字系统设计和VHDL.北京:

电子工业出版社.2008年8月

附录

附录一:

递增锯齿波程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;--程序包

entitysawtooth_adderis

port(clk,reset:

instd_logic;--定义clk、reset为输入信号

q:

outstd_logic_vector(7downto0));--定义q为输出信号

endsawtooth_adder;--实体

architecturebehavofsawtooth_adderis

begin

process(clk,reset)--定义进程

variabletmp:

std_logic_vector(7downto0);--定义变量,8位

begin

ifreset='0'then--如果复位信号为0,tmp为0

tmp:

="00000000";

elsifrising_edge(clk)then--捕捉时钟上升沿

iftmp="11111111"then--如果tmp递增至最大,增归零

tmp:

="00000000";

else--否则,tmp继续递增

tmp:

=tmp+1;

endif;

endif;

q<=tmp;--q等于变量tmp

endprocess;--进程结束

endbehav;--结构体结束

附录二:

递减锯齿波程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitysawtooth_minusis

port(clk,reset:

instd_logic;

q:

outstd_logic_vector(7downto0));

endsawtooth_minus;

architecturebehavofsawtooth_minusis

begin

process(clk,reset)

variabletmp:

std_logic_vector(7downto0);

begin

ifreset='0'then

tmp:

="11111111";

elsifrising_edge(clk)then

iftmp="00000000"then

tmp:

="11111111";

else

tmp:

=tmp-1;

endif;

endif;

q<=tmp;

endprocess;

endbehav;

附录三:

三角波程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;--程序包

entitytriangleis--定义三角波实体

port(clk,reset:

instd_logic;

q:

outstd_logic_vector(7downto0));

endtriangle;

architecturebehavoftriangleis--定义三角波结构体

begin

process(clk,reset)--进程开始

variabletmp:

std_logic_vector(7downto0);--定义中间变量tmp、a

variablea:

std_logic;

begin

ifreset='0'then--复位信号设置

tmp:

="00000000";

elsifrising_edge(clk)then--捕捉时钟信号上升沿

ifa='0'then--a=0时依次输出三角波上升沿

iftmp="11111110"then

tmp:

="11111111";

a:

='1';

else

tmp:

=tmp+1;

endif;

else--a=1时依次输出三角波下降沿

iftmp="00000001"then

tmp:

="00000000";

a:

='0';

else

tmp:

=tmp-1;

endif;

endif;

endif;

q<=tmp;--输出信号q=tmp

endprocess;

endbehav;--结构体结束

附录四:

方波程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitysquareis

port(clk,reset:

instd_logic;

q:

outstd_logic_vector(7downto0));

endsquare;

architecturebehavofsquareis

signala:

std_logic;

begin

process(clk,reset)

variabletmp:

std_logic_vector(7downto0);

begin

ifreset='0'then

a<='0';

elsifrising_edge(clk)then

iftmp="11111111"then

tmp:

="00000000";

elsetmp:

=tmp+1;

endif;

iftmp<="10000000"then

a<='1';

else

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1