EDA技术与VHDL设计-(6)[140页]课件.ppt

上传人(卖家):三亚风情 文档编号:3515012 上传时间:2022-09-10 格式:PPT 页数:140 大小:743.50KB
下载 相关 举报
EDA技术与VHDL设计-(6)[140页]课件.ppt_第1页
第1页 / 共140页
EDA技术与VHDL设计-(6)[140页]课件.ppt_第2页
第2页 / 共140页
EDA技术与VHDL设计-(6)[140页]课件.ppt_第3页
第3页 / 共140页
EDA技术与VHDL设计-(6)[140页]课件.ppt_第4页
第4页 / 共140页
EDA技术与VHDL设计-(6)[140页]课件.ppt_第5页
第5页 / 共140页
点击查看更多>>
资源描述

1、1/1262/1263/1264/1265/1266/1267/1268/1269/12610/12611/12612/12613/12614/126举例:半加器:一位加法器举例:半加器:一位加法器15/12616/126实体17/126nENTITY 实体名 ISn GENERIC(参数名:数据类型);n PORT(端口表);nEND ENTITY 实体名;18/1266.1.1 类属参数说明n类属参数是VHDL的一个术语,用以将信息参数传递到实体。参数传递说明语句必须放在端口说明语句之前,用于指定参数。n最常用的参数是器件的上升沿和下降沿之类的延迟时间、负载电容和电阻、驱动能力和功耗、总线

2、宽度等。19/126参数传递说明语句的一般格式 nGENERIC(常数名:数据类型 :设定值 ;常数名:数据类型 :设定值 );n参数传递说明语句以关键词GENERIC引导一个类属参量表,表中提供时间参数或总线宽度等静态信息。20/126【例6.2】译码器实体描述nENTITY decoder ISn GENERIC(N:POSITIVE);n PORTn(sel:IN BIT_VECTOR(1 to N);n dout:OUT BIT_VECTOR(1 to 2*N);nEND decoder;21/126【例6.3】带延迟的基本门电路nENTITY gate ISn GENERIC(del

3、ay:TIME:=5ns)n PORT();nEND gate;22/1266.1.2 端口说明n 端口为设计实体和其外部环境提供动态通信的通道,是对基本设计单元与外部接口的描述,其功能相当于电路图符号的外部引脚。端口可以被赋值,也可以当做逻辑变量用在逻辑表达式中。n 端口说明语句是对实体与外部电路接口的描述,也可以是对外部信号的输入/输出端口模式及其数据类型的描述。端口说明语句由PORT引导,并在语句的结尾处加分号。23/126端口说明语句的一般格式 nPORT(端口名 ,端口名 :端口模式 数据类型;n n 端口名 ,端口名 :端口模式 数据类型);24/126端口名n赋予每个实体外部引脚

4、的名称,通常用一个或几个英文字母或英文字母加数字命名,如d0、sel、q0等。n端口名的定义有一定惯例,如clk表示时钟,d开头的端口名表示数据,a开头的端口名表示地址等。25/126端口模式n端口模式是指这些通道上数据流动的方式,如输入或输出等。端口模式用来定义外部引脚的信号方向,其模式有4种,分别为IN、OUT、INOUT和BUFFER。26/126数据类型n数据类型指的是端口信号的类型。27/1266.1.3 实体描述举例28/12629/12630/12631/12632/126结构体n结构体是对实体功能的具体描述,因此它一定要跟在实体的后面。结构体一般由两大部分组成:(1)对数据类型

5、、常数、信号、子程序和元器件等进行说明的部分;(2)描述实体的逻辑行为,以各种不同的描述风格表达的功能描述语句,包括各种顺序语句和并行语句。33/12634/1266.2.1 结构体的命名35/1266.2.2 结构体信号定义语句36/1266.2.3 结构体功能描述语句。37/12638/126n LIBRARY IEEE;n USE IEEE.STD_LOGIC_1164.ALL;n ENTITY comparator ISn PORT(a,b:IN STD_LOGIC_VECTOR(7 DOWNTO 0);n g:OUT STD_LOGIC);n END comparator;n ARC

6、HITECTURE behavioral OF comparator ISn BEGINn comp:PROCESS(a,b)n BEGINn IF a=b THEN g=1;n ELSE g=0;n END IF;n END PROCESS;n END behavioral;39/12640/126【例6.8】8位比较器数据流描述 n LIBRARY IEEE;n USE IEEE.STD_LOGIC_1164.ALL;n ENTITY comparator ISn PORT(a,b:IN STD_LOGIC_VECTOR(7 DOWNTO 0);n g:OUT STD_LOGIC);n E

7、ND comparator;n ARCHITECTURE dataflow OF comparator ISn BEGINn g=1 WHEN(a=b)ELSE 0;n END dataflow;41/126【例6.9】布尔方程描述 n LIBRARY IEEE;n USE IEEE.STD_LOGIC_1164.ALL;n ENTITY comparator ISn PORT(a,b:IN STD_LOGIC_VECTOR (7 DOWNTO 0);n g:OUT STD_LOGIC);n END comparator;n ARCHITECTURE bool OF comparator IS

8、n BEGINn g=NOT(a(0)XOR b(0)AND NOT(a(1)XOR b(1)AND NOT(a(2)XOR b(2)ANDn NOT(a(3)XOR b(3)AND NOT(a(4)XOR b(4)AND NOT(a(5)XOR b(5)ANDn NOT(a(6)XOR b(6)AND NOT(a(7)XOR b(7);n END bool;42/12643/12644/126库n 库是经编译后数据的集合,它可以存放程序包定义、实体定义、结构体定义和配置定义。库的好处在于使设计者可以共享已经编译过的设计结果,以便在其他设计中可以随时引用这些信息,提高设计效率。在VHDL中可以

9、存在多个不同的库,但是库与库之间是独立的,不能相互嵌套。n 每当综合器在较高层次的VHDL源文件中遇到库语言时,就将随库制定的源文件读入,并参与综合。这就是说,在综合过程中,所要调用的库必须以VHDL源文件的方式存在,并能使综合器随时读入使用。45/12646/12647/12648/12649/1266.3.2 库的用法50/12651/126举例n LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_1164.STD_ULOGIC;n 第一个USE语句表明打开IEEE库中的STD_LOGIC_1164程序包,并使程序包中的

10、所有公共资源对本语句后面的VHDL设计实体程序全部开放,关键词ALL代表程序包中的所有资源。第二个USE语句开放了程序包STD_LOGIC_1164中的STD_ULOGIC数据类型。STD_ULOGIC是可枚举数据类型。52/12653/12654/12655/12656/126程序包n 在编写VHDL程序的过程中,实体说明和结构体中的信号定义、常量定义、数据类型、子程序说明、属性说明及元器件说明等部分只能在本设计实体中使用,而对于其他设计实体来说,则是不可用的。因此,为了使一组信号定义、数据类型说明或子程序说明等对多个设计实体和相应的结构体都有效,VHDL提供了程序包的概念。n 在VHDL中

11、,程序包主要用来存放各个设计能够共享的信号说明、常量定义、数据类型说明、子程序说明、属性说明和元器件说明等部分。如果需要使用程序包中的某些说明和定义,设计人员只需使用USE语句进行说明即可。57/1266.4.1 程序包组成和格式n 一个完整的程序包一般是由两部分组成的,分别为程序包说明部分和程序包包体部分。其中,程序包说明部分主要对数据类型、子程序、常量、元器件、属性和属性指定等进行说明;程序包包体部分由程序包说明部分指定的函数和过程的程序体组成,即用来规定程序包的实际功能。程序包包体部分的描述方法和结构体相同。n 程序包这种结构的好处是:当功能需要做某些调整或数据赋值需要变化时,只要改变程

12、序包体的相关语句就可以了,而无须改变程序包首的说明,这样使得需要重新编译的单元数目尽可能地减少。58/126程序包说明部分 n程序包说明部分的一般格式如下:nPACKAGE 程序包名 ISn 说明部分;程序包说明部分nEND 程序包名;59/126程序包包体部分 n程序包包体的一般格式如下:nPACKAGE BODY 程序包名 ISn 外部子程序体;n 内部子程序说明;n 内部子程序体;程序包体n 内部常量说明;n 内部数据类型说明;nEND 程序包名;60/1266.4.2 VHDL标准程序包(1)STD_LOGIC_1164程序包n 这是IEEE库中最常用的程序包,是IEEE的标准程序包。

13、包中包含一些数据类型、子类型和函数定义。这些定义将VHDL扩展为一个能描述多值逻辑的硬件描述语言,很好地满足了实际数字系统的设计需求。n STD_LOGIC_1164程序包中用得最多和最广的是两个满足工业标准的数据类型STD_LOGIC和STD_LOGIC_VECTOR。61/126(2)STD_LOGIC_ARITH程序包62/126(3)STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED程序包n它们都是Synopsys公司的程序包,都预先编译在IEEE库中。这些程序包包含了可用于INTEGER类型及STD_LOGIC和STD_LOGIC_VECTOR类型混合运算的运算符

14、,并定义了由STD_LOGIC_VECTOR型到INTEGER型的转换函数。这两个程序包的区别是后者定义的运算符考虑到了符号,是有符号数的运算。63/126(4)STANDARD和TEXTIO程序包n这是STD库中预先编译好的程序包。STANDARD程序包中定义了许多基本的数据类型、子类型和函数。TEXTIO程序包定义了支持文件操作的许多类型和子程序,主要供仿真器使用。64/126调用程序包的通用模式 nUSE 库名.程序包名.ALL;n例如:USE IEEE.STD_LOGIC_1164.ALL;该语句表示在VHDL程序中要使用名为STD_LOGIC_1164的程序包中所定义或说明的项。65

15、/12666/126配置n 在一般的VHDL程序设计中,元器件的结构体与该元器件同名的实体相连接,配置可以把特定的结构体关联到(指定给)一个确定的实体。通常在大而复杂的VHDL工程设计中,配置语句可以为实体指定或配置一个结构体。例如,可以利用配置使仿真器为同一实体配置不同的结构体,使设计者比较不同结构体的仿真差别,或者为例化的各元器件实体配置指定的结构体,从而形成一个所希望的例化元器件层次构成的设计实体。n VHDL提供配置语句用于描述各种设计实体和元器件之间的连接关系,以及设计实体和结构体之间的连接关系。67/1266.5.1 默认配置n默认配置是最简单形式的配置,不含任何块语句和元器件的模

16、块可用这种配置。默认配置语句的一般格式如下:nCONFIGURATION 配置名 OF 实体名 IS FOR 选配结构体名 END FOR;END 配置名;68/1266.5.2 结构体的配置n结构体的配置主要用来对结构体中引用的元器件进行配置。结构体的配置格式如下:FOR :USE ENTITY.;69/126【例6.11】全加器(采用结构体配置)70/12671/1266.6.1 标志符72/126VHDL87标准短标识符命名规则 短标志符必须由英文字母、数字及下画线组成;短标志符必须以英文字母开头;短标志符不允许连续出现两个下画线;短标志符最后一个字符不能是下画线;短标志符中的英文字母不

17、区分大小写;VHDL中的关键字不能作为短标志符来使用 73/126VHDL93标准扩展标志符命名规则 扩展标志符用反斜杠来分隔,如addr_bus;扩展标志符中允许包含图形符号和空格等,如addr&_bus和addr_b us;扩展标志符的两个反斜杠之间可以用数字开头,如16_addr_bus;扩展标志符的两个反斜杠之间可以使用关键字;扩展标志符中允许多个下画线相连;同名的扩展标志符和短标志符不同;扩展标志符区分大小写;若扩展标志符中含有一个反斜杠,则应该用两个相邻的反斜杠来代替。74/126举例n 以下是几种合法的标志符:my_counter,decoder_1,FFT,ram-addres

18、s。n 以下是几种非法的标志符。_Decoder_1:起始为非英文字母。2FFT:起始为数字。Sig_#N:符号“#”不能成为标志符的构成。Not-Ack:符号“-”不能成为标志符的构成。RyY_RST_:标志符的最后不能是下画线“_”。Data_ _BUS:标志符中不能有双下画线。Return:关键词。75/1266.6.2 数字1整数n 没有标出进制的整数都是十进制数,数字间的下画线仅仅是为了提高文字的可读性,相当于一个空的间隔符。例如,45_234_287等于45234287,156E2等于15600。n 如果需要指明进制,则表示成“进制#数值#指数”5个部分。#起分隔作用,十进制用10

19、表示,十六进制用16表示,八进制用8表示,二进制用2表示。数值与进制有关,指数部分用十进制表示,如果指数部分为0,则可以省略不写。例如,16#FE#表示十六进制数值FE,2#1111_1110#表示二进制数值11111110。76/1262实数n实数也都是十进制的数,但必须带有小数点。例如,1.335,99E-2等。77/1263物理量文字nVHDL综合器不接受此类文字,如60s,100m等。78/1266.6.3 字符串n 字符是用单引号括起的ASCII字符,可以是数值,也可以是符号或字母,例如:R,a,*,Z,U,0,11,-,Ln 字符串是一维的字符数组,需要放在双引号中。字符串有两类,

20、分别是文字字符串和数位字符串。n 文字字符串是用双引号括起的一串文字,例如:ERROR,Both S and Q equal to 1,X,BB$CC。79/126数位字符串n 也称位矢量,是预定义的数据类型BIT的一位数组。数位字符串与文字字符串相类似,但所代表的是二进制、八进制或十六进制的数组。它们所代表的位矢量长度即为等值的二进制数位数。n 字符串数值的数据类型是一维的枚举型数组。与文字字符串表示不同,数位字符串的表示首先要有计算基数,然后将该基数表示的值放在双引号中,基数符以“B”、“O”和“X”表示。80/12681/126nVHDL是一种强类型语言,不同类型之间的数据不能相互传递。

21、而且,即使数据类型相同,如果位长不同,也不能相互传递。这样,VHDL综合工具很容易找出设计中的各种常见错误。82/126n VHDL的数据类型可以分成4类:标量型、复合型、存取型和文件型。这些数据类型又可以分成预定义数据类型和自定义数据类型两个类别。n 预定义的VHDL数据类型是VHDL最常用、最基本的数据类型。这些数据类型都已在VHDL的标准程序包STANDARD和STD_LOGIC_1164及其他的标准程序包中进行了定义,并可在设计中随时调用。n VHDL综合器只支持部分可综合的预定义或用户自定义的数据类型,对于有些类型不支持,如TIME、FILE等类型。83/1266.7.1 预定义数据

22、类型数 据 类 型含 义整数整数32位,-2 147 483 6472 147 483 647实数浮点数,-1.0E+38+1.0E+38位逻辑“0”或“1”位矢量逻辑“0”或“1”序列布尔量逻辑“真”或“假”字符ASCII字符字符串ASCII字符序列时间时间单位fs,ps,ns,s,ms,sec,min,hr错误等级NOTE,WARNING,ERROR,FAILURE自然数、正整数整数的子集(自然数:大于等于0的整数;正整数:大于0的整数)84/1261整数(integer)n 整数类型的数代表正整数、负整数和零。整数类型与算术整数相似,可以使用预定义的运算符,如加(+)、减(-)、乘(*)

23、、除(/)等进行算术运算。n 在VHDL中,整数的取值范围是-2 147 483 647+2 147 483 647,即可用32位有符号的二进制数表示。n 实际应用中,VHDL仿真器通常将整数类型作为有符号数处理,而VHDL综合器则将整数作为无符号数处理。在使用整数时,VHDL综合器要求用“RANGE子句”为所定义的数限定范围,然后根据范围决定表示此信号或变量的二进制位数。85/1262实数(real)nVHDL的实数类型也类似于数学中的实数,或称浮点数。实数取值范围为-1.0E38+1.0E38。通常情况下,实数类型仅能在VHDL仿真器中使用,VHDL综合器则不支持实数。直接的实数类型表达和

24、实现相当复杂,目前在电路规模上难以承受。n实数有正、负数之分,书写时一定要带小数点。例如,-1.0,+2.5,-1.0E38。86/1263位(bit)n 位数据类型的取值只能是0或1。位与整数中的0和1不同,前者是逻辑值,后者是整数值。位数据类型可以用来描述数字系统中的总线值,当然也可以用转换函数进行转换。4 位矢量(bit_vector)n 位矢量是用双引号括起来的一组位数据。例如,“001100”、X“00BB”,这里位矢量前面的X表示十六进制。使用位矢量时必须注明位宽。87/1265布尔量(boolean)n布尔类型的数据只能取逻辑“真”或“假”两者之一。布尔量不属于数值,不能用于运算

25、,只能通过关系运算符获得。88/1266字符(character)n 字符也是一种数据类型,所定义的字符量通常用单引号括起来,如A。一般情况下,VHDL对大、小写不敏感,但是对字符量中的大、小写字符则加以区分。例如,B不同于b。字符量中的字符可以是az中任一个字母,09中的任一个数及空白或者特殊字符,如$、%等。程序包STANDARD中给出了预定义的128个ASCII字符类型,不能打印的用标志符给出。注意,字符1与整数1和实数1.0都是不相同的。89/1267字符串(string)n字符串是由双引号括起来的字符序列,也称为字符矢量或字符串数组,例如,“integer range”。字符串常用于

26、程序的提示和说明。90/1268时间(time)n 时间是一个物理量数据。完整的时间数据应包含整数和单位两部分,而且整数和单位之间应至少留一个空格位置,如55 sec、2 min等。n 在程序包STANDARD中给出了时间的预定义,其单位为fs,ps,ns,s,ms,sec,min,hr。以下为时间数据的例子:20 s,100 ns,3 sec。n 在系统仿真时,时间数据非常有用,用它可以表示信号延时,从而使模型系统更逼近实际系统的运行环境。91/1269错误等级(severity level)n错误等级类型数据用来表征系统的状态,它共有4种:NOTE(注意)、WARNING(警告)、ERRO

27、R(出错)、FAILURE(失败)。在系统仿真过程中可以用这4种状态提示系统当前的工作情况。这样可使操作人员随时了解当前系统的工作情况,并根据系统的不同状态采取相应对策。92/12610大于等于零的整数(natural)、正整数(positive)n这两类数据是整数的子类,大于等于零的整数类型只能取0和0以上的正整数。93/1266.7.2 自定义数据类型n在VHDL中,用户最感兴趣是可以自己定义数据类型。用户自定义数据类型格式为:TYPE 数据类型名 ,数据类型名 数据类型定义;n在VHDL中,还存在不完整的用户自定义数据类型,其格式为:TYPE 数据类型名,数据类型名;94/1261枚举类

28、型n枚举类型数据的定义格式为:TYPE 数据类型名 IS (元素,元素,);n枚举类型应用相当广泛,在程序包STD_LOGIC和STD_LOGIC_1164中都有定义。例如,STD_LOGIC的数据类型在STD_LOGIC_1164程序包中被定义为:TYPE STD_LOGIC IS (U,X,0,1,Z,W,L,H,);95/1262整数类型、实数类型n整数或实数用户自定义数据类型的格式为:TYPE 数据类型名 IS 数据类型定义 约束范围;96/1263数组类型n数组(ARRAY)类型属于复合类型,是将一组具有相同数据类型的元素集合在一起,作为一个数据对象来处理的数据类型。n数组可以是一维

29、(每个元素只有一个下标)数组或多维数组(每个元素有多个下标)。VHDL仿真器支持多维数组,但综合器只支持一维数组。97/126n数组的元素可以是任何一种数据类型。用以定义数组元素的下标范围子句决定了数组中元素的个数及元素的排序方向,即下标数是由低到高或由高到低排列的。98/126数组定义的书写格式 nTYPE 数据类型名 IS ARRAY (范围)OF 原数据类型名;n在这里如果范围这一项没有被指定,则使用整数数据类型。99/1264时间类型n 时间类型是表示时间的数据类型,在仿真时是必不可少的。其格式为:TYPE 数据类型名 IS 范围 UNITS 基本单位;单位;END UNITS;n 这

30、里的基本单位是“fs”,其1000倍是“ps”。时间是物理类型的数据,当然对容量、阻抗值等也可以进行定义。100/1265记录类型n 数组是同一类型数据集合起来形成的,而记录则是将不同类型的数据和数据名组织在一起形成的新客体。记录类型的定义格式为:TYPE 数据类型名 IS RECORD 元素名:数据类型名;元素名:数据类型名;END RECORD;101/1266.7.3 用户自定义的子类型n用户自定义的子类型是用户对已定义的数据类型进行一些范围限制而形成的一种新数据类型。n子类型定义的一般格式为:SUBTYPE 子类型名 IS 数据类型名 范围;102/126n子类型可以对原数据类型指定范

31、围而形成,也可以完全和原数据类型范围一致。例如: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:abvs;n aio=cio;正确操作n bio=cio;错误操作103/1266.7.4 数据类型的转换n 在VHDL中,数据类型的定义是相当严格的,不同类型的数据是不能进行运算或赋值的,这点读者一定要注意。在某一数据类型的常量、变量、信号和文件之间进行运算或赋值操作时,必须

32、要保证数据类型的一致性,否则仿真和综合过程中EDA工具将会给出错误信息。可见,数据类型的转换在编写VHDL程序中显得十分重要。n 通常,VHDL提供了三种数据类型的转换方法,它们分别是类型标志符转换、常量转换和函数转换。104/1261类型标志符转换n 所谓类型标志符转换,实际上就是利用数据类型的名称进行类型的转换,这种方法通常只适用于那些关系比较密切的数据类型之间的转换。n 例如,整数和实数之间的数据类型转换:SIGNAL m:INTEGER;SIGNAL n:REAL;m=integer(n);n=real(m);n 以上实数转换整数时会发生“四舍五入”的现象。105/1262常量转换n

33、常量转换就是借助一个具有转换表格性质的常量进行某些数据类型的转换,通常它的仿真效率要比利用转换函数的效率高得多。在进行某些复杂算法或数字信号处理过程中,采用常量转换是一种非常有效的方法。n 采用常量转换方法的具体操作步骤是:首先利用一个数组常量(实际上就是一个转换表),然后通过给转换信号赋常量数组的元素值完成数据类型的转换。106/1263函数转换n 函数转换是利用一些特殊的转换函数进行数据类型之间的转换。采用这种转换方法的具体步骤是:首先定义一个转换函数,然后将要转换的对象作为实参赋给函数的行参,最后通过调用函数可以完成数据类型的转换。n 可以直接调用这些函数来进行数据类型之间的转换操作,从

34、而省去了编写转换函数的麻烦。n 变换函数通常由VHDL的程序包提供。107/126函 数 名功 能STD_LOGIC_1164程序包TO_STDLOGICVECTOR(A)TO_BITVECTOR(A)TO_STDLOGIC(A)TO_BIT(A)由BIT_VECTOR转换为STD_LOGIC_VECTOR由STD_LOGIC_VECTOR转换为BIT_VECTOR由BIT转换成STD_LOGIC由STD_LOGIC转换成BITSTD_LOGIC_ARITH程序包CONV_STD_LOGIC_VECTOR(A,位长)CONV_INTEGER(A)由INTEGER、UNSIGNED、SIGNED

35、转换成STD_LOGIC_VECTOR由UNSIGNED、SIGNED转换成INTEGERSTD_LOGIC_UNSIGNED程序包CONV_INTEGER(A)由STD_LOGIC_VECTOR转换成INTEGER108/126109/126操作符n是指将VHDL中的基本元素连接起来的一种操作符号。在VHDL程序中,所有表达式都是由操作符将基本元素连接起来组成的。nVHDL有4种操作符,分别是逻辑操作符、关系操作符、算术操作符和并置操作符,分别进行逻辑运算、关系运算、算术运算和并置运算。110/1266.8.1 逻辑操作符操作符名称操作符功能NOT取反AND与OR或NAND与非NOR或非XO

36、R异或XNOR同或111/126逻辑操作符使用规则n 逻辑操作符可以应用的数据类型包括BOOLEAN、BIT、STD_LOGIC、BIT_VECTOR的子类型及它们的数组类型。n 二元逻辑操作符左右两边对象的数据类型必须相同。n 对于数组的逻辑运算来说,要求数组的维数必须相同,其结果也是相同维数的数组。112/126逻辑操作符使用规则n 在7种逻辑操作符中,NOT的优先级最高,其他6种逻辑操作符的优先级相同。n AND、OR、NAND、NOR通常称为“短路操作符”,即只有左边的操作结果不确定时才执行右边操作。其中,AND、NAND在左边的操作结果为“1”或“TRUE”时才执行右边的操作;OR、

37、NOR只有在左边的操作结果为“0”或“FALSE”时才执行右边的操作。n 高级编程语言中的逻辑操作符有自左向右或自右向左的优先级顺序,但VHDL中的逻辑操作符没有左右优先级差别,这时设计人员经常通过加括号的方法解决这个优先级差别的问题。113/1266.8.2 关系操作符操作符名称操作符功能=等于/=不等于大于=大于等于114/126关系操作符使用规则 n 关系操作符为二元操作符,要求操作符左右两边对象的数据类型必须相同,运算结果为BOOLEAN数据类型。n 在关系操作符的左右两边是运算操作数,不同的关系操作符对两边操作数的数据类型有不同要求。其中,等号“=”和不等号“/=”可以适用所有类型数

38、据,其他关系操作符则可以使用整数(INTEGER)、实数(REAL)和位(STD_LOGIC)等枚举类型和位矢量。数据类型必须相同,但是位长度不一定相同,当然也有例外的情况。n 在利用关系操作符对位矢量数据进行比较时,比较过程从最左边的位开始,自左至右按位进行比较。在位长不同的情况下,只能按自左至右的比较结果作为关系运算结果。115/1266.8.3 算术操作符操作符名称操作符功能加-减正号-负号*乘/除MOD取模REM取余*指数ABS取绝对值SLL逻辑左移SRL逻辑右移SLA算术左移SRA算术右移ROL逻辑循环左移ROR逻辑循环右移116/126算术操作符使用规则 n +(加)、-(减)、+

39、(正号)和-(负号)4种操作符的操作与数值运算完全相同,应用类型为整数、实数和物理类型。n *(乘)、/(除)的操作数应用类型是整数和实数。另外,物理类型可以被整数或实数相乘或相除,其结果仍然是物理类型。物理类型除以同一个物理类型可得整数。n MOD(取模)和REM(取余)只能用于整数类型。n ABS(取绝对值)操作符可以用于任何数值类型。n *(指数)的左操作数可以是整数或实数,但是右操作数必须是整数。同时只有在左操作数为实数时,其右操作数才可以是负整数。117/126n在算术运算中,实际上能够真正综合出逻辑电路的操作符只有“+”、“-”和“*”。对于算术操作符“/”、“MOD”、“REM”

40、,当分母的操作数是2的幂次时,逻辑电路才可能被综合。n 6种移位操作符都是VHDL93标准新增加的操作符,在VHDL87标准中没有,有的综合器尚不支持此类操作。118/1266.8.4 并置操作符n VHDL提供了一种并置操作符,它的符号为“&”,用来进行位和位矢量的连接运算。这里所谓位和位矢量的连接运算,是指将并置操作符右边的内容接在左边的内容之后以形成一个新的位矢量。n 采用并置操作符进行连接的方式很多,既可以将两个位连接起来形成一个位矢量,也可以将两个位矢量连接起来形成一个新的位矢量,还可以将位矢量和位连接起来形成一个新的位矢量。119/126n 例如:n SIGNAL a,b:STD_

41、LOGIC;n SIGNAL c:STD_LOGIC_VECTOR(1 DOWNTO 0);n SIGNAL d,e:STD_LOGIC_VECTOR(3 DOWNTO 0);n SIGNAL f:STD_LOGIC_VECTOR(5 DOWNTO 0);n SIGNAL g:STD_LOGIC_VECTOR(7 DOWNTO 0);n c=a&b;-两个位连接n f=a&d;-位和一个位矢量连接120/126n 在采用并置操作符的过程中,设计人员常常采用一种称为聚合连接的方式。聚合连接就是将以上直接连接中的并置操作符换成逗号,然后再使用括号将连接的位括起来。n 例如:n SIGNAL a,b

42、,c,d:STD_LOGIC;n SIGNAL q:STD_LOGIC_VECTOR(4 DOWNTO 0);n q=a&b&c&d&a;121/126n若采用聚合连接的方式,那么以上q的表达式可以写成如下几种形式中的任何一个:nq=(a,b,c,d,a);nq a,3=b,2=c,1=d,0=a);nq b,2=c,1=d,OTHERS=a);122/1266.8.5 操作符重载n 所谓操作符重载,是指对已存在的操作符重新定义,使其能进行不同类型操作数之间的运算。定义重载操作符的函数称为重载函数。n 重载操作符的定义见IEEE库的程序包STD_LOGIC_ARITH、STD_LOGIC_UN

43、SIGNED、STD_LOGIC_SIGNED,重载操作符由原操作符加双引号表示,如“+”。n 对操作符重载时,只需在程序前调用对应的程序包即可。123/126【例6.12】操作符重载 n LIBRARY IEEE;n USE IEEE.STD_LOGIC_1164.ALL;n USE IEEE.STD_LOGIC_UNSIGNED.ALL;n ENTITY overload ISn PORT(a,b:IN STD_LOGIC_VECTOR (3 DOWNTO 0);n sum:OUT STD_LOGIC_VECTOR (4 DOWNTO 0);n END overload;n ARCHITE

44、CTURE example OF overload ISn SIGNAL t1,t2:STD_LOGIC_VECTOR (4 DOWNTO 0);n BEGINn t1=0&a;n t2=0&b;n sum=t1+t2;n END example;124/126125/126n VHDL程序中数值的载体称为对象。VHDL一共有4种对象,分别是常量、变量、信号和文件。其中,文件类型是VHDL93标准新增加的。n 在电子电路中,这4类对象通常都具有一定的物理含义。例如,信号对应代表物理设计中的某一条硬件连接线;常量对应代表数字电路中的电源和地等;当然,变量对应关系不太直接,通常只代表暂存某些值的载

45、体;文件是传输大量数据的客体,在仿真测试时,测试的输入激励数据和仿真输出常常需要用文件来实现。126/1266.9.1 常量n 常量是指VHDL程序中一经定义后就不再发生变化的值,它可以在程序的很多区域进行说明,并且可以具有任何数据类型的值。作为硬件描述语言中的一种对象,常量在硬件电路设计中具有一定的物理意义,它通常代表硬件电路中的电源或地等。n 常量的使用通常可以使设计人员编写出可读性很强的VHDL程序,同时可以使程序中全局参数的修改变得十分简单易行。例如,在编写VHDL程序的过程中,设计人员往往会遇到程序多处使用同一个数值的情况,这时为了方便起见,就可以使用一个常量来代替这个特定的数值。这

46、样做最直观的好处是,如果以后需要修改这个数值时,只需修改这个常量就可以了,而并不需要进行多处修改。127/126常量说明的语法结构 n常量在使用前必须要进行说明,只有进行说明之后的常量才能在VHDL程序中使用,否则编译后将会给出语法错误。常量说明的语法结构为:n CONSTANT 常数名:数据类型:=表达式;n例如:nCONSTANT rise_time:TIME:=10 ns;nCONSTANT bus_width:INTEGER:=8;128/126n再看以下一个常量说明的举例:CONSTANT a:BIT_VECTOR(0 TO 3);n对象a被定义为常量,类型为位矢量BIT_VECTO

47、R。在定义对象a时,确定了其下标范围为03。129/126n定义常量时,也可同时赋值,以枚举形式给出它的各个元素的数值。n例如:CONSTANT a:BIT_VECTOR:=(0,0,1,0);n这是按位矢量下标顺序列出的a(0:3)数值。130/126n常量一旦被赋值就不能被改变。它不像后面提到的信号和变量那样,可以任意代入不同的数值。另外,常量所赋的值应与定义的数据类型一致。131/1266.9.2 变量n变量只能在进程语句、函数语句和过程语句结构中使用,它是一个局部量。在仿真过程中,它不像信号那样到了规定的仿真时间才进行赋值,变量的赋值是立即生效的。变量的主要作用是在进程中作为临时性的数

48、据存储单元。n变量定义的一般格式为:VARIABALE 变量名:数据类型:=初始值;132/126n变量作为局部量,其适用范围仅限于定义了变量的进程或子程序的顺序语句中。在这些语句结构中,同一变量的值将随变量赋值语句前后顺序的运算而改变。因此,变量赋值语句的执行与软件描述语言中的完全顺序执行的赋值操作十分类似。133/126n在变量定义语句中可以定义初始值,这是一个与变量具有相同数据类型的常数值,这个表达式的数据类型必须与所赋值的变量一致,初始值的定义不是必需的。此外,由于硬件电路上电后的随机性,综合器并不支持设置初始值。n变量赋值的一般格式为:目标变量名:=表达式;n由此式可见,变量赋值符号

49、是“:=”。134/126n变量数值的改变是通过变量赋值语句来实现的。赋值语句右方的“表达式”必须是一个与“目标变量名”具有相同数据类型的数值,这个表达式可以是一个运算表达式,也可以是一个数值。通过赋值操作,变量获得新的数值。n例如,对变量赋值语句为:nctrl_status:=0000 0000 000 ;nsum:=20;135/1266.9.3 信号n 信号是电子电路内部硬件连接的抽象,它除了没有数据流动方向说明以外,其他性质几乎与前面所述的“端口”概念一致。信号通常在结构体、程序包和实体中说明。n 信号说明语句的一般格式为:n SIGNAL 信号名:数据类型:=初始值;n 例如:n S

50、IGNAL sys_clk:BIT:=0;n SIGNAL sys_busy:BIT:=1;n SIGNAL count:BIT_VECTOR(7 DOWNTO 0);136/126n在程序中,信号值的代入采用“=”表示代入赋值,它允许信号传递时有延时。而“:=”用于信号中表示直接赋值,可用于信号赋初始值,没有延时。n例如:nt1=t2 AFTER 10 ns;n上式表明信号t2的值在延时10ns之后赋给信号t1。137/126n 对于常量、变量和信号作以下三点说明。n(1)常量只能进行一次赋值,变量和信号可以多次赋值。n(2)信号相当于硬件中的连线,因此信号的赋值必须经一段时间的延迟后才能生

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

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(EDA技术与VHDL设计-(6)[140页]课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|