超大规模集成电路VHDL.ppt
第2章 VHDL词法基础,2.1 标识符 2.2 数据对象 2.3 数据类型 2.4 类型转换 2.5 词法单元 2.6 运算符与操作符 2.7 属性,标识符规则是VHDL语言中符号书写的一般规则。不仅对电子系统设计工程师是一个约束,同时也为各种各样的EDA工具提供了标准的书写规范,使之在综合仿真过程中不生产生歧义,易于仿真。VHDL语言有两个标准版:VHDL87版和VHDL93版。VHDL87版的标识符语法规则经过扩展后,形成了VHDL93版的标识符语法规则。前一部分称为短标识符,扩展部分称为扩展标识符。VHDL93版含有短标识符和扩展标识符两部分。,2.1 标识符,短标识符规则:短标识符由字母、数字以及下划线字符组成,且具有以下特征要求:第一个字符必须是字母;最后一个字符不能是下划线;不允许连续两个下划线;在标识符中大、小写字母是等效的。VHDL中的注释文字一律为2个连续的连接线“-”,可以出现在任一语句后面,也可以出现在独立行;VHDL的保留字(关键字)不能用于标识符;,2.1.1 短标识符,如下标识符是非法的:_ tx_clk 8B10B large#number link_ _bar select rx_clk_,例如:如下标识符是合法的:tx_clk Three_state_Enable sel7D HIT_1124,-标识符必须起始于字母,-只能是字母、数字、下划线,-不能有连续两个下划线,-关键字(保留字)不能用于标识符,-最后字符不能是下划线,扩展标识符规则:扩展标识符是VHDL93版增加的标识符书写规则:(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.1.2 扩展标识符,2.2 数据对象,在VHDL中,凡是可以赋予一个值的客体称为数据对象。常用的数据对象为常量、变量、信号和文件,其中文件类型是VHDL93标准中新通过的。对象说明的一般书写格式为:对象类别 标识符表:子类型标识:初值;对象说明举例:CONSTANTT1,T2:time:30ns,-常量说明VARIABLESUM:read;-变量说明SIGNALCLOCK:bit;-信号说明FILE input:Text IS IN“STD_INPUT”-文件说明,2.2.1 常量,常量(CONSTANT)常量是指在设计描述中不会变化的值。在VHDL描述中,一般用常量名代替数值。,常量说明语句的一般格式为:CONSTANT 常量名,常量名:数据类型:=取值;,例:8位寄存器宽度指定:CONSTANT width:integer:8;设计实体的电源供电电压指定:CONSTANT vcc:real:5.0;某一模块信号输入/输出的延迟时间:CONSTANT delay:time:100ns;,常量所赋值和定义的数据类型应一致。常量一旦赋值就不能再改变。若要改变常量值,必须要改变设计,改变实体中的常量说明,然后重新编译。常量必须在程序包、实体、结构体或进程的说明区域中对常量的标识符、类型、常量值进行指定。定义在程序包中的常量由所在的实体或结构体调用。定义在实体内的常量仅在实体内使用,定义在进程内的常量仅在进程内使用。,常量的使用规则,变量(VARIABLE)变量是暂存数据的量。,变量说明语句的格式是:VARIABLE 变量名,变量名:数据类型:=初始值;,例如:VARIABLE count:INTEGER RANGE 0 TO 99:=0VARIABLES 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.变量赋值 立即生效,不存在延时行为;信号赋值 具有非立即性,信号之间的传递具有延时性。,4.信号赋值 可以出现在进程中,也可以直接出现在结构体中,但它们的运行含义不同:前者属顺序信号赋值,此时的赋值操作要视进程是否已被启动;后者属并行信号赋值,其赋值操作是各自独立并行发生的。,3.变量 用作进程中暂存数据的单元;信号 用作电路中的信号连线。,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;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;,当进程运行时,信号赋值将自上而下顺序执行,但第一项赋值操作并不会发生,这是因为信号赋值是在进程结束时才起作用。因为在进程结束更新时,d的最后一个赋值为c,因此执行结果为该式。,2.2.4 文件,文件(files)是传输大量数据的客体,包含一些专门数据类型的数值。在仿真测试时,测试的输入激励数据和仿真结果的输出都要用文件来进行。在IEEE1076标准中,TEXTIO程序包中定义了文件I/O传输的方法。它们是对过程的定义,调用这些过程就能完成数据的传递。procedure Readline(F:in Text;L:out Line);procedure Writeline(F:out Text;L:in Line);Procedure 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(整数)。取值范围为(2311)(2311)。在电子系统中,整数可以用进制来表示。整数不能看作矢量,不能单独对某一位操作。整数不能用于逻辑运算,只能用于算术运算。对象的数据类型定义为整数时,范围应有约束。例如: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(字符)。是用单引号括起来的一个字母(AZ,az)、数字(09)、空格或一些特殊字符(如$、%等)。VHDL语言对大小写英文字母不敏感,但区分字符量中的大小写。A,a,B,b,都认为是不同的字符。字符1,2仅是符号。,(7)String(字符串)。是用双引号括起来的一个字符序列。字符串区分大、小写字母。常用于程序的提示和结果说明等。例如“VHDL”,“STRING”,“MULTI_SCREEN COMPUTER”等。,(8)Time(时间)。时间的取值范围从(2311)(2311)。时间由整数值和时间单位组成。常用的时间单位有:fs、ns、s、ms、s、min、hr等。时间类型一般用于仿真,而不用逻辑综合。时间常用于指定时间延时和标记仿真时刻。,时间单位的描述规范说明如下:TYPE_TIME IS RANGE-2147483647 to 2147483847UNITS FS;PS=1000fs;Ns=1000ps;Us=1000Ns;Ms=1000us;Sec=1000ms;Min=60 sec;Hr=60 min;End units;,上述10种数据类型是VHDL中标准的数据类型,在编程时可以直接引用。如果用户需使用其它的数据类型,则必须进行自定义。,(9)Natural(自然数)和Positive(正整数)。是整数类型的子类型。自然数取值范围为0(2311);正整数是大于 0 的整数。,(10)Severity Level(错误等级)。错误等级分为:NOTE(注意)、WARNING(警告)、ERROR(出错)、FAILURE(失败)四级,用于提示系统的错误等级。错误等级这个数据类型用于表示电子系统工作状态。,标准数据类型,IEEE库STD_LOGIC_1164程序包中定义的STD_LOGIC类型和STD_LOGIC_VECTOR类型。(VHDL93标准)STD_LOGIC类型的数据可以具有九种取值,其含义如下:U:初始值X:不定态0:强制01:强制1Z:高阻态W:弱信号不定态L:弱信号0H:弱信号1_:不可能情况(可忽略值)其中,“X”方便了系统仿真,“Z”方便了双向总线的描述。,STD_LOGIC_VECTOR类型定义如下:TYPE STD_LOGIC_VECTOR IS ARRAY(NATURAL RANGE)OF STD_LOGIC;,2.用户自定义数据类型 VHDL允许用户自己定义数据类型。,常用的用户自定义数据类型主要有:(1)枚举(Enumerated)类型。通过列举某类变量所有可能的取值来加以定义。对这些取值,一般使用自然语言中有相应含义的单词或字符序列来代表,以便于阅读和理解。,自定义数据类型说明语句的一般格式是:TYPE 数据类型名,数据类型名 IS 数据类型定义;,枚举类型定义的格式为:TYPE 数据类型名 IS(元素1,元素2,);,该数据类型括号中的值自左向右按升序排列,中间用逗号分隔。在VHDL中,对其中每一个元素都赋予一个位置编号,最左边的元素开始记为“0”,向右依次递增“1”。这为“属性”提供了一个访问位置编号的机制。,例如,在程序包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=1000s;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)类型函数法。VHDL程序包中提供了多种转换函数,使得某些类型的数据之间可以相互转换,以实现正确的赋值操作。常用的类型转换函数有:,CONV_INTEGER():将STD_LOGIC_VECTOR类型转换成 INTEGER类型。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类型。,注意:引用时必须首先 打开库和相应的程序包。,该函数由STD_LOGIC_UNSIGNED程序包定义,该函数由STD_LOGIC_ARITH程序包定义,以下函数由STD_LOGIC_1164程序包定义,(3)用常数实现的类型变换 就效率而言,利用常数实现类型转换比利用类型转换函数的效率更高。下面的例子使用常数把类型为STD_LOGIC的值转换为BIT型的值。例:ENTITY typeconv IS.END;ARCHITECTURE arch OF typeconv IS TYPE typeconv_type IS ARRAY(STD_LOGIC)OF BIT;-定义一个类型CONSTANT typecon_con:typeconv_type:=(0/L=0,1/H=1,OTHERS=0);SIGNAL b:BIT;SIGNAL b:BIT;SIGNAL s:STD_LOGIC;BEGIN b=typecon_con(s);-常数实现类型转换,十进制数表示法,十进制数书写的规范格式为:十进制文字:整数整数指数整数:数字或下划线连接的数字指数:E整数或E整数整数举例:089,0,45678,2e8,5e3。实数举例:12.0,0.0,3.14159,1.2E3,2.4e5。,2.5 词法单元,2.5.1 数字,基表示法,用“基”表示数字的规范书定格式为:被表示的数:基基于基的整数.基于基的整数指数基为216之间的十进制正整数。#号为定界符,基为10时可省略定界符和基。基于基的整数:扩展数字下划线扩展数字 扩展数字:数字/字母 因为十六进制数中,大于9以上的数字用A,B,C,D,E,F表示,此处数字不再是09共10个符号,而是扩展到0F共16个符号表示数字,后者相对于前者称为扩展数字。指数:E整数或E整数整数举例:十进制值为255的数,用基表示法,写为:211111111-二进制表示法 8377-八进制表示法 16FF-十六进制表示法实数0.5的表示:2#0.100#8#0.4#16#0.8#2#1#E-1 8#4#E-1 16#8#E-1,字符为单引号括起来的ASCII字符,其规范书写格式为:字符文字:图形字符例如1,A,F。字符串为双引号括起来的图形字符序列。规范书写格式为:字符串文字:“图形字符”例如:“PCI BUS interface”,“This string constain an information”。位串是被双引号括起来的数字序列,其前冠以基数说明符;如,B“0110_1111”,O“117”,X“FFE0”;注意:相邻数字之间插入下划线只为增加可读性,对数值无影响,2.5.2 字符、字符串和位串,关键字、标识符:不区分大小写;注释:-,且只在该文本行有效;分隔:;为行分隔,VHDL的语句行可写在不同文本行中;空格:除关键字、标识符自身中间不能插入空格外,其他地方可插入任意数目的空格;,2.5.3 文法格式,2.6 运算符与操作符,VHDL中共有四类运算符:(1)逻辑运算符:包括一元逻辑运算符和二元逻辑运算符。一元逻辑运算符包括:NOT 二元逻辑运算符包括:AND、OR、NAND、NOR、XOR、XNOR 这7种逻辑运算符可以对“STD_LOGIC”和“BIT”等逻辑型数据、“STD_LOGIC _VECTOR”逻辑型数组及布尔数据进行逻辑运算。必须注意,运算符的左边和右边,以及代入的信号的数据类型必须是相同的。在一些高级语言中,逻辑操作符有从左向右或从右向左的优先组合顺序,而在VHDL中,左右没有优先组合的区别,一个表达式中如果有多个逻辑操作符,运算顺序的不同可能会影响运算结果,就需要用括号来解决组合顺序的问题。,例如:q=a AND b OR NOT c AND d;这条语句在编译时会给出语法错误信息,可以加上括号改为:q=(a AND b)OR(NOT(c AND d);如果逻辑表达式中只有AND、OR、XOR这3个操作符中的一种,可以不加括号,因为对于这三种逻辑运算来说,改变运算顺序不会影响逻辑结果。,例如:SIGNAL a,b,c:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL d,e,f,g:STD_LOGIC_VECTOR(1 DOWNTO 0);SIGNAL h,I,j,k:STD_LOGIC;SIGNAL l,m,n,o,p:BOOLEAN;.a=b AND c;-b、c 相与后向a赋值,a、b、c的数据类型同属4位长的位矢量d=e OR f OR g;-两个操作符OR相同,不需括号h=(i NAND j)NAND k;-NAND不属于上述三种算符中的一种,必须加括号l=(m XOR n)AND(0 XOR p);-操作符不同,必须加括号h=i AND j AND k;-两个操作符都是AND,不必加括号h=i AND j OR k;-两个操作符不同,未加括号,表达错误a=b AND e;-操作数b与e的位矢长度不一致,表达错误h=i OR l;-i的数据类型是位STD_LOGIC,而l的数据类型是-布尔量BOOLEAN,因而不能相互作用,表达错误,2.6 运算符与操作符,(2)算术运算符:包括一元算术运算符和二元算术运算符。一元算术运算符包括:+(正号)、(负号)、ABS(求绝对值)二元算术运算符包括:+、*、/、MOD(求模)、REM(求余)、*(指数运算)移位操作符:SLL(逻辑左移)、SRL(逻辑右移)、SLA(算术左移)、SRA(算术右移)、ROL(逻辑循环左移)、ROR(逻辑循环右移),(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;-i1取得num的左边界值 7 i2:=num RIGHT;-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);-获取元素hour的下一个值min time LEFTOF(day);-获取元素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;-反映从最近一次事件到现在经过的时间,返回一个时间值 Object LAST_VALUE;-反映信号变化前的取值,并将 该历史值返回 Object LAST_ACTIVE;-反映从最近一次活跃到现在经过的时间,返回一个时间值,需要注意的是:信号的事件(Event)和活跃(Active)是两个不同的概念,必须严格区分。信号的活跃 定义为信号值的任何变化。信号值由1变为0是一个活跃,而从1变为1也是一个活跃,唯一的准则是发生了事情,这种情况被称为一个事项处理(Transaction)。然而,信号的事件 则要求信号值发生变化。信号值从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 ISBEGIN PROCESS(clk)BEGIN IF(clk=1)AND(clk EVENT)THEN q=d;ASSERT(d LAST_EVENT5ns)-条件为真,向下执行 REPORT“SETUP VIOLATION”-条件为假,报告错误信息:建立时间不符合要求 SEVERITY ERROR;-出错等级:ERROR END IF;END PROCESS;END setup_time_check;,3信号类属性 信号类属性的作用对象是信号,其返回值也是一个信号。共有四种信号类属性,分别是:DELAYED(time),即延时。该属性使受它作用的信号延时time所规定的值。如:aDELAYED(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);,