




已阅读5页,还剩260页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章VHDL语言基础,4.1VHDL概述4.2VHDL的基本结构4.3VHDL的数据及文字规则4.4VHDL的操作符(Operator)4.5VHDL的顺序语句(SequentialStatement)4.6VHDL的并行语句(ConcurrentStatement),4.1VHDL概述,4.1.1VHDL语言的起源VHDL语言起源于1983年,1986年IEEE标准化组织开始工作,讨论VHDL语言标准。1987年12月IEEE接受VHDL为标准HDL,这就是IEEEStd.l076-1987(LRM87)。1993年IEEE对VHDL重新修订,增加了一些功能,公布了新的标准版本IEEEStd.1076-1993(LRM93)。,4.1.2VHDL语言的特点VHDL主要用于描述设计复杂数字系统的结构、行为、功能和接口。它在进行工程设计方面有很多优点:(1)与其它的硬加描述语言相比,VHDL语言描述能力更强,从而决定了它成为系统设计领域最佳的硬件描述语言。,(2)VHDL语言技术完备,具有丰富的仿真语句和库函数,而且还支持同步电路、异步电路和其它电路的设计。(3)VHDL语言方法灵活,对设计的描述具有相对独立性。设计者可以不懂硬件结构,可以不管最终设计实现的目标器件,而进行独立的设计。(4)VHDL语言支持广泛,目前大多数EDA工具几乎在不同程度上都支持VHDL语言。,4.2VHDL的基本结构,一个完整的VHDL程序包含实体(ENTITY)、结构体(ARCHITECTURE)、库(LIBRARY)、程序包(PACKAGE)和配置(CONFIGURATION)五个部分。下面以一个实例来说明:例4.1是一个4选1多路选择器的VHDL语言描述,我们通过这个程序可以归纳出VHDL程序的基本模块结构。,【例4.1】LIBRARYIEEE;-库使用说明USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux41IS-实体说明PORT(a,b,c,d:INSTD_LOGIC;-输入端口说明sel:INSTD_LOGIC_VECTOR(1DOWNTO0);p:OUTSTD_LOGIC);-输出端口说明ENDENTITYmux41;,ARCHITECTUREchoiceOFmux41IS-结构体说明SIGNALable:STD_LOGIC_VECTOR(1DOWNTO0);BEGINableppppNULL;ENDCASE;ENDPROCESS;ENDchoice;,图4.1VHDL程序的基本结构示意图,从例4.1的描述可以看出,一个最基本的VHDL程序由三部分组成:库说明(LIBRARY)、实体说明(ENTITY)和结构体说明(ARCHITECTURE),其它的结构层次可根据需要选用。一个程序只能有一个实体,但可以有多个结构体。实际上,一个相对完整的程序有比较固定的结构,如图4.1所示。首先是库和程序包说明;然后是实体描述,在实体中又包含一个或多个结构体,并且在每一个结构体中可以包含一个或一个以上的进程和其它语句结构(块和进程语句将在4.6节中详细讲解);最后是配置说明。,4.2.1实体(ENTITY)实体是VHDL程序的一个基本设计单元,它可以单独编译,并且可以并入设计库。其功能是对设计实体与外部电路进行接口描述,例如它可以对一个门电路、一个芯片、一块电路板乃至整个系统进行接口描述。,1.实体结构根据IEEE标准,一个基本单元实体结构定义如下:ENTITY实体名ISGENERIC(类属表);PORT(端口表);实体说明部分;BEGIN实体语句部分;ENDENTITY实体名;,2.类属(GENERIC)说明类属参量常以一种说明的形式放在实体或块结构体前的说明部分。类属为实体和外部环境通信提供一种静态信息通道,尤其是用来规定实体端口的大小、设计实体的物理特性和结构体中的总线宽度等等。类属与常数不同,常数只能从设计实体内部得到赋值,并且不能再改变,而类属的值可以由设计实体外部提供。,类属说明的一般格式如下:GENERIC(constant常数名:数据类型:=设定值;constant常数名:数据类型:=设定值;);,3.端口说明端口(PORT)说明语句是对一个设计实体界面的说明。其端口表部分对设计实体与外部电路的接口通道进行了说明,其中包括对每一接口的输入输出模式(MODE)和数据类型(TYPE)进行了定义。实体端口说明的一般书写格式如下:PORT(SIGNAL端口名:模式数据类型;SIGNAL端口名:模式数据类型;);,端口模式用来说明数据、信号通过该端口的方向。VHDL提供了以下四种端口模式:(1)IN:输入,只读模式。该模式主要用于输入控制信号、地址、数据和时钟等。(2)OUT:输出,单向赋值模式。该模式主要用于输出控制信号、地址和数据等。,(3)INOUT:双向模式。可以读或写,便于识别信号的用途、来源和去向。(4)BUFFER:缓冲模式,实际上是双向端口。可以读或写,也可以用于反馈,只能有一个驱动源。VHDL对端口的读写总规则为:只有在端口为IN、INOUT或BUFFER时,才能从该端口读数据;只有在端口为OUT、INOUT或BUFFER时,才能向该端口写数据。,4.2.2结构体(ARCHITECTURE)结构体是设计实体中的一个组成单元,用于描述设计实体的内部结构和实体端口间的逻辑关系。结构体对基本设计单元的输入输出关系可以用行为(behavior)描述、数据流(dataflow)描述、结构(structure)描述和混合(mixture)描述四种方式进行描述。,1.结构体语句格式根据IEEE标准,结构体的语句格式如下:ARCHITECTURE结构体名OF实体名IS说明语句BEGIN功能描述语句ENDARCHITECTURE结构体名;,结构体以“ARCHITECTURE结构体名OF实体名IS”开始,以“ENDARCHITECTURE结构体名;”结束。实体名必须是设计实体的名字,结构体名可以自由选择,但一般把结构体的名字取为行为、数据流和结构。例4.1中的实体名是mux41,结构体名是choice。注意:如果一个实体有多个结构体时,结构体名不能重复。如例4.3中第一个结构体名为one,另一个为two。结构体内部构造的描述层次和描述内容如图4.2所示。通常一个完整的结构体由说明语句和功能描述语句两个基本部分组成,并不是所有的结构体同时具有图4.2的全部的说明语句结构。,图4.2结构体内部构造图,2.结构体说明语句结构体的说明语句必须放在关键词“ARCHITECTURE”和“BEGIN”之间,用于对结构体内部的功能描述语句中将使用的信号(SIGNAL)、数据类型(TYPE)、常数(CONSTANT)、元件(COMPONENT)、函数(FUNCTION)和过程(PROCEDURE)等进行说明。,3.功能描述语句功能描述语句位于“BEGIN”和“END”之间,其构造包含五种以并行方式工作的不同类型的语句结构,它们可以看成结构体的五个子模块,如图4.2所示。它们分别为:(1)块语句;(2)进程语句;(3)信号赋值语句;(4)子程序调用语句;(5)元件例化语句。,4.结构体子模块的设计方法对于一个层次复杂、功能丰富的结构体而言,用一个模块描述很不方便,故采用子模块来进行设计。结构体的子模块有上述五种形式,所以针对它们可以采用五种结构方式:(1)采用多个块的子模块方式;(2)采用多个进程的子模块方式;(3)采用多个信号赋值的子模块方式;(4)采用多个子程序的子模块方式;(5)采用多个元件例化的子模块方式。,4.2.3库(LIBRARY)VHDL库是用来放置和存储可编译的设计单元的仓库,这些设计单元可以是预先定义好的数据类型、子程序等设计单元的集合体(程序包),也可以是预先设计好的各种设计实体(元件库程序包)。,库的语句格式如下:LIBRARY库名;库名是一系列标识符,这一语句表示打开了以此库名命名的库,以便后面的设计实体可以利用其中的程序包。如例4.1中的“LIBRARYIEEE;”表示打开IEEE库。,1.库的种类VHDL语言中的库分为设计库和资源库两类。设计库不需要使用LIBRARY和USE子句声明;资源库是标准模块和常规元件存放的库,使用之前要声明。程序设计中常用的库有以下四种。1)IEEE库IEEE库是VHDL设计中最常见的资源库,包含有IEEE标准的STD_LOGIC_1164、NUMERIC_BIT和NUMERIC_STD程序包以及其它一些支持工业标准的程序包。,2)VITAL库VITAL库是除IEEE库外另一个广泛使用的资源库。这个库中包含预定的时序程序包(VITAL_TIMING)和基本元件程序包(VITAL_PRIMITIVES),可提高VHDL门级时序模拟的精度,因而只在VHDL仿真器中使用。VITAL程序包已经成为IEEE标准。3)STD库STD库是设计库,包含STANDARD和TEXTIO标准程序包。在VHDL应用环境中,随时可调用这两个程序包中的所有内容。,4)WORK库WORK库是另一个常见的设计库。它接受用户分析和修改的设计单元,是VHDL语言的工作库,用于存放用户设计和定义的一些设计单元和程序包。在实际应用中也不需要显式说明。,2.库的用法在VHDL设计中,库说明语句放在实体单元前面。LIBRARY字句使列出名字的库中的所有资源可见。这样,在设计实体内的语句就可以使用库中的数据和文件。VHDL语言允许在一个设计实体中同时打开多个不同的库,但库与库之间必须是相互独立的。,例4.1中最前面的两条语句:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;表示先打开IEEE库,再打开此库中的STD_LOGIC_1164程序包的所有内容。由此可见,在实际使用中,库以程序包集合的方式存在,具体调用的是程序包中的内容。,第一种:USE库名.程序包名.项目名;作用:向本设计实体开放指定库中的特定程序包内所选定的项目。例如:USEIEEE.STD_LOGIC_1164.RISING_EDGE;表明向当前设计实体开放了STD_LOGIC_1164程序包中的RISING_EDGE函数。,第二种:USE库名.程序包名.ALL;作用:向本设计实体开放指定库中特定程序包内所有的内容。,4.2.4程序包(PACKAGE)程序包是一个设计单元,包含有可用于其它设计单元的一系列说明。在设计实体中定义的数据类型、常数说明、子程序或数据对象对于其它设计实体是不可见的。为了使已定义的数据类型、常数及子程序能被更多的VHDL设计实体方便地访问和共享,VHDL提供了程序包机制。,一个程序包由程序包首和程序包体两部分组成。程序包的定义语句结构如下:PACKAGE程序包名IS-程序包首程序包首说明ENDPACKAGE程序包名;PACKAGEBODY程序包名IS-程序包体程序包体及包体内说明ENDPACKAGEBODY程序包名;,1.程序包首程序包首为程序包定义接口。程序包首说明部分可收集多个不同的VHDL设计所需的公共信息,包括数据类型说明、信号说明、子程序说明及元件说明等。所有这些信息说明定义放在程序包中可供随时调用,显然提高了设计效率和程序可读性。,【例4.2】LIBRARYIEEE;-库使用说明USEIEEE.STD_LOGIC_1164.ALL;PACKAGEbagIS-程序包首开始CONSTANTnum1:REAL:=3.1415926;-定义常数num1CONSTANTnum2:INTEGER;-定义常数num2FUNCTIONfun(a,b,c:REAL)RETURNREAL;-定义函数funCOMPONENTcomIS-定义元件comGENERIC(t1,t2:TIME:=3ns);-类属说明,PORT(in1,in2:STD_LOGIC);-端口说明ENDCOMPONENTcom;ENDPACKAGEbag;-程序包首结束PACKAGEBODYbagIS-程序包体开始CONSTANTnum2:INTEGER:=5;FUNCTIONfun(a,b,c:REAL)RETURNREALISBEGINRETURN(a+b+c)/3.0;ENDFUNCTIONfun;ENDPACKAGEBODYbag;-程序包体结束,在此例中,程序包名是bag,在其中定义了两个常数num1和num2,接着定义了一个函数fun,还定义了一个元件com。程序包中说明的标识符不是自动对其它设计单元可见,如果要使用程序包中的所有定义,可用USE语句。具体格式如下:USE程序包名.标识符名;USE程序包名.ALL;,要使用例4.2的程序包中的所有定义,可用如下语句:LIBRARYWORK;USEWORK.bag.ALL;WORK库是默认打开的,可省去“LIBRARYWORK”;语句,只要加入相应的USE语句即可。,2.程序包体程序包体是次级设计单元,包括在程序包首中已定义的子程序。程序包体说明部分内容可以是USE语句、子程序定义、子程序体、常数说明、数据类型说明和子类型说明等。在程序包中含有子程序说明时必须有对应的程序包体,如例4.2所示。,3.常用预定义程序包1)STD_LOGIC_1164程序包该程序包预先在IEEE库中编译,是IEEE库中最常用的标准程序包。STD_LOGIC_1164程序包定义了一些数据类型、子类型和函数,这些定义将VHDL扩展为一个能描述多值逻辑的硬件描述语言,很好地满足了实际数字系统的设计需求。,访问STD_LOGIC_1164程序包中的项目需要使用以下语句:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;该程序包中定义的数据类型包括:STD_ULOGIC、STD_ULOGIC_VECTOR、STD_LOGIC和STD_LOGIC_VECTOR,所有的标准运算符都对这些数据类型重载。其中用的最多最广的是STD_LOGIC和STD_LOGIC_VECTOR数据类型,它们的定义满足工业标准,非常适合FPGA/CPLD器件中多值逻辑设计结构。,2)STD_LOGIC_ARITH程序包该程序包预先编译在IEEE库中,是Synopsys公司的程序包。它在STD_LOGIC_1164程序包的基础上扩展了UNSIGNED、SIGNED和SMALL_INT三个数据类型,并定义了相关的算术运算符和转换函数。,3)STD_LOGIC_SIGNED和STD_LOGIC_UNSIGNED程序包这两个程序包都预先编译在IEEE库中,也是Synopsys公司的程序包。其中STD_LOGIC_SIGNED定义有符号数的运算,而STD_LOGIC_UNSIGNED定义运算符时没有考虑符号。它们重载后可用于INTEGER、STD_LOGIC和STD_LOGIC_VECTOR之间的混合运算,且定义了STD_LOGIC_VECTOR到INTEGER的转换函数。,4)STANDARD程序包该程序包是STD库中的预编译程序包,定义了一些基本的数据类型、子类型和函数。STANDARD程序包是VHDL标准程序包,在所有设计单元的开头隐性地打开了下面的语句:LIBRARYWORK.STD;USESTD.STANDARD.ALL;所以在实际应用中,不必再用LIBRARY和USE语句另作显式声明。,5)TEXTIO程序包该程序包也是STD库中的预编译程序包,定义了支持ASCIII/O操作的许多类型和子程序。,4.2.5配置(CONFIGURATION)配置是VHDL设计实体中一个最基本的单元,用于描述层与层之间的连接关系和实体与结构体之间连接关系。配置语句用来为比较大的系统设计提供管理和工程组织。通常在大且复杂的VHDL工程设计中,配置语句可以为一个确定的实体选择不同的结构体。,在综合或仿真中,利用VHDL语言的配置功能可以选择不同的结构体进行仿真和对比性能,从而得到最佳的设计目标。配置语句还能用于对元件的端口连接进行重新安排等。VHDL综合器允许将配置规定对一个设计实体中的最高层设计单元,但只支持对最顶层的实体进行配置。,配置语句的一般格式如下:CONFIGURATION配置名OF实体名ISFOR配置说明ENDFOR;END配置名;,【例4.3】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYand1ISPORT(x:INSTD_LOGIC;y:INSTD_LOGIC;z:OUTSTD_LOGIC);ENDENTITYand1;,ARCHITECTUREoneOFand1ISBEGINz=xANDy;ENDARCHITECTUREone:ARCHITECTUREtwoOFand1ISBEGINz=0WHEN(x=0)AND(y=0)ELSE0WHEN(x=0)AND(y=1)ELSE0WHEN(x=1)AND(y=0)ELSE1WHEN(x=1)AND(y=1)ELSE0;,ENDARCHITECTUREtwo;CONFIGURATIONerOFand1ISFORtwoENDFOR;ENDer;CONFIGURATIONyiOFand1ISFORoneENDFOR;ENDyi;,4.3VHDL的数据及文字规则,VHDL语言和其它高级语言一样,具有多种数据类型,其定义也与其它高级语言是一致的。语言要素是编程语句的基本单元。VHDL的语言要素主要是数据对象,其中包括变量、信号、常数、数据类型、各类操作数及运算操作符。,4.3.1VHDL的文字规则VHDL语言有固定的文字规则,有些方面类似于其它计算机高级语言,另外还有自己特有的文字规则和表达方式。VHDL文字主要包括数值和标识符。,1.数字型文字(1)整数文字:都是十进制的数。例如:2,108,13_254_297(=13254297),256E2(=25600)。(2)实数文字:都是十进制的数,但必须带有小数点。例如:18.93,34.97E-1(=3.497),6.35,18_670_21.453_9(=1867021.4539)。,(3)以数制基数表示的文字:用这种方式表示的数由5个部分组成。用十进制数标明数制进位的基数;数制隔离符号“#”;表达的文字;指数隔离符号“#”;用十进制表示的指数部分,这一部分的数如为0,则可省去不写。例如:2#1110#-(二进制表示,等于14)10#150#-(十进制表示,等于150)16#FE#-(十六进制表示,等于254)16#F.03#E+2-(十六进制表示,等于3843.00),(4)物理量文字:VHDL综合器不接受此类文字。例如:57A,30s,10m,2k。,2.字符串型文字字符是用单引号引起来的ASCII字符,可以是数值,也可以是符号或字母,例如:B,*,2,-,.;字符串则是双引号引起来的一维字符数组。有以下两种类型的字符串:1)文字字符串文字字符串是用双引号引起来的一串文字,如:“ERROR”,“X”。,2)数位字符串数位字符串也叫位矢量,是预定义的数据类型BIT的一位数组。数位字符串所代表的位矢量的长度即为等值的二进制数的位数。与文字字符串表示不同,数位字符串的表示先要有计算基数,后将该基数表示的值放在双引号中,基数符放在字符串的前面,用“B”、“O”和“X”表示。,3.标识符标识符的用法规定了VHDL语言书写符号的一般规则。标识符可以是常数、变量、信号、端口、子程序或参数的名字。1)短标识符VHDL短标识符的书写遵守如下规则:(1)有效字符:英文字母(az,AZ)、数字(09)和下划线(_)。,(2)标识符必须以英文字母开头。(3)必须是单一下划线“_”,且其前后都必须有英文字母或数字。(4)标识符中的英语字母不分大小写。,2)扩展标识符VHDL93版支持扩展标识符,它具有以下特点:(1)扩展标识符以反斜杠来界定,数字打头是合法的标识符。(2)允许包含图形符号、空格符,但没有格式的作用。(3)两个反斜杠之间允许有多个下划线相邻,扩展标识符要分大小写。(4)扩展标识符与短标识符永远不同。(5)扩展标识符如果含有一个反斜杠,则用两个反斜杠来表示。,4.下标名下标名用于指示数组变量或信号的某一元素。下标段名则用于指示数组型变量或信号的某一段元素。下标名的语句格式为标识符(表达式)标识符必须是数组型变量或信号的名字,表达式代表的值必须是数组下标范围中的一个值,这个值将对应数组中的一个元素。如果这个表达式是一个可计算的值,则此操作数可很容易地进行综合;如果是不可计算的,则只能在特定的情况下综合,且耗费资源较大。,【例4.4】SIGNALa,b:BIT_VECTOR(0TO4);SIGNALn:INTEGERRANGE0TO4;SIGNALx,y:BIT;x=a(n);-不可计算型下标表示y=b(4);-可计算型下标表示,5.段名段名对应数组中某一段的元素,是多个下标名的组合。其表达形式是标识符(表达式方向表达式)标识符必须是数组类型的信号名或变量名,每个表达式的数值必须在数组元素下标号范围以内,并且必须是可计算的立即数。方向用TO或者DOWNTO来表示,TO表示数组下标序列由低到高(如1TO6);DOWNTO表示数组下标序列由高到低(如5DOWNTO2),注意段中两表达式值的方向必须与原数组一致。,【例4.5】SIGNALa,b:BIT_VECTOR(0TO5);a(0TO2)=b(3TO5);a(3TO5)=b(0TO2);,4.3.2VHDL的数据对象(DataObject)在VHDL语言中,数据对象是一种存放值的容器。共有四类基本数据对象:常量、变量、信号和文件。前三种数据对象一直都存在,只有文件类型是在VHDL93标准中通过的。信号和变量都可以连续赋值;常量只能在说明的时候赋值且只能被赋值一次。,1.常量(CONSTANT)常量是一个恒定不变的值,如果作了数据类型和赋值定义,在程序中就不能再改变。常量的设置是为了使设计实体中的常数更容易阅读和修改。,CONSTANT常量名:数据类型:=表达式;常量的使用规则如下:(1)常量必须在程序包、实体、结构体、块、进程和子程序等设计单元中对有关项目进行指定。(2)常量的使用范围取决于被定义的位置。定义在程序包中的常量可在任何实体和结构体中调用;定义在实体或进程内的常量只能在实体或进程中使用。(3)定义的常量数据类型必须与表达式的数据类型一致。其数据类型可以是标量类型或复合类型,但不能是文件类型或存取类型。,2.变量(VARIABLE)变量是一个局部量,用在进程和函数结构中作局部的数据存储。变量的赋值立即发生,不存在任何延时。变量的定义形式与常量十分相似,其格式如下:VARIABLE变量名:数据类型约束条件:=表达式;,变量的使用规则如下:(1)变量赋值和初始化赋值都用“:=”表示。(2)变量赋的初值不是预设的,某一时刻只能有一个值。(3)变量不能用于在进程间传递数据。(4)变量不能用于硬件连线和存储元件。(5)仿真时,变量用于建模;综合时,变量充当数据的暂存。,3.信号(SIGNAL)信号是描述硬件系统的基本数据对象,是实体间动态数据交换的手段。在VHDL中,信号及其相关的信号赋值语句、决断函数、延时语句等很好地描述了硬件系统的许多基本特征。,信号的定义格式如下:SIGNAL信号名:数据类型约束条件:=表达式;信号赋值语句表达式如下:目标信号名=表达式;信号的使用规则如下:(1)“:=”表示对信号直接赋值,信号获得初始值不生产延时。(2)“=”表示对信号代入赋值,这种方式允许产生延时。,【例4.6】SIGNALa:STD_LOGIC:=0;SIGNALb:STD_LOGIC_VECTOR(15DOWNTO0);,【例4.7】.SIGNALa,b,c,x,y:INTEGER;.PROCESS(a,b,c)BEGINx=a*b;y2ms,a3=3);-整体赋值名字关联方式com.a1:=2ms;-等价单个元素赋值方式com.a2:=1;com.a3:=3;,4.3.4VHDL的类型转换VHDL语言对于某一数据类型的变量、信号和常量赋值时,类型一定要一致。在相互操作时,如果不一致,则需要使用显式类型转换。1.类型转换函数方式在VHDL程序设计中,可以用函数来实现类型转换。VHDL语言提供了类型转换函数来完成这项功能。,【例4.15】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYcntISPORT(clk:INSTD_LOGIC;output:INOUTSTD_LOGIC_VECTOR(3DOWNTO0);ENDcnt;LIBRARYDATAIO;USEDATAIO.STD_LOGIC_OPS.ALL;,ARCHITECTUREzhOFcntISBEGINPROCESS(clk)BEGINIFclk=1ANDclkEVENTTHENoutputresult(i):=0;WHEN1H=result(i):=1;WHENOTHERS=result(i):=xmap;ENDCASE;ENDLOOP;RETURNresult;END;,2.类型标记转换方式VHDL可以用类型标记转换方式实现类型转换。类型标记就是类型的名字,例如REAL就是把整数转换为实数的类型标记。通常,类型标记转换方式也称为直接类型转换方式。类型标记转换方式一般格式是:数据类型标识符(表达式),【例4.16】VARIABLEa:INTEGER;VARIABLEb:REAL;a:=INTEGER(b);b:=REAL(a);上例中的赋值语句可以正常工作。需要注意的是,实数转换成整数时会发生舍入误差。如果某实数的值正好处于两个整数的正中间,则转换的结果可能向任意方向靠拢。,一般情况下,类型标记转换方式必须遵循以下规则:(1)此方法仅限于非常关联的数据类型之间的类型转换,如整数和实数的类型转换。(2)如果两个数组的维数相同且元素属同一类型,并在各自的下标范围内索引是同一类型或非常接近的类型,那么这两个数组是非常关联类型。(3)枚举类型不能使用类型标记的方法进行类型转换。(4)在类型与其子类型之间不需要进行类型转换。,4.4VHDL的操作符(Operator),4.4.1操作符的种类VHDL语言有四类操作符,即逻辑操作符、关系操作符、算术操作符和符号操作符,见表4.2。在VHDL设计中,不同类型的数据对象对应不同类型的运算符。运算符和变量类型必须匹配。,表4.2VHDL的操作符列表,4.4.2操作符的优先级在VHDL语言中,各种操作符的优先级是不同的。其优先级别顺序参见表4.3。,表4.3VHDL操作符的优先级,4.4.3逻辑操作符(LogicalOperator)VHDL语言共有七种逻辑操作符(参见表4.2)。信号或变量在这些操作符的直接作用下,可构成组合电路。逻辑操作符要求操作数的数据类型有三种,即BIT、BOOLEAN和STD_LOGIC。操作数的数据类型也可以是一维数组,但必须为BIT_VECTOR或STD_LOGIC_VECTOR。,【例4.17】SIGNALa,b,c:STD_LOGIC_VECTOR(0TO4);SIGNALd,e,f,g:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALm,n,i,p,k:BOOLEAN;c=aORb;-a、b相或后赋值给cd=eANDfANDg;-两个操作符AND相同,不需括号k=(iXORn)AND(mORp);-操作符不同,必须加括号m=nANDpORk;-表达错误,两个操作符不同,未加括号b=aXORf;-表达错误,操作数a与f的位矢长度不一致n=iANDg-表达错误,i和n的数据类型不同,不能相互作用,4.4.4关系操作符(RelationalOperator)VHDL语言共有六种关系操作符(参见表4.2)。关系操作符的作用是将相同数据类型的数据对象进行数值比较或关系排序判断,并将结果用布尔类型(BOOLEAN)的数据表示出来,即TRUE或FALSE。VHDL规定,“=”和“/=”操作符的操作对象可以是VHDL中的任何数据类型构成的操作数。,4.4.5算术操作符(ArithmeticOperator)在表4.2中所列的17种算术操作符可以分成表4.4所示的五类操作符。,表4.4算术操作符分类表,1.移位操作符六种移位操作符是VHDL93标准新增的运算符。标准规定,移位操作符作用的操作数的数据类型是一维数组,并要求数组中的元素必须是BIT或BOOLEAN类型,移位的位数是整数。,【例4.18】VARIABLEyiwei:STD_LOGIC_VECTOR(3DOWNTO0):=(1,0,1,1);-设初始值.yiweiSLL1;-(0,1,1,0)-逻辑左移位数是1yiweiSRL3;-(0,0,0,1)-逻辑右移位数是3yiweiSLA3;-(1,1,1,1)-算术左移位数是3yiweiSRA1;-(1,1,0,1)-算术右移位数是1yiweiROL1;-(0,1,1,1)-逻辑循环左移位数是1yiweiROR3;-(0,1,1,1)-逻辑循环左移位数是3,2.求和操作符求和操作符包括加、减和并置操作符。加减操作符的运算与常规的加减法一致,VHDL规定它们操作数的数据类型是整数。对于位宽大于4的加法器和减法器,VHDL综合器将调用库元件进行综合。并置运算符(ENDBLOCKa2;,y=x;-此x来自a1块a4:BLOCK-定义块a4,套于a1块中BEGINeoutputoutputoutputoutput=s1;ENDCASE;ENDIF;ENDPROCESSbh;ENDARCHITECUREexample;,3.PROCESS的设计要点与BLOCK语句相比,进程语句结构具有许多显著的特点。进程的设计需要注意以下几方面的问题:(1)在进程中只能设置顺序语句。(2)进程语句中有一个敏感信号表,对于表中列出的任何信号的改变,都将启动进程,执行进程内相应顺序语句。,(3)结构体中多个进程能并行同步运行,原因是进程之间是通过传递信号和共享变量值来实现通信的。(4)进程是VHDL重要的建模工具。其结构不但为综合器所支持,而且进程的建模方式直接影响仿真和综合结果。,4.PROCESS的应用PROCESS结构描述了一个可以反复工作,靠敏感信号触发的硬件模块的行为,反映了实际硬件的工作情况。综合后的进程语句所对应硬件逻辑模块的工作方式可以是组合逻辑方式的,也可以是时序逻辑方式的。下面给出两个例子,分别是组合逻辑方式(有敏感信号表进程)的和时序逻辑方式(无敏感信号表进程)的,它们是等价的。,【例4.42】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYcountISPORT(clr:INSTD_LOGIC;in1:INSTD_LOGIC_VECTOR(2DOWNTO0);out1:OUTSTD_LOGIC_VECTOR(2DOWNTO0);ENDcount8;,ARCHITECTUREactOFcount8ISBEGINPROCESS(in1,clr)-有敏感信号表进程BEGINIF(clr=1ORin1=111)THENout1=000;-有清零信号或计数已达7,out1输出0,ELSE-否则作加1操作out1=in1+l;-注意,使用了重载算符+,重载算符+是在库里ENDIF;-STD_LOGIC_UNSIGNED中预先声明的ENDPROCESS;ENDact;,例4.42有一个产生组合电路的进程,它描述了一个八进制加法器,对于每3位输入in,此进程对其作加1操作,并将结果由out输出。由于是组合电路,故无记忆功能。,【例4.43】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYcount8ISPORT(clr:INSTD_LOGIC;c1k:INSTD_LOGIC;cnt:BufferSTD_LOGIC_VECTOR(2DOWNTO0);ENDcount8;,ARCHITECTUREactOFcount8ISBEGINPROCESS-无敏感信号表进程BEGINWAITUNTILclkEVENTANDclk=1;-待时钟clk的上沿IF(clr=1ORcnt=7)THENcnt=000;ELSE,cnt=cnt+1;ENDIF;ENDPROCESS;ENDact;,4.6.3并行过程调用语句(ConcurrentProcedureCall)过程是子程序的一种。并行过程调用语句可以作为一个并行语句直接出现在结构体中或块语句中。其语句格式如下:PROCEDURE过程名(敏感信号参数表)IS过程说明部分BEGIN顺序描述语句ENDPROCEDURE过程名;,【例4.44】PROCEDUREexam(SIGNALa:INSTD_LOGIC_VECTOR;-过程名为examSIGNALerror:OUTBOOLEAN)ISVARIABLEone:BOOLEAN:=FALSE;-设初始值BEGINFORiINaRANGELOOP-对位矢量a的所有的位元素进行循环检测,IFa(i)=1THEN-发现a中有1IFoneTHEN-若foundone为TRUE,则表明发现了一个以上的1ERROR=TRUE;-发现了一个以上的1,令one为TRUERETURN;-结束过程ENDIF;,Foundone:=TRUE;-在a中已发现了一个1ENDIF;ENDLOOP;-再测a中的其它位error=NOTone;-如果没有任何1被发现,error将被置TRUEENDPROCEDUREexam;,【例4.45】AA:BLOCKSIGNALa1:STD_LOGIC_VECTOR(0TO0);-过程调用前设定位矢尺寸SIGNALa2:STD_LOGIC_VECTOR(0TO3);SIGNALb1,b2:BOOLEAN;,BEGINexam(a1,b1);-并行过程调用,关联参数名为a1、b1exam(a2,b2);-并行过程调用,关联参数名为a2、b2ENDBLOCKAA;,4.6.4并行信号赋值语句(ConcurrentSignalAssignment)每一条信号赋值语句等价于一条对该信号赋值缩写的进程语句。并行信号赋值语句有三种形式:简单信号赋值语句、条件信号赋值语句和选择信号赋值语句。这三种信号赋值语句的共同点是:赋值目标必须都是信号;所有赋值语句在结构体内的执行是同时发生的,与它们的书写顺序和是否在块语句中没有关系。,1.简单信号赋值语句简单信号赋值语句是VHDL并行语句结构的最基本的单元,语句格式如下:赋值目标=表达式;,【例4.46】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYbcISPORT(a,b,c,d:INSTD_LOGIC;out1,out2:OUTSTD_LOGIC);ENDbc;ARCHITECTUREbinOFbcISSIGNALs:STD_LOGIC;BEGIN,out1=aORb;out2=c+d;A:BLOCKSIGNALe,f,g,h:STD_LOGIC;BEGINg=eORf;h=eANDf;ENDBLOCKA;s=g;ENDARCHITECTUREbin;,2.条件信号赋值语句条件信号赋值语句可以等价成由一组IF语句构成的进程语句。其语句的格式如下:标号:POSTPONED赋值目标=表达式WHEN赋值条件ELSE表达式WHEN赋值条件ELSE表达式;,在执行条件信号语句时,每个赋值条件按书写的先后关系逐项测定。赋值条件的数据类型是布尔量,如果赋值条件为“TRUE”,就把表达式的值赋予赋值目标。最后一项表达式可以不跟赋值条件,表示上面条件都不满足时,把该表达式的值赋予赋值目标信号。赋值条件语句允许有重叠现象。,【例4.47】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYencoderISPORT(input:INSTD_LOGIC_VECTOR(3DOWNTO0);output:OUTSTD_LOGIC_VECTOR(1DOWNTO0);ENDencoder;,A
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能化工生产-洞察与解读
- 钻孔桩水下打捞合同范本7篇
- 风险评估与量化-洞察与解读
- 2025年及未来5年中国高端女装市场竞争态势及行业投资潜力预测报告
- 微纳米颗粒清洗技术-洞察与解读
- 2025年度周口西华县中医院校园招聘17名考前自测高频考点模拟试题附答案详解
- 2025江苏泰州市第四人民医院招聘高层次人才15人考前自测高频考点模拟试题有完整答案详解
- 2025河南新乡市拓晋科技中等专业学校招聘模拟试卷及答案详解(网校专用)
- 2025黑龙江黑河市漠河市公益性岗位招聘18名考前自测高频考点模拟试题及完整答案详解
- 2025春季四川叙永县委组织部叙永县人力资源和社会保障局叙永县事业单位人才岗位需求70人考前自测高频考点模拟试题及答案详解(必刷)
- 监控验收单完整版本
- DL-T-5743-2016水电水利工程土木合成材料施工规范
- (正式版)YST 1682-2024 镁冶炼行业绿色工厂评价要求
- 体育健康知识教案课件
- 卡西欧dh800电吹管说明书
- 体育课免修申请书体育课免修申请书八篇
- 【超星尔雅学习通】商法的思维网课章节答案
- 509册泵类书籍大全-截止到20150531
- GB/T 5796.3-2022梯形螺纹第3部分:基本尺寸
- GA 576-2018防尾随联动互锁安全门通用技术条件
- 工厂化育苗基质与营养
评论
0/150
提交评论