1、2.2 VHDL的数据类型和数据对象的数据类型和数据对象o 2.2.1 VHDL的标记的标记o 2.2.2 VHDL的数据类型的数据类型o 2.2.3 VHDL的运算符的运算符2.2.1 VHDL的标记的标记o 一个完整的一个完整的VHDL语句可以有下列几个部分语句可以有下列几个部分组成:标识符、保留字(组成:标识符、保留字(Reserved Words)、界符、常数、赋值符号和注释)、界符、常数、赋值符号和注释(Comments),所有这些统称为标记。),所有这些统称为标记。2.2.1 VHDL的标记的标记o 1、标识符、标识符o标识符用来表示常数、变量、信号、子程序、结构体和实体等名称。标
2、识符用来表示常数、变量、信号、子程序、结构体和实体等名称。VHDL基本的标识符组成的规则如下:基本的标识符组成的规则如下:o标识符由标识符由26个英文字母、数字个英文字母、数字0,1,2,9及下划线及下划线“_”组成;组成;o标识符必须是以英文字母开头;标识符必须是以英文字母开头;o标识符中不能有两个连续的下划线标识符中不能有两个连续的下划线“_”,标识符的最后一个字符不能,标识符的最后一个字符不能是下划线;是下划线;o标识符中的英文字母不区分大小写。标识符中的英文字母不区分大小写。o例如:例如:oCLK,QO,DAT1,SX_1,NOT_Q是合法的标识符。是合法的标识符。o3DA,_QD,N
3、A_C,DB-A,DB_等是非法的标识符。等是非法的标识符。2.2.1 VHDL的标记的标记o 2.保留字保留字o VHDL中的保留字是具有特殊含义的标识符中的保留字是具有特殊含义的标识符号,只能作为固定的用途,用户不能用保留号,只能作为固定的用途,用户不能用保留字作为标识符。字作为标识符。o 如如 ENTITY,ARCHITECTURE,PROCESS,BLOCK,BEGIN和和END等。等。o VHDL保留字如表保留字如表2-2-1所示。所示。2.2.1 VHDL的标记的标记absaccessafter aliasalland architecturearrayassert attribu
4、tebegin blockbody bufferbuscase componentconfigurationconstant disconnectdownto elseelsifend entity exit fileforfunctiongenerate genericgroupguardedifimpureininertialinoutislabellibrarylinkageliteralloopmapmodnandnewnextnornotnullofonopenorothersoutpackageportpostponedprocedureprocesspurerangerecord
5、registerrejectremreportreturn rolrorselectseveritysignal sharedslasllsrasrl subtypethentotransporttypeunaffectedunitsuntilusevariablewaitwhenwhilewithxnorxor2.2.1 VHDL的标记的标记o3.VHDL中的界符界符是作为中的界符界符是作为VHDL语言中两个部分的分隔语言中两个部分的分隔符用的。如每个完整的语句均以符用的。如每个完整的语句均以“;”结尾,用双减号结尾,用双减号“-”开头开头的部分是注释内容,不参加程序的部分是注释内容,不参加
6、程序编译。信号赋值符号是编译。信号赋值符号是“=+*/&-_()=:=表表2-2-22.2.1 VHDL的标记的标记o4.注释符注释符o在在VHDL中,为了便于理解和阅读程序,中,为了便于理解和阅读程序,常常加上注释,注释符用双减号常常加上注释,注释符用双减号“-”表表示。注释语句以注释符打头,到行尾结束。示。注释语句以注释符打头,到行尾结束。注释可以加在语句结束符注释可以加在语句结束符“;”之后,也可之后,也可以加在空行处。以加在空行处。2.2.2 VHDL的数据类型的数据类型o在在VHDL中,定义了三种数据对象,即信号、变量中,定义了三种数据对象,即信号、变量和常数。和常数。o数据类型分为
7、两大类:即预定义的数据类型和用户数据类型分为两大类:即预定义的数据类型和用户自定义的数据类型。自定义的数据类型。o预定义的数据类型是最基本的数据类型,这些数据预定义的数据类型是最基本的数据类型,这些数据类型都定义在标准程序包类型都定义在标准程序包STANARD、STD_LOGIC_1164和其它标准的程序包中,这和其它标准的程序包中,这些程序包放在些程序包放在EDA软件中软件中IEEE和和STD目录中,供目录中,供用户随时调用。用户随时调用。o在预定义的各种数据类型的基础上,用户可以根据在预定义的各种数据类型的基础上,用户可以根据实际需要自己定义数据类型和子类型,如标量型和实际需要自己定义数据
8、类型和子类型,如标量型和数组型。数组型。2.2.2 VHDL的数据类型的数据类型o1.STANDARD程序包中预定义的数据类型程序包中预定义的数据类型o(1)整数(整数(INTEGER)数据类型)数据类型o整数数据类型与数学中整数的定义是相同的,整数类型的数据代整数数据类型与数学中整数的定义是相同的,整数类型的数据代表正整数、负整数和零。表正整数、负整数和零。VHDL整数类型定义格式为:整数类型定义格式为:oTYPE INTEGER IS RANGE-2147483648 TO 2147483647;o正整数(正整数(POSITIVE)和自然数()和自然数(NATURAL)是整数的子)是整数的
9、子类型,定义格式为:类型,定义格式为:oSUBTYPE POSITIVE IS INTEGER RANGE 0 TO INTEGERHIGH;oSUBTYPE NATURE IS INTEGER RANGE 1 TO INTEGERHIGH;o其中其中INTEGERHIGH是数值类属性,代表整数上限的数值,也是数值类属性,代表整数上限的数值,也即即231-1。2.2.2 VHDL的数据类型的数据类型o1.STANDARD程序包中预定义的数据类型程序包中预定义的数据类型o(2)实数(实数(REAL)数据类型)数据类型oVHDL的实数就是带小数点的数,分为正数和小数。实的实数就是带小数点的数,分为
10、正数和小数。实数有两种书写形式即小数形式和科学计数形式,不能写数有两种书写形式即小数形式和科学计数形式,不能写成整数形式。实数数据类型的定义格式为:成整数形式。实数数据类型的定义格式为:oTYPE REAL is range-1.7e38 to 1.7e38;o例如:例如:SIGNAL A,B,C:REAL;oA=5.0;oB=3.5E5;oC=-4.5;2.2.2 VHDL的数据类型的数据类型o1.STANDARD程序包中预定义的数据类型程序包中预定义的数据类型o(3)位(位(BIT)数据类型)数据类型o位数据类型的位值用字符位数据类型的位值用字符0和和1表示,将值放在单表示,将值放在单引号
11、中,表示二值逻辑的引号中,表示二值逻辑的0和和1。这里的。这里的0和和1与整数型与整数型的的0和和1不同,可以进行算术运算和逻辑运算,而整数类不同,可以进行算术运算和逻辑运算,而整数类型只能进行算术运算。位数据类型的定义格式为:型只能进行算术运算。位数据类型的定义格式为:oTYPE BIT is(0,1);o例如:例如:RESULT :OUT BIT;oRESULT=1;o将将RESULT引脚设置为高电平。引脚设置为高电平。2.2.2 VHDL的数据类型的数据类型o1.STANDARD程序包中预定义的数据类型程序包中预定义的数据类型o(4)位向量(位向量(BIT_VECTOR)数据类型)数据类
12、型o位向量是基于位向量是基于BIT数据类型的数组。数据类型的数组。VHDL位向量的定义格式为:位向量的定义格式为:oTYPE BIT_VECTOR is array(NATURAL range)of BIT;o使用位向量必须注明位宽,即数组的个数和排列顺序,位向量使用位向量必须注明位宽,即数组的个数和排列顺序,位向量的数据要用双引号括起来。例如的数据要用双引号括起来。例如“1010”,X“A8”。其中。其中1010是四位二进制数,用是四位二进制数,用X表示双引号里的数是十六进制数。表示双引号里的数是十六进制数。o例如:例如:SIGNAL A:BIT_VECTOR(3 DOWNTO 0);oA
13、B是关系运算,如果是关系运算,如果A=3,B=2,则,则AB关系成立,结果是布尔量关系成立,结果是布尔量TRUE,否则结果为,否则结果为FALSE。oVHDL中,布尔数据类型的定义格式为中,布尔数据类型的定义格式为:oTYPE BOOLEAN IS(FALSE,TRUE);2.2.2 VHDL的数据类型的数据类型o1.STANDARD程序包中预定义的数据类型程序包中预定义的数据类型o(6)字符(字符(CHARACTER)数据类型)数据类型o在在STANDARD程序包中预定义了程序包中预定义了128个个ASCII码字符类型,字符类型用单引号括起来,如码字符类型,字符类型用单引号括起来,如A,b,
14、1等,与等,与VHDL标识符不区分大小标识符不区分大小写不同,字符类型中的字符大小写是不同的,如写不同,字符类型中的字符大小写是不同的,如B和和b不同。不同。2.2.2 VHDL的数据类型的数据类型o1.STANDARD程序包中预定义的数据类型程序包中预定义的数据类型o(7)字符串(字符串(STRING)o在在STANDARD程序包中,字符串的定义是程序包中,字符串的定义是:oTYPE STRING is array(POSITIVE range)of CHARACTER;o字符串数据类型是由字符型数据组成的数组,字符字符串数据类型是由字符型数据组成的数组,字符串必须用双引号括起来。例如:串必
15、须用双引号括起来。例如:oCONSTANT STR1:STRING:=“Hellow world”;o定义常数定义常数ST1是字符串,初值是是字符串,初值是“Hellow world”。2.2.2 VHDL的数据类型的数据类型o(8)时间(时间(TIME)数据类型)数据类型o表示时间的数据类型,一个完整的时间类型包括整数表示的数值部分和时间表示时间的数据类型,一个完整的时间类型包括整数表示的数值部分和时间单位两个部分,数值和单位之间至少留一个空格,如单位两个部分,数值和单位之间至少留一个空格,如1 ms,20 ns等。等。oSTANDARD程序包中定义时间格式为:程序包中定义时间格式为:oTY
16、PE TIME is range-9223372036854775808 to 9223372036854775807o UNITSo fs;-飞秒飞秒o ps=1000 fs;-皮秒皮秒o ns=1000 ps;-纳秒纳秒o us=1000 ns;-微秒微秒o ms=1000 us;-毫秒毫秒o sec=1000 ms;-秒秒o min=60 sec;-分分o hr=60 min;-小时小时oEND UNITS;2.2.2 VHDL的数据类型的数据类型o2.IEEE预定义的标准逻辑位和标准逻辑位向量预定义的标准逻辑位和标准逻辑位向量o(1)标准逻辑位(标准逻辑位(STD_LOGIC)数据类型
17、)数据类型oSTD_LOGIC是位(是位(BIT)数据类型的扩展,是)数据类型的扩展,是STD_ULOGIC数据类型的子类型。定义格式为:数据类型的子类型。定义格式为:oTYPE std_ulogic IS(U,-Uninitializedo X,-Forcing Unknowno 0,-Forcing 0o 1,-Forcing 1o Z,-High Impedance o W,-Weak Unknowno L,-Weak 0 o H,-Weak 1 o -Dont care);oFUNCTION resolved(s:std_ulogic_vector)RETURN std_ulogic;
18、oSUBTYPE std_logic IS resolved std_ulogic;2.2.2 VHDL的数据类型的数据类型o2.IEEE预定义的标准逻辑位和标准逻辑位向量预定义的标准逻辑位和标准逻辑位向量o(2)标准逻辑位向量(标准逻辑位向量(STD_LOGIC_VECTOR)数据类型数据类型o STD_LOGIC_VECTOR是基于是基于STD_LOGIC数数据类型的标准逻辑一维数组,和据类型的标准逻辑一维数组,和BIT_VECTOR数数组一样,使用标准逻辑位向量必须注明位宽和排列组一样,使用标准逻辑位向量必须注明位宽和排列顺序,数据要用双引号括起来。例如:顺序,数据要用双引号括起来。例如
19、:oSIGNAL SA1:STD_LOGIC_VECTOR(3 DOWNTO 0);o SA1=“0110”;2.2.2 VHDL的数据类型的数据类型o2.IEEE预定义的标准逻辑位和标准逻辑位向量预定义的标准逻辑位和标准逻辑位向量o(2)标准逻辑位向量(标准逻辑位向量(STD_LOGIC_VECTOR)数据类型)数据类型o STD_LOGIC_VECTOR是基于是基于STD_LOGIC数据类型的数据类型的标准逻辑一维数组,和标准逻辑一维数组,和BIT_VECTOR数组一样,使用标准数组一样,使用标准逻辑位向量必须注明位宽和排列顺序,数据要用双引号括起逻辑位向量必须注明位宽和排列顺序,数据要用
20、双引号括起来。例如:来。例如:o SIGNAL SA1:STD_LOGIC_VECTOR(3 DOWNTO 0);o SA1=“0110”;2.2.2 VHDL的数据类型的数据类型o3.其它预定义的数据类型其它预定义的数据类型o在在STD_LOGIC_ARITH程序包中定义了无符号程序包中定义了无符号(UNSIGNED)和带符号()和带符号(SIGNED)数据类型,)数据类型,这两种数据类型主要用来进行算术运算。定义格式这两种数据类型主要用来进行算术运算。定义格式为:为:oTYPE UNSIGNED is array(NATURAL range)of STD_LOGIC;oTYPE SIGNE
21、D is array(NATURAL range)of STD_LOGIC;2.2.2 VHDL的数据类型的数据类型o4.用户自定义的数据类型用户自定义的数据类型o这种定义数据类型的格式:这种定义数据类型的格式:oTYPE 数据类型名称数据类型名称 IS 数据类型名数据类型名RANGE 数据范围;数据范围;o例如:例如:TYPE DATA IS INTEGER RANGER 0 TO 9;o定义定义DATA是是INTEGER数据类型的子集,数据范围是数据类型的子集,数据范围是09。oSUBTYPE 数据类型名称数据类型名称 IS 数据类型名数据类型名 RANGE 数据范围;数据范围;o例如:例
22、如:SUBTYPE DB IS STD_LOGIC_VECTOR(7 DOWNTO 0);o定义定义DB 是是STD_LOGIC_VECTOR数据类型的子集,位宽数据类型的子集,位宽8位。位。2.2.2 VHDL的数据类型的数据类型o5数组(数组(ARRAY)的定义)的定义o数组定义的格式为:数组定义的格式为:oTYPE 数据类型名称数据类型名称 IS ARRAY 数组下标的范围数组下标的范围 OF 数组元素的数组元素的数据类型;数据类型;o例如,在例如,在IEEE程序包中定义程序包中定义STD_LOGIC_VECTOR数据类型的数据类型的语句是语句是oTYPE std_logic_vecto
23、r IS ARRAY(NATURAL RANGE)OF std_logic;o限定性数组的下标的范围用整数指定,数组元素的下标可以是由低限定性数组的下标的范围用整数指定,数组元素的下标可以是由低到高,如到高,如 0 TO 3,也可以是由高到低,如,也可以是由高到低,如7 DOWNTO 0,表示数,表示数组元素的个数和在数组中的排列方式。组元素的个数和在数组中的排列方式。o例如:例如:TYPE D IS ARRAY(0 TO 3)OF STD_LOGIC;oTYPE A IS ARRAY(4 DOWNTO 1)OF BIT;2.2.2 VHDL的数据类型的数据类型o6数据类型的转换数据类型的转换
24、o在在VHDL语言中,数据类型的定义是相当严格的,不同类型的数据语言中,数据类型的定义是相当严格的,不同类型的数据是不能进行运算和赋值的。为了实现不同类型的数据赋值,就要进行数是不能进行运算和赋值的。为了实现不同类型的数据赋值,就要进行数据类型的变换。变换函数在据类型的变换。变换函数在VHDL语言程序包中定义。在程序包语言程序包中定义。在程序包STD_LOGIC_1164、STD_LOGITH_ARITH和和STD_LOGIC_ UNSIGNED中提供的数据类型变换函数如表中提供的数据类型变换函数如表2-2-3所列。例如把所列。例如把INTEGER数据类型的信号转换为数据类型的信号转换为STD
25、_LOGIC_VECTOR数据类型数据类型的方法是:的方法是:o定义定义A,B为:为:SIGNAL A:INTEGER RANGER 0 TO 15;oSIGNAL B:STD_LOGIC_VECTOR(3 DOWNTO 0);o需要调用需要调用STD_LOGIC_ARITH程序包中的函数程序包中的函数CONV_STD_LOGIC_VECTORo调用的格式是:调用的格式是:B=CONV_STD_LOGIC_VECTOR(A);2.2.3 VHDL的运算符的运算符o与高级语言一样,与高级语言一样,VHDL语言的表达式也语言的表达式也是由运算符和操作数组成的。是由运算符和操作数组成的。VHDL标准
26、标准预定义了五种运算符,即逻辑运算符、算预定义了五种运算符,即逻辑运算符、算术运算符、关系运算符、移位运算符和连术运算符、关系运算符、移位运算符和连接运算符,并且定义了与运算符相应的操接运算符,并且定义了与运算符相应的操作数的数据类型。作数的数据类型。o表表2-2-4 VHDL运算符列表运算符列表4运算符运算符类型类型运算符运算符功能功能优先级优先级逻辑运逻辑运算符算符AND逻辑与逻辑与最低最低最高最高OR逻辑或逻辑或NAND逻辑与非逻辑与非NOR逻辑或非逻辑或非XOR逻辑异或逻辑异或NXOR逻辑异或非逻辑异或非关系运关系运算符算符=等于等于/=不等于不等于大于大于=大于等于大于等于移位运移位
27、运算符算符SLL逻辑左移逻辑左移SLA算术左移算术左移SRL逻辑右移逻辑右移SRA算术右移算术右移ROL逻辑循环左逻辑循环左移移ROR逻辑循环右逻辑循环右移移运算符类运算符类型型运算符运算符功能功能优先级优先级符号运算符号运算符符+正正最低最低最高最高-负负连接运算连接运算符符&位合并位合并算术运算算术运算符符+加加-减减 乘乘/除除MOD求模求模REM求余求余乘方乘方ABS求绝对值求绝对值逻辑非运逻辑非运算符算符NOT逻辑非逻辑非2.2.3 VHDL的运算符的运算符o1.逻辑运算符逻辑运算符o在在VHDL语言中定义了七种基本的逻辑运算符,它们分别是:语言中定义了七种基本的逻辑运算符,它们分别
28、是:oAND(与)、(与)、OR(或)、(或)、NOT(非)、(非)、NAND(与非)、(与非)、NOR(或非)、(或非)、XOR(异或)和(异或)和NXOR(异或非)等。(异或非)等。o例如用例如用VHDL描述逻辑表达式是描述逻辑表达式是Y=AB,Z=A+B+C的程序如下:的程序如下:1.ENTITY loga IS 2.PORT(3.A,B,C :IN STD_LOGIC;4.Y,Z :OUT STD_LOGIC 5.);6.END loga;7.ARCHITECTURE stra OF loga IS 8.BEGIN9.Y=A AND B;10.Z=A OR B OR C;11.END
29、stra;2.2.3 VHDL的运算符的运算符o 2.算术运算符算术运算符oVHDL语言定义了五种常用的算术运算符,分别是语言定义了五种常用的算术运算符,分别是o+加或正,加或正,A+B,+Ao-减或负,减或负,A-B,-Bo 乘,乘,A Bo/除,除,A/Bo 指数,指数,N2o以及以及MOD(求模)、(求模)、REN(取余)、(取余)、ABS(求绝对值)等算术运算(求绝对值)等算术运算符。符。STD_LOGIC_VECTOR或或BIT_VECTOR等数据类型。等数据类型。o例如例如X=A+B;oY=C D;oZ 大于大于o=大于或等于大于或等于 o=小于或等于小于或等于2.2.3 VHDL
30、的运算符的运算符o4.移位运算符移位运算符oVHDL93标准中增加了六个移位运算符,分别标准中增加了六个移位运算符,分别是是SLL逻辑左移,逻辑左移,SRL逻辑右移,逻辑右移,SLA算术左算术左移,移,SRA算术右移,算术右移,ROL逻辑循环左移,逻辑循环左移,ROR逻辑循环右移。移位运算符的格式是:逻辑循环右移。移位运算符的格式是:o操作数名称操作数名称 移位运算符移位运算符 移位位数;移位位数;o例如例如 A=“0101”;o B=A SLL 1;o仿真的结果是仿真的结果是B=1010。2.2.3 VHDL的运算符的运算符0SRLSRARORROL图2-2-1 移位运算符操作示意图00SL
31、LSLA2.2.3 VHDL的运算符的运算符o5连接运算符(连接运算符(&)o用连接运算符可以将多个数据对象合并成一个新的一维数组。用连接运算符可以将多个数据对象合并成一个新的一维数组。连接符连接符“&”右边的操作数的元素在右。操作数可以是右边的操作数的元素在右。操作数可以是BIT或或STD_LOGIC数据类型。数据类型。o如果如果 1011,0010 A:BIT_VECTOR(0 TO 7)o 0001,0110 B:BIT_VECTOR(0 TO 7)o C=B(0 TO 3)&A(5 TO 7)&1;o则则C=1011,11012.2.4 VHDL的数据对象的数据对象o在在VHDL程序中
32、,常用的数据对象分为三种类型,即常数程序中,常用的数据对象分为三种类型,即常数(CONSTANT)、变量()、变量(VARIABLE)和信号()和信号(SIGNAL)o1.常数(常数(CONSTANT)o常数被赋值后就保持某一固定的值不变。通常常数的赋值在程常数被赋值后就保持某一固定的值不变。通常常数的赋值在程序开始前进行,其数据类型在常数说明语句中指明,赋值符号序开始前进行,其数据类型在常数说明语句中指明,赋值符号为为“:=”。o常数定义语句的格式为:常数定义语句的格式为:oCONSTANT 常数名称:数据类型常数名称:数据类型:=表达式表达式o例如:例如:oCONSTANT Vcc:REA
33、L:=5.0;oCONSTANT DALY:TIME:=20ns;oCONSTANT KN:INTEGER:=60;o2.2.4 VHDL的数据对象的数据对象o2.变量(变量(VARIABLE)o在在VHDL程序中,变量只能在进程和子程序中定义和使用,不程序中,变量只能在进程和子程序中定义和使用,不能在进程外部定义使用,变量属于局部量,在进程内部主要用来能在进程外部定义使用,变量属于局部量,在进程内部主要用来暂存数据。变量初值的赋值的符号是暂存数据。变量初值的赋值的符号是“:=”。o变量定义语句的格式为:变量定义语句的格式为:oVARABLE 变量名称:数据类型变量名称:数据类型:=初值初值;
34、o例如:例如:oVARABLE S1:INTEGER:=0;oVARABLE S2,S3:INTEGER;oVARABLE CON1:INTEGER RANGER 0 TO 20;oVARABLE D1,D2:STD_LOGIC;oo BV:=AV+D;o AV:=E+2;o CV:=AV*2 ;2.2.4 VHDL的数据对象的数据对象o3.信号(信号(SIGNAL)o在在VHDL中,信号分为外部端口信号和内部信号,外部端口信号是设计单中,信号分为外部端口信号和内部信号,外部端口信号是设计单元电路的引脚,在程序实体中定义,外部信号对应四种元电路的引脚,在程序实体中定义,外部信号对应四种I/O状
35、态是状态是IN,OUT,INOUT,BUFFER等,其作用是在设计单元电路之间起互连作等,其作用是在设计单元电路之间起互连作用,外部信号可以供整个设计单元使用属于全局量。用,外部信号可以供整个设计单元使用属于全局量。o信号定义语句的格式为:信号定义语句的格式为:oSIGNAL 信号名称:数据类型信号名称:数据类型:=初值初值;o例如:例如:oSIGNAL S1:STD_LOGIC:=0;oSIGNAL D1:STD_LOGIC _VECTOR(3 DOWNTO 0):=“1001”;o定义信号定义信号S1是标准逻辑位型,初值是逻辑是标准逻辑位型,初值是逻辑0;信号;信号D1是标准逻辑位是标准逻辑位向量,初值是逻辑向量向量,初值是逻辑向量1001。o信号赋值符号与变量赋值符号不同,信号赋值符号为信号赋值符号与变量赋值符号不同,信号赋值符号为“=”。