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

下载本文档

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

文档简介

第3章硬件描述语言基础

内容提要:3.1VHDL基本结构3.2VHDL的对象、数据类型及运算操作符3.3VHDL的主要描述语句3.4VHDL的预定义属性3.5有限状态机.3.1VHDL的基本结构

一个完整的VHDL程序(源代码)通常包括以下5个部分:

实体(Entity):用于描述所设计的系统的外部信号。构造体(Architecture):用于描述系统内部的结构和行为配置(Configuration):用于从库中选取所需单元来组成系统设计的不同版本。包集合或程序包(Package):存放个设计模块都能共享的数据类型、常数和子程序等。库(Library):存放已经编译的实体、构造体、包集合和配置。可以由设计者生成和由ASIC芯片制造商提供。.1.USE定义区2.PACKAGE定义区3.ENTITY定义区4.ARCHITECTURE定义区定义元件库5.CONFIGURATION定义区定义使用那些自定义元件库定义电路实体的外观:I/O接口的规格描述电路内部的逻辑功能决定那一个architecture被使用.例:与非门的VHDL程序。Entitynand_2is---------------定义一个实体Port(a,b:instd_logic;--描述输入信号y:outstd_logic);--描述输出信号Endnand_2;Libraryieee;------------------IEEE库说明Useieee.std_Logic_1164.all;----定义元件库ARCHITECTURErtlOFnand_2ISBEGIN-------------结构体说明y<=NOT(aANDb);ENDrtl;.第3章硬件描述语言基础

内容提要:

3.1VHDL基本结构☞

3.1.1VHDL设计的基本单元及结构3.1.2结构体的描述形式3.1.3VHDL结构体的子结构3.1.4库、程序包和配置

3.2VHDL的对象、数据类型及运算操作符3.3VHDL的主要描述语句3.4VHDL的预定义属性3.5有限状态机.3.1.1VHDL设计的基本单元及结构

VHDL设计中的基本单元就是设计实体,它用以描述完整系统、电路板、芯片、逻辑单元或门电路。设计实体的组成:

实体说明(EntityDeclaration):描述一个设计的外貌,即对外的输入输出接口以及一些用于结构体的参数定义。

结构体或构造体(ArchitectureBody):描述的是设计的行为和结构,指定输入和输出之间的行为。.设计实体、实体说明和结构体之间的关系

实体说明结构体(1)

设计实体实体说明

结构体1

结构体2

结构体n(2)…

设计实体.Entityand_gateis

Port(a:inbit;b:inbit;c:outbit);Endand_gate;Architecturebehaveofand_gateisBeginc<=aandb;Endbehave;例一个二输入与门电路的VHDL描述。实体说明结构体实体名保留字说明:VHDL是不区分大小写的。可根据习惯书写。.

①实体说明功能:描述设计模块的输入/输出信号或引脚,并给出设计模块与外界的接口。实体类似一个“黑盒”,实体描述了“黑盒”的输入输出口。格式:

Entity实体名 is[Generic(类属表);][Port(端口表);]End[entity]实体名;注意:实体名要一致,必须与编程文件名一致。其中[entity]选项是VHDL-93语法的要求。类属参数说明端口说明.Entity__entity_nameis

Generic(__parameter_name:string:=__default_value; __parameter_name:integer:=__default_value);

Port( __input_name,__input_name:instd_logic; __bidir_name,__bidir_name:inoutstd_logic; __output_name,__output_name:outstd_logic);End__entity_name;类属参数说明端口说明.1)实体名实体名实际上是器件名,最好根据相应的电路功能确定。如4位2进制计数器用counter4b;8位加法器用add8b;3/8译码器用ym_38。实体名必须与程序的文件名相同,否则无法编译。实体名不能用工具库中定义好的元件名。实体名不能用中文,也不能用数字开头。.2)类属参数说明作用:用以将信息参数传递到实体。如定义端口宽度、器件延迟时间等。一般格式:其中:常数名由设计者确定;数据类型通常取integer或time等;提供时间参数、总线宽度等信息。Generic(常数名:数据类型[:=设定值; ……);如:Generic(awidth:integer:=3; timex:time);.使用类属参数说明语句易于使设计具有通用性。例:在电路中多次使用二输入与门电路,但延迟时间不同。二输入与门电路的VHDL程序。Entityand_gateis

Generic(delay:time);Port(a:inbit;b:inbit;c:outbit);Endand_gate;Architecturebehaveofand_gateisBeginc<=aandbafter(delay);Endbehave;.现在要求实现这样一个设计:由三个二输入与门电路组成下图所示的四输入与门功能,要求门1的延迟时间为5ns,门2的延迟时间为6ns,门2的延迟时间为7ns。.其VHDL程序如下:Entityand4isPort(a,b,c,d:inbit;q:outbit);Endand4;Architecturebehaveofand4iscomponentand_gate

Generic(delay:time);Port(a:inbit;b:inbit;c:outbit);Endcomponent;Signalq1,q2:bit;BeginU1:and_gategenericmap(5ns)Portmap(a,b,q1);U2:and_gategenericmap(6ns)Portmap(c,d,q2);U3:and_gategenericmap(7ns)Portmap(q1,q2,q);Endbehave;.3)端口说明说明内容

端口说明是用来描述设计实体与外部的接口,是对端口名称、数据类型和模式(方向)的描述。每一个输入输出信号都称为端口,对应于电路图上的一个引脚。格式Port(input_name,input_name:instd_logic;input_vector_name:instd_logic_vector(__highdownto__low);bidir_name,bidir_name:inout

std_logic;output_name,output_name:out

std_logic);端口名称端口模式数据类型.a.端口名称

是端口的标识符,由字母、数字和下划线组成,其命名规则为:第一个字符必须是字母;下划线不能连用;最后一个字符不能是下划线;不区分大小写;命名不能与保留字相同。

如:不合法的例子

_clk,8mclk,data__bus,buffer,data_.b.端口模式(方向):在端口说明中,模式有五种:输入、输出、双向、缓冲和链接。输入模式(in):信号自端口进入实体,而实体内部的信号不能从该端口输出。输出模式(out):信号从实体内部经该端口输出,而不能通过该端口向实体内部输入信号。双向模式(inout):可以输入也可以输出,实体内部的信号和外部向实体内部输入的信号都可以经过该端口。缓冲模式(buffer):可以作为实体内部的驱动即用于实体内部的反馈。只能连接内部信号和具有缓冲模式的端口。链接模式(linkage):用来说明端口无指定方向,可以与任意方向的信号相连。.说明:1)双向模式可以代替输入、输出和缓冲模式的任何一种。2)“out”和“buffer”都可以定义输出端口。其区别:图(a):只能用于输出。图(b):构造体内部也要使用该信号时,只能定义成“buffer”。.Port(d0,d1,sel:inbit;q:outbit;bus:outbit_vector(7downto0));c.数据类型在VHDL语言中有10种数据类型。在逻辑电路中只用到两种:bit(位)和bit_vector(位向量)。bit:为位逻辑数据类型,信号取值是逻辑值“1”和“0”。bit_vector:取值是一组二进制位的值。如:8位数据总线数端口.Libraryieee;Useieee.std_logic_1164.all;EntitymuisPort(d0,d1,sel:instd_logic;q:outstd_logic;bus:outstd_logic_vector(7downto0));3)在某些VHDL程序中,数据类型的说明符号有所不同,如:.实体举例Entityblack_boxisGeneric(constantwidth:integer:=7;);Port( clk,rst:instd_logic; d:instd_logic_vector(widthdownto0); q:out std_logic_vector(widthdownto0); co:outstd_logic);Endblack_box;黑盒rstd[7:0]clkq[7:0]co关键字类属参量端口定义端口模式端口数据类型实体结束.练习一

编写包含以下内容的实体代码: 端口D为12位输入总线; 端口OE和CLK都是1位输入; 端口AD为12位双向总线; 端口A为12位输出总线; 端口INT是1位输出; 端口AS是一位输出同时被用作内部反馈。my_designd[11:0]oeclkad[11:0]a[11:0]intas.练习一答案Libraryieee;Useieee.std_logic_1164.ALL;Entitymy_designisPORT(d:instd_logic_vector(11downto0); oe,clk:instd_logic; ad:inoutstd_logic_vector(11downto0); a:outstd_logic_vector(11downto0); int:outstd_logic; as:bufferstd_logic);Endmy_design;my_designd[11:0]oeclkad[11:0]a[11:0]intas.练习

1、编写包含全加器的实体代码。2、编写4选1数据选择器的实体代码。 Full_adderabcsumcoMux_41absycd.②结构体通过若干并行语句来描述设计实体的逻辑功能(行为描述)或内部电路结构(结构描述),从而建立设计实体输出与输入之间的关系。一个设计实体可以有多个结构体。结构体的结构:

Architecture<结构体名>of<实体名>is[结构体说明部分];Begin<并行处理语句>;End[architecture]<结构体名>;.Architectureaof__entity_nameis

Signalsignal_name:std_logic;

Signalsignal_name:std_logic;Begin

Enda;结构体说明并行处理语句--ProcessStatement;--ConcurrentProcedureCall;--ConcurrentSignalAssignment;--ConditionalSignalAssignment;--SelectedSignalAssignment; --ComponentInstantiationStatement;--GenerateStatement;.结构体名

对结构体的命名,是结构体的唯一标识符。Of后面的实体名表明了该结构的所对应的实体。结构体的名称可由设计者自己命名,通常把结构体命名为behavioral(行为)、dataflow(数据流)或者structural(结构)。结构体说明结构体说明用于对结构体内部所使用的信号、常数、数据类型和函数进行定义。最常见的是对内部流动的信号的定义。但不能定义变量。结构体说明部分位于结构体architecture和begin之间。格式

Signal

signal_name:bit;保留字信号名数据类型.并行处理语句并行处理语句具体地描述了结构体的行为和结构。并行处理语句位于结构体中begin和end之间。并行语句有五种类型,可以把它们看成结构体的五种子结构。这五种语句结构本身是并行语句,但内部可能含有并行运行的逻辑描述语句或顺序运行的逻辑描述语句,如进程内部包含的即为顺序语句。五种语句结构分别为块语句、进程语句、信号赋值语句、子程序调用语句和元件例化语句。例:进程(process)语句。[进程标号:]process[(敏感信号表)][is] [进程语句说明部分];

Begin <进程语句部分>;

Endprocess[进程标号];.Libraryieee;Uselibraryieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Entityadderisport(q1:instd_logic_vector(7downto0);q2:instd_logic_vector(7downto0);cs:instd_logic;q:outstd_logic_vector(7downto0));Endadder;Architecturebehaveofadderisbegin

process(cs)beginif(cs=‘1’)thenq<=q1+q2;endif;endprocess;Endbehave;实体描述结构体描述例:.结构体结构图结构体说明语句功能描述语句块语句进程语句信号赋值语句子程序调用语句元件例化语句由若干并行执行语句包装在一起形成一个子模块。定义顺序语句模块,用从外部获得的信号值,或内部的运算数据向其它的信号进行赋值。将设计实体内的处理结果向定义的信号或界面端口进行赋值用以调用过程或函数,并将获得的结果赋值于信号。元件调用,用来调用另一个实体所描述的电路。.实体和结构体之间的关系Input1InputnOutput1Outputn实体AMUX_Out2SelBCD.第3章硬件描述语言基础

内容提要:3.1VHDL基本结构

3.1.1VHDL设计的基本单元及结构

3.1.2结构体的描述形式

3.1.3VHDL结构体的子结构3.1.4库、程序包和配置

3.2VHDL的对象、数据类型及运算操作符3.3VHDL的主要描述语句3.4VHDL的预定义属性3.5有限状态机

.共有4种:结构(Structure)描述方式数据流(DateFlow)描述方式

行为(BehaviorProcess)描述方式混合描述方式采用后两种描述的可以进行逻辑综合,而采用行为的大部分只用于系统仿真,少数的也可以进行逻辑综合。3.1.2结构体的描述形式.①BehaviorProcess描述architectureoneofmux21isbeginy<=awhens='0'elseb;endone;真值表所谓行为描述,是对设计实体的数学模型进行描述。当要描述一个设计实体的行为时,只需要用一组状态来描述即可。即只描述所希望电路的功能或者电路行为(输入输出间转换的行为),而没有指明或涉及实现这些行为的硬件结构。与数字电路中的真值表描述相似。如:.行为描述抽象程度远远高于数据流和结构描述方式。行为描述类似于高级编程语言,当要描述一个设计实体的行为时,只需要用一组状态来描述即可。优点在于只需描述清楚输入与输出的关系,而不需要关注设计功能的门级描述。在行为描述方式的程序中大量采用算术运算、关系运算、惯性延时、传输延时等难于进行逻辑综合和不能进行逻辑综合的语句。一般用于系统模型的仿真或者系统工作原理的仿真。在VHDL中存在一些专门用于描述系统行为的语句。.1)代入语句是VHDL进行行为描述的最基本的语句。其格式为:信号量<=敏感信号量表达式如:a<=b;z<=anor(bnandc);具有延时时间的代入语句:

a<=bafter5ns;例:二输入与门

entityand2isport(a,b:inbit;c:outbit);endand2;architectureand2_behavofand2isBeginc<=aandbafter5ns;Endand_behav;.例:四选一电路的行为描述方法Libraryieee;Useieee.std_logic_1164.all;Entitymux4isport(i0,i1,i2,i3,a,b:instd_logic;q:outstd_logic);Endmux4;Architecturebehavofmux4issignalsel:integer;Beginwithselselect.

q<=i0after10nswhen0,i1after10nswhen1,i2after10nswhen2,i3after10nswhen3,‘X’after10nswhenothers;sel<=0whena=‘0’andb=‘0’else1whena=‘1’andb=‘0’else2whena=‘0’andb=‘1’else3whena=‘1’andb=‘1’else4;Endbehav;在第二个语句中,a和b是信号敏感量,当a和b任何一个值发生变化,该语句被执行;第一个语句的信号敏感量为sel。这两个语句是可以并发执行。.

2)延时语句在VHDL中有两种延时:惯性延时和传输延时。a.惯性延时在VHDL中,惯性延时是缺省的,不作特别的说明,产生的延时是惯性延时。在惯性模型中,系统和器件的输出信号发生变化必须有一段时间的延时。称为系统和器件的惯性或惯性延时。其特点:当一个系统或器件的输入信号变化周期小于惯性延时时,其输出保持不变。几乎所有器件都存在惯性延时,在代入语句总要加上惯性延时时间的说明。如:b<=aafter10ns;惯性延时只在行为仿真时有意义,逻辑综合时将被忽略。.b.传输延时在VHDL中,传输延时是不可缺省的,必须在语句中明确说明。常用于描述总线延时、连接线的延时及ASIC芯片中的路径延时。具有传输延时的代入语句。如:b<=transportaafter20ns;ab20ns.3)类属(Generic)说明语句类属说明的一般格式:

Generic(常数名:数据类型[:设定值]{;常数名:数据类型[:设定值]});类属参量是一种端口界面常数,常以一种说明的形式放在实体或块结构体的说明部分。类属为所说明的环境提供了一种静态信息通道。类属与常数不同,常数只能从设计实体的内部得到赋值,且不能再改变,而类属的值可以由设计实体外部提供。用于设计实体和其外部环境通信的参数和传递信息。从环境外部动态地接受赋值,类似于端口PORT说明。.[例]Libraryieee;Useieee.std_logic_1164.all;Entityandnisgeneric(n:integer);--定义类属参数及其类型port(a:instd_logic_vector(n-1downto0);--限制矢量长度c:outstd_logic);Endandn;ArchitecturebehavofandnisBeginprocess(a)variableint:std_logic;beginint:=‘1’;foriina’length-1downto0loopifa(i)=‘0’thenint:=‘0’;endif;endloop;c<=int;endprocess;Endbehav;.Libraryieee;Useieee.std_logic_1164.all;Entityexnisport(d1,d2,d3,d4,d5,d6,d7:instd_logic;q1,q2:outstd_logic);Endexn;Architectureexn_behavofexniscomponentandn--元件调用声明generic(n:integer);port(a:instd_logic_vector(n-1downto0);c:outstd_logic);endcomponentBeginu1:andngenericmap(n=>2);--定义类属变量,赋值为2portmap(a(0)=>d1,a(1)=>d2,c=>q1);u2:andngenericmap(n=>5);portmap(a(0)=>d3,a(1)=>d4,a(2)=>d5,a(3)=>d6,a(4)=>d7,c=>q2);Endexn_behav;例:.4)类属映射语句

格式为:genericmap(类属表)描述相应元件类属参数间的衔接和传送方式。用于设计从外部端口改变元件内部参数或结构规模的元件,或称类属元件,这些元件在例化中特别方便,在改变电路结构或元件升级方面显得尤为便捷。与端口映射语句portmap()具有相似的功能和使用方法,类属参数衔接表达方式相同。.全加器:ABCinSCoBACinSCo0000001010100101100100110011011010111111真值表:规律:S:1010Co:1100add1.Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Entityadd1isport(A:instd_logic;B:instd_logic;Cin:instd_logic;Co:outstd_logic;S:outstd_logic);Endadd1;实现全加器功能的行为描述:Architecturebehaveofadd1isBeginprocess(A,B,Cin)variablen:integerrange0to3;constantS_vector:std_logic_vector(0to3):=“1010”;constantCo_vector:std_logic_vector(0to3):=“1100”;beginn:=0;if(A=‘1’)thenn:=n+1;endif;if(B=‘1’)thenn:=n+1;endif;if(Cin=‘1’)thenn:=n+1;endif;S<=S_vector(n);Co<=Co_vector(n);Endprocess;Endbehave;.程序仿真结果.architectureoneofmux21isbeginy<=(aand(nots)or(bands);endone;②DateFlow描述

(也称为寄存器传输描述方式)逻辑函数式类似于寄存器传输级的方式描述数据的传输和变换,与数字电路中的逻辑表达式描述相似。数据流描述方式是对从信号到信号的数据流的路径形式的描述,因此很容易进行逻辑综合。要对信号的流动路径进行描绘,要求对设计实体以及内部电路要有一定的认识。.例:全加器逻辑描述.Libraryieee;Useieee.std_logic_1164.all;Entityadd1isport(A:instd_logic;B:instd_logic;Cin:instd_logic;Co:outstd_logic;S:outstd_logic);Endadd1;Architecturedataflowofadd1isSignaltmp1,tmp2:std_logic;Begintmp1<=AxorB;tmp2<=tmp1andCin;S<=tmp1xorCin;Co<=tmp2or(AandB);Enddataflow;实现全加器功能的数据流描述.程序仿真结果.③

Structure描述根据硬件结构描述该设计单元,即描述该硬件是如何构成的,类似于数字电路中的逻辑图描述。

结构描述方式就是在多层次的设计中,通过调用库中的元件或是已经设计好的模块来完成设计实体功能的描述。即高层次的设计模块调用低层次的设计模块。结构体中描述元件(或模块)和元件(或模块)之间的互连关系,就像网表一样。逻辑图.architectureoneofmux21issingled,e:bit;begind<=aand(not)s;e<=bands;y<=dore;endone;例.1)结构描述步骤:例化元件的创建创建一个具有所需功能的项目,并将其保存在工作库中。元件的说明在引用例化元件时,在结构体说明部分进行例化元件的说明。元件的例化在使用元件时,采用元件例化语句对要引用的元件进行例化。如portmap。.2)元件例化语句语句格式:

Component元件名

is--元件定义语句

Generic(类属表);

Port(端口名表);

Endcomponent元件名;例化名:元件名portmap(

--元件例化语句

[端口名=>]连接端口,…);元件定义语句相当于对一个现成的设计实体进行封装,使其只留出对外的接口界面。类属表可列出端口的数据类型和参数,端口名表列出对外的个端口名。元件例化语句中的例化名必须存在。类似于电路板中的插座名,而元件名则是准备在此插座上插入的元件名。portmap是端口映射的意思。.端口映射方法指下一层元件的端口信号与实际信号的连接关系。有两种映射方法:位置映射和名称映射。位置映射在下一层中元器件端口说明中的信号书写顺序位置和portmap()中指定的实际信号书写顺序位置一一对应。如:在二输入与门中端口的输入输出定义为:

port(a,b:inbitc:outbit);

在设计的引用中u2的信号对应关系描述为:

u2:and2portmap(nsel,d1,ab);

即u2的nsel

对应a,d1对应b,ab对应c。.名称映射将已经存在于库中的现成模块的各端口名称,赋予设计中模块的信号名。例如:

u2:and2portmap(a=>nsel,b=>d1,c=>ab);在输出信号没有连接的情况下,对应端口的描述可以省略。Portmap()句中的位置可以是任意的。.全加器的原理框图.Libraryieee;Useieee.std_logic_1164.all;Entityadd1isport(A:instd_logic;B:instd_logic;Cin:instd_logic;Co:outstd_logic;S:outstd_logic);Endadd1;Architecturestructureofdd1isComponentand2Port(a:instd_logic;b:instd_logic;c:outstd_logic);Endcomponent;实现全加器功能的结构描述Componentor2Port(a:instd_logic;b:instd_logic;c:outstd_logic);Endcomponent;Componentxor2Port(a:instd_logic;b:instd_logic;c:outstd_logic);Endcomponent;signaltmp1,tmp2,tmp3:std_logic;BeginU1:xor2portmap(A,B,tmp1);U2:and2portmap(tmp1,Cin,tmp2);U3:xor2portmap(tmp1,Cin,S);U4:and2portmap(A,B,tmp3);U5:or2portmap(tmp2,tmp3,Co);Endstructure;.④混合描述方式混合描述方式就是上述三种描述方式的组合。小结:行为描述方式→真值表数据流描述方式→逻辑表达式结构描述方式→电路图

四种描述风格各有各的特点。常用的是结构描述和混合描述方式。信号流描述方式最简单实用。最不常用的是行为描述方式,因为行为描述中有一些语句不能进行逻辑综合和难于综合。.第3章硬件描述语言基础

内容提要:3.1VHDL基本结构

3.1.1VHDL设计的基本单元及结构

3.1.2结构体的描述形式

3.1.3VHDL结构体的子结构

3.1.4库、程序包和配置

3.2VHDL的对象、数据类型及运算操作符3.3VHDL的主要描述语句3.4VHDL的预定义属性3.5有限状态机

.3.1.3VHDL结构体的子结构对于大型设计,一般将其划分为几个相对比较独立的模块。一个设计的结构体就可以用几个子结构来表示。提高设计的条理性和程序的可读性。有三种子结构:

块(Block)语句结构进程(process)语句结构子程序(subprograms)结构.①块语句[块标号:]block[卫式表达式][类属子句[类属接口表;]];[端口子句[端口接口表;]];[块说明部分];Begin<块语句部分>;Endblock[块标号];一个设计的结构体对应于总电路原理图,而块语句就对应于总电路原理图中的子原理图。块语句的结构.Libraryieee;Useieee.std_logic_1164.all;Entitymux2isport(d0:instd_logic_vector(3downto0);d1:instd_logic_vector(3downto0);s:instd_logic;y:outstd_logic_vector(3downto0));Endentitymux2;Architecturedataflowofmux2issignaltmp1,tmp2,tmp3:std_logic_vector(3downto0);Beginlabel1:blockbegintmp1(3)<=d0(3)ands;tmp1(2)<=d0(2)ands;tmp1(1)<=d0(1)ands;tmp1(0)<=d0(0)ands;tmp2(3)<=d1(3)and(nots);tmp2(2)<=d1(2)and(nots);tmp2(1)<=d1(1)and(nots);tmp2(0)<=d1(0)and(nots);tmp3<=tmp1ortmp2;y<=tmp3;endblocklabel1;Enddataflow;例:2-1多路选择器.程序仿真结果.Block和子原理图的关系Block1Block2Block3Block4子图1子图2子图3子图3EntityseparateArchitectureBlock1BlockBlock2BlockBlock3BlockBlock4Block.

块语句还有一种特殊的控制方式:在块语句中包含一个卫式表达式。

当卫式表达式是真时,执行块语句;当卫式表达式是假时,不执行块语句。这种通过卫式表达式来对块中的驱动器进行使能控制的块语句就称为卫式块语句。块语句部分所描述的各个语句都是并行执行的语句,与书写顺序无关,这种语句在VHDL中将可并行执行的语句称为并发语句。块语句的并发性卫式块语句Block[卫式表达式].Libraryieee;Useieee.std_logic_1164.all;Entitydffisport(d,clk:instd_logic;q,qb:outstd_logic);Enddff;ArchitecturedataflowofdffisBeginlabel1:block(clk=‘1’)beginq<=guardeddafter3ns;qb<=guarded(notd)after5ns;Endblocklabel1;Enddataflow;例:D触发器卫式表达式前卫关键词guarded表示只有卫式表达式为真时语句才被执行dclkqqb.②进程语句在一个设计实体的结构体中,所有的处理语句都是并行处理语句,但是仍然存在顺序语句。并行语句是并行执行,与书写顺序无关。顺序语句是一个接一个按照严格顺序来执行的。进程语句本身是并行语句,进程与进程之间是并行执行的,但进程内部的语句是顺序语句,内部是顺序执行的。.1)结构[进程标号:]PROCESS[敏感信号表][is][进程语句说明部分];BEGIN <进程语句部分>;ENDPROCESS[进程标号];进程标号是一个进程的名字标号,它是一个可选项。敏感信号表中可以是一个或多个信号,当其中的信号值改变时,则在进程内部引起语句执行。当进程中没有敏感信号表时,进程语句中必须有其他形式的敏感信号激励;当进程中有敏感信号表时,进程语句就不允许再显示wait、waitfor、waituntil和waiton中的任何一种语句。.进程语句说明部分用来定义局部数据环境,主要包括数据类型说明、子程序说明和变量说明等。进程语句部分是用来设计某一个功能独立的电路。与块语句的区别在于:块语句中的块语句部分是并行执行的;而进程语句中的进程语句部分则是按照顺序一条条向下执行的,与语句书写的顺序有关。进程可以看成是无限循环的。激励条件满足后,进程启动,begin和endprocess间的语句将从上到下顺序执行一次;当执行完最后一条语句后,返回进程的第一条语句,等待满足下一次激励条件。.process_label:PROCESS(signal_name,signal_name) VARIABLEvariable_name:STD_LOGIC; VARIABLEvariable_name:STD_LOGIC;BEGIN --SignalAssignmentStatement --VariableAssignmentStatement --ProcedureCallStatement --IfStatement --CaseStatement --LoopStatementENDPROCESS__process_label;.注意:进程中语句的顺序性在系统仿真时,进程结构中的语句是按顺序一条一条向下执行的。与语句书写的顺序有关。进程的启动

执行状态:当敏感信号发生变化(由“0”变为“1”或由“1”变为“0”)或激励条件满足时,进程启动,begin和endprocess间的语句将从上到下顺序执行一次;当执行完最后一条语句后,返回进程的第一条语句,等待满足下一次激励条件。敏感信号信号变化一次,进程执行一次。

等待状态:当敏感信号不发生变化或激励条件不满足时,进程处于等待状态。.Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Entitymux4isport(d0:instd_logic_vector(7downto0);d1:instd_logic_vector(7downto0);d2:instd_logic_vector(7downto0);d3:instd_logic_vector(7downto0);s0:instd_logic;s1:instd_logic;q:outstd_logic_vector(7downto0));Endentitymux4;例:4-1多路选择器.Architecturebehaveofmux4isBeginlabel1:process(d0,d1,d2,d3,s0,s1)variabletmp:integerrange0to3;begintmp:=0;if(s0=‘1’)thentmp:=tmp+1;endif;if(s1=‘1’)thentmp:=tmp+2;endif;casetmpiswhen0=>q<=d0;when1=>q<=d1;when2=>q<=d2;when3=>q<=d3;whenothers=>null;endcase;endprocesslabel1;Endbehave;.程序仿真结果.2)进程同步在每个结构体中可以有多个进程语句,多个进程语句之间是并行的关系。ArchitecturedataflowofexampleisBegin

Enddataflow;label2:processbeginwaituntilclk=‘0’;q2<=d;Endprocesslabel2;label1:processbeginwaituntilclk=‘1’;q1<=d;Endprocesslabel1;说明:第1个进程表示当clk为高时,将数据送至q1;第2个进程表示当clk为低时,将数据送至q2;两个进进程并发执行。.程序仿真结果.同一个结构体中不仅可以存在多个进程,而且多个进程之间还可以互相通信,同步执行。Architecturertlofsyncissignalcounter:integer;Begin

Endrtl;label1:processbeginwaituntilclk=‘1’;counter<=counter+1;Endprocesslabel1;label2:processbeginwaituntilclk=‘1’;if(counter=4)thenirq<=‘0’;elseirq<=‘1’;Endif;Endprocesslabel2;.程序仿真结果.ArchitecturebehaveofclockisBeginlabel1:process(clk)begin

if(clk'eventandclk='1')thenq1<=b;endif;Endprocesslabel1;label2:process(clk)begin

if(clk='1')thenq2<=b;endif;Endprocesslabel2;在进程中,用时钟来进行同步是常常使用的,下面介绍几种不同描述方法:label3:processbegin

waituntilclk='1';q3<=b;Endprocesslabel3;label4:process(clk)begin

if(clk’last_valueandclk’eventandclk='1')thenq2<=b;endif;Endprocesslabel2;Endbehave;.程序仿真结果.③子程序结构子程序就是在主程序调用它以后能够将处理结果返回主程序的程序模块。它们可以被反复调用,避免大量重复源代码的书写。子程序通常包括子程序说明部分和子程序定义部分。子程序说明部分主要定义了其他设计调用该子程序时的接口,子程序定义部分则描述该子程序具体功能的实现。在VHDL中,子程序有两类类型:过程和函数。两者的区别在于:过程可以返回多个值,而函数只能返回一个值;过程中参数可以有三种模式:in、out和inout,而函数中参数只有in方式;过程中可以有wait语句,而函数中却不能有该语句。.1)过程Procedure<过程名>([对象种类]参数名[,参数名…]:[方式]类型;[对象种类]参数名[,参数名…]:[方式]类型;[对象种类]参数名[,参数名…]:[方式]类型;……);Procedure<过程名>([对象种类]参数名[,参数名…]:[方式]类型;[对象种类]参数名[,参数名…]:[方式]类型;……)is[常量说明;][变量说明;][类型说明;]Begin<过程语句部分>;End[procedure]<过程名>;过程定义的结构过程说明的结构.参数有三种方式:in、out和inout,默认方式为in。过程中的参数可以接受变量、常量和信号作为对象种类。输入(in)默认为常量,输出(out和inout)默认为变量。常量说明、变量说明和类型说明主要是对过程中要使用的常量、变量和类型进行说明,且说明只在该过程中有效。在过程中不能定义新的信号。过程定义的位置有三个:程序包(package)、结构体(architecture)和进程(process)过程调用的方式有两种:并行过程调用(在结构体并行处理语句部分)顺序过程调用(在进程语句或另一个子程序内部).Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Entityconvertisport(i:instd_logic_vector(3downto0);f:outboolean;o:inoutintegerrange0to15);Endconvert;Architecturebehaveofconvertisprocedurevector_to_int(input:instd_logic_vector;flag:outboolean;q:inoutinteger)is

例:将位矢量转换成整数beginq:=0;flag:=false;foriininput’rangeloopq:=q*2;if(input(i)=‘1’)thenq:=q+1;elsif(input(i)/=‘0’)thenflag:=true;endif;endloop;endvector_to_int;Beginprocess(i)variablea:boolean;variableb:integer;beginvector_to_int(i,a,b);f<=a;o<=b;endprocess;Endbehave;.提示:该程序执行循环语句时候,循环变量i是不需要人为定义的。且i的取值是从3取到0,该条件语句相当于foriin3to0loop。该程序定义过程是在结构体中,因此应在结构体中被调用。该程序调用过程是采用顺序过程调用语句。.程序仿真结果.Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Entityconvert2isport(i1,i2:instd_logic_vector(3downto0);f1,f2:outboolean;o1,o2:inoutintegerrange0to15);Endconvert2;Architecturebehaveofconvert2isprocedurevector_to_int(input:instd_logic_vector;signalflag:outboolean;signalq:inoutinteger)is例:将位矢量转换成整数.

beginq<=0;flag<=false;foriininput’rangeloopq<=q*2;if(input(i)=‘1’)thenq<=q+1;elsif(input(i)/=‘0’)thenflag<=true;endif;endloop;endvector_to_int;Beginvector_to_int(i1,f1,o1);process(i2)beginvector_to_int(i2,f2,o2);endprocess;Endbehave;

并行调用顺序调用.注意:该程序中过程说明中将其输出q和flag定义为信号类型。过程中,变量参数不允许出现在并行过程调用语句中,而信号参数可以。由于过程定义的参数为信号类型,因此在调用过程时,可以直接用输出信号作为实参。该程序调用过程时既采用了顺序过程调用语句,又有并行过程调用语句。在MAX+PLUS2中不支持过程并行调用,也不支持信号参数。.2)函数function<函数名>([对象种类]参数名[,参数名…]:[in]类型;[对象种类]参数名[,参数名…]:[in]类型;[对象种类]参数名[,参数名…]:[in]类型;……)return类型;function<函数名>([对象种类]参数名[,参数名…]:[in]类型;[对象种类]参数名[,参数名…]:[in]类型;……)return类型is[常量说明;][变量说明;][类型说明;]Begin<函数语句部分>;Return(表达式);End[function]<函数名>;函数说明的结构函数定义的结构.函数中参数只有一种方式:in,因此参数的方式说明可以省略。函数中的参数只可以接受常量和信号作为对象种类。如果没有指定,则默认为常量。常量说明、变量说明和类型说明主要是对函数中要使用的常量、变量和类型进行说明,且说明只在该函数中才有效。在函数中不能定义新的信号。函数总要返回一个值,该值的数据类型在函数参数说明之后进行说明。函数定义的位置:程序包(package)、结构体(architecture)、进程(process)、实体说明部分.函数在不同位置的定义a.在程序包中的定义例:求最大值Libraryieee;Useieee.std_logic_1164.all;Packageexampleisfunctionmaximum(a,b:integerrange0to100)returninteger;endexample;Packagebodyexampleisfunctionmax

温馨提示

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

评论

0/150

提交评论