TYPE 数据类型名{,数据类型名} IS [数据类型定义]

Download Report

Transcript TYPE 数据类型名{,数据类型名} IS [数据类型定义]

第2章 VHDL词法基础

2.1 标识符

2.2 数据对象

2.3 数据类型

2.4 类型转换

2.5 词法单元

2.6 运算符与操作符

2.7 属性
2.1 标识符

标识符规则是VHDL语言中符号书写的一般规则。
不仅对电子系统设计工程师是一个约束,同时也为
各种各样的EDA工具提供了标准的书写规范,使之
在综合仿真过程中不生产生歧义,易于仿真。

VHDL语言有两个标准版:VHDL’87版和VHDL’93
版。VHDL’87版的标识符语法规则经过扩展后,形
成了VHDL’93版的标识符语法规则。前一部分称为
短 标识符 ,扩展部分称为 扩展标识符 。VHDL’93版
含有短标识符和扩展标识符两部分。
2.1.1 短标识符
短标识符规则:
短标识符由字母、数字以及下划线字符组成,且具有以下特
征要求:
● 第一个字符必须是字母;
● 最后一个字符不能是下划线;
● 不允许连续两个下划线;
● 在标识符中大、小写字母是等效的。
● VHDL中的注释文字一律为2个连续的连接线“--”,可以出
现在任一语句后面,也可以出现在独立行;
● VHDL的保留字(关键字)不能用于标识符;
例如:如下标识符是合法的:
tx_clk
Three_state_Enable
sel7D
HIT_1124
如下标识符是非法的:
_ tx_clk
--标识符必须起始于字母
8B10B
large#number
--只能是字母、数字、下划线
link_ _bar
select
--不能有连续两个下划线
--关键字(保留字)不能用于标识符
rx_clk_
--最后字符不能是下划线
2.1.2 扩展标识符
扩展标识符规则:
扩展标识符是VHDL’93版增加的标识符书写规则:
(1) 扩展标识符用反斜杠来定界。例如:\multi_screens\,
\eda_centrol\等都是合法的扩展标识符。
(2) 允许包含图形符号、空格符。例如:\mode A, \$100\,
\p%name\等。
(3) 反斜杠之间的字符可以用保留字。例如: \buffer\,
\entity\, \end\等。
(4) 扩展标识符的界定符两个斜杠之间可以用数字打头。如:
\100$\,
\2chip\, \4screens\等。
(5) 扩展标识符中允许多个下划线相连。例如:
\Four_screens\, \TWO_Computer_sharptor\等。
(6) 扩展标识符区分大小写。例如:
\EDA\ 与\eda\不同。
(7) 扩展标识符与短标识符不同。例如:\COMPUTER\ 与
Computer不同。
2.2 数据对象
在VHDL中,凡是可以赋予一个值的客体称为数据对象。常
用的数据对象为常量、变量 、信号和文件,其中文件类型是
VHDL’93标准中新通过的。
对象说明的一般书写格式为:
对象类别 标识符表:子类型标识[:= 初值];
对象说明举例:
CONSTANT T1,T2:time :=30ns,--常量说明
VARIABLE SUM:read;
--变量说明
SIGNAL CLOCK:bit;
--信号说明
FILE input:Text IS IN “STD_INPUT” --文件说明
对象的赋值规则:
信号和变量可以连续的赋于不同的值。
 常量只在它被说明时赋值,在整个器件
工作期间值不变化。试图对常量多次赋
值是错误的。
 文件可以用参数向子程序传递数据,通
过子程序对文件进行读和写操作。文件
不可以通过赋值来更新文件的内容,文
件参数没有模式。

可用函数调用的方法给对象赋初值。
例如:
CONSTANT Bus-number:Integer :=My_function(True,6);

如果在同一个对象说明语句中,对多个同一类型的对象指定初
始值,则多个对象同时取得了这一指定值。
 信号和变量的默认值。当信号和变量没有指定初始值或没有给
信号变量赋值时,即信号和变量的值在对象说明语句中默认时,
信号变量的取值称为默认值。一般地,若变量为字符型变量则
取最大值;若变量、信号为数值型变量,则取初始值,默认值
为‘0’

2.2.1 常量
● 常量(CONSTANT)
常量是指在设计描述中不会变化的值。在VHDL描述中,一般
用常量名代替数值。
常量说明语句的一般格式为:
CONSTANT 常量名{,常量名}:数据类型 := 取值;
例:8位寄存器宽度指定:
CONSTANT width:integer:=8;
设计实体的电源供电电压指定:
CONSTANT vcc:real:=5.0;
某一模块信号输入/输出的延迟时间:
CONSTANT delay:time:=100ns;
● 常量的使用规则
 常量所赋值和定义的数据类型应一致。
 常量一旦赋值就不能再改变。若要改变常量值,必须要
改变设计,改变实体中的常量说明,然后重新编译。
 常量必须在程序包、实体、结构体或进程的说明区域中
对常量的标识符、类型、常量值进行指定。定义在程序包中
的常量由所在的实体或结构体调用。定义在实体内的常量仅
在实体内使用,定义在进程内的常量仅在进程内使用。
● 2.2.2 变量(VARIABLE)
变量是暂存数据的量。
变量说明语句的格式是:
VARIABLE 变量名{,变量名}:数据类型 [:=初始值];
例如:
VARIABLE count: INTEGER RANGE 0 TO 99 : =0
VARIABLES result: std_logic:='0';—变量赋初值
VARIABLES x,y,z : integer;
VARIABLES count: integer range 0 TO 255 :=10;
变量赋值语句格式为:
目标变量名 := 表达式;
 赋值语句中的表达式必须与目标变量具有相同的数据类型。
● 变量的使用规则
 变量是一个 局部量 ,它只用于进程和子程序。变量必须
在进程或子程序的说明区域中加以说明。
 变量赋值是 直接的、非预设的 ,它在某一时刻仅包含一
个值。变量的赋值立即生效,不存在延时行为。
变量常用在实现某种运算的赋值语句中。变量赋值和初始
化赋值符号用“:=”表示。
变量不能用于硬件连线和存储元件。
● 变量的使用规则
在仿真模型中,变量用于高层次建模。
在系统综合时,变量用于计算,作为索引载体和数据暂存。
在进程中,变量的使用范围在进程之内。若将变量用于进
程之外,必须将该值赋给一个相同类型的信号,即进程之间
传递数据靠的是信号。
● 2.2.3 信号(SIGNAL)
信号是电子电路内部硬件实体相互连接的抽象表示。信号能够
代表连线,也可内连元件,端口也是一种信号。
信号说明语句的格式为:
SIGNAL 信号名{,信号名} :数据类型 [:=初始值];
例如:
SIGNAL count: BIT_VECTOR(3 downto 0); --计数器宽度
SIGNAL sys_clk:BIT :=‘0’;
--系统时钟信号
信号赋值语句格式为:
目标信号名 <= 表达式;
 赋值语句中的表达式必须与目标信号具有相同的数据类型。
 信号通常在构造体、包集合和实体中说明;信号不能在进程中
说明(但可以在进程中使用)。
“:=”表示对信号直接赋值,表示信号初始值不产生延时。
“<=”表示代入赋值,代入赋值法允许产生延时。例如:T1
<= T2 after 20ns;
 信号包括I/O引脚信号以及IC内部缓冲信号,有硬件电路与之
对应,故信号之间的传递有实际的附加延时。
 硬件中的信号总是同时工作的,即信号同时在各个模块中流动,
这就是硬件电路的并发性 。HDL体现了实际电路中信号“同时”
流动的这种基本特性。
信号和变量的主要区别:
1. 变量 是一个局部量,只能用于进程或子程序中;
信号 是一个全局量,它可以用来进行进程之间的通信。
2. 变量赋值 立即生效,不存在延时行为;
信号赋值 具有非立即性,信号之间的传递具有延时性。
3. 变量 用作进程中暂存数据的单元;
信号 用作电路中的信号连线。
4. 信号赋值 可以出现在进程中,也可以直接出现在结构体中,
但它们的运行含义不同:前者属顺序信号赋值,此时的赋值操作
要视进程是否已被启动;后者属并行信号赋值,其赋值操作是各
自独立并行发生的。
5. 在进程中变量和信号的赋值形式与操作过程不同:
在变量的赋值语句中,该语句一旦被执行,其值立即被赋予变
量。在执行下一条语句时,该变量的值即为上一句新赋的值。
在信号的赋值语句中,该语句即使被执行,其值不会使信号立
即发生代入,在下一条语句执行时,仍使用原来的信号值。直到
进程结束之后,所有信号赋值的实际代入才顺序进行处理。因此,
实际代入过程和赋值语句的执行是分开进行的。
如例a所示。
例a 信号和变量值代入的区别举例
PROCESS (a,b,c,d)
BEGIN
d<=a;
x<=b+d;
d<=c;
y<=b+d;
END PROCESS;
结果:
x<=b+c;
y<=b+c;
当进程运行时,信号赋值将自上而下顺
序执行,但第一项赋值操作并不会发生,
这是因为信号赋值是在进程结束时才起
作用。因为在进程结束更新时,d的最
后一个赋值为c ,因此执行结果为该式。
PROCESS (a,b,c)
VARIABLE d:std_logic_vector(3 downto 0);
BEGIN
d:=a;
x<=b+d;
d:=c;
y<=b+d;
END PROCESS;
结果:
x<=b+a;
y<=b+c;
2.2.4 文件


文件(files)是传输大量数据的客体,包含一些专门数据
类型的数值。在仿真测试时,测试的输入激励数据和仿真
结果的输出都要用文件来进行。
在IEEE1076标准中,TEXTIO程序包中定义了文件I/O传输
的方法。它们是对过程的定义,调用这些过程就能完成数
据的传递。
procedure
procedure
Procedure
Readline (F:in Text;L:out Line);
Writeline(F:out Text;L:in Line);
Read(L:inout Line;Value:out std_logic;
Good:out boolean);
procedure Read(L:inout Line;Value:out std_logic);
procedure Read(L:inout Line;Value:out
std_logic_vector;
Good:out boolean);
2. 3 数据类型
 VHDL是一种强类型的语言。
 对象的数据类型 定义了该对象可以具有的值和对该对象可以
进行的运算的限制。在VHDL中,这种限制是被强制执行的。
 VHDL提供了多种标准的数据类型。在VHDL描述中, 每个
信号、常量、变量都要指定它的数据类型,以确定它能保持那
一类数据。
 VHDL对数据类型的定义相当严格,在进行赋值或变换过程
中都要进行类型检查。VHDL不允许不同类型的数值相互赋值或
使用类型不允许的运算符进行运算 。这种特性可以帮助设计者
在设计前期发现错误。
1. 标准数据类型
 VHDL提供的10种标准数据类型。
(1)Integer(整数)。
取值范围为 -(231-1)~(231-1)。
在电子系统中,整数可以用进制来表示。
整数不能看作矢量,不能单独对某一位操作。
整数不能用于逻辑运算,只能用于算术运算。
对象的数据类型定义为整数时,范围应有约束。
例如:
variable a: integer range –255 to 255;
在电子系统设计过程中,整数可以用来抽象地表达总线的状态。
(2)Real(实数)。
取值范围为 -1.0E+38 ~ +1.0E+38。和整数一样,实数能被约束。由于实数
运算需要大量的资源,因此综合工具常常并不支持实数类型。
有些数可用实数表示,也可用整数表示。例如+99.0是实数,+99是整数,
两数具有相同的值;但两者具有不同的类型。
在有关文献中,实数类型也称为浮点类型(FLOATING TYPE)。但大多数EDA
工具不支持浮点运算。
(3)Bit(位)。
只有两种取值,即 0 和 1 ,可用于描述信号的取值。
位通常用单引号来括住其位的值。

如: TYPE BIT IS ('0','1');
位的值‘0’,‘1’表示信号的状态;
布尔量的值‘0’,‘1’表示‘假’,‘真’。两者的意义不一样。
(4)Bit_Vector(位矢量)。
是用双引号括起来的一组数据,每位
只有两种取值:0 和 1。在其前面可加以数制标记,如X(16进制)、B(2进
制、默认)、O(8进制)等。位矢量常用于表示总线的状态。
(5)Boolean(布尔量)。
又称逻辑量。有“真”、“假”两种状态,分别用TRUE和FALSE标记。
布尔量没有数量多少的概念,不能进行算术运算,只能进行关系运算和逻辑
运算。
布尔量常用来表达信号的状态,或者总线上的控制权,仲裁情况,忙、闲状
态等。
若某个客体被定义为布尔量,则EDA工具对设计进行仿真时,自动地对其赋
值情况进行核查。
(6)Character(字符)。
是用单引号括起来的一个字母(A~Z,a~z) 、数字( 0~9 )、空格或一
些特殊字符(如$、@、%等)。
VHDL语言对大小写英文字母不敏感,但区分字符量中的大小写。‘A’,
‘a’,‘B’,‘b’,都认为是不同的字符。字符‘1’,‘2’仅是符号。
(7)String(字符串)。是用双引号括起来的一个字符序列。字符串区
分 大 、 小 写 字 母 。 常 用 于 程 序 的 提 示 和 结 果 说 明 等 。 例 如 “ VHDL” ,
“STRING”,“MULTI_SCREEN COMPUTER”等。
(8)Time(时间)。时间的取值范围从 -(231-1)~(231-1)。时
间由整数值和时间单位组成。常用的时间单位有:fs、ns、μs、ms、s、min、
hr等。时间类型一般用于仿真,而不用逻辑综合。时间常用于指定时间延时和
标记仿真时刻。
时间单位的描述规范说明如下:
TYPE_TIME IS RANGE -2147483647 to
2147483847
UNITS
FS;
PS = 1000fs; Ns = 1000ps;
Us = 1000Ns; Ms = 1000us;
Sec = 1000ms; Min = 60 sec;
Hr = 60 min;
End units;
(9)Natural(自然数)和Positive(正整数)。 是整数类型的子
类型。自然数取值范围为0 ~(231-1);正整数是大于 0 的整数。
(10)Severity Level(错误等级)。错误等级分为:NOTE(注意)、
WARNING(警告)、ERROR(出错)、FAILURE(失败)四级,用于提示
系统的错误等级。错误等级这个数据类型用于表示电子系统工作状态。
上述10种数据类型是VHDL中标准的数据类型,在
编程时可以直接引用。如果用户需使用其它的数据类
型,则必须进行自定义。
标准数据类型
数据类型
含
义
整数
整数32位, 取值范围:-(231-1) ~ (231-1)
实数
浮点数,取值范围: -1.0e+38 ~ 1.0e+38
位
逻辑’0’或’1’
位矢量
位矢量,用双引号括起来的一组数据
布尔量
逻辑“真” 或“假”,用TRUE和FALSE标记
字符
字符串
时间
自然数、正整数
错误等级
ASCII字符
字符矢量
时间单位fs,ps,ns,μs,ms,sec,min,hr
整数的子集:自然数取值范围为0 ~(231-1);正
整数是大于0的整数
Note,warning,error,failure
 IEEE库STD_LOGIC_1164程序包中定义的STD_LOGIC类型和
STD_LOGIC_VECTOR类型。(VHDL’93标准)
STD_LOGIC类型的数据可以具有九种取值,其含义如下:
’U’:初始值
’X’:不定态
’0’: 强制0
’1’: 强制1
’Z’: 高阻态
’W’:弱信号不定态
’L’:弱信号0
’H’:弱信号1
’_’:不可能情况(可忽略值)
其中,“X”方便了系统仿真,“Z”方便了双向总线的描述。
STD_LOGIC_VECTOR类型定义如下:
TYPE STD_LOGIC_VECTOR IS ARRAY (NATURAL
RANGE <>) OF STD_LOGIC;
2. 用户自定义数据类型
VHDL允许用户自己定义数据类型。
该数据类型括号中的值自左向右
自定义数据类型说明语句的一般格式是:
按升序排列,中间用逗号分隔。
在VHDL中,对其中每一个元素
TYPE 数据类型名 {,数据类型名}
IS [数据类型定义];
都赋予一个位置编号,最左边的
元素开始记为“0” ,向右依次递
常用的用户自定义数据类型主要有:
增“1” 。这为“属性”提供了一
(1)枚举(Enumerated)类型。个访问位置编号的机制。
通过列举某类变量所有可能的
取值来加以定义。对这些取值,一般使用自然语言中有相应含义
的单词或字符序列来代表,以便于阅读和理解。
枚举类型定义的格式为:
TYPE 数据类型名 IS (元素1,元素2,…);
例如,在程序包STD_LOGIC_1164中对STD_LOGIC的定义为
TYPE STD_LOGIC IS ( 'U' ,'X' ,'0' ,'1' ,'Z' ,'W' ,'L' ,'H' ,'_' );
(2) 数组(ARRAY)类型。 又称为向量,是多个相同类型的
数据集合。它可以是二维的和多维的。
数组类型定义的格式为:
TYPE 数据类型名
IS ARRAY (范围) OF 元素类型名;
多维数组需要用两个以上的范围来
描述,而且多维数组不能生成逻辑
电路,因此只能用于生成仿真图形
 范围一项规定数组下标的类型和范围。默认的下标类型是整型,
及硬件的抽象模型。
但也可以使用其它数据类型,这就需要在范围中标明下标的类型。
例如:
TYPE count1 IS ARRAY ( STD_LOGIC '_' DOWNTO 'U' )
OF INTEGER;
(3) 纪录(RECORD)类型。 是多个不同类型的数据集合。
纪录类型定义的格式为:
TYPE 数据类型名 IS RECORD
元素名: 数据类型名;
元素名: 数据类型名;
……
END RECORD;
 纪录适用于描述总线、通信协议等。对于记录类型的对象
进行单元素赋值时,可在记录类型对象名后加点“.”,然后
再加赋值元素的元素名。
(4)时间(TIME)类型(物理类型)。表示时间的数据类型,
在仿真时是必不可少的。
时间类型定义的一般格式为:
TYPE 数据类型名 IS 范围;
UNITS 基本单位;
单位;
END UNITS;
例如:TYPE time IS range –1e18 TO 1e18;
UNITS fs;
ps=1000fs;
ns=1000ps;
μs=1000ns;
ms=1000μs;
set=1000ms;
min=60set;
hr=60min;
END UNITS;
这里的基本单位是“fs”。时间是物理类型的数据,
当然对容量、阻抗值也可以做定义。
(5) 子类型(SUBTYPE)。子类型是一个具有限制条件的类型,
通常用来定义具有一定限制条件的基本类型的数据对象。
子类型定义的一般格式为:
SUBTYPE 子类型名 IS 数据类型名[约束范围];
例如:如下 Byte 被定义作为一个子类型,而后数据对象被定义
为从属于该子类型。
SUBTYPE Byte IS Bit_Vector(7 downto 0);
SIGNAL Byte1, Byte2:Byte;
SIGNAL Data1, Data2:Byte;
SIGNAL Addr1, Addr2:Byte;
2.4 数据类型的转换
在VHDL程序中,不同类型的对象不能代入,因此要进行类型
转换。类型转换的方法有:
(1)类型标记法。用类型名称来实现关系密切的标量类型之间的
转换。
例如:
VARIABLE x:INTEGER;
VARIABLE y:REAL;
使用类型标记(即类型名)实现类型转换时,可采用赋值语句:
x :=INTEGER(y);
y :=REAL(x)。
(2)类型函数法。
该函数由
STD_LOGIC_UNSIGNED
VHDL程序包中提供了多种转换函数,使得某些类型的数据之间可以相互转
程序包定义
换,以实现正确的赋值操作。常用的类型转换函数有:
该函数由
STD_LOGIC_ARITH
★CONV_INTEGER ( ):将STD_LOGIC_VECTOR类型转换成
INTEGER类型。
程序包定义
以下函数由
STD_LOGIC_1164
★CONV_STD_LOGIC_VECTOR( ):将INTEGER类型、UNSIGNED
程序包定义
类型或 SIGNED类型转换成STD_LOGIC_VECTOR类型。
★TO_BIT ( ): 将STD_LOGIC类型转换成BIT类型。
★TO_BIT_VECTOR( ):将STD_LOGIC_VECTOR类型转换
BIT_VECTOR 类型。
★TO_STD_LOGIC( ): 将BIT类型转换成STD_LOGIC类型。
★TO_STD_LOGIC_VECTOR( ): 将BIT_VECTOR类型转换成
STD_LOGIC_VECTOR类型。
注意 :引用时必须首先 打开库和相应的程序包。
(3)用常数实现的类型变换
CONSTANT tpye_conv-con:
type_conv-con:=('0'∣'L'=>'0',‘1'∣'H'=>‘1',Others=
>'0');
SIGNAL b:bit;
SIGNAL S : std_ulogic;
BEGIN
B<=TYPE_CONV-CON(s);--类型转换式
END;
2.5 词法单元
2.5.1 数字
十进制数表示法
十进制数书写的规范格式为:
十进制文字: := 整数[整数][指数]


整数: := 数字或下划线连接的数字
指数: := E[+]整数或E[-]整数
整数举例:089,0,456-78,2e8,5e3。
实数举例:12.0,0.0,3.14159,1.2E-3,2.4e+5。
基表示法
用“基”表示数字的规范书定格式为:
被表示的数: := 基#基于基的整数[.基于基的整数]#指数
 基 为2~16之间的十进制正整数 。 #号为定界符,基为10时可省略定界
符和基。
 基于基的整数: := 扩展数字{[下划线]扩展数字}
扩展数字: := 数字/字母
因为十六进制数中,大于9以上的数字用A,B,C,D,E,F表示,
此处数字不再是0~9共10个符号,而是扩展到0~F共16个符号表示
数字,后者相对于前者称为扩展数字。
 指数: := E[+]整数或E[-]整数
整数举例:十进制值为255的数,用基表示法,写为:
2#11111111#
-- 二进制表示法
8#377#
-- 八进制表示法
16#FF#
-- 十六进制表示法
实数0.5的表示:
2#0.100# 8#0.4#
16#0.8#
2#1#E-1 8#4#E-1 16#8#E-1
2.5.2 字符、字符串和位串

字符为单引号括起来的ASCII字符,其规范书写格式为:

字符文字: := ‘图形字符’

例如‘1’,‘A’,‘F’…。

字符串为双引号括起来的图形字符序列。规范书写格式为:

字符串文字: := “{图形字符}”

例如:“PCI BUS interface”,

“This string constain an information”。

位串是被双引号括起来的数字序列,其前冠以基数说明符;如,
B“0110_1111”,O“117”,X“FFE0”;

注意:相邻数字之间插入下划线只为增加可读性,对数值无影响
2.5.3 文法格式
关键字、标识符:不区分大小写;
注释:‘--’,且只在该文本行有效;
分隔:‘;’为行分隔,VHDL的语句行可写在不同
文本行中 ;
空格:除关键字、标识符自身中间不能插入空格外,
其他地方可插入任意数目的空格 ;
2.6 运算符与操作符
VHDL中共有四类运算符:
(1)逻辑运算符:包括一元逻辑运算符和二元逻辑运算符。
一元逻辑运算符包括:NOT
二元逻辑运算符包括:AND、OR、NAND、NOR、XOR
(2)算术运算符:包括一元算术运算符和二元算术运算符。
一元算术运算符包括:+(正号)、—(负号)、ABS(求绝对值)
二元算术运算符包括:+ 、— 、* 、/ 、MOD(求模)、REM(求余)、
**(指数运算)
(3)关系运算符:它包括:= 、/= 、<、<= 、>、>=
关系运算符,在VHDL程序设计中有如下规则:
两个对象进行比较时,数据类型一定要相同。
=(等于)和/=(不等于)适用于所有数据类型的对象之间的比较。
大于、小于、大于等于、小于等于适用于整数、实数位、位矢量及数组类型
的比较。
<=符号有两种含义:代入符和小于等于符,要根据上下文判断。
两个位矢量类型的对象比较时,自左至右,按位比较。
VHDL中的操作符:
● “<=” 赋值符:用于将数据传给信号。
● “:=”赋值符:用于将数据传给变量。该赋值符也用于为信号、变量、
常量等指定初值。
● “=>” 符号: 在WHEN语句中出现,其含义是“THEN(则)”。
(4)并置运算符:&(连接),用于将多个位连接成为位矢量。
例如:DBUS<=D0&D1&D2&D3,即DBUS<=(D0,D1,D2,D3)。
并置运算符的使用规则如下:
并置运算符可用于位的连接,形成位矢量。
并置运算符可用两位矢量的连接构成更大的位矢量。
位的连接,可以用并置符连接法,也可用集合体连接法。
举例如下:
DATA_C <= D0 & D1 & D2 & D3;
DATA_C <= (D0,D1,D2,D3);
 上述四种运算符的优先级顺序为:NOT、ABS、**;REM、
MOD、/、*;—(负)、+(正);&、—(减)、+(加);>= 、
<= 、>、<、/= 、= ;XOR、NOR、NAND、OR、AND 。
 需要注意的是:在编写VHDL程序时,必须保证操作数的数据
类型与运算符所要求的数据类型一致。
2.7 属性(Attributes)
VHDL没有一般程序设计语言中那些运算类标准函数,取
而代之的是多种能反映和影响硬件行为的属性 。VHDL的属性
可分为数值类、函数类、信号类和范围类等属性。
属性的一般格式为:
Object ′Attributes
为获取硬件设计
中的一些有关信
息(各类项目特
性)而定义的内
部函数
某一项目的属性或特征通常可以用一个值或一个表达式来表示;
它可以通过VHDL的属性描述语句加以访问。
1.数值类属性
数值类属性用于返回数组、块、或一般数据的有关值,如边
界、数组长度等。
● 对一般数据属性,返回函数的边界值。其格式为
Object ′LEFT;
Object ′RIGHT;
Object ′HIGH;
Object ′LOW;
● 对于数组的数值属性,返回数组的长度值。其格式为
Object ′LENGTH;
● 对于块结构体的数值属性,返回块的信息。其格式为
Object ′BEHAVIOR;
Object ′STRUCTURE;
例如:TYPE num IS ARRAY RANGE 7 DOWNTO 0;
VARIABLE i1,i2,i3,i4,M: INTEGER;
BEGIN
i1:=num ′LEFT;
i2:=num ′RIGHT;
--i1取得num的左边界值 7
--i2取得num的右边界值 0
i3:=num ′HIGH;
--i3取得num的上限值 7
i4:=num ′LOW;
--i4取得num的下限值 0
M:= num ′LENGTH; --M取得num的长度为8
2.函数类属性
函数类属性是以函数形式为设计人员提供数据类型、数组、信
号的相关信息的。
● 数据类型的属性函数。利用数组属性可以获得数组的区间,该
属性的格式为
Object ′SUCC(X);
--获取X的下一个值
Object ′PRED(X);
--获取X的前一个值
Object ′LEFTOF(X);
--获取X的左边值
Object ′RIGHTOF(X);
--获取X的右边值
其中, “Object”为数据类型名,X为其中的一个元素。
例如:TYPE time IS (year,month,day,hour,min,sec);
则 time ′SUCC(hour);
time ′LEFTOF(day);
--获取元素hour的下一个值min
--获取元素day的左边值month
● 数组的属性函数。其格式为
Object ′LEFT(n);
--获取索引号为n的区间左端边界值
Object ′RIGHT(n); --获取索引号为n的区间右端边界值
Object ′HIGH(n);
--获取索引号为n的区间高端边界值
Object ′LOW(n);
--获取索引号为n的区间低端边界值
其中, “Object”为数组名;n为多维数组中所定义的多维区
间的序号。默认值n=1,表示对一维空间进行操作。
● 信号的属性函数。利用信号属性可得到信号的行为和功能信息,
其格式为
Object ′EVENT;
--反映信号的值是否变化,是,则返回为“真”
Object ′ACTIVE; --反映信号是否活跃,是,则返回为“真”
Object ′LAST_EVENT;
--反映从最近一次事件到现在经过
需要注意的是
:信号的事件(
Event)和活跃(Active)是两
的时间,返回一个时间值
个不同的概念,必须严格区分。信号的活跃
定义为信号值的
Object ′LAST_VALUE;
--反映信号变化前的取值,并将
任何变化。信号值由1变为0是一个活跃,而从1变为1也是一个
活跃,唯一的准则是发生了事情,这种情况被称为一个事项处
该历史值返回
理(Transaction)。然而,
则要求信号值发生变
Object ′LAST_ACTIVE; 信号的事件
--反映从最近一次活跃到现在经过
化。信号值从1变为0是一个事件,但从1变为1虽是一个活跃却
的时间,返回一个时间值
不是一个事件。所有的事件都是活跃,但并非所有的活跃都是
事件。
例如:利用函数信号属性检查信号的建立时间。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY dff1 IS
PORT(d,clk : IN STD_LOGIC;
q : OUT STD_LOGIC);
END dff1;
ARCHITECTURE setup_time_check OF dff1 IS
BEGIN
PROCESS(clk)
BEGIN
IF(clk='1′) AND (clk ′EVENT) THEN
q<=d;
ASSERT (d ′LAST_EVENT>5ns) --条件为真,向下执行
REPORT “SETUP VIOLATION” --条件为假,报告错误信息:
建立时间不符合要求
SEVERITY ERROR;
--出错等级:ERROR
END IF;
END PROCESS;
END setup_time_check;
3.信号类属性
信号类属性的作用对象是信号,其返回值也是一个信号。共有
四种信号类属性,分别是:
● DELAYED (time),即延时。该属性使受它作用的信号延时time所规
定的值。如:a′DELAYED (5ns)即信号a延时5ns。
● STABLE (time)。用于监测信号在规定时间内的稳定性。若受它作用的
信号在time所规定的时间内没有发生事件,则该属性的结果为“TRUE”。
● QUIET(time)。用于监测信号在规定时间内的是否“安静”。若受
它 作 用 的 信 号 在 time 所 规 定 的 时 间 内 没 有 发 生 事 情 或 事 件 ( Active 或
Event ),则该属性的结果为“TRUE”。
● TRANSACTION。用于检测信号的 Active 或 Event 。当Active 或
Event 发生时,该属性的值也将发生改变。
4.范围类属性
该属性的返回值是一个数据区间。其
范围类属性的格式为:
Object ′RANGE(n);
Object ′REVERSE RANGE(n);
这两个属性功能相同,但得到的区间范围是颠倒的。