版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章VHDL设计初步§3.1
VHDL程序基本结构§3.2
VHDL文字规则§3.3
VHDL的数据类型§3.4
VHDL的数据对象§3.5
VHDL的操作符§3.6设计实例§3.1VHDL程序基本结构库(Library)、程序包(Package)实体(Entity)结构体(Architecture)配置(Configuration)VHDL程序基本结构:库、程序包实体(Entity)配置(Configuration)结构体(Architecture)进程或其它并行结构库—IEEE库
IEEE库是VHDL设计中最常用的库,它包含有IEEE标准的程序包和其他一些支持工业标准的程序包。IEEE库中的标准程序包主要有:STD_LOGIC_1164、NUMERIC_BIT和NUMERIC_STD程序包。其中STD_LOGIC_1164是最重要且最常用的程序包。此外,还有些程序包虽非IEEE标准,但已成为工业标准,从而加入到IEEE库中。最常用的是Synopsys公司的STD_LOGIC_ARITH、STD_LOGIC_SIGNED、STD_LOGIC_UNSIGNED。一般,基于FPGA/CPLD的开发,IEEE库中的四个程序包STD_LOGIC_1164、STD_LOGIC_ARITH、STD_LOGIC_SIGNED和STD_LOGIC_UNSIGNED已经够用。库—STD库
VHDL定义了两个标准程序包,即STANDARD和TEXTIO(文件输入/输出)程序包,它们都收入在STD库中,可随时调用。由于STD库符合VHDL语言标准,在应用中不必用打开库语句。即
LIBRARY
STD;
USE
STD.STANDARD.ALL是不必要的。库—WORK库
WORK库是用户的VHDL设计的现行工作库,用于存放用户设计和定义的一些设计单元和程序包。WORK库自动满足VHDL语言标准,在实际调用中,也不必显示预先说明,即不必在VHDL程序中明确打开并指定。基于VHDL所要求的WORK库的基本概念,利用VHDL进行设计时,不允许在根目录下进行,而是必须为此设定一个文件夹,用于保存所有此项目的设计文件,VHDL综合器将此文件默认为WORK库。还要注意的是,工作库并不是这个文件夹的名字,而是一个逻辑名。综合器将指示器指向该文件夹的路径。库—VITAL库
VITAL程序包也已成为IEEE标准。使用VITAL库,可以提高VHDL门级时序模拟精度,因而只在VHDL仿真器中使用。库中包含时序程序包VITAL_TIMIGN和VITAL_PRIMITIVES。但在实际中,由于各FPGA/CPLD的生产厂商的适配工具都能为各自的芯片生成带时序信息的VHDL门级网表,因而一般并不需要VITAL库中的程序包。库的用法例:
LIBRARY
IEEE;
USE
IEEE.STD_LOGIC_1164.STD_ULOGIC;
USE
IEEE.STD_LOGIC_1164.RISING_EDGE;表示向当前设计实体开放了IEEE.STD_LOGIC_1164程序包中的RISING_EDGE函数,但由于此函数要用到IEEE.STD_ULOGIC,所以在其前面加了一条USE语句,开放同一程序包中的这一数据类型。定义程序包的一般语句结构如下:
PACKAGE程序包名IS--程序包首程序包首说明部分END程序包名;PACKAGE程序包名IS程序包体说明部分及包体内容--程序包体END程序包名;
程序包的结构由程序包的说明部分(即程序包首)和程序包的内容(即程序包体)两部分组成。程序包首可独立定义和使用。其中的说明有数据类型说明、信号说明、子程序说明及元件说明等。在程序包结构中,程序包体并不是必需的;一个完整的程序包中,程序包首名与程序包体名是同一个名字。程序包体将包括在程序包首中已定义的子程序的子程序体中。程序包体说明部分的组成内容可以是USE语句(即允许对其他程序包的调用)、子程序定义、子程序体、数据类型说明子类型说明和常数说明等。常用的预定义的程序包有:STD_LOGIC_1164程序包:最常用的程序包,是IEEE的标准程序包。其中最常用的两个数据类型是:STD_LOGIC和STD_LOGIC_VECTOR。STD_LOGIC_ARITH程序包:在STD_LOGIC_1164上扩展了三个数据类型:UNSIGNED、SIGNED和SMALL_INTSTD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED程序包:Synopsys公司的程序包,都预先编译在IEEE库中。这些程序包重载了可用于INTEGER型及STD_LOGIC和STD_LOGIC_VECTOR型混合运算的运算符,并定义了STD_LOGIC_VECTOR型到INTEGER型的转换函数。 STANDARD和TEXTIO程序包:两者都是STD库中的预编译程序包。STDNDARD定义了许多基本的数据类型、子类型和函数。TEXTIO程序包定义了文件操作的许多类型和子程序,主要供仿真器使用。在使用前需加语句USESTD.TEXTIO.ALL。实体(Entity)—P62实体由实体声明部分和结构体组成。实体声明部分指定了设计单元的输入/输出端口或引脚,它是设计实体对外的一个通信界面,是外界可以看到的部分;结构体用来描述设计实体的逻辑结构和逻辑功能,它由VHDL语句构成,是外界看不到的部分。一个实体可以多个结构体。实体声明部分的语句格式为:
ENTITY实体名IS
[GENERIC(类属表);][PORT(端口表);]END实体名;实体(Entity)—参数传递说明语句(P82)参数传递说明语句(类属参数声明)必须放在端口声明之前。用于指定矢量位数、器件延迟时间等参数。其格式为:
GENERIC([常数名:数据类型[:设定值]{;常数名:数据类型[:设定值]});
如:
GENERIC(m:TIME:=1.0ns);声明m是一个值为1.0ns的时间参数【例9-1】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYandnISGENERIC(n:INTEGER);--定义类属参量及其数据类型PORT(a:INSTD_LOGIC_VECTOR(n-1DOWNTO0);--用类属参量限制矢量长度c:OUTSTD_LOGIC);END;ARCHITECTUREbehavOFandnISBEGIN
PROCESS(a)VARIABLEint:STD_LOGIC;BEGINint:='1';FORiINa'LENGTH-1DOWNTO0LOOP--循环语句IFa(i)='0'THENint:='0';ENDIF;ENDLOOP;c<=int;ENDPROCESS;
END;
u1:andnGENERICMAP(n=>2)--参数传递映射语句,定义类属变量,n赋值为2PORTMAP(a(0)=>d1,a(1)=>d2,c=>q1);u2:andnGENERICMAP(n=>5)--定义类属变量,n赋值为5PORTMAP(a(0)=>d3,a(1)=>d4,a(2)=>d5,a(3)=>d6,a(4)=>d7,c=>q2);
END;
实体(Entity)—参数传递映射语句(P227)参数传递映射语句描述相应元件类属参数间的衔接和传送方式。可用于设计从外部端口改变元件内部参数或结构规模的元件。其语句格式为:
GENERICMAP(类属表)
【例9-4】LIBRARYIEEE;--顶层设计USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_arith.ALL;USEIEEE.STD_LOGIC_unsigned.ALL;ENTITYaddersISGENERIC(msb_operand:INTEGER:=15;msb_sum:INTEGER:=15);PORT(b:INSTD_LOGIC_VECTOR(msb_operandDOWNTO0);result:OUTSTD_LOGIC_VECTOR(msb_sumDOWNTO0));ENDadders;ARCHITECTUREbehaveOFaddersISCOMPONENTaddernPORT(a,b:INSTD_LOGIC_VECTOR;result:OUTSTD_LOGIC_VECTOR);ENDCOMPONENT;SIGNALa:STD_LOGIC_VECTOR(msb_sum/2DOWNTO0);SIGNALtwoa:STD_LOGIC_VECTOR(msb_operandDOWNTO0);BEGINtwoa<=a&a;U1:addernPORTMAP(a=>twoa,b=>b,result=>result);U2:addernPORTMAP(a=>b(msb_operanddowntomsb_operand/2+1),b=>b(msb_operand/2downto0),result=>a);ENDbehave;
实体(Entity)—端口说明语句(P60)端口声明是描述器件的外部接口信号的声明,相当于器件的引脚声明,端口声明语句格式为:
PORT(端口名{,端口名}:端口模式数据类型名);
…端口名{,端口名}:端口模式数据类型名);端口模式包括:
IN—输入;
OUT—输出;
INOUT—双向,既可以用于输入出可用于输出;
BUFFER—具有读功能的输出。
BUFFER功能与INOUT类似,区别在于当需要输入数据时,只允许内部回读输出的信号,即反馈,该信号由内部产生。
inout
和
buffer的区别【例3-1】P58
LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;
ENTITY
mux21aIS
PORT(a,b:INBIT;
s:INBIT;
y:OUTBIT);
ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISBEGINPROCESS(a,b,s)BEGINIF(s=‘1’)THENy<=a;ELSEy<=b;
ENDIF;ENDPROCESS;ENDARCHITECTUREone;实体端口实体名端口名端口模式设计实体
结构体语句格式为:ARCHITECTURE结构体名OF实体名IS[信号声明语句];BEGIN[功能描述语句]ENDARCHITECTURE结构体名;
信号声明语句也称为说明语句,包括在结构体中需要说明和定义的数据对象、数据类型、元件调用声明等等。它并非必须的。
功能描述语句在结构本中必须给出相应的电路功能描述语句。
【例3-1】P64
ENTITYmux21aISPORT(a,b:INBIT;s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISBEGINPROCESS(a,b,s)BEGINIF(s=‘1’)THENy<=a;ELSEy<=b;ENDIF;ENDPROCESS;ENDARCHITECTUREone;结构体结构体名配置
配置是指将特定的结构体与一个确定的实体相关联,为一个大型系统的设计提供管理和工程组织。在VHDL程序中,每个实体可以拥有多个不同的结构体,而每个结构体的地位是相同的,在这种情况下,可以利用配置说明为这个实体指定一个结构体。配置语句的一般格式为:
CONFIGURATION配置名OF实体名IS配置说明
END配置名;文件取名和存盘(P65)在保存文件前,每个VHDL设计程序都必须赋给一个正确的文件名。一般,程序文件名可以由设计者任意给定,但具体取名最好与文件实体名相同;文件后缀扩展名必须是.VHD。§3.2VHDL的文字规则数字字符串标识符下标名P65、P346数字(P346)整数:都是十进制的数,如:
5,156E2(=15600),45_234_287(=45234287)实数:带有小数点的十进制数,如:
1.335,88_670.46,44.99E-2(=0.4499)物理量文字
60s(60秒),100m(100米)数字
以数制基数表示的文字:用这种方式表示的数由五个部分组成。第一部分是用十进制数标明数制进位的基数;第二部分是数制隔离符号“#”;第三部分是表达的数;第四部分是指数隔离符号“#”;第五部分是用十进制表示的指数部分,此部分数若为0可以省去如:
SIGNL
d1,d2,d3,d4,d5:INTEGERRANGE0TO255
d1<=10#170#;--十进制表示,等于170
d2<=16#FE#;--十六进制表示,等于254
d3<=2#1111_1110#;--二进制表示,等于254
d4<=8#376#;--八进制表示,等于254
d5<=16#E#E1;--十六进制表示,等于2#1110000#,等于224字符串(P346)
字符是用单引号括起来的ASCⅡ字符,可以是数值,也可以是符号或字母。如:‘R’,‘z’
字符串是一维的字符数组,需放在双引号中。有两种类型的字符串:文字字符串和数位字符串。文字字符串是用双引号括起来的一串文字,如:“ERROR”,“BB&CC”
数位字符串也称位矢量,代表各进制数的数组。数位字符串的表示首先要有计算基数,然后将该基数表示的值放在双引号中,基数符以“B”,“O”,“X”表示,并放在字符串的前面。其中:B:二进制基数符号,表示二进制位0或1,在字符串中的每位表示一个BIT。O:八进制基数符号,在字符串中的每一个数代表一个八进制数,即代表一个3位的二进制数。X:十六进制基数符号(0~F)十六进制数,即一个4位的二进制数。
例如:data1<=B“1_1101_1110”--二进制数组,长度是9data2<=O“15”--八进制数组,位矢数组长度是6data3<=X“AD0”--十六进制数组,位矢数组长度是12data4<=B“101_010_101_010”--位矢数组长度是12data5<=“101_010_101_010”--表达错误,缺Bdata6<=“101010”--正确,略去B,不可加下划线data7<=“0AD0”--表达错误,缺X标识符(P347)
标识符是最常用的操作符,标识符可以是常数、变量、信号、端口、子程序或参数的名字。其书写应遵守以下规则:有效的字符:26包括个大小写英文字母,数字0~9及下划线“_”。任何标识符必须以英文字母开头。必须是单一下划线“_”,且其前后都必须有英文字母或数字。标识符中的英语字母不分大小写。允许包含图形符号(回车符、换行符),也允许包含空格符。
例:
合法的标识符:Decoder_1,State0非法的标识符:_Decoder_1--起始为非英文字母2FFT--起始为数字Sig_#N--符号”#”不能成为标识符的构成Not-Ack--符号”-”不能成为标识符的构成RyY_RST_--标识符的最后不能是下划线“_”Data__BUS--标识符中不能有双下划线Return--关键词下标名(P348)
下标名用于指示数组型变量或信号的某一元素。下标段名则用于指示数组型变量或信号的某一段元素。下标名的语句格式如下:标识符(表达式)其中,“标识符”必须是数组型的变量或信号的名字;“表达式”所代表的值必须是数组标范围中的一个值,这个值将对应数组中的一个元素。如果这个表达式是一个可计算的值,则此操作数可很容易的进行综合。如果是不可计算的,则只能在特定的情况下综合,且耗费资源较大。
例:SIGNALa,b:BIT_VECTOR(0TO3);SIGNALm:INTEGERRANGE0TO3;SIGNALy,z:BIT;y<=a(m);--不可计算型下标表示z<=b(3);--可计算型下标表示其中下标名m不可计算,而下标名3是可计算的。§3.3VHDL的数据类型(P59、P357)VHDL要求设计实体中的每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型。VHDL中的数据类型可以分成四大类:标量型:包括实数类型、整数类型、枚举类型、时间类型。复合类型:可以由小的数据类型复合而成。复合类型主要有数组型和记录型。存取类型:为给定的数据类型的数据提供存取方式文件类型:用于提供多值存取类型这些数据类型又可分为预定义数据类型和用户自定义类型。此处,主要讲以下两种常用的数据类型:VHDL的预定义数据类型数组类型VHDL的预定义数据类型预定义的VHDL数据类型是VHDL最常用、最基本的数据类型。这些数据类型已在IEEE库中的标准程序包STANDARD和STD_LOGIC_1164及其它标准程序包中预先作了定义。INTEGER(整数)数据类型NATURAL(自然数)和POSITIVE(正整数)数据类型REAL(实数)数据类型BOOLEAN(布尔)数据类型BIT(位)数据类型BIT_VECTOR(位矢量数据类型)STD_LOGIC(标准逻辑位)和STD_LOGIC_VECTOR(标准逻辑位矢量)CHARACTER(字符)数据类型STRING(字符串)数据类型TIME(时间)数据类型其它预定义标准数据类型整数数据类型(INTEGER)(P82)整数包括正整数、负整数和零。整数是32位的带符号数,因此它的数值范围是-2147483647~+2147483647,即。自然数和正整数数据类型(NATURAL)自然数是整数的一个子集,它包括0和正整数。正整数也是整数的一个子集,它是不包括0的自然数。实数数据类型(REAL)实数由正、负、小数点和数字组成。实数的范围是:-1.0E+38~+1.0E+38。布尔数据类型(BOOLEAN)布尔数据类型包括FALSE(假)和TURE(真)。综合器将其变为0或1信号值。位数据类型(BIT)BIT(位)数据类型包括逻辑位’0’和’1’。在VHDL中,逻辑位0和1的表达必须加单引号,否则VHDL综合器将0和1解释为整数数据类型INTEGER位矢量数据类型位矢量是用双引号括起来的数字序列。位矢量数据定义语句:TYPEBIT_VECTORISARRAY(NaturalRange<>)OFBIT;其中,“<>”表示数据范围未定界在使用位矢量时,必须注明位宽,即数组中元素个数和排列,如:SIGNALa:BIT_VECTOR(7DOWNTO0);在此句中,声明a是由a(7)~a(0)构成的矢量,权值最高为a(7),a(0)最低。标准逻辑位和标准逻辑位矢量STD_LOGIC(标准逻辑位)数据类型
(P63)在VHDL中,标准逻辑位数据有九种逻辑值,它们是’U’(未初始化的)、’X’(强未知的)、’0’(强0)、’1’(强1)、’Z’(高阻态)、’W’(弱未知的)、’L’(弱0)、’H’(弱1)和’-’(忽略)。在STD_LOGIC数据类型中的数据是用大写字母定义的,使用中不能用小写字母代替。STD_LOGIC_VECTOR(标准逻辑位矢量)数据类型(P69-70)
标准逻辑矢量数据在数字电路中常用于表示总线。其定义语句为:TYPESTD_LOGIC_VECTORISARRAY(NaturalRang<>)OFSTD_LOGIC字符数据类型字符是单引号括起来的ASCⅡ码字符,如’A’、’a’、’0’等。字符类型区分大小写。STRING(字符串)数据类型字符串是用双引号括起来的字符序列,也称字符矢量或字符串数组。如“ABOY”,”10100011”时间数据类型时间是物理量数据,它由整数数据和单位两部分组成。时间TIME数据定义语句为:TYPETIMEISRANGE-2147483647TO-2147483647unitsfs;--飞秒,VHDL中的最小时间单位。ps;--皮秒,等于1000fs
…hr;--小时ENDunits;其它预定义标准数据类型(P70)
VHDL综合工具配备的扩展程序包中定义了一些有用的类型。如Synopsys公司在IEEE库中加入的程序包STD_LOGIC_ARITH中定义了如下三种数据类型:无符号型(UNSIGNED)、有符号型(SIGNED)、小整型(SMALL_INT)。在使用之前,必须加入以下的语句:
LIBRARY
IEEE;
USE
IEEE.STD_LOGIC_ARITH.ALLUNSIGNED类型和SIGNED类型是用来设计可综合的数学运算程序的重要类型,UNSIGNED用于无符号数的运算,SIGNED用于有符号数的运算。
在IEEE程序包中NUMERIC_STD和NUMEIC_BIT程序包中定义了UNSIGNED型及SIGNED型,NUMERIC_STD是针对于STD_LOGIC型定义的,而NUMERIC_BIT是针对BIT型定义的。在程序包中还定义了相应的运算符重载函数。有些综合器没有附带STD_LOGIC_ARITH程序包,此时只能用NUMERIC_STD和NUMEIC_BIT程序包。
无符号数据类型(UNSIGNEDTYPE)
UNSIGNED数据类型代表一个无符号的数值,在综合器中,这个数值被解释为一个二进制数,这个二进制数的最左位是其最高位。如,十进制的8可以表示为:UNSIGNED’(“1000”)如果要定义一个变量或信号的数据类型为UNSIGNED,则其位矢长度越长,所能代表的数值越大。如一个4位变量的最大值为15,一个8位变量的最大值则为255,0是其最小值,因为不能用UNSIGNED定义负数。例:VARIABLEvar:UNSIGNED(0TO10);SIGNALsig:UNSIGNED(5DOWNTO0)其中变量var有11位数值,最高位是var(0),而非var(10);信号sig有6位数值,最高位是sig(5)。
有符号数据类型(SIGNEDTYPE)
SIGNED数据类型表示一个有符号的数值,综合器将其解释为补码,此数的最高位是符号位。例如;SIGNED’(“0101”)代表+5,5SIGNED’(“1011”)代表-5若是将上例中的var定义为SIGNED型,则数值意义就不同了,如:VARIABLEvar:SIGNED(0TO10);其中变量var有11位,最左位var(0)是符号位。数组类型(P179)数组类型是复合类型,是将一组具有相同数据类型的元素集合在一起,作为一个数据对象来处理的数据类型。数组可以是一维(每个元素只有一个下标)数组或多维数组(每个元素有多个下标)。VHDL仿真器支持多维数组,而综合器只支持一维数组。数组的元素可以是任何一种数据类型,用以定义数组元素的下标范围子句决定了数组中元素的个数,以及元素的排序方向,即下标是由低到高(TO),或是由高到低(DOWNTO)。如:
“0TO7”是由低到高排序的8个元素;“15
DOWNTO0”是由高到低排序的16个元素。
VHDL允许定义两种不同数组,即限定性数组和非限定性数组。它们的区别是,限定性数组下标的取值范围在数组定义时就被确定了,而非限定性数组下标的取值范围要待随后确定。限定性数组
限定性数组定义语句格式如下:TYPE数组名ISARRAY(数组范围)OF数据类型;其中
数组名——是新定义的限定性数组类型的名称,可以是任何标识符;数据类型与数组元素的数据类型相同
数组范围——明确指出数组元素的定义数量和排序方式,以整数来表示其数组的下标数据类型—指数组各元素的数据类型
例1:TYPEstbISARRAY(7DOWNTO0)OFSTD_LOGIC; 其中,stb是数组类型,有8个元素,它的下标排序为7~0,各元素的排序是stb(7)~stb(0)。
例2:TYPExIS(low,high);TYPEdata_busISARRAY(0TO7,x)OFBIT;其中,x定义为两元素的枚举数据类型,然后将data_bus定义为一个有9个元素的数组类型,其中每一个元素的数据类型是BIT。
非限定性数组非限定性数组是在定义某数组时,并不首先说明所定义的数组下标的取值范围,而是定义某一数据对象为此数组类型时,再确定该数组下标范围取值。这样就可以通过不同的定义取值,使相同的数据对象具有不同下标取值的数组类型。非限定性数组的定义语句格式为:TYPE数组名ISARRAY(数组下标名RANGE<>)OF数据类型其中:数组名-----是定义的非限定性数组类型的取名数组下标名----是以整数类型设定的一个数组下标名称<>----是下标范围待定符号,用到该数组类型时,再填入具体的数值范围数据类型----是数组中每一个元素的数据类型非限定性数组如:TYPEBIT_VECTORISARRAY(NaturalRange<>)OFBIT;
SIGNALa:BIT_VECTOR(7DOWNTO0);§3.4VHDL的操作符(P359)
VHDL的操作符包括:逻辑操作符(LogicOperator)
关系操作符(RelationOperator)
算术操作符(ArithmeticOperator)
符号操作符(SignOperator)。逻辑操作符、关系操作符类型操作符功能操作数数据类型逻辑操作符AND与BIT、BOOLEAN、STD_LOGICOR或BIT、BOOLEAN、STD_LOGICNOT非BIT、BOOLEAN、STD_LOGICNAND与非BIT、BOOLEAN、STD_LOGICNOR或非BIT、BOOLEAN、STD_LOGICXOR异或BIT、BOOLEAN、STD_LOGICXNOR同或BIT、BOOLEAN、STD_LOGICNXOR异或非BIT、BOOLEAN、STD_LOGIC关系操作符=等于任何数据类型/=不等于任何数据类型<小于枚举与整数及对应的一维数组>大于枚举与整数及对应的一维数组<=小于等于枚举与整数及对应的一维数组>=大于等于枚举与整数及对应的一维数组算术操作符、符号操作符类型操作符功能操作数数据类型算术操作符+加整数-减整数&并一维数组*乘整数和实数/除整数和实数MOD取模整数REM求余整数SLL逻辑左移BIT或布尔型一维数组SRL逻辑右移BIT或布尔型一维数组SLA算术左移BIT或布尔型一维数组SRA算术右移BIT或布尔型一维数组ROL逻辑循环左移BIT或布尔型一维数组ROR逻辑循环右移BIT或布尔型一维数组**乘方整数ABS取绝对值整数符号操作符+正整数-负整数
对于VHDL中的操作符与操作数间的运算有两点需要特别注意的规则:
1、在基本操作符间操作数的数据类型必须相同2、操作数的数据类型必须与操作符所要求的数据类型完全一致因此,不仅要了解所用的操作符的操作功能,还要了解此操作符所要求的操作数的数据类型。此外,在进行运算时还要注意各操作符之间存在的优先级别,优先级别越高,越先操作。运算符优先级NOT,ABS,**最高优先级最低优先级*,/,MOD,REM+(正号),-(负号)+,-,&SLL,SLA,SRL,SRA,ROL,ROR=,/=,<,<=,>,>=AND,OR,NAND,NOR,XOR,XNOR类型操作符功能操作数数据类型逻辑操作符AND与BIT、BOOLEAN、STD_LOGICOR或BIT、BOOLEAN、STD_LOGICNOT非BIT、BOOLEAN、STD_LOGICNAND与非BIT、BOOLEAN、STD_LOGICNOR或非BIT、BOOLEAN、STD_LOGICXOR异或BIT、BOOLEAN、STD_LOGICXNOR同或BIT、BOOLEAN、STD_LOGICNXOR异或非BIT、BOOLEAN、STD_LOGIC逻辑操作符(P64、P359)
在逻辑操作符中,如果逻辑操作符左边和右边值的类型为数组,则这两个数组的位宽要相等。在一个表达式中有两个以上的运算符时,需要使用括号将这些运算分组。如果运算中的运算符相同,且是AND、OR、XOR中的一种,则不需使用括号;如果一串运算中的运算符不同或有除这三种运算符外的运算符,则必须用括号。如:AandBandCandD(AorB)xorC逻辑操作符
【例】SIGNALa,b,c:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALd,e,f,g:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALh,I,j,k:STD_LOGIC;SIGNALl,m,n,o,p:BOOLEAN;
…a<=bANDc;--b、c相与后向a赋值,a、b、c的数据类型同属4位长的位矢量d<=eORfORg;--两个操作符OR相同,不需括号h<=(iNANDj)NANDk;--NAND不属上述三种算符中的一种,必须加括号l<=(mXORn)AND(oXORp);--操作符不同,必须加括号h<=iANDjANDk;--两个操作符都是AND,不用加括号h<=iANDjORk;--两个操作符不同,未加括号,表达错误a<=bANDe;--操作数b与e的位矢长度不一致,表达错误h<=iORl;--i的数据类型是STD_LOGIC,而l的数据类型是布尔量,因而不能相互作用,表达错误
【例3-2】(P61)
LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYh_adderISPORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDENTITYh_adder;ARCHITECTUREfh1OFh_adderISBEGINso<=aXORbco<=aANDb;ENDARCHITECTUREfh1;absoco0000011010101101半加器真值表关系操作符=等于任何数据类型/=不等于任何数据类型<小于枚举与整数及对应的一维数组>大于枚举与整数及对应的一维数组<=小于等于枚举与整数及对应的一维数组>=大于等于枚举与整数及对应的一维数组
关系操作符的作用是将相同的数据类型的数据对象进行数值比较或关系排序判断,并将结果用布尔类型的数据表示出来,即其运算结果为TRUE和FALSE两种。关系操作符不同长度的数组也可以进行运算,两个数组的操作运算是从左至右逐一对各元素进行比较来决定的,在比较过程中,并不管原数组的下标定义顺序,即不管是用TO还是用DOWNTO。比较过程中,只要有一对元素不等,就可确定两者的关系,得出布尔结果。如:
‘1’=‘1’;“101”=“101”;
“1”>“011”;“101”<“110”;
“1011”>“101011”其结果均为TRUE。对于这些判断中出现的错误,可以用STD_LOGIC_ARITH程序包中定义的UNSIGNED数据类型来解决,即将这些进行操作的数据的数据类型定义为UNSIGNED。如UNSIGNED’(“1”)<UNSIGNED’(“011”)的比较结果则为TURE。
【例9-22】ENTITYrelational_ops_1ISPORT(a,b:INBIT_VECTOR(0TO3);m:OUTBOOLEAN);ENDrelational_ops_1;ARCHITECTUREexampleOFrelational_ops_1ISBEGINoutput<=(a=b);ENDexample;【例9-23】ENTITYrelational_ops_2ISPORT(a,b:ININTEGERRANGE0TO3;m:OUTBOOLEAN);ENDrelational_ops_2;ARCHITECTUREexampleOFrelational_ops_2ISBEGINoutput<=(a>=b);ENDexample;
简单的比较运算(=和/=)在实现硬件结构时,比排序操作符构成电路芯片资源利用率要高。同样是对4位二进制数进行比较,例1采用了“=”操作符,而例2采用了”>=“操作符,除这两个操作我们符之外,两个程序完全一样。但综合结果表明,例9-23所耗用的逻辑门比例9-22多出近3倍算术操作符分类表类别算术操作符分类1求和操作符+(加),-(减),&(并置)2求积操作符*,/,MOD,REM3混合操作符**,ABS4移位操作符SLL,SRL,SLA,SRA,ROL,ROR算术操作符类型操作符功能操作数数据类型算术操作符+加整数-减整数&并一维数组*乘整数和实数/除整数和实数MOD取模整数REM求余整数SLL逻辑左移BIT或布尔型一维数组SRL逻辑右移BIT或布尔型一维数组SLA算术左移BIT或布尔型一维数组SRA算术右移BIT或布尔型一维数组ROL逻辑循环左移BIT或布尔型一维数组ROR逻辑循环右移BIT或布尔型一维数组**乘方整数ABS取绝对值整数求和操作符
VHDL中的求和操作符包括加减操作符和并置操作符。
加减操作符的运算规则与常规的加减法一样,在VHDL中,规定它们的操作数的数据类型是整数。
【例9-24】
VARIABLEa,b,c,d,e,f:INTEGERRANE0TO255;
…
a:=b+c;
d:=e–f;在综合后,由加减运算符产生的组合逻辑门所耗费的硬件资源的规模都比较大,例9-26说明了一个3位加法运算的逻辑电路。如果加减运算符中的一个操作数或两个操作数都为整型常数,则只需很少的电路资源。【例9-26】
PACKAGEexample_arithmeticISTYPEsmall_INTISRANGE0TO7;ENDexample_arithmetic;USEWORK.example_arithmetic.ALL;ENTITYarithmeticISPORT(a,b:INsmall_INT;c:OUTsmall_INT);ENDarithmetic;ARCHITECTUREexampleOFarithmeticISBEGINc<=a+b;ENDexample;
并置操作符“&”(P72)用来完成一维数组的位扩展,即将操作数或数组组合并起来形成新的数组。可以将一个元素并置于一个数组中形成更长的数组,也可以将两个数组并置形成一个新的数组。并置操作前后的数组长度应一致。如:“VH”&“DL”的结果为“VHDL”,‘0’&‘1’&‘1’的结果为“011”
【例】SIGNALa:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALd:STD_LOGIC_VECTOR(1DOWNTO0);
…a<=‘1’&‘0’&d(1)&‘1’;--元素与元素并置,并置后的数组长度为4
…IFa&d=“101011”THEN--数组并置,形成更长的数组,其长度为两个数组长度之和。求积操作符:求积操作符包括*(乘),/(除),MOD(取模),REM(取余)。在VHDL中,乘与除的数据类型规定为整数和实数。MOD和REM的操作数的数据类型只能是整数,运算结果也是整数。取余运算(aREMb)的符号与a相同,其绝对值小于b的绝对值;例:
(-5)REM2=(-1);5REM(-2)=1;
取模运算(aMODb)的符号与b相同,其绝对值小于b的绝对值;例:
(-5)MOD2=1;5MOD(-2)=(-1)
混合操作符混合操作符有**(乘方)和ABS(取绝对值)两种。它们的操作数数据类型一般为整数类型。**(乘方)运算的左边可以是整数或浮点数,但右边必须为整数,而且只有在左边为浮点时,其右边才可以为负数。
【例9-27】
SIGNAL
a,b:INTEGERRANGE-8TO7;SIGNALc:INTEGERRANGE0TO15;SIGNALd:INTEGERRANGE0TO3;a<=ABS(b);c<=2**d;移位操作符
移位操作符有六种:SLL、SRL、SLA、SRA、ROL、ROR。移位操作符是VHDL’93标准新增的运算符。规定移位操作符作用的操作数的数据类型应是一维数组,并要求数组中的元素必须是BIT或BOOLEAN的数据类型,移位的位数则是整数。在EDA工具所附的程序包中重载的移位操作符已支持STD_LOGIC_VECTOR及INTEGER等类型。移位操作符左边可以是支持的类型,右边则必定是整数类型。如果操作符右边是整数类型常数,移位操作符实现起来比较节省硬件资源。
SLL/SRL(逻辑左/右移):将位矢向左/右移,右/左边跟进的位补零。
ROL/ROR(逻辑循环左/右移):与SLL/SRL相似,只是它们移出的位将用于依次填补移空的位,执行的是自循环式的移位。
SLA/SRA(算术左/右移):是算术移位操作符,其移空位用最初的首位来填补。
移位操作符的语句格式为:标识符移位操作符移位位数
例:
“1011”SLL1=“0110”
“1011”SRL1=“0101”
“1011”ROLl=“0111”
“1011”ROR1=“1101”
“1011”SLA1=“0111”
“1011”SRA1=“1101”
00原首位原首位【例3-14】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYdecoder3to8ISPORT(DIN:INSTD_LOGIC_VECTOR(2DOWNTO0)DOU:OUTBIT_VECTOR(7DOWNTO0));ENDENTITY;ARCHITECTUREbehOFdecoder3to8ISBEGINDOUT<=“00000001”SLLCONV_INTEGER(DIN);ENDbeh;符号操作符符号操作符“+”和“-”的操作数只有一个,操作数的数据类型为整数,操作符“+”对操作数不作任何改变,操作符“-”作用于操作数后的返回值是对原操作数取负,在实际使用中,取负操作数需加括号,如:
z:=x*(-y)§3.5VHDL的数据对象-P71、第8章VHDL数据对象是指用来存放各种类型数据的容器。包括:常数(Constant)变量(Variable)信号(Signal)在VHDL中,被定义的标识符必须确定为某类数据对象,同时还必须被定义为某种数据类型。前者(数据对象)规定了标识符的行为方式和功能特点;后者(数据类型)限定了标识符的取值范围。常数(Constant)
常数的声明和设置主要是为了使设计实体中的常数更容易阅读和修改。常数一般在程序前部声明,在程序中,常数是一个恒定不变的值,一旦做了数据类型和赋值定义后,在程序中不能再改变,因而具有全局性意义。常数声明格式为:
CONSTANT常数名:数据类型:=初值;如:
CONSTANT
delay:TIME:=25ns
DATAIN:INTEGER:=15
FBT:STD_LOGIC_VECTOR:=“010110”VHDL要求所定义的常量数据类型必须与表达式的数据类型一致。常量定义语句所允许的设计单元有实体、结构体、程序包、块、进程和子程序。常量具有可视性,即常量的使用范围取决于它被定义的位置。变量(Variable)在VHDL语法规则中,变量是一个局部量,只能在进程(PROCESS)、子程序(函数和过程)中声明和使用。变量的作用是在进程中作为临时的数据存储单元。变量声明的语法格式为:
VARIABLE变量名:数据类型[:=初始值]变量在声明时,可以赋初值,也可不赋初值,到使用时才用变量赋值语句赋值。变量的赋值是一种理想化的数据传输,是立即发生的,不存在任何的延时。变量赋值语句的语法格式为:目标变量名:=表达式赋值语句右边的“表达式”必须是一个与“目标变量名”具有相同数据类型的数值。
例如:VARIABLEa:INTEGER;VARIABLEb:INTEGER:=2;VARIABLEs,t:STD_LOGIC_VECTOR(7DOWNTO0);VARIABLEx,y:INTEGERRANGE15DOWNTO0;a:=“1010101”s:=t;s(0TO5):=t(2TO7);x:=11;y:=2+x;
信号(Signal)
信号是描述硬件系统的基本数据对象,它类似于连接线,可作为设计实体中并行语句模块间的信息交流通道。它作为一种数值容器,不仅可以容纳当前值,也可以保持历史值,这一属性与触发器的记忆功能有很好的对应关系,只是不必注明信号的数据流动的方向。
信号要在结构体中声明后才能使用。信号声明语句的语法格式为:SIGNAL信号名:数据类型[:=初值]信号初始值的设置不是必须的。如:SIGNALtemp:STD_LOGIC:=0;--声明temp为标准逻辑位(STD_LOGIC)信号,赋初值为0SIGNALflaga,flagb:BIT--声明flaga,flagb为位(BIT)信号,未赋初值
信号的使用和定义范围是实体、结构体和程序包,在进程和子程序的顺序中不允许定义信号,在进程中只能将信号列入敏感表。信号具有全局特征。当信号声明数据类型后,就能对信号赋值了。信号赋值的语句格式为:目标信号名<=表达式AFTER时间量这里的表达式可以是一个运算表达式,也可以是数据对象(变量、信号或常量)。符号“<=”表示赋值操作,即将信号传入。信号的传入不是即时的,即目标信号需要一定延迟的时间δ才能接收到源信号的数据。因此符号“<=”两边的数值并不总是一致的,这与实际器件的传播延迟特性是吻合的,这与变量的赋值过程有很大差别。VHDL综合器在信号赋值时,常用关键词AFTER设置延迟量。如:z<=xAFTER5ns赋值符“<=”两边的信号的数据类型必须一致。
信号的赋值可以出现在一个进程中,也可以直接出现在结构体的并行语句结构中。但两者意义不同:在进程中属顺序信号赋值,信号赋值操作要视进程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年浙江建设职业技术学院单招职业适应性考试参考题库及答案解析
- 2026年张家口职业技术学院单招职业适应性考试参考题库及答案解析
- 2026年广东省外语艺术职业学院单招职业适应性考试参考题库及答案解析
- 2026年长沙电力职业技术学院单招职业适应性测试备考题库及答案解析
- 2026年黑龙江建筑职业技术学院单招职业适应性考试备考题库及答案解析
- 期末个人总结范本
- 期中考试质量分析总结15篇
- 期末考试广播稿(集锦15篇)
- 毕业生实习心得体会15篇
- 2026年浙江纺织服装职业技术学院单招职业适应性测试模拟试题及答案解析
- 医院四级电子病历评审汇报
- 工会财务知识课件
- 国学馆展厅设计
- 三维伤口扫描系统:革新伤口评估模式的关键力量
- AI在体育领域的数据分析与预测
- 国开机考答案 管理学基础2025-06-21
- 企业IT顾问兼职聘用合同
- 2025年春国开(新疆)《国家安全教育》平时作业1-4题库
- T/CI 312-2024风力发电机组塔架主体用高强钢焊接性评价方法
- 高级工程师职称评定个人总结范文(5篇)
- 外贸业务流程管理指南
评论
0/150
提交评论