硬件描述语言VHDL基础_第1页
硬件描述语言VHDL基础_第2页
硬件描述语言VHDL基础_第3页
硬件描述语言VHDL基础_第4页
硬件描述语言VHDL基础_第5页
已阅读5页,还剩140页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章硬件描述语言VHDL基础自20世纪60年代以来,数字集成电路已经历了从SSI、MSI、LSI到VLSI的发展过程。数字集成电路按照芯片设计方法的不同大致可以分为三类:①通用型中、小规模集成电路;②用软件组态的大规模、超大规模集成电路,如微处理器、单片机等;③专用集成电路(ASIC-ApplicationSpecificIntegratedCircuit)。

ASIC是一种专门为某一应用领域或为专门用户需要而设计、制造的LSI或VLSI电路,它可以将某些专用电路或电子系统设计在一个芯片上,构成单片集成系统。一、PLD发展概况①PLD中阵列交叉点的逻辑表示PLD逻辑阵列中交叉点的连接方式采用图7-7所示的几种逻辑表示。(a)表示实体连结,就是行线和列线在这个交叉点处实在连接,这个交叉点是不可编程点,在交叉点处打上实心点。①PLD中阵列交叉点的逻辑表示PLD逻辑阵列中交叉点的连接方式采用图7-7所示的几种逻辑表示。(b)表示可编程连接。无论×或表示该符号所在行线和列线交叉处是可编程点,具有一个可编程单元。Ä①PLD中阵列交叉点的逻辑表示PLD逻辑阵列中交叉点的连接方式采用图7-7所示的几种逻辑表示。在采用熔丝工艺的PLD器件中,器件出厂后用户编程之前,所有可编程点处的熔丝都处于接通状态,习惯上都用×表示熔丝接通,因此可编程点上处处都打×或。Ä①PLD中阵列交叉点的逻辑表示PLD逻辑阵列中交叉点的连接方式采用图7-7所示的几种逻辑表示。PLD器件被用户编程后,可编程点上的熔丝有的烧断,有的接通。编程后可在编程点上仍打有×,这时的×表示可编程点被编程后熔丝接通。①PLD中阵列交叉点的逻辑表示PLD逻辑阵列中交叉点的连接方式采用图7-7所示的几种逻辑表示。熔丝烧断的可编程点上的×消失,行线和列线不相接,这种情况用图(c)表示。

②与门及或门的表示≥1ABCYYABCYABC&ABCYYABC与阵列如图(a)所示。在二极管与门的各支路与输出之间接入熔丝。熔丝保留的各支路的输入为有效输入,输出F是熔丝保留各支路输入的与逻辑函数。图(b)是PLD表示。图(a)和图(b)是熔丝全部保留的与阵列表示情况。图(c)是烧断3个熔丝的情况,图(d)是图(c)的PLD表示。PLD中与阵列的缺省表示在PLD器件与阵列中常看到下图中给出的几种表示。输出为Z1的与门4个输入变量全部被编程后输入,4个交叉点均画×。因此,Z2为Z1的缺省表示。这时的阵列交叉点上均未画×,而在与门符号内却画有×。PLD中与阵列的缺省表示输出为Z3的与门输入阵列交叉点上无×,与门符号内也无×,这是浮动状态的逻辑表示。浮动输入状态代表与阵列编程后熔丝全部熔断,4个输入全都不同与门相接,相当与门输入悬空,与门输出为高电平,即输出逻辑“1”②与门及或门的表示③输入缓冲器和反馈缓冲器在PLD中有二种特殊的缓冲器输入缓冲器和反馈缓冲器,二种缓冲器有相同的电路构成它们是单输入、双输出的缓冲器单元,一个是高有效输出端,即同极性输出端。另一个是低有效输出端,即反极性输出端。③输入缓冲器和反馈缓冲器与曾经学过的输出三态缓冲器不同输出三态缓冲器也有三个端,但只有一个输入和一个输出端,另一个是使能控制端。原则上说,输出三态缓冲器有二个输入端一个输出端。输入缓冲器和反馈缓冲器输出只有0、1两个逻辑状态。而输出三态缓冲器除了有0、1两个逻辑状态外,还有一个称为高阻(Z)的状态。在PLD中为了实现输出极性可编程,常采用图(a)所示的异或门结构。当熔丝烧断,异或门输出极性为低有效,即否则异或门输出高有效Q0=P⊕0=P。③输入缓冲器和反馈缓冲器PPQ=Å=10图(b)是编程后熔丝保留,输出极性编程为高有效。图(c)是编程熔丝烧断,输出极性编程为低有效。③输入缓冲器和反馈缓冲器与阵列Y1Y2或阵列AB与阵列Y1Y2或阵列④与或阵列图任一组合逻辑函数都可用“与或”式表示,即任何组合逻辑函数都可以用一个与门阵列与一个或门阵列来实现。如:标准画法简化画法例:可编程只读存储器PROM与阵列(固定)D2D1D0或阵列(可编程)A2A1A0完全译码阵列实现组合逻辑函数:将函数写为最小项之和形式,将对应的与项或起来即可。容量=与门数×或门数=2n×m利用效率低。例:试用PROM实现4位二进制码到Gray码的转换。转换真值表与阵列或阵列A2A1A0A3D2D1D0D3例:可编程逻辑阵列PLA

与阵列(可编程)A2A1A0D2D1D0或阵列(可编程)实现组合逻辑函数:将函数化简为最简与或式,将对应的与项或起来即可。容量=与门数×或门数制造工艺复杂。与阵列或阵列A3A2A1A0D3D2D1D0例:试用PLA实现4位二进制码到Gray码的转换。解:利用卡诺图化简得最简与或式:二、可编程专用集成电路ASIC可编程专用集成电路ASIC(ApplicationSpecificIntegratedCircuit)是面向用户特定用途或特定功能的大规模、超大规模集成电路。分类:按功能分为数字的、模拟的、数字和模拟混和三种。按制造方式分为全定制、半定制ASIC、可编程三种。根据芯片的集成度和结构复杂度分类简单可编程逻辑器件SPLD特点是都具有可编程的与阵列、不可编程的或阵列、输出逻辑宏单元OLMC和输入输出逻辑单元IOC。复杂可编程逻辑器件CPLD特点是具有更大的与阵列和或阵列,增加了大量的宏单元和布线资源,触发器的数量明显增加。现场可编程逻辑门阵列FPGA运算器、乘法器、数字滤波器、二维卷积器等具有复杂算法的逻辑单元和信号处理单元的逻辑设计可选用FPGA实现。按制造技术和编程方式进行分类双极熔丝制造技术的可编程ASIC莱迪思(Lattice)半导体公司的PAL系列反熔丝制造技术的可编程ASICActel的FPGAEECMOS制造技术的可编程ASICLattice的GAL和ispLSI/pLSISRAM制造技术的可编程ASICXilinx的FPGA,Altera的FPGA双极熔丝和反熔丝ASIC通常称为OTP(onetimeprogramming)器件采用EECMOS和SRAM制造技术的可编程ASIC具有用户可重复编程的特性,可以实现电擦电写。按制造技术和编程方式进行分类用SRAM技术制造的FPGA则具有数据挥发性,又称易失性。具有挥发性的FPGA,当系统断电或掉电后,写入FPGA中的编程数据要丢失。因此,必须把要下载到FPGA的数据借用编程器固化到与其联用的EPROM或EEPROM中,待重新上电时,芯片将编程数据再下载到FPGA中。FPGA的数据挥发性,决定有些环境不宜选用。可编程ASIC的编程方式可编程ASIC的编程方式有两种:采用专用编程器进行编程在系统编程甩掉了专用编程器,而且也不用将芯片从电路系统取下,只利用计算机和一组下载电缆就可以在系统编程。Lattice和Xilinx等几家大公司现在都有在系统可编程ASIC产品。在系统编程方式方便了用户。

可编程ASIC的一般开发步骤设计输入(entry)功能模拟(functionsimulation)逻辑分割(partitioning)布局和布线(placeandrouting)时间模拟(timingsimulation)写入下载数据(download)ASIC开发步骤流程图TOP—DOWN设计思想自顶向下(TOP—DOWN)设计首先是从系统级开始入手。把系统分成若干基本单元模块,然后再把作为基本单元的这些模块分成下一层的子模块。TOP—DOWN设计思想采用TOP—DOWN层次结构化设计方法,设计者可在一个硬件系统的不同层次的模块下进行设计。总体设计师可以在上层模块级别上对其下层模块设计者所做的设计进行行为级模拟验证。在TOP—DOWN的设计过程中,划分每一个层次模块时要对目标模块做优化,在实现模块时要进行模拟仿真。虽然TOP—DOWN的设计过程是理想的,但它的缺点是得到的最小可实现的物理单元不标准,成本可能较高。BOTTOM—UP设计思想BOTTOM—UP层次结构化设计是TOP—DOWN设计的逆过程。它虽然也是从系统级开始的,即从设计树的树根开始,但在层次模块划分时,首先考虑的是实现模块的基本物理单元是否存在,划分过程必须是从存在的基本单元出发。BOTTOM—UP设计思想设计树最末枝上的单元要么是已经制造出的单元,要么是已经开发成功的单元,或者是可以买得到的单元。自底向上(BOTTOM—UP)的设计过程采用的全是标准单元,通常比较经济。但完全采用自底向上的设计有时不能完全达到指定的设计目标要求。BOTTOM—UP设计思想用可编程ASIC实现一个好的电子系统设计通常采用TOP—DOWN和BOTTOM—UP两种方法的结合,充分考虑设计过程中多个指标的平衡。设计库及库元件在层次设计中所用的模块有两种:预先设计好的标准模块由用户设计的具有特定应用功能的模块前者一般要存放在EDA开发系统中各种类型的文件库之中,后者必须经过模型仿真和调试证明无误后,建立一个图形符号存放在用户的设计库中准备在更上层的设计中使用。设计库及库元件模块的功能模型可以是逻辑图形式,也可以是VHDL描述的,还可以是真值表或逻辑方程式描述的。一个已知的图形符号可以用来代表一个或几个功能模型,这些模型的功能相同,参数可以不同。例如2输入与非门7400、74LS00,74S00,功能相同,但是传输延时,功耗不相同。第3章硬件描述语言VHDL基础⒈硬件描述语言概述⒉VHDL语言程序结构⒊VHDL常用语句⒋VHDL语法基础什么是VHDLVHDL-VHSICHardwareDecription

Language

其中VHSIC-VeryHighSpeedIntegratedCircuit即超高速集成电路硬件描述语言电子设计自动化的关键技术之一是要求用形式化方法来描述硬件系统。VHDL适应了这种要求。目前在国内外应用的硬件描述语言有许多种,其中应用最广泛的有VHDL语言和Verilog-HDL语言。

3.1硬件描述语言概述VHDL和VerilogHDLVerilogHDL:另一种硬件描述语言,由Verilog

公司开发,1995年成为IEEE标准。优点:简单、易学易用缺点:功能不如VHDL强大,仿真工具少VHDL:1987年成为IEEE标准优点:功能强大、通用性强。缺点:难学VHDL在电子系统设计中的应用电子系统的设计模块VHDL在电子系统设计中的应用电子系统设计的描述等级1、行为级2、RTL级(Registertransferlevel)3、逻辑门级4、版图级(制版级)用VHDL可以描述以上四个等级VHDL在电子系统设计中的应用系统设计的描述等级-行为级所谓行为描述,实际就是对整个系统的数学模型的描述,在行为描述阶段,并不真正考虑其实际操作和算法怎么实现,而是考虑系统的结构和工作过程是否能达到系统设计规格书的要求。VHDL在电子系统设计中的应用系统设计的描述等级-RTL级寄存器描述比行为描述更注重硬件的具体实现,通过该描述可以导出系统的逻辑表达式,为逻辑综合作准备,当然进行逻辑综合和逻辑综合工具的能力有关,当然设计人员还必须了解逻辑综合工具的说明和规定。

VHDL在电子系统设计中的应用系统设计的描述等级-逻辑门级该层次把RTL描述的程序转换成基本逻辑元件表示的文件,该文件就象老的设计方法中的电原理图。VHDL在电子系统设计中的应用系统设计的描述等级-制版级如何使用VHDL描述硬件实体Entity(实体)Architecture1(构造体)ArchitectureNprocess(进程结构)

block(块结构)subprograms(子程序)procedure(过程)

function(函数)3.2VHDL语言程序结构VHDL语言程序可由实体(Entity)说明、结构体(Architecture)、程序包(Package)、库(Library)、配置(Configuration)5个部分组成。其中库、实体说明、结构体是一个VHDL语言程序的基本组成部分。3.2VHDL语言程序结构实体(Entity):实体用于描述所设计的系统的外部接口信号;结构体(Architecture):构造体用于描述系统内部的结构和行为;建立输入和输出之间的关系;库(Library):库是专门存放预编译程序包的地方。程序包(Package):包集合存放各个设计模块共享的数据类型、常数和子程序等;配置(Configuration):配置语句安装具体元件到实体—结构体对,可以被看作是设计的零件清单;libraryIEEE;useIEEE.std_logic_1164.all;useIEEE.std_logic_unsigned.all;entitycountisport(clock,reset:inSTD_LOGIC;

dataout:outSTD_LOGIC_VECTOR(3downto0));endcount;architecture

behaviorlofcountissignaldatabuffer:STD_LOGIC_VECTOR(3downto0);begin

dataout<=databuffer;

process(clock,reset)

beginif(reset='1')thendatabuffer<="0000";

elsif(clock'eventandclock='1')thenifdatabuffer="1000"then

databuffer<="0000";elsedatabuffer<=databuffer+'1';endif;endif;

endprocess;endbehavioral;3.2VHDL语言程序结构以2选1多路选择器电路为例

当s=‘0’时,

y的值为a的值,当s=‘1’时,

y的值为b的值。

s00001111a00110011b01010101y001101013.2.1实体说明实体:描述电路器件外部情况及各信号端口的基本性质外部特性:4个信号端口a,b,s:输入信号端口y:输出信号端口输入输出信号性质:STD_LOGIC

ENTITYmux21aIS

PORT(a,b,s:INSTD_LOGIC;

y:OUTSTD_LOGIC);ENDmux;例3-1

ENTITY

mux21aIS

PORT(a,b,s:INSTD_LOGIC;y:OUTSTD_LOGIC);

ENDENTITY

mux21a;

ARCHITECTURE

oneOFmux21aISBEGINy<=aWHENs=‘0’ELSEb;

ENDARCHITECTURE

one;实体结构体实体名结构体名3.2.1实体说明库说明【例3-1】二选一MUX的VHDL描述。

--2to1mux21aVHDLLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux21aIS

PORT(a,b,s:INSTD_LOGIC;

y:OUTSTD_LOGIC);ENDmux21a;ARCHITECTUREstructureOFmux21aISSIGNALtemp:STD_LOGIC;BEGIN

实体说明结构体3.2VHDL语言程序结构注释3.2VHDL语言程序结构

P0:PROCESS(a,b,s)VARIABLEtempl,temp2,temp3:STD_LOGIC;BEGIN

templ:=aAND(NOTs); temp2:=bANDs; temp3:=templORtemp2; temp<=temp3; y<=temp;ENDPROCESSP0;ENDstructure;进程变量定义3.2.1实体说明实体说明的书写格式如下所示:

ENTITY<实体名>IS[GENERIC(类属说明);][PORT(端口说明);][实体语句部分;]END[ENTITY]<实体名>;其中“<>”中的部分是必选项,“[]”中的部分是可选项。3.2.1实体说明其中端口说明格式为:

PORT(端口名1,端口名N:方向:数据类型)其中方向有:IN,OUT,INOUT,BUFFER,LINKAGE注意In信号只能被引用,不能被赋值out信号只能被赋值,不能被引用buffer信号可以被引用,也可以被赋值简单地说

In

不可以出现在<=或:=的左边

out不可以出现在<=或:=的右边

buffer可以出现在<=或:=的两边

INOUT

BUFFERINOUT3.2.1实体说明3.2.1实体说明注意:数据类型名是端口信号的取值类型,有:BIT:位类型,取值0、1;BIT_VECTOR:位向量类型,是BIT的组合;INTEGER:整数类型,可用作循环指针或常数;BOOLEAN:布尔类型,取值FALSE、TRUESTD_LOGIC:工业标准的逻辑类型,取值0、1、X、Z等;STD_LOGIC_VECTOR:是STD_LOGIC的组合;

3.2.1实体说明STD_LOGIC:工业标准的逻辑类型,由IEEE1164标准制定的9值逻辑系统取值:0,1,U,Z,X,W,L,H,-

U:没初始化

Z:高阻

X:不定

W:弱信号不定

L:弱信号0

H:弱信号1 -:Don’tcare3.2.1实体说明例子(HalfAdd)

其内部结构将由Architecture来描述3.2.1实体说明例如,4位加法器作为一个设计实体的实体说明如下:

ENTITYadder_rippleIS

PORT(a,b:INSTD_LOGIC_VECTOR(3DOWNTO0);q:OUTSTD_LOGIC_VECTOR(3DOWNTO0);

Cout:OUTSTD_LOGIC);ENDadder_ripple;3.2.1实体说明类属说明语句(GENERIC)

类属说明语句必须放在端口说明语句之前,用以设定实体或元件的内部电路结构和规模,其书写格式如下:

GENERIC(常数名:数据类型[:=设定值];┇常数名:数据类型[:=设定值]);例如:GENERIC(m:TIME:=5ns);指定了结构体内m的值为5ns。3.2.2结构体结构体(Architecture)是对实体功能的具体描述。结构体主要是描述实体的硬件结构、元件之间的互连关系、实体所完成的逻辑功能以及数据的传输变换等方面的内容。一个结构体的书写格式如下:

ARCHITECTURE<结构体名>OF<实体名>IS[说明语句;]BEGIN<功能描述语句;>END<结构体名>;描述电路器件的内部逻辑功能和电路结构可以有多种不同的描述方式行为描述方式(behavioral)

数据流描述方式(dataflow)

结构描述方式(structure)3.2.2结构体功能描述语句3.2.2结构体Arcthitecture

格式:

Arcthitecture

结构体名of

实体名is[定义语句]内部信号、常数、元件、数据类型、函数等的定义

begin[并行处理语句和block、process、function、procedure]

end构造体名;一个实体中可以具有一个结构体,也可以具有几个结构体。一个实体内部若有几个结构体,则结构体名不能重复。3.2.2结构体3.2.2结构体行为描述一般采用进程语句(process)描述3.2.2结构体【例3-2】一个RS触发器的结构体的行为描述方式

ARCHITECTURErs_behavOFrsffISBEGINq<=NOT(qbANDset);

qb<=NOT(qANDreset);

ENDrs_behav;是一个RS触发器的结构体的行为描述方式。3.2.2结构体3.2.2结构体元件例化时端口映射方式1:位置对应方式元件例化时端口映射方式2:名字直接对应3.2.2结构体【例】一个RS触发器的结构体的结构描述方式

ARCHITECTURErs_struOFrsffISCOMPONENTnand2

PORT(a,b:INBIT;

c:OUTBIT);

ENDCOMPONENT;

BEGINu1:nand2PORTMAP(a=>set,b=>qb,c=>q);

u2:nand2PORTMAP(a=>reset,b=>q,c=>qb);

ENDrs_stru;3.2.2结构体3.2.2结构体数据流描述【例3-4】使用RTL(数据流)描述方式的全加器VHDL程序

ENTITYfull_adderISGENERIC(tpd:TIME:=5ns)

PORT(a,b,Cin:INSTD_LOGIC;

S,Co:OUTSTD_LOGIC);ENDfull_adder;ARCHITECTURErtlOFfull_adderISSIGNALh:STD_LOGIC;--内部信号定义

BEGIN h<=aXORbAFTERtpd; S<=hXORCinAFTERtpd; Co<=(aANDb)OR(hANDCin)AFTER2*tpd;ENDrtl;3.2.2结构体3.2.2结构体三种描述方式的比较3.2.3包集合、库及配置除了entity(实体)和architecture(结构体)外还有另外三个可以独立进行编译的设计单元Package(包集合):存放信号定义、常数定义、数据类型、元件语句、函数定义和过程定义。Library库:内含各类包定义、实体、构造体等configuration(配置)描述层与层之间的连接关系以及实体与构造体之间关系。3.2.3包集合、库及配置VHDL中的设计单元(可以独立编译)3.2.3包集合、库及配置Library库的概念库:数据的集合,用来存放已编译过的设计单元(包括实体说明、结构体、配置说明、包集合)库中内容可以用作其他VHDL描述的资源。在VHDL语言中,库的说明总是放在设计单元的最前面:LIBRARY库名;USE库名.程序包名.项目名;第一个语句是LIBRARY库名,表明使用什么库。另外还要说明设计者要使用的是库中哪一个包集合以及包集合中的项目名。这样就是第2个语句的格式。3.2.3包集合、库及配置在VHDL语言中库大致有5种:STD库--VHDL的标准库IEEE库--VHDL的标准库的扩展面向ASIC的库--不同的工艺不同公司自定义的库(WORK库)普通用户自己的库除WORK库外,其他4类库在使用前都要首先进行说明3.2.3包集合、库及配置Package包集合的概念为了使一组数据类型、常量、子程序等被多个实体公用,VHDL提供了包集合的机制。包集合就像是公用的工具箱,各个实体都可使用其中定义的工具。为了方便设计,VHDL提供了一些标准的包集合。

LIBRARYIEEE;

--打开IEEE库

USEIEEE.STD_LOGIC_1164.ALL;--调用其中的STD_LOGIC_1164包集合3.2.3包集合、库及配置Package包集合用户也可以自定义包集合包集合结构如下所示:

PACKAGE包集合名IS[说明语句]END包集合名;PACKAGEBODY包集合名IS[说明语句]ENDBODY;3.2.3包集合、库及配置【例3-10】包集合的例子。

--包集合说明

PACKAGEexampleISTYPEalu_op

IS(add,sub,mul,div,eq,gt,lt);--枚举类型

CONSTANTpi:REAL:=3.1415926;--常量

CONSTANTdelayl:TIME;

COMPONENTnand2--元件

PORT(a,b:INBIT;

c:OUTBIT);

ENDCOMPONENT;

FUNCTIONmean(a,b,c:REAL)RETURNREAL;--函数

ENDexample;3.2.3包集合、库及配置【例3-10】包集合的例子。--包集合体PACKAGEBODYexampleISCONSTANTdelay1:TIME:=15ns;--定义延时常量的值

FUNCTIONmean(a,b,c:REAL)RETURNREALISBEGINRETURN(a+b+c)/3.0;--求均值

ENDmean;ENDexample;自定义的包集合和标准包集合一样,也要通过调用才能使用。如要用上例中的example包集合,则要在实体说明前加上语句:USEWORK.example.ALL;3.2.3包集合、库及配置配置(Configuration)描述层与层之间的连接关系,以及实体与结构之间的连接关系。设计者可以利用这种配置语句来选择不同的结构体,使其与要设计的实体相对应。在仿真某一个实体时,可以利用配置来选择各种不同的结构体,进行性能对比试验,以得到性能最佳的结构体。配置语句的基本书写格式如下:

CONFIGURATION配置名OF实体名IS[语句说明]END配置名;VHDL中的结构关系结构关系3.4VHDL语法基础3.4.1标识符和保留字基本标识符主要由字母、数字以及下划线组成,标识符的书写要遵守以下规则:①字符必须以英文字母开头;②标识符的最后一个字符不能是下划线;③在标识符中不允许出现连续2个下划线;④VHDL的保留关键字不能做一般的标识符使用。标识符中不区别大小写,但通常有较好语言素质的设计人员书写VHDL程序时都有自己的大小写体的书写风格。下面是几个符合规范的标识符:

Three_State_GateSel_7DROM_2716下面是几个不符号规范的标识符:

_TEXT_FILE--标识符必须以字母开头,_开头错误

8D10B--标识符必须以字母开头,数字开头错误

TOOL--Bar--不能出现二个连续下划线

SELECT--保留关键字不能做标识符用

Res_Clk_--下划线不能在标识符最后

Date-Input--字母间不是下划线3.4.1标识符和保留字3.4.2数据对象对象object对客观实体的抽象和概括在VHDL语言中,数据对象有以下4种类型:常数(CONSTANT)信号(SIGNAL)变量(VARIABLE)文件(FILES),其中文件类型是VHDL’93标准中新加入的。

1.常量(CONSTANT)常量是指那些在设计描述中不发生变化的值。常量是全局变量,在结构体描述、程序包说明、实体说明、过程说明、函数调用说明和进程说明中使用。使用前必须对常量进行说明,常量说明的格式如下:CONSTANT常量名:数据类型:=表达式;1.常量(CONSTANT)例如:

CONSTANTWIDTH:INTEGER:=8; --寄存器的宽度CONTANTVCC:REAL:=5.0;--指定供电电源的电压CONTANTDBUS:BIT_VECTOR:=“10110011”;--给出总线数据向量注意:数值和单位之间要留空格常量一旦赋值之后,在程序中就不能再改变了。2.变量(VARIABLE)变量是局部变量变量只能在进程语句、函数语句以及过程语句中使用。变量的说明也只能在进程语句、函数语句以及过程语句的相应说明区域进行。变量的书写格式为:

VARIABLE变量名:数据类型[:=表达式];例如:

VARIABLEresult:STD_LOGIC:=‘0’;--变量赋初值

VARIABLEx,y,z:INTEGER;VARIABLEcount:INTEGERRANGE0TO255:=10;2.变量(VARIABLE)在VHDL语言中,变量的使用规则和限制范围说明如下:变量赋值是直接非预设的,在某一时刻仅包含一个值;变量赋值和初始化赋值符号用“:=”表示;变量不能用于硬件连线和存储元件;在仿真模型中,变量用于高层次建模;在系统综合时,变量用于计算,作为索引载体和数据的暂存;在进程中,变量的使用范围在进程之内。若将变量用于进程之外,必须将该变量先赋给一个相同类型的信号,用信号在进程之间传递数据。3.信号(SIGNAL)在电子电路内,是用连线将元件或单元连结起来构成系统。在VHDL语言中,信号起着连线的作用,信号将实体与实体、元件与元件连结起来构成系统。一般将信号视为实际硬件系统中连线的抽象。信号是全局变量,一般在程序包、实体说明、结构体中都可以对信号进行定义说明,各进程之间的通信可以借助信号来实现。

3.信号(SIGNAL)信号说明语句格式如下:SIGNAL信号名:数据类型、约束条件[:=初始值];

信号赋值语句格式如下:信号名<=表达式;例如:

A<=BAFTER10ns;--有一定的延时

A<=expression_B;A<=expression_BAFTER10ns;--延时10ns变量与信号的差异1、赋值方式不同:变量:=表达式;信号<=表达式;2、硬件实现的功能不同信号代表电路单元、功能模块间的互联,代表实际的硬件连线变量代表电路单元内部的操作,代表暂存的临时数据3、有效范围不同信号(全局量):程序包、实体、结构体变量(局部量):进程、子程序在进程和子程序中,信号只能被使用,不能被定义说明变量与信号的差异4、赋值行为的不同:信号赋值延时更新数值,一般生成时序电路变量赋值立即更新数值,一般生成组合电路5、信号的多次赋值一个进程中,只最后一次赋值有效多个进程中变量与信号的差异由于信号赋值的延时性,赋新值发生在进程结束时,所以结果是a,b的值互换。由于变量赋值的立即更新,所以结果是a,b的值均为b。3.4.3数据类型数据类型举例整数

+136,+12456,-678实数(浮点数)

-2.0,+3.5,-1.0E38

BIT

‘0’,‘1’一定用单引号

BIT_VECTOR“10101111”,X“00BB”

STD_LOGIC

‘0’,‘1’,‘L’,‘H’…等9种取值布尔量(BOOLEAN)只有二种取值情况‘0’和‘1’或TRUE和FALSESTD_LOGIC_VECTOR“01100110”(STD_LOGIC数组)字符和字符串A~Z,0~9,a~z,“STRING”物理类型

Time_unitns(纳秒)ms(毫秒)错误等级

note,warning,error自然数、正整数大于0或等于0的整数3.4.3数据类型(1)整数在VHDL语言中整数的范围是-(231-1)~(231-1),即-2147483647~2147483647。整数可以用一系列二进制数来表示,但不能看做是BIT_VECTOR或STD_LOGIC_VECTOR。(2)实数实数类型也称浮点数类型,规定的浮点数范围是-1.0E+38~+1.0E+38。注意有的数字可用实数表示,也可用整数表示。例如+99.0是实数,+99是整数,两数虽然数值相同,但类型不同。3.4.3数据类型(3)BIT和BIT_VECTORBIT型又称位型,其取值只有‘0’和‘1’。而BIT_VECTOR实际上是BIT的数组。例如“01110111”或X“07FA”是BIT_VECTOR型数据,用来表示一个信号的值或用来表示总线信号的数值。由于BIT_VECTOR仅能表示逻辑“0”和“1”不能表示高阻、随意项、未知常用状态,实际可综合的程序中很少用。在可综合的VHDL语言程序中,实际上都采用STD_LOGIC和STD_LOGIC_VECTOR型数据。3.4.3数据类型(4)布尔量布尔量具有两种状态,“真”或者“假”。虽然布尔量也是二值枚举量,但它和BIT型不同,没有数值的含义,也不能进行算术运算,但它能进行关系运算。例如,它可以在IF语句中被测试,测试结果产生一个布尔量TRUE或者FALSE。一个布尔量常用来表示信号的状态或者总线上的情况。如果某个信号或者变量被定义为布尔量,那么在仿真中将自动地对其赋值进行核查。一般这一类型数据的初始值总为FALSE。3.4.3数据类型(5)STD_LOGIC和STD_LOGIC_VECTORSTD_LOGIC是VHDL语言中已定义的标准逻辑变量,有9种定义的可取值。例如:‘U’,‘X’,‘0’,‘1’,‘Z’,‘W’,‘L’,‘H’,‘-’其中’U’未初始化;‘X’强迫未知:‘0’强制0;‘1’强制1;‘Z’高阻;‘W’弱未知;‘L’为弱0;‘H’为弱1;‘-’为随意。对逻辑综合而言仅‘0’,‘1’,‘Z’和‘-’有意义。逻辑综合是将电路的行为级描述,特别是RTL级描述转化成为门级表达的过程。

STD_LOGIC_VECTOR是STD_LOGIC的数组。二者赋值只能是‘0’,‘1’或由二进制数组成的字符串“11001111”,不能赋16进制或8进制数。

3.4.3数据类型(6)字符和字符串字符在VHDL语言中也认为是一种数据类型,使用时要用单引号。例如‘A’,‘a’,‘B’,‘b’。注意单引号内字母大小写所代表的意义不同,‘1’和‘2’只是个字符量而已,不具有数值含义。VHDL语言中的字符串都带有双引号,例如“VHDL”,“ABCDE”,这些带有双引号的字符串常用于结构说明或程序提示。3.4.3数据类型(7)物理型数据表示时间的数据为物理型数据。这一数据类型在仿真时将要用到,逻辑综合不用。物理型数据可视为与物理单位有关的整数。能方便地用来表示、分析校验量纲。例如,下面的语句是STANDARD程序包给出的子句,它表示出time这个物理型数据的量纲和进位关系

TYPEtimeIS-2147483647TO2147483646UNITSfs;ps=1000fs;ns=1000ps;μs=1000ns;ms=1000μs;sec=1000ms;min=60sec;hr=60min;ENDUNITS3.4.4数据类型的转换在VHDL语言中数据类型的定义是很严格的,对于某一数据类型的变量、信号、常量及文件赋值时,数据类型必须一致。为了正确地进行代入或赋值,数据类型转换常常是非常必要的。为了实行类型转换,VHDL语言的程序包中提供了一些转换函数。表3-5程序包中转换函数及其功能

程序包名转换函数名转换函数功能STD_LOGIC_1164TO_STDLOGICVECTOR(A)TO_BITVECTOR(A)TO_STDLOGIC(A)TO_BIT(A)由BIT_VECTOR转换为STD_LOGIC_VECTOR

由STD_LOGIC_VECTOR转换为BIT_VECTOR

由BIT转换成STD_LOGIC

由STD_LOGIC转换成BITSTD_LOGIC_ARITHCONV_STD_LOGIC_VECTOR(A,位长)CONV_INTEGER(A)由INTEGER,UNSDGNED,SIGNED转换成指定位长的STD_LOGIC_VECTOR

由UNSIGNED,SIGNED转换成INTEGERSTD_LOGIC_UNSIGNEDCONV_INTEGER(A)由STD_LOGIC_VECTOR转换成INTEGER类型转换实例VARIABLEI:INTEGER;--变量I定义为整型。VARIABLER:REAL;--变量R定义为实型。I:=INTEGER(R);--把R转为整型后赋给整型变量I。R:=REAL(I);--把I转为实型后赋给实型变量R。SIGNALa:BIT_VECTOR(11DOWNTO0);SIGNALb:STD_LOGIC_VECTOR(11DOWNTO0);a<=x“A8”;--十六进制值可赋予位向量b<=x“A8”;--语法错,十六进制值不能赋予 STD_LOGIC_VECTOR类型b<=T0_STDLOGICVECTOR(X“AF7”);--将位向量转换成标准逻辑向量b<=TO_STDLOGICVECTOR(O“5177”);--将八进制表示位向量转换成标准逻辑向量b<=TO_STDLOGICVECTOR(B“1010_1111_0111”);--转换为标准逻辑向量3.4.5运算操作符在VHDL语言中共有4类运算操作符,逻辑运算关系运算算术运算并置运算需要注意的是操作数的类型应该和操作符所要求的类型一致。运算操作符的优先级。1.逻辑运算符VHDL语言中的逻辑运算符共有7种:AND——与OR——或NOT——取反NAND——与非NOR——或非XOR——异或XNOR——异或非必须注意的是,运算符的左边和右边,以及代入信号的数据类型必须是相同的,否则编译时会给出出错警告。适用数据类型:STD_LOGICBITSTD_LOGIC_VECTOR布尔型2.算术运算符在VHDL语言中,有如下10种算术运算符:

+加;

-减;*乘;/除;

MOD求模;

REM取余;

ABS取绝对值。

**指数;

+正;(一元运算)-负;(一元运算)可以为任何数据类型(整数、实数、物理量)具有相同的数据类型可以同为整数或实数。物理量可以被整数或实数相乘或相除,其结果仍为一个物理量求模和取余的操作数必须是同一整数类型数据。左操作数可以是任意整数或实数,而右操作数应为一个整数。2.算术运算符实际上能够真正综合逻辑电路的算术运算符只有“+”、“-”、“*”。在数据位较长的情况下,使用算术运算符进行运算,特别是使用乘法运算符时,应非常慎重。因为对于16位的乘法运算,综合时逻辑门电路会超过2000个门。3.关系运算符在VHDL语言中,有如下6种关系运算符:

=等于;

/=不等于;

<小于;

<=小于等于;

>大于;>=大于等于。在关系运算符的左、右两边是运算操作符,不同的关系运算符对两边的操作数的数据类型有不同的要求左、右两边的操作数的类型必须相同,但位长度不一定相同等号和不等号可以适用于所有类型的数据可使用于整数和实数、位等枚举类型以及位向量等数组类型3.关系运算符在利用关系运算符对位向量数据进行比较时,比较过程是从最左边的位开始,自左至右按位进行比较的。在位长不同的情况下,只能按自左至右的比较结果作为关系运算的结果。例如,对2位和3位的位向量进行比较:

SIGNALa:STD_LOGIC_VECTOR(2DOWNTO0);

SIGNALb:STD_LOGIC_VECTOR(1DOWNTO0);

a<=“011”;

b<=“11”;

IF(a<b)THEN┇ELSE┇ENDIF;4.并置运算符并置运算符“&”用于位和向量的连接,就是将运算符右边的内容接在左边的内容之后形成一个新的数组。例如:ARCHITECTUREexampleOFshiftrlISBEGINPROCESS(a)BEGINo1<=‘0’&a(7DOWNTO1);--右移一位o2<=a(6DOWNTO0)&‘0’;--左移一位o3<=a&b;--合并a,bENDPROCESS;ENDshiftrl;3.3VHDL常用语句VHDL的描述语句分为并行语句和顺序语句两种。1、并行处理(concurrent)语句的执行与书写顺序无关,并行块内的语句是同时执行的2、顺序处理(sequential)语句的执行按书写的先后次序,从前到后顺序执行。这种方式和其他普通编程语言(如c,pascal)是一样的。3.3VHDL常用语句Architecture中的语句及子模块之间是并行处理的子模块block中的语句是并行处理的子模块process中的语句是顺序处理的子模块subprogram中的function和procedure是顺序处理的Arcthitecture

构造体名of

实体名is[定义语句]内部信号、常数、元件、数据类型、函数等的定义

begin[并行处理语句和block、process、function、procedure]

end构造体名;内部顺序处理Architecture中的BlockBlock格式

块名:

BLOCK[定义语句]

begin[并行处理语句concurrentstatement]

endblock

块名Architecture中的Block条件Block格式

块名:

BLOCK

[(布尔表达式)]

[定义语句]

begin[并行处理语句concurrentstatement[信号]<=

guarded[信号,延时];

endblock

块名Architecture中的BlockBlock例子

myblock1:

block(clk=‘1’)

signal:qin:bit:=‘0’;

begin

qout<=guardedqin;

endblockmyblock1

myblock2:

block

begin

qout<=qin;

endblock

myblock2Architecture中的processProcess格式[进程名:]

process[(触发信号列表)][定义语句;]

begin[串行处理语句sequentialstatement;]

endprocessArchitecture中的processprocess例子

exp1:

process

(clk,qin)

variable:qin:bit:=‘0’;

begin

qout<=qin;

endprocessexp2:

process

begin

waiton

clk,qin;

qout<=qin;

endprocessArchitecture中的subprogramFunction(函数)格式:

function

函数名(参数1,参数2…...)

[定义语句]

return

数据类型名

is[定义语句]

begin[顺序执行语句]

return[返回变量名]

end函数名

Architecture中的subprogramFunction例子functionmax(a,b:bit)

returnbooleanisvariable:flag:boolean;beginif(a=b)thenflag<=true;

endifreturnflag;endmaxFunction中的参数不用说明方向(因为只有一种方向in)Architecture中的subprogramprocedure(过程)格式:

procedure

过程名(参数1,参数2…...)is[定义语句]

begin[顺序执行语句]

end

过程名

Architecture中的subprogramProcedure例子proceduremax(a,b:inbit;

flag:outboolean)isbeginif(a=b)thenflag<=true;

endifendmax;3.3.1并行语句在VHDL语言中,并行语句主要包括:并行信号赋值语句;块语句;进程语句;过程调用语句;参数传递语句(也称GENERIC语句);元件例化语句;生成语句;并行断言语句。1.并行信号赋值语句在VHDL语言中,并行信号赋值语句可分为以下3个子类型:并发信号赋值语句;条件信号赋值语句;选择信号赋值语句。上面信号赋值语句的共同特点就是语句执行都是并发的。并行处理语句concurrentstatement信号赋值操作符号“<=”进行信号赋值操作的,它可以用在顺序执行语句中,也可以用在并行处理语句中注意

1、用在并行处理语句中时,符号<=右边的值是此条语句的敏感信号,即符号<=右边的值发生变化就会重新激发此条赋值语句,也即符号<=右边的值不变化时,此条赋值语句就不会执行。如果符号<=右边是常数则赋值语句一直执行。

2、用在顺序执行语句中时,没有以上说法。并行处理语句concurrentstatement赋值语句例子Myblock:Blockbegin

clr<=‘1’after10ns;

clr<=‘0’after20ns;endblockmyblockprocessbegin

clr<=‘1’after10ns;

clr<=‘0’after20ns;endblockmyblock程序执行10ns后clr

为1,又过10ns后0赋给了clr,此时clr

以前的值1并没有清掉,clr将出现不稳定状态程序执行10ns后clr

为1,又过20ns后clr的值变为0,条件信号赋值语句条件信号赋值语句属于并发描述语句的范畴,可以根据不同的条件将不同的表达式的值赋给目标信号。条件信号赋值语句书写的一般格式为:

目标信号<=表达式1WHEN条件1ELSE

表达式2WHEN条件2ELSE

表达式3WHEN条件3ELSE…

表达式n-1WHEN条件n-1ELSE

表达式n;并行处理语句concurrentstatement条件信号带入语句例子Blockbegin

sel<=b&a;q<=ainwhensel=“00”elsebinwhensel=“01”elsecinwhensel=“10”elsedinwhensel=‘11”elsexx;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论