第四章VHDL语言的数据类型及运算操作符.ppt

上传人:sccc 文档编号:6005507 上传时间:2023-09-13 格式:PPT 页数:59 大小:335.54KB
返回 下载 相关 举报
第四章VHDL语言的数据类型及运算操作符.ppt_第1页
第1页 / 共59页
第四章VHDL语言的数据类型及运算操作符.ppt_第2页
第2页 / 共59页
第四章VHDL语言的数据类型及运算操作符.ppt_第3页
第3页 / 共59页
第四章VHDL语言的数据类型及运算操作符.ppt_第4页
第4页 / 共59页
第四章VHDL语言的数据类型及运算操作符.ppt_第5页
第5页 / 共59页
点击查看更多>>
资源描述

《第四章VHDL语言的数据类型及运算操作符.ppt》由会员分享,可在线阅读,更多相关《第四章VHDL语言的数据类型及运算操作符.ppt(59页珍藏版)》请在三一办公上搜索。

1、第四章 VHDL语言的数据类型及运算操作符号,VHDL语言像其它高级语言一样,具有多种数据类型。对大多数数据类型的定义,两者是一致的。但是也有某些区别,如VHDL语言中可以由用户自己定义数据类型,这一点在其它高级语言中是做不到的。,4.1 VHDL语言的客体及其分类,在VHDL语言中凡是可以赋予一个值的对象就称为客体(Object)。客体主要包括以下3种:信号、变量、常数(Signal、Variable、Constant)。在电子电路设计中,这3类客体通常都具有一定的物理含义。例如,信号对应地代表物理设计中的某一条硬件接线;常数对应地代表数字电路中的电源和地等。当然,变量对应关系不太直接,通常

2、只代表暂存某些值的载体。3类客体的含义和说明场合如下表所示。,4.1.1 常数(Constant),常数是一个固定的值。所谓常数说明就是对某一常数名赋予一个固定的值。通常赋值在程序开始前进行,该值的数据类型则在说明语句中指明。常数说明的一般格式如下:,CONSTANT 常数名:数据类型:=表达式;,例如:CONSTANT Vcc:REAL:=5.0;CONSTANT DALY:TIME:=100 ns;CONSTANT FBUS:BIT_VECTOR:=“0101”;,常数一旦被赋值就不能再改变。上面Vcc被赋值为5.0V,那么在所有的VHDL语言程序中Vcc的值就固定为5.0V,它不像后面所

3、提到的信号和变量那样,可以任意代入不同的数值。另外,常数所赋的值应和定义的数据类型一致。例如:CONSTANT Vcc:REAL:=“0101”;这样的常数说明显然是错误的。,4.1.2 变量(Variable),变量只能在进程语句、函数语句和过程语句结构中使用,它是一个局部量。在仿真过程中,它不像信号那样,到了规定的仿真时间才进行赋值,变量的赋值是立即生效的。变量说明语句的格式为:,VARIABLE 变量名:数据类型 约束条件:=表达式;,例如:VARIABLE x,y:INTEGER;VARIABLE count:INTEGER RANGE 0 TO 255:=10;,变量在赋值时不能产生

4、附加延时。例如,tmp1,tmp2,tmp3都时变量,那么下式产生延时的方式时不合法的:tmp3:=tmp1+tmp2 AFTER 10ns;,4.1.3 信号(Signal),信号是电子电路内部硬件连接的抽象。它除了没有数据流动方向说明以外,其它性质几乎和前面所述的“端口”概念一致。信号通常在构造体、包集合和实体中说明。信号说明语句格式为:,SIGNAL 信号名:数据类型 约束条件:=表达式;,例如:SIGNAL sys_clk:BIT:=0;SIGNAL ground:BIT:=0;,在程序中,信号值的代入采用“=”代入符,而不是像变量赋值时用“:=”符。而且信号代入时可以附加延时。例如,

5、s1和s2都时信号,且s2的值经10ns延时以后才被代入s1。此时信号传送语句可书写为:s1=s2 AFTER 10ns;信号时一个全局量,它可以用来进行进程之间的通信。一般来说,在VHDL语言中对信号赋值时按仿真时间来进行的。信号值的改变也需按仿真时间的计划表行事。,4.1.4 信号和变量值代入的区别,信号和变量值的代入不仅形式不同,而且其操作过程也不相同。在变量的赋值语句中,该语句一旦被执行,其值立即被赋予变量。在执行下一条语句时,该变量的值就为上一句新赋的值。变量的赋值符为“:=”。信号代入语句采用“=”代入符,该语句即使被执行也不会使信号立即发生代入。下一条语句执行时,仍使用原来的信号

6、值。由于信号代入语句是同时进行处理的,因此,实际代入过程和代入语句的处理是分开进行的。,信号和变量值代入的区别(续),如下面左图所示,信号C和D的代入值(A+B)和(C+B)将由PROCESS外部通过进程的敏感信号A,B,C取得。进程执行时,只从信号所对应的实体取值,只要不碰到WAIT语句或进程执行结束,进程执行过程中信号值是不进行代入的。如下面右图所示,为了进行仿真,需要让代入和处理交替地反复进行。,4.1.5 信号和变量值代入的区别-举例,现在来看下例中两个进程描述的语句。首先,由于信号A发生变化使进程语句开始启动执行。这样一来,仿真器对进程中的各语句自上至下地进行处理。当进程所有语句执行

7、完毕,或者中途碰到WAIT语句时,该进程执行结束,信号代入过程被执行。代入同样应按顺序自上至下地进行。,在第一个进程中,D中最初代入的值是A,接着又代入C值。尽管D中先代入A值,后代入C值,在时间上有一个的延时,但是,在代入时由于不进行处理,因此仿真时认为是时间0值延时。因此D的最终值应为C,这样X和Y的内容都为B+C。,在第二个进程中,D是变量。在执行“D:=A;”语句以后,A的值就被赋给D,所以 X为B+A。此后又执行“D:=C;”,从而使Y为B+C。从这里可以看出,信号量的值将进程语句最后所代入的值作为最终代入值。而变量的值一经赋值就变成新的值。这就是变量赋值和信号代入在操作上的区别。,

8、4.2 VHDL语言的数据类型,如前所述,在VHDL语言中信号、变量、常数都要指定数据类型。为此,VHDL提供了多种标准的数据类型。另外,为使用户设计方便,还可以由用户自定义数据类型。这样使语言的描述能力及自由度更进一步提高,从而为系统高层次的仿真提供了必要手段。与此相反,VHDL语言的数据类型的定义相当严格,不同类型之间的数据不能直接代入,而且,即使数据类型相同,而位长不同时也不能直接代入。这样,为了熟练地使用VHDL语言编写程序,必须很好理解各种数据类型的定义。,数据类型的概念在VHDL语言中十分重要可以说VHDL是一个强数据类型(strongly typed)语言,即意味着每个对象都只能

9、取该对象所指定类型的值而且,对每个操作的定义也都包含了作为操作对象的值的类型这种强类型化的目的是允许设计师可以在设计过程的早期阶段(即在模型的分析阶段)发现错误,4.2.1 VHDL语言标准的数据类型,1、整数(Integer),整数与数学中的整数的定义相同。在VHDL中,整数的表示范围为-21474836472147483647,即从-(232-1)和(232-1),但实际上VHDL语言的执行可以扩充到这个范围之外千万不要把一个实数(含小数点的数)赋予一个整数变量,这是因为VHDL是一个强类型语言,它要求在赋值语句中的数据类型必须匹配。整数的例子如下:+136,+12456,-457,尽管整

10、数值在电子系统中可能是用一系列二进制位值来表示的,但是整数不能看作是位矢量,也不能按位来进行访问,对整数不能用逻辑操作符。当需要进行位操作时,可以用转换函数,将整数转换成位矢量。目前在有的CAD厂商所提供的工具中,对此规定已有所突破,允许对有符号和无符号的整型量进行算术逻辑运算。在电子系统的开发过程中,整数也可以作为对信号总线状态的一种抽象手段,用来准确地表示总线的某一状态。,下面例举两个整数类型的定义:type day_of_month is range 0 to 31;type year is range 0 to 2100;这两个类型是完全不同的,尽管它们包括了一些共同的值因此,如果按下

11、面的方式来声明两个变量:variable today:day_of_month:=9;variable start_year:year:=1987;则如下操作是非法的:start_year:=today;尽管数字是类型year中的一个元素,但是它与day_of_month不是一个类型,二者不相容,2、实数(Real),在进行算法研究或者实验时,作为对硬件方案的抽象手段,常常采用实数四则运算。实数的定义值范围为-1.0E+38+1.0E+38。实数有正负数,书写时一定要有小数点。例如:-1.0,+2.5,-1.0E38有些数可以用整数表示也可以用实数表示。例如,数字1的整数表示为1,而用实数表示

12、则为1.0。两个数的值时一样的,但数据类型却不一样。,浮点类型声明举例:type input level is range-10.0 to+10.0;type probability is range 0.0 to 1.0 声明为浮点类型的变量有一个默认的初始值,即类型区间最左边的数值因此,如果声明一个变量属于上述input level类型:variable input_a:input_level;其初始值即为-10.0,3、位(Bit),在数字系统中,信号值通常用一个位来表示。位值的表示方法是,用字符0或者1(将值放在单引号中)表示之。位与整数中的1和0不同,1和0仅仅表示一个位的两种取值。

13、有时也可以用显式说明之,例如:BIT(1)位数据可以用来描述数字系统中总线的值。位数据不同于布尔数据,当然也可以用转换函数进行转换。,4、位矢量(Bit_Vector),位矢量是用双引号括起来的一组位数据。例如:“001100”X“00BB”在这里,位矢量最前面的X表示是十六进制。用位矢量数据表示总线状态最形象也最方便。在以后的VHDL程序中将会经常用到。,5、布尔量(Boolean),一个布尔量具有两种状态,“真”或者“假”。虽然布尔量也是二值枚举量,但它和位不同,没有数值的含义,也不能进行算术运算。它能进行关系运算。例如,它可以在IF语句中被测试,测试结果产生一个布尔量TRUE或者FALS

14、E。一个布尔量常用来表示信号的状态或者总线上的情况。如果某个信号或者变量被定义为布尔量,那么在仿真中将自动地对其赋值进行核查。一般这一类型的数据的初始值总为FALSE。,6、字符(Character),字符也是一种数据类型,所定义的字符量通常用单引号括起来,如A。一般情况下,VHDL对大小写不敏感,但是对字符量中的大、小写字符则认为是不一样的。例如,B不同于b。字符量中的字符可以是az中的任一个字母,09中的任一个数字以及空白或者特殊字符,如$,%等等。包集合STANDARD中给出了预定义的128个ASCII码字符类型,不能打印的用标识符给出。字符1于整数1和实数1.0都是不相同的。当要明确指

15、出1的字符数据时,则可写为 CHARACTER(1),7、字符串(String),字符串是由双引号括起来的一个字符序列,它也称字符矢量或字符串数组。例如:“integer range”字符串常用于程序的提示和说明。,8、时间(Time),时间时一个物理量数据。完整的时间量数据应包含整数和单位两部分,而且整数和单位之间至少应留一个空格的位置。例如,55 sec,2 min等。在包集合STANDARD中给出了时间的预定义,其单位为fs,ps,ns,us,ms,sec,min,hr。下面时时间数据的例子:20 us,100 ns,3 sec在系统仿真时,时间数据特别有用,用它可以表示信号延时,从而使

16、模型系统能更逼近实际系统的运行环境。,9、错误等级(Severity Level),错误等级类型数据用来表征系统的状态,它共有4中:NOTE(注意),WARNING(警告),ERROR(出错),FAILURE(失败)。在系统仿真过程中可以用这4种状态来提示系统当前的工作情况。这样可以使操作人员随时了解当前系统工作的情况,并根据系统的不同状态采取相应的对策。,10、大于等于零的整数(Natural),正整数(Positive),这两类数据是整数的子类,Natural类数据只能取值0和0以上的正整数;而Positive类数据则只能为正整数。,11、VHDL语言标准的数据类型小结,上述10种数据类型

17、是VHDL语言中标准的数据类型,在编程时可以直接引用。如果用户需使用这10种以外的数据类型,则必须进行自定义。但是,大多数的CAD厂商已在包集合中对标准数据类型进行了扩展。例如,数组型数据等。由于VHDL语言属于强类型语言,在仿真过程中,首先要检查赋值语句中的类型和区间,任何一个信号和变量的赋值均必须落入给定的约束区间中,也就是说要落入有效数值的范围中。约束区间的说明通常跟在数据类型说明的后面。例如:INTEGER RANGE 100 DOWNTO 1 BIT_VECTOR(3 DOWNTO 0)REAL RANGE 2.0 TO 30.0这里DOWNTO表示下降;而TO表示上升。一个BCD数

18、的比较器,利用约束区间说明的端口说明语句可以写为:ENTITY bcd_compare IS PORT(a,b:IN INTEGER RANGE 0 TO 9:=0;c:OUT BOOLEAN);END bcd_compare;,应该来说严格将VHDL语言的数据类型化为标准类型和非标准类型是没有意义而事实上VHDL语言类型的划分也没有种标准类型之多下面我们从另一个角度来总结对于语言的数据类型,可以分为标题类型,复合类型,访问类型,文件类型四中,而后面两种我们暂时不做讨论而前面我们定义的种标准数据类型全部属于标题类型,标题类型,分立类型,浮点类型,物理类型,real,整数类型,枚举类型,time

19、,interger,boolean,severity_level,character,bit,如上图所表示的那样,我们可以从分立类型,浮点类型,物理类型三个类型的划分去具体记忆我们前面所提到的中标准类型。,4.2.2 用户定义的数据类型,在VHDL语言中,使用户最感兴趣的一个特点是,可以由用户自己来定义数据类型。由用户定义的数据类型的定义书写格式为:TYPE 数据类型名,数据类型名 数据类型定义;在VHDL语言中还存在不完整的用户定义的数据类型的书写格式:TYPE 数据类型名,数据类型名;这种由用户做的数据类型定义是一种利用其它已定义的说明所进行的“假”定义,因此它不能进行逻辑综合。,1、用户

20、定义的数据类型的种类,枚举(Enumerated)类型;整数(Integer)类型;实数(Real)、浮点数(Floating)类型;数组(Array)类型;存取(Access)类型;文件(File)类型;记录(Recode)类型;时间(Time)类型(物理类型)。,2、枚举(Enumerated)类型,在逻辑电路中,所有的数据都是用“1”或“0”来表示的,但是人们在考虑逻辑关系时,只有数字往往时不方便的。在VHDL语言中,可以用符号名来代替数字。例如,在表示一周每一天状态的逻辑电路中,可以假设“000”为星期天,“001”为星期一。这对阅读程序是非常不方便的。为此,可以定义一个叫“week”

21、的数据类型。TYPE week IS(sun,mon,tue,wed,thu,fri,sat);由于上述的定义,凡是用于代表星期二的日子都可以用tue来代替,这比用代码“010”表示星期二直观多了,使用时也不易出错。枚举类型数据的定义格式为:TYPE 数据类型名 IS(元素,元素,);这类用户定义的数据类型应用相当广泛,例如在包集合STD_LOGIC和STD_LOGIC_1164中都由此类数据的定义。如:TYPE STD_LOGIC IS(U,X,0,1,Z,W,L,H,-);,3、整数类型(Integer),实数类型(Real),整数类型在VHDL语言中已存在,这里所说的是用户所定义的整数类

22、型,实际上可以认为是整数的一个子类。例如,在一个数码管上显示数字,其值只能取09的整数。如果由用户定义一个用于数码显示的数据类型,那么就可以写为:TYPE digit IS INTEGER RANGE 0 TO 9;同理实数类型也如此,例如:TYPE current IS REAL RANGE 1E4 TO 1E4;据此,可以总结出整数或实数用户定义数据类型的格式为:TYPE 数据类型名 IS 数据类型定义 约束范围;,4、数组(Array)类型,数组是将相同类型的数据集合在一起所形成的一个新的数据类型。它可以是一维的也可以是二维或多维的。数组定义的书写格式为:TYPE 数据类型名 IS AR

23、RAY 范围 OF 原数据类型名;在这里如果范围这一项中没有指定数据类型,则使用整数数据类型。例如:TYPE word IS ARRAY(1 TO 8)OF STD_LOGIC;若范围这一项需用整数类型以外的其它数据类型时,则在指定数据范围前应加数据类型名。例如:TYPE word IS ARRAY(INTEGER 1 TO 8)OF STD_LOGIC;TYPE instruction IS(ADD,SUB,INC,SRL,SRF,LDA,LDB,XFR);SUBTYPE digit IS INTEGER 0 TO 9;TYPE insflag IS ARRAY(instruction AD

24、D TO XRF)OF digit;,数组(Array)类型(续1),数组在总线定义及ROM,RAM等的系统模型中使用。“STD_LOGIC_VECTOR”也属于数组数据类型,它在包集合“STD_LOGIC_1164”中被定义:TYPE STD_LOGIC_VECTOR IS ARRAY(NATURAL RANGE)OF STD_LOGIC;这里范围由“RANGE”指定,这是一个没有范围限制的数组。在这种情况下,范围由信号说明语句等确定。例如:SIGNAL aaa:STD_LOGIC_VECTOR(3 DOWNTO 0);在函数和过程的语句中,若使用无限制范围的数组时,其范围一般由调用者所传递

25、的参数来确定。多维数组需要用两个以上的范围来描述,而且多维数组不能生成逻辑电路,因此只能用于生成仿真图形及硬件的抽象模型。例如:,数组(Array)类型(续2),上述例子是二维的。在三维情况下要用3个范围来描述。在代入初值时,各范围最左边所说明的值为数组的初始位脚标。在上例中(0,7)是起始位,接下去右侧范围向右移一位变为(0,6),以后顺序为(0,5),(0,4)直至(0,0)。然后,左侧范围向右移一位变为(1,7),此后按此规律移动得到最后一位(5,0)。,TYPE memarray IS ARRAY(0 TO 5,7 DOWNTO 0)OF STD_LOGIC;CONSTANT romd

26、ata:memarray:=(0,0,0,0,0,0,0,0),(0,1,1,1,0,0,0,1),(0,0,0,0,0,1,0,1),(1,0,1,0,1,0,1,0),(1,1,0,1,1,1,1,0),(1,1,1,1,1,1,1,1);SIGNAL data_bit:STD_LOGIC;data_bit=romdata(3,7);,在三维图形中,空间的一个点可以使用一个坐标的三元矢量来表示可以通过一个矢量乘以一个的变换矩阵来对空间的点进行变换,比如缩小放大,旋转和反演等,得到一个表示被变换点的新矢量对点和变换矩阵书写的VHDL类型声明如下:type point is array(1 t

27、o 3)of real;type matrix is array(1 to 3,1 to 3)of real;可以利用上面的数组类型来声明有关点的变量p和q,以及一个矩阵变量transform:variable p,q:point variable transform:matrix;,利用下面的语句来实现对点p的变换,产生结果为点q:for i in 1 to 3 loop q(i):=0.0 for j in 1 to 3 loop q(i):=q(i)+transform(i,j)*p(j);end loop;end loop;,5、时间(Time)类型(物理类型),表示时间的数据类型,在

28、仿真时是必不可少的,其书写格式为:,TYPE 数据类型名 IS 范围;UNITS 基本单位;单位;END UNITS;,例如:TYPE time IS RANGE-1E18 TO 1E18;UNITS fs;ps=1000fs;ns=1000ps;us=1000ns;ms=1000us;sec=1000ms;min=60sec;hr=60min;END UNITS;,这里基本单位是“fs”,其1000倍是“ps”等等。时间是物理类型的数据,当然对容量、阻抗值等也可以作定义。,6、记录(Recode)类型,数组是同一类型数据集合起来形成的,而记录则是将不同类型的数据和数据名组织在一起而形成的新客

29、体。记录数据类型的定义格式为:,TYPE 数据类型名 IS RECORD 元素名:数据类型名;元素名:数据类型名;END RECORD;,记录(Recode)类型(续),在从记录数据类型中提取元素数据类型时应使用“”。例如:TYPE bank IS RECORD addr0:STD_LOGIC_VECTOR(7 DOWNTO 0);addr1:STD_LOGIC_VECTOR(7 DOWNTO 0);r0:INTEGER;inst:instruction;END RECORD;SIGNAL addbus1,addbus2:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL

30、result:INTEGER;SIGNAL alu_code:instruction;SIGNAL r_bank:bank:=(“00000000”,”00000000”,0,add);addbus1=r_bank.addr1;r_bank.inst=alu_code;用记录描述SCSI总线及通信协议时比较方便的。记录数据类型在生成逻辑电路时应将它分解开来才行。因此,它比较适用于系统仿真。,4.2.3 用户定义的子类型,用户定义的子类型是用户对已定义的数据类型,作一些范围限制而形成的一种新的数据类型。子类型的名称通常采用用户较易理解的名字。子类型定义的一般格式为:SUBTYPE 子类型名 IS

31、 数据类型名 范围;例如,在“STD_LOGIC_VECTOR”基础上所形成的子类:SUBTYPE iobus IS STD_LOGIC_VECTOR(7 DOWNTO 0);SUBTYPE digit IS INTEGER RANGE 0 TO 9;子类型可以对原数据类型指定范围而形成,也可以完全和原数据类型范围一致。例如:SUBTYPE abus IS STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL aio:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL bio:STD_LOGIC_VECTOR(15 DOWNTO 0);SIGNAL cio

32、:abus;aio=cio;正确操作 bio=cio;错误操作 除上述外,子类型还常用于存储器阵列等的数组描述的场合。新构造的数据类型及子类型通常在包集合中定义,再由USE语句装载到描述语句中。,1、数据类型的转换,在VHDL语言中,数据类型的定义是相当严格的,不同类型的数据是不能进行运算和直接代入的。为了实现正确的代入操作,必须将要代入的数据进行类型变换。这就是所谓类型变换。变换函数通常由VHDL语言的包集合提供。,2、类型变换函数,3、数据类型转换的例子,LIBRARY IEEE;USE IEEE STD_LOGIC_1164.ALL;USE IEEE STD_LOGIC_UNSIGNED

33、.ALL;ENTITY add5 IS PORT(num:IN STD_LOGIC_VECTOR(2 DOWNTO 0););END add5;ARCHITECTURE rtl1 OF add5 IS SIGNAL in_num:INTEGER RANGE 0 TO 5;BEGIN in_num=CON_INTEGER(num);(变换式)END rtl;,数据类型转换的例子(续),此外,由“BT_VECTOR”变换成“STD_LOGIC_VECTOR”也非常方便。代入“STD_LOGIC_VECTOR”的值只能是二进制数,而代入“BIT_VECTOR”的值除二进制数以外,还可能是十六进制及八

34、进制数。不仅如此,“BIT_VECTOR”还可以用“-”来分隔数值位。下面的几个语句表示了“BIT_VECTOR”和“STD_LOGIC_VECTOR”的赋值语句。SIGNAL a:BIT_VECTOR(11 DOWNTO 0);SIGNAL b:STD_LOGIC_VECTOR(11 DOWNTO 0);a=X“A8”;十六进制值可赋予位矢量 b=X“A8”;语法错,十六进制值不能赋予位矢量 b=TO_STDLOGICVECTOR(X“AF7”);b=TO_STDLOGICVECTOR(O“5177”);八进制变换 b=TO_STDLOGICVECTOR(B“1010_1111_0111”)

35、;,4、数据类型的限定,在VHDL语言中,有时可以用所描述的文字的上下关系来判断某一数据的数据类型。例如:SIGNAL a:STD_LOGIC_VECTOR(7 DOWNTO 0);aYY=“10111111”;END CASE,数据类型的限定(续),在上例中a类型限定方式与数据类型变换很相似,这一点同学们应注意。,5、IEEE标准“STD_LOGIC”、“STD_LOGIC_VECTOR”,在上面的数据类型介绍中,曾讲到VHDL的标准数据类型“BIT”,它是一个逻辑型的数据类型。这类数据取值只能是“0”和“1”。由于该类型数据不存在不定状态X,故不便于仿真。另外,由于它也不存在高阻状态,因此

36、也很难用它来描述双向数据总线。为此IEEE在1993年制订出了新的标准(IEEE STD1164),使得“STD_LOGIC”型数据可以具有如下的9种不同的值:U-初始值;X-不定;0-0;1-1;Z-高阻;W-弱信号不定;L-弱信号0;H-弱信号1;-不可能情况。,“STD_LOGIC”和“STD_LOGIC_VECTOR”使IEEE新制订的标准化数据类型,也是在VHDL语法以外所添加的数据类型,因此将它归属到用户定义的数据类型种。当使用该类型数据时,在程序中必须写出库说明语句和使用包集合的说明语句。,4.2.4 VHDL语言的运算操作符,在VHDL语言中共有4类操作符,可以分别进行逻辑运算

37、(Logical)、关系运算(Relational)、算术运算(Arithmetic)和并置运算(Concatenation)。需要注意的是,被操作符所操作的对象是操作数,且操作数的类型应该和操作符所要求的类型相一致。另外,运算操作符是有优先级的,例如逻辑运算符NOT,在所有操作符中其优先级最高。,1、操作符的优先级,请同学们参看书上45页的表格。,2、逻辑运算符,在VHDL语言中逻辑运算符共有6种,它们分别是:NOT(取反)、AND(与)、OR(或)、NAND(与非)、NOR(或非)、XOR(异或)。,这6种逻辑运算符可以对“STD_LOGIC”和“BIT”等的逻辑型数据、“STD_LOGI

38、C_VECTOR”逻辑型数组及布尔型数据进行逻辑运算。必须注意,运算符的左边和右边,以及代入的信号的数据类型必须是相同的。,当一个语句种存在两个以上的逻辑表达式时,在语言种运算有自左至右的优先级顺序规定,而在语言中,左右没有优先级差别。例如,在下例中,如去掉式中的括号,那么从语法上来说时错误的:X=(a AND b)OR(NOT c AND d);,逻辑运算符(续),当然也有例外,如果一个逻辑表达式中只有“AND”,“OR”,“XOR”运算符,那么改变运算顺序将不会导致逻辑的改变。此时,括号时可以省略的,例如:a=b AND c AND d AND e;a=b OR c OR d OR e;a

39、=b XOR c XOR d XOR e;a=(b NAND c)NAND d)NAND e;(必须要括号)a=(b AND c)OR(d AND e);(必须要括号)在所有逻辑运算符中NOT的优先级最高。,3、算术运算符,在VHDL语言中算术运算符共有10种,它们分别是:+(加),(减),*(乘),/(除),MOD(求模),REM(取余),+(正),(负),*(指数),ABS(取绝对值)。,在算术运算中,对于一元运算的操作数(正、负)可以为任何数值类型(整数、实数、物理量)。加法和减法的操作数也和上面一样,具有相同的数据类型,而且参加加、减运算的操作数的类型也必须相同。乘除法的操作数可以同为

40、整数和实数。物理量可以被整数或实数相乘或相除,其结果仍为一个物理量。物理量除以同一类型的物理量即可得到一个整数量。求模和取余的操作数必须时同一整数类型数据。一个指数的运算符的左操作数可以是任意整数或实数,而右操作数应为一整数(只有在左操作数是实数时,右操作数才可以是负整数)。,算术运算符(续),实际上能够真正综合逻辑电路的算术运算符只有“+”、“”、“*”。在数据位较长的情况下,在使用算术运算符进行运算,特别是使用乘法运算符“*”时,应特别慎重。因为对于16位的乘法运算,综合时逻辑门电路会超过2000个门。对于算术运算符“/”、“MOD”、”REM”,分母的操作数为2乘方的常数时,逻辑电路综合

41、时可能的。,若对“STD_LOGIC_VECTOR”进行“+”(加)、“”(减)运算时,两边的操作数和代入的变量位长如不同,则会产生语法错误。另外,“*”运算符两边的位长相加后的值和要代入的变量的位长不相同时,同样也会出现语法错误。,4、关系运算符,在VHDL语言中关系运算符共有6种,它们分别是:=(等于),/=(不等于),(大于),=(大于等于)。,在关系运算符的左右两边时运算操作数,不同的关系运算符对两边的操作数的数据类型有不同的要求。其中等号“=”和不等号“/=”可以适用所有类型的数据。其它关系运算符则可使用于整数(INTEGER)和实数(REAL)、位(STD_LOGIC)等枚举类型以

42、及位矢量(STD_LOGIC_VECTOR)等数组类型的关系运算。在进行关系运算时,左右两边的操作数的数据类型必须相同,但是位长度不一定相同,当然也有例外的情况。在利用关系运算符对位矢量数据进行比较时,比较过程是从最左边的位开始,自左至右按位进行比较的。在位长不同的情况下,只能按自左至右的比较结果作为关系运算的结果。,关系运算符(续),上例a的值位10,而b的值位7,a应该比b大。但是,由于位矢量是从左至右按位比较的,当比较到次高位时,a的次高位为“0”而b的次高位为“1”,故比较结果b比a大。这样的比较结果显然时不符合实际情况的。为了能使位矢量进行关系运算,在包集合“STD_LOGIC_UNSIGNED”中对“STD_LOGIC_VECTOR”关系运算重新作了定义,使其可以正确的进行关系运算。注意在使用时必须首先说明调用该包集合。当然,此时位矢量还可以和整数进行关系运算。在关系运算符中小于等于符“=”和代入符“=”时相同的,在读VHDL语言的语句时,应按照上下文关系来判断此符号到底时关系符还是代入符。,例如,对3位和4位的位矢量进行比较:SIGNAL a:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL b:STD_LOGIC_VECTOR(2 DOWNTO 0);a b)THEN ELSE,5、并置运算符,5、并置运算符,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号