3.2VHDL语言要素VHDL具有计算机编程语言的一般特性,其语言要素是编程语句的基本单元。准确无误地理解和掌握VHDL语言要素的基本含义和用法,对正确地完成VHDL程序设计十分重要。3.2.1VHDL文字规则一、数字型文字——由数字、小数点和下划线组成1、整数文字5,678,156E2,45_234_287(=45234287)2、实数文字188.993,88_670_551.453_9093、以数制基数表示的文字格式:数制#数值#例如:10#170#16#FE#2#11010001#8#376#4、物理量文字例如:60s,100m二、字符串文字字符——以单引号括起来的数字、字母和符号(ASCII码)例如:’0’,’1’,’A’,’B’,’a’,’b’字符串——一维的字符数组,用双引号括起来。1、文字字符串例如:”ABC”,”ABOY.”,”A”2、数值字符串——矢量格式:数制基数符号“数值字符串”其中:B——二进制基数符号;O——八进制基数符号;X——16进制基数符号;例如:B“111011110”;矢量数组,长度为9O“15”;等效B“001101”,长度为6X“AD0”;等效B“101011010000”,长度为123、标识符——是用户给常量、变量、信号、端口、子程序或参数定义的名字规则:以字母开头,后跟若干字母、数字或单个下划线构成,但最后不能为下划线。例如:h_adder,mux21,example为合法标识符;2adder,_mux21,ful__adder,adder_为错误的标识符。VHDL’93标准支持扩展标识符,以反斜杠来定界,允许以数字开头,允许使用空格以及两个以上的下划号。例如:\74LS193\,\ABOY.\等为合法的标识符。4、下标名——数组格式:标识符(表达式)例如:b(3)5、段名——多个下标名的组合格式:标识符(表达式方向表达式)方向:TO——下标序号由低到高DOWNTO——下标序号由高到低例如:D(7DOWNTO0);表示数据总线D7~D0D(0TO7);表示数据总线D0~D73.2.2VHDL数据对象——存放各种类型数据的容器,包括变量、常量和信号1、变量(VARIABLE)规则:只能在进程(PROCESS)、函数(FUNCTION)和过程(PROCEDURE)中说明和使用的局域量定义格式:VARIABLE变量名:数据类型{:=初始值}例如:VARIABLEa:INTEGER;VARIABLEb:INTEGER:=2;变量赋值语句:目标变量名:=表达式例如:VARIABLEx,y:REALVARIABLEa,b:BITVECTOR(0TO7);x:=100.0;y:=1.5+x;a:=“1010101”a(3TO6):=(‘1’,‘1’,‘0’,‘1’);a(0TO5):=b(2TO7);2、信号(SIGNAL)规则:信号是在结构体(ARCHITECTURE)、程序包(PACKAGE)和实体中说明的全局量。信号定义格式:SIGNAL信号名:数据类型:=初值;例如:SIGNALtemp:STDLOGIC:=‘0’;SIGNALflaga,flagb:BIT;SIGNALdata:STDLOOGICVECTOR(15DOWNTO0);信号赋值语句:目标信号名<=表达式例如:x<=9;y<=x;z<=xAFTER5ns;信号与变量的区别:(1)使用场合不同;(变量:进程;信号:结构体)(2)变量用“:=”号赋值,其值被立即使用(无时间延迟);而信号用“<=”赋值,其值可以附加延迟。4、常数(CONSTANT)规则:常数在程序前部定义,且一旦被赋值就不能再改变。常数定义格式:CONSTANT常数名:数据类型:=初值;例如:CONSTANTfbus:BITVECTOR:=“010111”;CONSTANTVcc:REAL:=5.0;CONSTANTdely:TIME:=25ns;3.2.3VHDL数据类型一、VHDL数据类型1、标量型(ScalarType)——单元素的最基本数据类型(1)实数类型(2)整数类型(3)枚举类型(4)时间类型2、复合类型(CompositeType)(1)数组型(Array)(2)记录型(Record)3、存取类型(AccessType)——为数据对象提供存取方式4、文件类型(FilesType)——提供多值存取类型二、VHDL的预定义数据类型——在IEEE库中的标准程序包(STANDARD)中预先定义的数据类型。1、布尔(BOOLEAN)数据类型包括逻辑“假”(FALSE)和逻辑“真”(TRUE),定义语句:TYPEBOOLEANIS(FALSE,TRUE);--以枚举类型定义2、位(BIT)数据类型包括‘0’和‘1’,定义语句:TYPEBITIS(‘0’,‘1’)3、位矢量(BITVECTOR)数据类型位矢量是用双引号括起来的数字序列,如“0011”,X“00FD”定义语句:TYPEBITVECTORISARRAY(NaturalRange〈〉)OFBIT;--“”表示数据范围未定界规则:使用位矢量必须注明位宽,例如:SIGNALa:BITVECTOR(7TO0);--定义a为由a(7)~a(0)构成矢量,左为a(7)右为a(0);4、字符(CHARACTER)数据类型字符是用单引号括起来的ASCII码字符,如‘A’‘a’‘0’‘9’定义语句:TYPECHARACTERIS(ASCII码字符表中的全部字符)5、整数(INTEGER)数据类型整数包括:正整数、负整数和零范围:32位带符号数原码,即-(231-1)~+(231-1)(-2147483647~+2147483647)6、自然数(NATURAL)和正整数(POSITIVE)数据类型自然数——包括0和正整数正整数——不包括0的正整数7、实数(REAL)数据类型由正、负、小数点和数字组成,如:-1.0,+2.5,-1.0E38范围:-1.0E+38TO+1.0E+388、字符串(STRING)数据类型字符串是用双引号括起来的字符序列,也称字符矢量或字符串数组。例如,“ABOY.”,“10100011”9、时间(TIME)数据类型时间是物理量数据,由整数数据和单位两部分组成,定义语句:TYPETIMEISRANGE–2147483647TO2147483647unitsfs;--飞秒(10-15S)VHDL中的最小时间单位ps=1000fs;--皮秒ns=1000ps;--纳秒us=1000ns;--微秒ms=1000us;--毫秒sec=1000ms;--秒min=60sec;--分hr=60min;--时ENDunits;10、错误等级(SeverityLevel)错误等级数据用于表征系统的状态,包括:NOTE(注意),WARNING(警告),ERROR(出错),FAILURE(失败)。在仿真过程中,可输出这4种值来提示被仿真系统当前的工作状态。其定义如下:TYPEseverity_levelIS(note,warning,error,failure);三、IEEE预定义的标准逻辑位和矢量1、标准逻辑位(STDLOGIC)数据类型TYPESTDLOGICIS(‘U’--未初始化的‘X’--强未知的‘0’--强0‘1’--强1‘Z’--高阻态‘W’--弱未知的‘L’--弱0‘H’--弱1‘-’--忽略);2、标准逻辑矢量(STDLOGICVECTOR)数据类型TYPESTDLOGICVECTORISARRAY(NaturalRange〈〉)OFSTDLOGIC;--〈〉表示范围未定四、用户自定义数据类型方式定义格式:TYPE数据类型名IS数据类型定义OF基本数据类型或:TYPE数据类型名IS数据类型定义;例如:TYPEst1ISARRAY(0TO15)OFSTDLOGIC;TYPEweekIS(sun,mon,tue,wed,thu,fri,sat);1、枚举类型(Enumerated)定义格式:TYPE数据类型名IS数据类型定义;例如:TYPEweekIS(sun,mon,tue,wed,thu,fri,sat);2、整数类型和实数类型定义格式:TYPE数据类型名ISRANGE范围;例如:TYPEnum1ISRANGE0TO100;3、数组类型数组——是一组具有相同数据类型的元素的组合。定义格式:TYPE数组名ISARRAY(数据范围)OF数据类型;例如:TYPEdata_busISARRAY(7DOWNTO0)OFSTD_LOGIC;--定义数据总线,下标由高到低,即D7位权值最高,D0位权值最低。TYPEdata_busISARRAY(0TO7)OFSTD_LOGIC;--定义数据总线,下标由低到高,即D0位权值最高,D7位权值最低。4、记录类型(Recode)记录——是一组不同数据类型的元素的组合。定义格式:TYPE记录类型名ISRECODE元素名:元素数据类型;元素名:元素数据类型;:ENDRECODE[记录类型名][例4-16]利用记录类型定义微处理器的命令信息表TYPERegNameIS(AX,BX,CX,DX);--定义枚举类型数据(CPU的4个数据寄存器蜜名)TYPEOperationISRECODEMnemonic:STRING(1TO10);--助记符OPCode:BIT_VECTOR(3DOWNTO0);OP1,OP2,Res:RegName;ENDRECODE;VARIABLEInstr1,Instr2,Instr3:Operation;…Instr1:=(“ADDAX,BX”,“0001”,AX,BX,AX);Instr2:=(“ADDBX,BX”,“0010”,others=BX);…Instr3.Mnemonic:=“MULAX,BX”;Instr3.Op1:=AX;--将记录Instr3中的OP1赋(RegName的)值AX3.2.4VHDL操作符类型操作符功能操作数数据类型算术操作符+加整数-减整数&并一维数组*乘整数和实数/除整数和实数MOD取模整数REM求余整数SLL逻辑左移BIT或布尔型一维数组SRL逻辑右移BIT或布尔型一维数组类型操作符功能操作数数据类型算术操作符SLA算术左移BIT或布尔型一维数组SRA算术右移BIT或布尔型一维数组ROL逻辑循环左移BIT或布尔型一维数组ROR逻辑循环右移BIT或布尔型一维数组**乘方整数ABS取绝对值整数类型操作符功能操作数数据类型关系操作符=等于任何数据类型/=不等于任何数据类型小于枚举与整数及对应的一维数组大于同上=小于等于同上=大于等于同上类型操作符功能操作数数据类型逻辑操作符AND与BIT、BOOLEAN、STDLOGICOR或同上NAND与非同上NOR或非同上XOR异或同上NXOR异或非同上NOT非同上类型操作符功能操作数数据类型符号操作符+正整数-付整数说明:(1)操作符的优先级:()→(NOT,ABS,**)→(REM,MOD,/,*)→(+,-)→(关系运算符)→(逻辑运算符:XOR,NOR,NAND,OR,AND)(2)在逻辑运算表达式中若全部运算符相同,则可以不加括号;若运算符不同则加括号分隔;(3)并“&”操作符完成一维数组的位扩展