一、VHDL语言的基本语法1、VHDL语言的标识符VHDL中的标识符可以是常数、变量、信号、端口、子程序或参数的名字。使用标识符要遵守如下规则:标识符由字母(A…Z,a…z)、数字和下划线字符组成;任何标识符必须以英文字母开头;末字符不能为下划线;不允许出现两个连续下划线;标识符中不区分大小写字母;VHDL定义的保留字或称关键字,不能用作标识符;VHDL中的注释由两个连续的虚线(--)开始,直到行尾;VHDL语言要素[例]_Decoder_1--起始为非英文字母3DOP--起始为数字Large#number--“#”不能成为标识符的构成符号Date__bus--不能有双下划线Copper_--最后字符不能为下划线on--关键字2、VHDL语言的数字2.1数字型文字的值有多种表达方式,现列举如下:(1)整数文字:整数文字都是十进制的数,如:5,678,0,156E2(=15600),45_234_287(=45234287)(2)实数文字:实数文字也都是十进制的数,但必须带有小数点,如:188.993,88_670_551.453_909(=88670551.453909),1.0,44.99E-2(=0.4499),1.335,0.0数字前可加0,数字中间不能有空格2.2以数制基数表示的文字:数制#基数#指数数制和指数部分是用十进制数表示的数。指数部分的数如果是0可以省去不写。现举例如下:10#170#--(十进制数表示,等于170)2#1111_1110#--(二进制数表示,等于254)16#E#E1--(十六进制数表示,等于2#11100000#,等于224)16#F.01#E+2--(十六进制数表示,等于3841.00)8#377#--(与16#FF#,016#0FF#,2#11111111都为255)3、字符串型文字字符是用单引号引起来的ASCII字符,可以是数值,也可以是符号或字母,如:‘R’,‘A’,‘*’,‘Z’。而字符串则是一维的字符数组,须放在双引号中。VHDL中有两种类型的字符串:文字字符串和数位字符串。文字字符串是用双引号引起来的一串文字,如:“ERROR”,“BOTHSANDQEQUATOL”,“X”,“BB$CC”进制基数符号“数位字符串”(1)文字字符串(2)数位字符串也称数值字符串、位矢量,是预定义的数据类型BIT的一维数组,它们所代表的是二进制、八进制或十六进制的数组,其位矢量的长度即为等值的二进制数的位数。例如:B“1_1101_1110”--二进制数数组,位矢数组长度是9X“AD0”--十六进制数数组,位矢数组长度是12B:二进制基数符号,表示二进制数位0或1。O:八进制基数符号。X:十六进制基数符号(0~F)。4、下标名及下标段名下标名用于指示数组型变量或信号的某一元素,如:a(2),b(n)下标段名则用于指示数组型变量或信号的某一段元素,其语句格式如下:数组类型信号名或变量名(表达式1[TO/DOWNTO表达式2]);SIGNALA,B,C:BIT_VECTOR(0TO7);SIGNALM:INTEGERRANGE0TO3;SIGNALY,Z:BIT;Y=A(M);--M是不可计算型下标表示Z=B(3);--3是可计算型下标表示C(0TO3)=A(4TO7);-以段的方式进行赋值C(4TO7)=A(0TO3);-以段的方式进行赋值如下是下标名及下标段名使用示例:1、常数(Constant)常数是一个固定的值,主要是为了使设计实体中的常数更容易阅读和修改。常数一旦被赋值就不能再改变。一般格式:CONSTANT常数名:数据类型:=表达式;例:CONSTANTfbus:BIT_VECTOR:=“01011001”;--总线上数据设备向量CONSTANTdely:TIME:=25ns;--输入/输出的延迟时间常数所赋的值应与定义的数据类型一致。二、VHDL语言的数据对象常量的使用范围取决于它被定义的位置:(1)程序包中定义的常量具有最大的全局化特性,可以用在调用此程序包的所有设计实体中;(2)设计实体中定义的常量,其有效范围为这个实体定义的所有的结构体;(3)设计实体中某一结构体中定义的常量只能用于此结构体;(4)结构体中某一单元定义的常量,如一个进程中,这个常量只能用在这一进程中。2、变量(Variable)变量是一个局部变量,它只能在进程语句、函数语句和过程语句结构中使用,用作局部数据存储。变量常用在实现某种算法的赋值语句中。VARIABLE变量名:数据类型约束条件:=表达式;例:VARIABLEx,y:INTEGER;--定义x,y为整数变量VARIABLEcount:INTEGERRANGE0TO255:=10;--定义计数变量范围一般格式:变量赋值语句的语法格式如下:目标变量:=表达式;(1)赋值语句右方的表达式必须是一个与目标变量有相同数据类型的数值。(4)若将变量用于进程之外,必须将该值赋给一个相同的类型的信号,即进程之间传递数据靠的是信号。(2)变量不能用于硬件连线和存储元件。(3)变量的适用范围仅限于定义了变量的进程或子程序中。[例]VARIABLEx,y:REAL;VARIABLEa,b:BIT_VECTOR(0TO7);x:=100.0;--实数赋值,x是实数变量y:=1.5+x;--运算表达式赋值,y也是实数变量a:=b;a:=”1010101”;--位矢量赋值,a的数据类型是位矢量a(3TO6):=(‘1’,’1’,’0’,’1’);--段赋值a(0TO5):=b(2TO7);a(7):=’0’;--位赋值3、信号(Signal)信号是描述硬件系统的基本数据对象,它类似于连接线。它除了没有数据流动方向说明以外,其他性质与实体的端口(Port)概念一致。信号说明格式为:SIGNAL信号名:数据类型约束条件:=初始值;信号初始值的设置不是必需的,而且初始值仅在VHDL的行为仿真中有效。例:SIGNALtemp:STD_LOGIC:=‘0’;SIGNALflaga,flagb:BIT;SIGNALdate:STD_LOGIC_VECTOR(15DOWNTO0);信号的使用和定义范围是实体、结构体和程序包.在程序中:(1)信号值的代入采用“=”代入符,而且信号代入时可以附加延时。(2)变量赋值时用“:=”,不可附加延时。(3)信号的初始赋值符号仍是“:=”。例:X=YAFTER10ns;--X,Y都是信号,且Y的值经过10ns延时以后才被代入X。信号是一个全局量,它可以用来进行进程之间的通信。例进程1:PROCESS(A,B,C,D)BEGIND=A;X=B+D;D=C;Y=B+D;ENDPROCESS;D中最初代入的值是A,接着又代入C值。尽管D中先代入A值,后代入C值,在时间上有一个△的延时,但是,在代入时由于不进行处理,因此仿真时认为是时间0值延时。所以D的最终值应为C,这样执行的结果:X,Y的内容都为B+C。进程2:PROCESS(A,B,C)VARIABLED:STD_LOGIC_VECTOR(3DOWNTO0);BEGIND:=A;X=B+D;D:=C;Y=B+D;ENDPROCESS;在执行“D:=A;”语句后,A的值就被赋给D,所以X为B+A。此后又执行“D:=C;”,从而使Y为B+C。由此可看出,信号的值将进程语句最后所代入的值作为最终代入值。而变量的值一经赋值就变成新的值。在仿真过程中,信号到了规定的仿真时间才进行赋值,变量的赋值是立即生效的。信号与变量的区别(2)赋值符不同信号signalcount:std_logic_vector(7downto0);变量variabletema:std_logic_vector(3downto0);信号在结构体中声明;变量在进程中声明(1)声明的形式与位置不同count=“00000000”,count=“ZZZZZZZZ”count=tema;tema:=0000;(3)赋值生效的时间不同信号:进程结束时变量:立即生效(4)进程对信号敏感,对变量不敏感(5)作用域不同信号可以是多个进程的全局信号,变量只在定义后的顺序域可见三、VHDL语言的数据类型标量型(ScalarType)复合类型(CompositeType)存取类型(AccessType)文件类型(FilesType)VHDL中的数据类型可以分成四大类。标量型(SCALARTYPE):属单元素的最基本的数据类型,通常用于描述一个单值数据对象,它包括实数类型、整数类型、枚举类型和时间类型。复合类型(COMPOSITETYPE):可以由细小的数据类型复合而成,如可由标量复合而成。复合类型主要有数组型(ARRAY)和记录型(RECORD)。存取类型(ACCESSTYPE):为给定的数据类型的数据对象提供存取方式。文件类型(FILESTYPE):用于提供多值存取类型。1.VHDL的预定义数据类型VHDL的预定义数据类型都是在VHDL标准程序包STANDARD中定义的,在实际使用中,已自动包含进VHDL的源文件中,因而不必通过USE语句以显式调用。1).布尔(BOOLEAN)数据类型2).位(BIT)数据类型3).位矢量(BIT_VECTOR)数据类型4).字符(CHARACTER)数据类型5).整数(INTEGER)数据类型6).实数(REAL)数据类型7).字符串(STRING)数据类型8).时间(TIME)数据类型9).错误等级(SEVERITY_LEVEL)1)布尔(BOOLEAN)数据类型程序包STANDARD中定义布尔数据类型的源代码如下:TYPEBOOLEANIS(FALSE,TRUE);布尔数据类型实际上是一个二值枚举型数据类型,它的取值有FALSE和TRUE两种。位数据类型也属于枚举型,取值只能是1或0。位数据类型的数据对象,如变量、信号等,可以参与逻辑运算,运算结果仍是位的数据类型。VHDL综合器用一个二进制位表示BIT。在程序包STANDARD中定义的源代码是:TYPEBITIS(‘0’,‘1’);2)位(BIT)数据类型位矢量只是基于BIT数据类型的数组,在程序包STANDARD中定义的源代码是:TYPEBIT_VECTORISARRAY(NATURALRANGE)OFBIT;3)位矢量(BIT_VECTOR)数据类型4)字符(CHARACTER)数据类型字符类型通常用单引号引起来,如‘A’。字符类型区分大小写,如‘B’不同于‘b’。字符类型已在STANDARD程序包中作了定义。整数类型的数代表正整数、负整数和零。5)整数(INTEGER)数据类型常用整数常量的书写方式示例如下:2--十进制整数10E4--十进制整数16#D2#--十六进制整数2#11011010#--二进制整数自然数和正整数是整数的一个子类型。在STANDARD程序包中定义的源代码如下:SUBTYPENATURALISINTEGERRANGE0TOINTEGER'HIGH;SUBTYPEPOSITIVEISINTEGERRANGE1TOINTEGER'HIGH;自然数(NATURAL)和正整数(POSITIVE)数据类型实数常量的书写方式举例如下:65971.333333--十进制浮点数8#43.6#E+4--八进制浮点数43.6E-4--十进制浮点数6)实数(REAL)数据类型VHDL的实数类型类似于数学上的实数,或称浮点数。实数的取值范围为-1.0E38~+1.0E38。通常情况下,实数类型仅能在VHDL仿真器中使用,VHDL综合器不支持实数,因为实数类型的实现相当复杂,目前在电路规模上难以承受。字符串数据类型是字符数据类型的一个非约束型数组,或称为字符串数组。字符串必须用双引号标明。如:7)字符串(STRING)数据类型VARIABLEstring_var:STRING(1TO7);string_var:=abcd;VHDL中唯一的预定义物理类型是时间。完整的时间类型包括整数和物理量单位两