《第三章 VHDL语言的数据类型及运算操作符.ppt》由会员分享,可在线阅读,更多相关《第三章 VHDL语言的数据类型及运算操作符.ppt(51页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第三章VHDL语言的数据类型及运算操作符3.1 VHDL语言的客体及其分类 在在VHDL VHDL 语言中,可以赋予一个值的的对语言中,可以赋予一个值的的对象就称为客体或对象,它接受不同数据类型的象就称为客体或对象,它接受不同数据类型的赋值赋值 。对象主要包括以下对象主要包括以下3 3种:种:信号信号(SIGNAL)(SIGNAL):对应物理意义上是实际电:对应物理意义上是实际电路连接线。说明全局量路连接线。说明全局量 变量变量(VARIABLE)(VARIABLE):相当于暂存寄存器,变:相当于暂存寄存器,变量值不是最终的结果。说明局部量量值不是最终的结果。说明局部量 常数常数(CONSTA
2、NTCONSTANT):如电源、地等,用来:如电源、地等,用来描述固定的值。描述固定的值。说明全局量说明全局量3.1.1常数(Constant)n n常量是指在设计实体中不会发生变化的值,它可常量是指在设计实体中不会发生变化的值,它可以在很多部分进行说明,并且可以是任何数据类以在很多部分进行说明,并且可以是任何数据类型。型。n n 常量的定义和设置主要是为了使设计实体中的常量的定义和设置主要是为了使设计实体中的常数更容易阅读和修改。常数更容易阅读和修改。例如,将位矢的宽度定例如,将位矢的宽度定义为一个常量,只要修改这个常量就能很容易地义为一个常量,只要修改这个常量就能很容易地改变宽度,从而改变
3、硬件结构。改变宽度,从而改变硬件结构。在程序中,常量在程序中,常量是一个恒定不变的值,一旦作了数据类型的赋值是一个恒定不变的值,一旦作了数据类型的赋值定义后,在程序中不能再改变,因而具有全局意定义后,在程序中不能再改变,因而具有全局意义。义。格式:格式:CONSTANT CONSTANT 常数名:数据类型:表达式;常数名:数据类型:表达式;例:例:CONSTANT VCC:REAL:=5.0;CONSTANT VCC:REAL:=5.0;CONSTANT DALY:TIME:=100ns;CONSTANT DALY:TIME:=100ns;CONSTANT BUS:BIT_VECTOR:=“1
4、010 CONSTANT BUS:BIT_VECTOR:=“1010”CONSTANT G1 CONSTANT G1:BITBIT:1;1;数据类型和表达式表示的数据类型应该一致。数据类型和表达式表示的数据类型应该一致。表示是位信息,表示是位信息,而而“”“”表示的是位表示的是位矢量信息。矢量信息。n n 常量定义语句所常量定义语句所允许允许的设计单元有的设计单元有实体、结构实体、结构体、程序包、块、进程和子程序体、程序包、块、进程和子程序。在程序包中定。在程序包中定义的常量可以暂不设具体数值,它可以在程序包义的常量可以暂不设具体数值,它可以在程序包体中设定。体中设定。n n 常量的可视性,即
5、常量的使用范围取决于它被常量的可视性,即常量的使用范围取决于它被定义的位置。在程序包中定义的常量具有最大全定义的位置。在程序包中定义的常量具有最大全局化特征,可以用在调用此程序包的所有设计实局化特征,可以用在调用此程序包的所有设计实体中;体中;定义在设计实体中的常量,其有效范围为定义在设计实体中的常量,其有效范围为这个实体定义的所有的结构体这个实体定义的所有的结构体;定义在设计实体;定义在设计实体的某一结构体中的常量,则只能用于此结构体;的某一结构体中的常量,则只能用于此结构体;定义在结构体的某一单元的常量,如一个进程中,定义在结构体的某一单元的常量,如一个进程中,则这个常量只能用在这一进程中
6、。则这个常量只能用在这一进程中。总结:n n在运行中不变,若要改变必须要改变设计,也就是说改变常量说明,重新编译。n n常量必须在程序的实体、结构体或过程的说明区中,对其标识符类型常量值进行指定。n n定义在实体中的常量仅在实体中使用。以此类推。3.1.2变量(Variable)变量是局部变量,只能在进程、过程、函数中使用变量是局部变量,只能在进程、过程、函数中使用和定义。和定义。格式:格式:VARIABLE VARIABLE 变量名:数据类型变量名:数据类型 约束条件:约束条件:表达式;表达式;例:例:VARIABLE VARIABLE x,y:INTEGERx,y:INTEGER VARI
7、ABLE VARIABLE x,y:INTEGERx,y:INTEGER RANGE 0 TO 255:=10 RANGE 0 TO 255:=10 在程序中,变量的赋值是立即生效的,不能产生附加在程序中,变量的赋值是立即生效的,不能产生附加延时。延时。tmp1:=tmp2+tmp3 AFTER 10ns tmp1:=tmp2+tmp3 AFTER 10ns n n变量作为局部量,其适用范围仅限于定义了变变量作为局部量,其适用范围仅限于定义了变量的进程或子程序中。仿真过程中惟一的例外量的进程或子程序中。仿真过程中惟一的例外是共享变量。变量的值将随变量赋值语句的运是共享变量。变量的值将随变量赋值
8、语句的运算而改变。变量定义语句中的初始值可以是一算而改变。变量定义语句中的初始值可以是一个与变量具有相同数据类型的常数值,也可以个与变量具有相同数据类型的常数值,也可以是一个全局静态表达式,这个表达式的数据类是一个全局静态表达式,这个表达式的数据类型必须与所赋值变量一致。型必须与所赋值变量一致。此初始值不是必需此初始值不是必需的,综合过程中综合器将略去所有的初始值。的,综合过程中综合器将略去所有的初始值。n n变量数值的改变是通过变量赋值来实现的,其变量数值的改变是通过变量赋值来实现的,其赋值语句的语法格式如下:赋值语句的语法格式如下:n n 目标变量名目标变量名:=:=表达式;表达式;总结:
9、总结:n n(1)变量值是直接的,在某一时刻,仅包含一个值。n n(2)赋值和初始化符号 :n n(3)变量不能表示连线或存贮元件3.1.3 信号(Signal)n n信号是描述硬件系统的基本数据对象,信号是描述硬件系统的基本数据对象,它类似于连接线它类似于连接线。信号可。信号可以作为设计实体中并行语句模块间的信息交流通道。在以作为设计实体中并行语句模块间的信息交流通道。在VHDLVHDL中,中,信号及其相关的信号赋值语句、决断函数、延时语句等很好地描信号及其相关的信号赋值语句、决断函数、延时语句等很好地描述了硬件系统的许多基本特征。如硬件系统运行的并行性;信号述了硬件系统的许多基本特征。如硬
10、件系统运行的并行性;信号传输过程中的惯性延时特性;多驱动源的总线行为等。传输过程中的惯性延时特性;多驱动源的总线行为等。n n信号作为一种数值容器,不但可以容纳当前值,也可以保持历史信号作为一种数值容器,不但可以容纳当前值,也可以保持历史值。这一属性与触发器的记忆功能有很好的对应关系。值。这一属性与触发器的记忆功能有很好的对应关系。n n信号初始值的设置不是必需的,而且初始值仅在信号初始值的设置不是必需的,而且初始值仅在VHDLVHDL的行为仿的行为仿真中有效。真中有效。n n与变量相比,信号的硬件特征更为明显,它具有与变量相比,信号的硬件特征更为明显,它具有全局性特性全局性特性。n n信号的
11、说明通常在信号的说明通常在ARCHITECTUREARCHITECTURE、PACKAGEPACKAGE、ENTITYENTITY中进中进行的。行的。n n信号的定义格式如下:信号的定义格式如下:信号的定义格式如下:信号的定义格式如下:n n SIGNAL SIGNAL 信号名:信号名:信号名:信号名:数据类型数据类型数据类型数据类型 约束条件约束条件约束条件约束条件:=:=初始值;初始值;初始值;初始值;n n示例:示例:示例:示例:n nSIGNAL S1SIGNAL S1:STD_LOGIG:=0STD_LOGIG:=0;-定义了一个标准位的单值信号定义了一个标准位的单值信号S1S1,初
12、始值,初始值为低电平为低电平n nSIGNAL S2SIGNAL S2,S3S3:BITBIT;-定义了两个为定义了两个为BITBIT的信号的信号S2S2和和S3S3n nSIGNAL S4SIGNAL S4:STD_LOGIC_VECTOR(15 STD_LOGIC_VECTOR(15 DOWNTO 0)DOWNTO 0);-定义了一个标准位矢的位矢量定义了一个标准位矢的位矢量(数组、总数组、总线线)信号,共有信号,共有1616个信号元素个信号元素n n以下示例定义的信号数据类型是设计者自行定义的,这是VHDL所允许的:n n TYPE FOUR IS(X,0,I,Z);n n SIGNAL
13、 S1FOUR;n n SIGNAL S2FOUR:=X;n n SIGNAL S3FOUR:=L;总结:n n信号大多数均是在实体或结构体的说明区加以说明n n信号赋值语句 “=”符号n n重要应用:信号可以在状态机中表示变量n n端口说明中的对象均为信号类型3.1.4信号与变量的区别 信号赋值至少有信号赋值至少有 延时;而变量赋值没有延时。延时;而变量赋值没有延时。信号除当前值外有许多相关的信息;而变量只有当前值。信号除当前值外有许多相关的信息;而变量只有当前值。进程对信号敏感而不对变量敏感进程对信号敏感而不对变量敏感。信号可以是多个进程的全局信号;而变量只在定义它们的顺序域信号可以是多个
14、进程的全局信号;而变量只在定义它们的顺序域可见(共享变量除外)。可见(共享变量除外)。信号是硬件中连线的抽象描述,它们的功能是保存变化的数据和信号是硬件中连线的抽象描述,它们的功能是保存变化的数据和连接子元件,信号在元件的端口连接元件。变量在硬件中没有类连接子元件,信号在元件的端口连接元件。变量在硬件中没有类似的对应关系,它们用于硬件特性的高层次建模所需要的计算中。似的对应关系,它们用于硬件特性的高层次建模所需要的计算中。信号赋值和变量赋值分别使用不同的赋值符号信号赋值和变量赋值分别使用不同的赋值符号“=”=”和和“:”;允许两者之间相互赋值,但要保证两者的类型相同。对于信号;允许两者之间相互
15、赋值,但要保证两者的类型相同。对于信号赋值来说,在信号赋值的执行和信号值的更新之间至少有赋值来说,在信号赋值的执行和信号值的更新之间至少有 延时,延时,只有延迟之后才能得到新值,否则保持原值;而对于变量来说,只有延迟之后才能得到新值,否则保持原值;而对于变量来说,赋值没有延迟,变量在赋值语句执行后立即得到新值。赋值没有延迟,变量在赋值语句执行后立即得到新值。n n例31:PROCESS(A,B,C,D)BEGIN D=A;X=B+D;D=C;Y=B;END PROCESS结果:结果:X=B+C;n n例例3 32 2:PROCESS(A,B,C)PROCESS(A,B,C)VARIABLE D
16、:STD_LOGIC_VECTOR(3DOWNTO 0)VARIABLE D:STD_LOGIC_VECTOR(3DOWNTO 0)BEGINBEGIN D:=A;D:=A;X:=B+D;X:=B+D;D:=C;D:=C;Y:=B;Y:=B;END PROCESSEND PROCESS结果:结果:X=B+A;3.2 VHDL语言的数据类型n nVHDL是一种强类型语言,要求设计实体中的每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型,并且只有数据类型相同的量才能互相传递和作用。VHDL作为强类型语言的好处是能使VHDL编译或综合工具很容易地找出设计中的各种常见错误。VHD
17、L中的数据类型可以分成以下几大类:标准的数据类型、用户自定义的数据类型、用户自定义的子类型。3.2.1 标准的数据类型 1 1:整数:整数 2 2:实数:实数 3 3:位:位 4 4:位矢量:位矢量 5 5:布尔量:布尔量 6 6:字符:字符 7 7:时间:时间 8 8:错误等级:错误等级 9 9:自然数,正整数:自然数,正整数 1010:字符串:字符串1、整数(INTEGER)n n整数类型的数代表正整数、负整数和零。整数类型的数代表正整数、负整数和零。取值取值范围为范围为-(231-1231-1)()(231-1231-1),主要用主要用于表示总线(如多位计数器的输出)的状态于表示总线(如
18、多位计数器的输出)的状态,不不能直接按位来操作能直接按位来操作,也不能进行逻辑运算。也不能进行逻辑运算。n n整数常量的书写方式示例如下:整数常量的书写方式示例如下:n n2 2 -十进制整数十进制整数n n10E4 -10E4 -十进制整数十进制整数n n16#D2#-16#D2#-十六进制整数十六进制整数n n2#11011010#2#11011010#-二进制整数二进制整数2、实数(REAL)数据类型 n nVHDLVHDL的实数类型类似于数学上的实数,或称浮点数。实的实数类型类似于数学上的实数,或称浮点数。实数的取值范围为数的取值范围为-1.0E+38-1.0E+38+1.0E+38+
19、1.0E+38。通常情况下,。通常情况下,实数类型仅能在实数类型仅能在VHDLVHDL仿真器中使用,仿真器中使用,VHDLVHDL综合器不支综合器不支持实数,因为实数类型的实现相当复杂,目前在电路规模持实数,因为实数类型的实现相当复杂,目前在电路规模上难以承受。主要用于硬件方案的研究或实验。上难以承受。主要用于硬件方案的研究或实验。n n实数常量的书写方式举例实数常量的书写方式举例 n n65971.333333 65971.333333 -十进制浮点数十进制浮点数n n8#43.6E+4#8#43.6E+4#-八进制浮点数八进制浮点数n n43.6E-4 43.6E-4 -十进制浮点数十进制
20、浮点数3、位(BIT)数据类型 n n 位数据类型也属于枚举型,取值只能是1或0。位数据类型的数据对象,如变量、信号等,可以参与逻辑运算,运算结果仍是位的数据类型。VHDL综合器用一个二进制位表示BIT。在程序包STANDARD中定义的源代码是:n n TYPE BIT IS(0,1);4、位矢量(BIT_VECTOR)数据类型 n n是用双引号括起来的一组位数据是用双引号括起来的一组位数据,每位只有两种每位只有两种取值取值:0:0和和1 1。在其前面可以加上数制标记在其前面可以加上数制标记,如如X X(十六进制)、(十六进制)、B B(二进制(二进制,默认)、默认)、OO(八(八进制)等。进
21、制)等。常用于表示总线的状态。常用于表示总线的状态。n n在程序包在程序包STANDARDSTANDARD中定义的源代码是:中定义的源代码是:n n TYPE BIT _VETOR IS ARRAY(NATURA TYPE BIT _VETOR IS ARRAY(NATURA RANGE)OF BITRANGE)OF BIT;n n“001100”001100”n nX“00BB”X“00BB”5、布尔(BOOLEAN)数据类型 n n BooleanBoolean(布尔量),(布尔量),又称逻辑量。又称逻辑量。有有“真真”、“假假”两种状态两种状态,分别用分别用TRUETRUE和和FALSE
22、FALSE标记。标记。用于关系运算和逻辑判断,常用来表示信号的状用于关系运算和逻辑判断,常用来表示信号的状态或者总线上的情况,态或者总线上的情况,程序包程序包STANDARDSTANDARD中定中定义布尔数据类型的源代码如下:义布尔数据类型的源代码如下:n n TYPE BOOLEAN IS(FALSETYPE BOOLEAN IS(FALSE,TRUE)TRUE);n n一般这一类型的数据的初始值总为一般这一类型的数据的初始值总为FALSEFALSE6、字符(CHARACTER)数据类型 n n字符类型通常用单引号括起来的一个字母、数字或$、%等字符。如A。字符类型区分大小写,如B不同于b。
23、字符类型已在STANDARD程序包中作了定义。n nCHARACTER(1)n n指出1的字符数据7、字符串(STRING)数据类型 n n字符串数据类型是字符数据类型的一个非约束型数组,或称为字符串数组。字符串必须用双引号标明。区分大小写字母。常用于程序的提示和说明等。n n如:VARIABLE STRING_VARSTRING(1 TO 7);n n n n STRING_VAR“A B C D”;8、时间(TIME)数据类型 n n VHDLVHDL中中惟惟一一的的预预定定义义物物理理类类型型是是时时间间。完完整整的的时时间间类类型型包包括括整整数数和和物物理理量量单单位位两两部部分分,
24、整整数数和和单单位位之之间间至至少少留留一一个个空空格格,如如55 55 msms,20 20 nsns。常常用用单单位位有有fsfs(飞飞秒秒)、nsns(纳纳秒秒)、ss(微微秒秒)、msms(毫毫秒秒)、s s(秒秒)、minmin(分分)等等。常常 用用 于于 指指 定定 器器 件件 延延 时时 和和 标标 记记 仿仿 真真 时时 刻刻。STANDARD STANDARD 程序包中也定义了时间。定义如下:程序包中也定义了时间。定义如下:n nTYPE TIME IS RANGE-2147483647 TO 2147483647TYPE TIME IS RANGE-2147483647
25、TO 2147483647n nunits units n nfsfs;-飞秒,飞秒,VHDLVHDL中的最小时间单位中的最小时间单位n npsps=1000 =1000 fsfs;-皮秒皮秒n nns=1000 ns=1000 psps;-纳秒纳秒n nus=1000 nsus=1000 ns;-微秒微秒 n nms=1000 usms=1000 us;-毫秒毫秒n nsec=1000 mssec=1000 ms;-秒秒n nmin=60 secmin=60 sec;-分分n nhr=60 minhr=60 min;-时时n nend end untisuntis;9、错误等级(SEVERI
26、TY_LEVEL)n n 在在VHDLVHDL仿真器中,错误等级用来指示设计系统仿真器中,错误等级用来指示设计系统的工作状态,共有四种可能的状态值:的工作状态,共有四种可能的状态值:NOTE(NOTE(注注意意)、WARNING(WARNING(警告警告)、ERROR(ERROR(出错出错)、FAILURE(FAILURE(失败失败)。在仿真过程中,可输出这四种。在仿真过程中,可输出这四种值来提示被仿真系统当前的工作情况。其定义如值来提示被仿真系统当前的工作情况。其定义如下:下:n n TYPE SEVERITY_LEVE IS(NOTETYPE SEVERITY_LEVE IS(NOTE,W
27、ARNINGWARNING,ERRORERROR,FAILURE)FAILURE);10、自然数(NATURAL)和正整数(POSITIVE)数据类型 n n 自然数是整数的一个子类型,是非负的整数,即零和正整数;正整数也是整数的一个子类型,它包括整数中非零和非负的数值。n nINTEGER RANGE 100 DOWNTO 1;n nINTEGER RANGE 0 TO 9:=0;3.3.2 用户定义的数据类型n n 除了可使用除了可使用VHDLVHDL提供的标准数据类型之外提供的标准数据类型之外,设计者还可设计者还可以自己建立新的数据类型及子类型。新构造的数据类型及以自己建立新的数据类型及
28、子类型。新构造的数据类型及子类型通常在包集合中说明子类型通常在包集合中说明,以便重用和供多个设计共用。以便重用和供多个设计共用。n n类型说明语句的一般形式是类型说明语句的一般形式是:n n TYPE TYPE 数据类型名数据类型名 IS IS 数据类型定义数据类型定义OF OF 基本数据基本数据类型类型;n n或或 TYPE TYPE 数据类型名数据类型名 IS IS 数据类型定义;数据类型定义;n nVHDLVHDL允许用户自行定义新的数据类型,它们可以有多种,允许用户自行定义新的数据类型,它们可以有多种,如枚举类型如枚举类型(ENUMERA-TION TYPE)(ENUMERA-TION
29、 TYPE)、整数类型、整数类型(INTEGER TYPE)(INTEGER TYPE)、数组类型、数组类型(ARRAY TYPE)(ARRAY TYPE)、记录类、记录类型型(RECORD TYPE)(RECORD TYPE)、时间类型、时间类型(TIME TYPE)(TIME TYPE)、实数类型、实数类型(REA TYPE)(REA TYPE)等。等。1、枚举类型 n n 通过列举某类变量所有可能的取值来加以定义。通过列举某类变量所有可能的取值来加以定义。对这些取值对这些取值,一般使用自然语言中有相应含义的一般使用自然语言中有相应含义的单词或字符序列来代表单词或字符序列来代表,因而便于阅
30、读和理解。因而便于阅读和理解。VHDLVHDL中的枚举数据类型是用文字符号来表示一中的枚举数据类型是用文字符号来表示一组实际的二进制数的类型组实际的二进制数的类型(若直接用数值来定义,若直接用数值来定义,则必须使用单引号则必须使用单引号)。n n枚举类型的具体定义格式为枚举类型的具体定义格式为 n n TYPE TYPE 数据类型名数据类型名 IS(IS(元素元素1,1,元素元素2,);2,);n n例如例如,在程序包在程序包STD STD LOGIC LOGIC 11641164中对中对STD STD LOGICLOGIC的定义为的定义为n nTYPE STD TYPE STD LOGIC
31、IS(U,X,0,1,LOGIC IS(U,X,0,1,Z,W,L,H,-);Z,W,L,H,-);2、整数类型和实数类型 n n整数和实数的数据类型在标准的程序包中已作了定义,但整数和实数的数据类型在标准的程序包中已作了定义,但在实际应用中,特别在综合中,由于这两种非枚举型的数在实际应用中,特别在综合中,由于这两种非枚举型的数据类型的取值定义范围太大,综合器无法进行综合。据类型的取值定义范围太大,综合器无法进行综合。n n整数或实数用户定义数据类型的格式为:整数或实数用户定义数据类型的格式为:n n TYPE TYPE 数据类型名数据类型名 IS IS 数据类型定义数据类型定义 约束范围约束
32、范围n n 实际应用中,实际应用中,VHDLVHDL仿真器通常将整数或实数类型作为仿真器通常将整数或实数类型作为有符号数处理,有符号数处理,VHDLVHDL综合器对整数或实数的编码方法是:综合器对整数或实数的编码方法是:n n 对用户已定义的数据类型和子类型中的负数,编码为对用户已定义的数据类型和子类型中的负数,编码为二进制补码;二进制补码;n n 对用户已定义的数据类型和子类型中的正数,编码为对用户已定义的数据类型和子类型中的正数,编码为二进制原码。二进制原码。3、数组类型 n n 数组类型属复合类型,它是将一组具有相同数据类型的元素集数组类型属复合类型,它是将一组具有相同数据类型的元素集合
33、在一起,作为一个数据对象来处理的数据类型。数组可以是合在一起,作为一个数据对象来处理的数据类型。数组可以是一维一维(每个元素只有一个下标每个元素只有一个下标)数组或多维数组数组或多维数组(每个元素有多个每个元素有多个下标下标)。VHDLVHDL仿真器支持多维数组,但仿真器支持多维数组,但VHDLVHDL综合器只支持一综合器只支持一维数组。维数组。n n 数组的元素可以是任何一种数据类型,用以定义数组元素的数组的元素可以是任何一种数据类型,用以定义数组元素的下标范围子句决定了数组中元素的个数以及元素的排序方向,下标范围子句决定了数组中元素的个数以及元素的排序方向,即下标数是由低到高,或是由高到低
34、。即下标数是由低到高,或是由高到低。n n限定性数组定义语句格式如下:限定性数组定义语句格式如下:n n TYPE TYPE 数组名数组名 IS ARRAY(IS ARRAY(数组范围数组范围)OF)OF 数据类型;数据类型;n n 其中,数组名是新定义的限定性数组类型的名称,可以是任其中,数组名是新定义的限定性数组类型的名称,可以是任何标识符,其类型与数组元素相同;数组范围指出数组元素的何标识符,其类型与数组元素相同;数组范围指出数组元素的定义数量和排序方式,以整数来表示其数组的下标。定义数量和排序方式,以整数来表示其数组的下标。默认的下默认的下标类型是整型标类型是整型,但也可以使用其它数据
35、类型但也可以使用其它数据类型,如枚举类型等如枚举类型等,这这时需在范围中标明下标的类型;数据类型即指数组各元素的数时需在范围中标明下标的类型;数据类型即指数组各元素的数据类型。据类型。n n TYPE STB IS ARRAY(7 DOWNTO 0)OF STD_LOGIC TYPE STB IS ARRAY(7 DOWNTO 0)OF STD_LOGIC;n n 这个数组类型的名称是这个数组类型的名称是STBSTB,它有八个元素,它的下标排序是,它有八个元素,它的下标排序是7 7,6 6,5 5,4 4,3 3,2 2,1 1,0 0,各元素的排序是,各元素的排序是STB(7)STB(7),
36、STB(6)STB(6),STB(1)STB(1),STB(0)STB(0)。n n TYPE X IS(LOWTYPE X IS(LOW,HIGH)HIGH);n n TYPE DATA_BUS IS ARRAY(0 TO 7TYPE DATA_BUS IS ARRAY(0 TO 7,X)OF BITX)OF BIT;n n 首先定义首先定义X X为两元素的枚举数据类型,然后将为两元素的枚举数据类型,然后将DATA_BUSDATA_BUS定义为一个数组定义为一个数组类型,其中每一元素的数据类型是类型,其中每一元素的数据类型是BITBIT。n n非限制性数组的定义语句格式如下:非限制性数组的定
37、义语句格式如下:n n TYPE TYPE 数组名数组名 IS ARRAY(IS ARRAY(数组下标名数组下标名 RANGE)OF RANGE)OF 数据类型;数据类型;n nTYPE BIT_VECTOR IS ARRAY(NATURA RANE)OF BITTYPE BIT_VECTOR IS ARRAY(NATURA RANE)OF BIT;n nVARABLE VAVARABLE VA:BIT_VECTOR(1 TO 6)BIT_VECTOR(1 TO 6);n n -将数组取值范围定在将数组取值范围定在1 16 64、记录类型 n n 由已定义的、数据类型不同的对象元素构成的数组称
38、为记录类型的对象。定义记录类型的语句格式如下:n n TYPE 记录类型名 IS RECORD n n 元素名 :元素数据类型;n n 元素名 :元素数据类型;n n n n END RECORD 记录类型名;n n【例例】n nTYPE RECDATA IS RECORD TYPE RECDATA IS RECORD n n-将将RECDATARECDATA定义为三元素记录类型定义为三元素记录类型n nELEMENT1 ELEMENT1 TIMETIME;n n-将元素将元素ELEMENT1ELEMENT1定义为时间类型定义为时间类型n nELEMENT2 ELEMENT2 TIMETIME
39、;-将元素将元素ELEMENT2ELEMENT2定定义为时间类型义为时间类型n nELEMENT3 ELEMENT3 STD_LOGICSTD_LOGIC;-将元素将元素ELEMENT3ELEMENT3定义为标准位类型定义为标准位类型n nEND RECORD RECDATAEND RECORD RECDATA;n n【例例】利用记录类型定义的一个微处理器命令信息表利用记录类型定义的一个微处理器命令信息表 n nTYPE REGNAME IS(AXTYPE REGNAME IS(AX,BXBX,CXCX,DX)DX);n nTYPE OPERATION IS RECORDTYPE OPERAT
40、ION IS RECORDn n OPSTR OPSTRSTRING(1 TO 10)STRING(1 TO 10);n n OPCODEOPCODEBIT_VECTOR(3 DOWNTO 0)BIT_VECTOR(3 DOWNTO 0);n n OP1OP1,OP2OP2,RESRES:REGNAMEREGNAME;n nEND RECORD OPERATIONEND RECORD OPERATION;n nVARIABLE INSTR1VARIABLE INSTR1,INSTR2INSTR2:OPERATIONOPERATION;n nn nINSTR1:=(ADD AXINSTR1:=(
41、ADD AX,BXBX,00010001,AXAX,BXBX,AX)AX);n nINSTR2:=(ADD AXINSTR2:=(ADD AX,BXBX,“00100010,OTHERS=BX)OTHERS=BX);n nVARIABLE INSTR3VARIABLE INSTR3OPERATIONOPERATION;n nn nINSTR3.OPSTR:=MU AXINSTR3.OPSTR:=MU AX,BXBX;n nINSTR3.OP1:=AXINSTR3.OP1:=AX;3.2.3 用户定义的子类型n n设计者还可以对已定义的数据类型的取值范围加以限制,设计者还可以对已定义的数据类型的
42、取值范围加以限制,形成形成新的数据类型新的数据类型,称为用户定义的子类型。称为用户定义的子类型。n n 子类型定义的一般格式为子类型定义的一般格式为 n nSUBTYPE SUBTYPE 子类型名子类型名 IS IS 数据类型名数据类型名 范围范围;n n例如例如,可定义一种适用于数码管的数据类型可定义一种适用于数码管的数据类型digit:digit:n n SUBTYPE digit IS INTEGER RANGE 0 TO 9;SUBTYPE digit IS INTEGER RANGE 0 TO 9;n n 除了定义新的数据类型之外除了定义新的数据类型之外,设计者还可以通过限制和约束设
43、计者还可以通过限制和约束已有的数据类型来达到同样的目的。已有的数据类型来达到同样的目的。例如例如,可以使用可以使用RANGERANGE子子句来将整型信号句来将整型信号digitdigit的取值限制在的取值限制在0 09 9之间之间:n nSIGNAL digit:INTEGER RANGE 0 TO 9;SIGNAL digit:INTEGER RANGE 0 TO 9;n n同样同样,可以限制可以限制STD STD LOGICLOGIC类型得到取值限制为类型得到取值限制为X X、0 0、1 1 或或 Z Z的变量的变量var1:var1:n n VARIABLE var1 STD VARIA
44、BLE var1 STD LOGIC RANGE X TO ZLOGIC RANGE X TO Z3.2.4 数据类型的转换n n为了实现正确的代入操作,必须将要代入的数据进行类型转换。n n变换函数通常由VHDL语言的包集合提供。n n见书P42433.2.5 数据类型的限定n n数据类型的限定方式是在数据前加上“类型名”n nAAYYYY=“11111111”;3.2.6 IEEE3.2.6 IEEE标准标准”STD_LOGIC”,”STD_LOGIC_VECTOR”STD_LOGIC”,”STD_LOGIC_VECTOR”n n1)1)标准逻辑位标准逻辑位标准逻辑位标准逻辑位STD_LO
45、GICSTD_LOGIC数据类型数据类型数据类型数据类型 n n数据类型数据类型STD_LOGICSTD_LOGIC的定义如下所示:的定义如下所示:n nTYPE STD_LOGIC IS(UTYPE STD_LOGIC IS(U,XX,00,11,ZZ,WW,LL,HH,-)-);n n各值的含义是:各值的含义是:n nU-U-未初始化的,未初始化的,X-X-强未知的,强未知的,0-0-强强0 0,1-1-强强1 1,Z-Z-高阻态,高阻态,n nW-W-弱未知的,弱未知的,L-L-弱弱0 0,H-H-弱弱1 1,-忽略。忽略。n n在程序中使用此数据类型前,需加入下面的语句:在程序中使用此
46、数据类型前,需加入下面的语句:n nLIBRARY IEEELIBRARY IEEE;n nUSE IEEE.STD_LOGIC_1164.ALLUSE IEEE.STD_LOGIC_1164.ALL;n nSTD_LOGICSTD_LOGIC是标准的是标准的BITBIT数据类型的扩展,共定义了数据类型的扩展,共定义了九种值。九种值。n n2)2)标准逻辑矢量标准逻辑矢量标准逻辑矢量标准逻辑矢量(STD_LOGIC_VECTOR)(STD_LOGIC_VECTOR)数据类型数据类型数据类型数据类型n nSTD_LOGIC_VECTORSTD_LOGIC_VECTOR类型定义如下:类型定义如下:
47、n nTYPE STD_LOGIC_VECTOR IS ARRAY(NATURA RANGE)OF TYPE STD_LOGIC_VECTOR IS ARRAY(NATURA RANGE)OF STD_LOGICSTD_LOGIC;n n【例例】n nTYPE T_DATA IS ARRAY(7 DOWNTO 0)OF STD_LOGICTYPE T_DATA IS ARRAY(7 DOWNTO 0)OF STD_LOGIC;-自定义数组类型自定义数组类型n nSIGNA DATABUSSIGNA DATABUS,MEMORYMEMORY:T_DATAT_DATA;n n -定义信号定义信号D
48、ATABUSDATABUS,MEMORYMEMORYn nCPUCPUPROCESS IS -CPUPROCESS IS -CPU工作进程开始工作进程开始n nVARIABLE REG1VARIABLE REG1T_DATAT_DATA;-定义寄存器变量定义寄存器变量REG1REG1n nBEGIN BEGIN n nn nDATABUS=REG1DATABUS=REG1;-向向8 8位数据总线赋值位数据总线赋值n nEND PROCESS CPUEND PROCESS CPU;-CPU-CPU工作进程结束工作进程结束n nMEMMEMPROCESS IS -RAMPROCESS IS -RA
49、M工作进程开始工作进程开始n nBEGIN BEGIN n nn nDATABUS=MEMORYDATABUS=MEMORY;n nEND PROCESS MEMEND PROCESS MEM;n n3.3 VHDL语言的运算操作符n n VHDL语言中共有四类运算,即逻辑运算、关系运算、算术运算和并置运算。前三类操作符是完成逻辑和算术运算的最基本的操作符的单元。n n 关系运算和算术运算的运算规则及运算符与常用的程序设计语言的几乎完全相同,主要的差别可能只有两个:。不等号是“/=”,乘方运算符是“*”3.3.1 逻辑运算符n n六种逻辑运算符六种逻辑运算符 n nNOTNOT取反取反n n
50、ANDAND与与n n OROR或或n n NANDNAND与非与非n n NORNOR或非或非n n XORXOR异或。异或。n n注意:运算符的左边和右边,以及代入的信号的数据类型必须是相同注意:运算符的左边和右边,以及代入的信号的数据类型必须是相同的。的。n n左右没有优先级差别左右没有优先级差别n na=b AND c AND d AND e;a=b AND c AND d AND e;n na=(b AND c)OR(d AND e);a=(b AND c)OR(d AND e);n nNOTNOT优先级最高优先级最高3.3.2 算术运算符n n1010种算术运算符:种算术运算符:n