您好,欢迎访问三七文档
63.3VHDL的基本知识1.关键字(保留字)VHDL要求使用者必须遵守定义了关键字(keyword)和语法(syntax)的一整套规则。“关键字”是VHDL中具有特别含义的单词,只能做为固定的用途,用户不能用其做为标识符。常用的VHDL关键字按字母排列顺序的清单如下:ABS,ACCESS,AFTER,ALL,AND,ARCHITECTURE,ARRAY,ATTRIBUTE,BEGIN,BODY,BUFFER,BUS,CASE,COMPONENT,CONSTANT,DISCONNECT,DOWNTO,ELSE,ELSIF,END,ENTITY,EXIT,FILE,FOR,FUNCTION,GENERIC,GROUP,IF,INPURE,IN,INOUT,IS,LABEL,LIBRARY,LINKAGE,LOOP,MAP,MOD,NAND,NEW,NEXT,NOR,NOT,NULL,OF,ON,OPEN,OR,OTHERS,OUT,PACKAGE,POUT,PROCEDURE,PROCESS,PURE,RANGE,RECODE,REM,REPORT,RETURN,ROL,ROR,SELECT,SHARED,SIGNAL,SLA,SLL,SRA,SUBTYPE,THEN,TRANSPORT,TO,TYPE,UNAFFECTED,UNITS,UNTIL,USE,VARIABLE,WAIT,WHEN,7WHILE,WITH,XOR,XNOR这些关键字的含义将在本章及后面的章节中讨论。2.标识符标识符(Identifiers)用来定义常数、变量、信号、端口、子程序或参数的名字。VHDL的标识符由英文字母(A~Z,a~z)、数字(0~9)和下划线字符(_)组成,这些标识符必须遵守以下规则:1.标识符的第一个字符必须是英文字母。2.标识符不区分大小写。3.下划线字符不可用于标识符的最后一个字符。4.标识符不允许连续出现两个下划线字符。5.VHDL的关键字不能用作标识符使用。6.标识符字符最长可以是32个字符。3.数据对象VHDL的数据对象(DateObjects)包括常量、变量、信号和文件四种类型。(1).常量常量(Constants)是对某一常量名赋予一个固定的值,而且只能赋值一次。通常赋值在程序开始前进行,该值的数据类型则在说明语句中指明。常量说明的一般格式为:CONSTANT常量名:数据类型[:=设置值];8例如:CONSTANTVcc:REAL:=5.0;--定义Vcc的数据类型是实数,赋值为5.0VCONSTANTbus_width:INTEGER:=8;--定义bus_width被赋值为8的整数常量一旦被赋值就不能再改变,如上例中Vcc被赋值为5.0V,则在该设计电路的VHDL语言程序中Vcc的值就固定为5.0V。另外常量所赋的值应和定义的数据类型一致。常量在程序包、实体、构造体或进程的说明性区域内必须加以说明。定义在程序包内的常量可供所含的任何实体、构造体所引用,定义在实体说明内的常量只能在该实体内可见,定义在进程说明性区域中的常量只能在该进程内可见。(2).变量变量(Variables)只能在进程语句、函数语句和过程语句结构中使用。变量的赋值是直接的,非预设的,分配给变量的值立即成为当前值,变量不能表达“连线”或存储元件。变量说明的格式为:VARIABLE变量名:数据类型[:=设置值];例如:VARIABLEx,y:INTEGER;--定义x,y变量数据类型是整数VARIABLEaddress:INTEGERRANGE0TO255:=10;--定义address整数变量,变化范围是0~2559(3).信号信号(Signals)表示逻辑门的输入或输出,也可以表达存储元件的状态。信号通常在构造体、程序包和实体中说明。信号说明的格式为:SIGNAL信号名:数据类型[:=设置值];例如:SIGNALclk:BIT:=’0’;--定义时钟信号clk的初始值为0SIGNALcount:BIT_VECTOR(3DOWNTO0);--定义计数输出信号count为4位位矢量在程序中,变量采用“:=”符号赋值,信号的赋值采用“=”符号,信号的值必须经过一段时间延迟后,才能成为当前值的赋值。4.数据类型(1).常用的数据类型在VHDL语言中信号、变量和常量都要指定数据类型(DateType),为此VHDL提供了多种标准的数据类型。常用的标准数据类型有以下几种:a.整数(Integer)。b.实数(Real).c.位(Bit)。d.位矢量(Bit-Vector)。e.布尔量(Boolean)f.字符(Character)10g.字符串(String)h.时间(Time)i.错误等级(SeverityLevel)j.大于等于零的整数和正整数另外还有两种由IEEE制定的标准化数据类型,分别是标准逻辑(Std_Logic)和标准逻辑序列(Std_Logic_Vector)。当使用这两种数据类型时,在程序中必须写出库说明语句和使用程序包说明语句。(2).数据类型转换在VHDL语言中,数据类型是相当严格的,不同类型的数据是不能进行运算和直接代入的。为了实现正确的操作,必须对数据进行相应的类型转换。类型变换函数通常由VHDL语言的程序包提供,例如在“STD_LOGIC_1164”、“STD_LOGIC_ARITH”和“STD_LOGIC_UNSIGNED”的程序包中提供了如表3.2所示的数据类型变换函数。表3.2数据类型变换函数115.运算符VHDL语言中定义了丰富的运算操作符,主要有逻辑运算符、关系运算符、算术运算符、赋值运算符、关联运算符和其它运算符,各个运算符的详细说明请参考有关资料。需要注意的是,被运算符所操作的对象是操作数,操作数的数据类型和运算符所要求的类型要相一致。逻辑运算符可以对BIT、BIT_VECTOR或BOOLEAN等类型的值进行运算;关系运算符要求两边的操作数必须相同,结果为BOOLEAN类型;乘除运算符用于整数、浮点数与物理类型;取模、取余只能用于整数运算。运算符具有优先级的,乘方(**)、取绝对值(ABS)和非(NOT)的优先级别最高,其次是乘、除、取模和取余,然后依次是正负号、连接符、移位运算符、关系运算符和逻辑运算符。下面重点介绍取模、取余、移位和赋值运算符的含义。取余运算(aREMb)的符号与a相同,其绝对值小于b的绝对值。例如:(-5)REM2=(-1)5REM2=(1)取模运算(aMODb)的符号与b相同,其绝对值小于b的绝对值。例如:(-5)MOD2=15MOD(-2)=(-1)移位运算符的左边位一维数组,其元素类型必须是BIT或BOOLEAN,右边必须是整数移位次数为整数的绝对值。移位运算符所执行的操作如图3.4所示。12其中SLL是将位向量左移,右边移空位补零;SRL是将位向量右移,左边移空位补零;SLA是将位向量左移,右边第一位的数值保持原值不变;SRA是将位向量右移,左边第一位的数值保持原值不变;ROL和ROR是自循环移位方式。1位移位与循环的情况如下:“1100”SLL1=“1000”“1100”SRL1=“0110”“1100”SLA1=“1000”“1100”SRA1=“1110”“1100”ROL1=“1001”“1100”ROR1=“0110”赋值运算符有两种,“=”用于信号赋值,“:=”用于变量赋值。例如:信号定义:SIGNALa:BIT_VECTOR(0TO3);--TO表示数组升序排列(a0a1a2a3)SIGNALb:BIT_VECTOR(3DOWNTO0);--DOWNTO表示数组降序排列(b3b2b1b0)信号赋值:a=”0011”;--a(3)=’1’,a(2)=’1’,a(1)=’0’,a(0)=’0’b=”0011”;--b(3)=’0’,b(2)=’0’,b(1)=’1’,b(0)=’1’13变量定义:VARIABLEc:INSTRUCTION;变量赋值:c:=(ADD,5,10);--记录类型的集合赋值用连接运算符(&)可以将多个数据对象合并成一个新的数组,也可以将两个一维数组中的元素分解合并成新的一维数组。连接两个操作符产生新的一维数组的位宽等于两个操作数的位宽之和,新的一维数组元素的顺序由操作数的位置决定,连接符“&”左边的操作数的元素在左,连接符“&”右边的操作数的元素在右。举例如下:1011,0010a:BIT_VECTOR(0TO7)0001,0110b:BIT_VECTOR(0TO7)c=a(0TO3)&b(5TO7)&’1’;则c=1011,11016.属性属性(Attributes)提供了有关实体、构造、类型和信号等项目的指定特征,有些预先定义的数据类、信号类和范围类属性,对于综合是十分有用的。一般格式为:项目名’属性标识符常用属性的具体应用说明请参考有关资料。143.4VHDL的主要描述语句顺序语句和并行语句是VHDL程序设计中两大基本描述语句系列。3.4.1顺序语句顺序语句用于进程、过程和函数语句,定义进程、过程和函数语句所执行的算法,为算法描述提供方便。顺序语句按出现的次序执行,在结构层次中前面语句的执行结果可能直接影响后面语句的执行结果。1.IF语句IF语句根据所指定的一个布尔表达式(条件)来实现两种分支判断,其书写格式通常可以分为3种类型。(1)IF表达式THEN顺序处理语句;ENDIF;(2)IF表达式THEN顺序处理语句1;ELSE顺序处理语句2;ENDIF;(插入例题)(3)IF表达式1THEN顺序处理语句1;ELSIF表达式2THEN顺序处理语句2;15┆ELSIF表达式N-1THEN顺序处理语句N-1;ELSE顺序处理语句N;ENDIF;注意:IF语句的条件判断输出是布尔量,因此在IF语句的条件表达式中只能使用关系运算及逻辑运算的组合表达式。每一个IF语句都必须有一个对应的ENDIF语句,IF语句可以嵌套使用,即在一个IF语句中可以调用另一个IF语句,ELSEIF允许在IF语句中多次使用。2.CASE语句一般格式为:CASE表达式ISWHEN条件表达式1=顺序处理语句1;WHEN条件表达式2=顺序处理语句2;┆WHENOTHERS=顺序处理语句N;ENDCASE;16根据CASE语句形式可知,当CASE和IS之间的表达式取值满足指定的条件表达式的取值时,程序将执行对应的顺序处理语句。需要注意的是语句中WHEN后跟的“=”符号不是运算符,仅描述取值和对应执行语句的对应关系,条件表达式的值可以是一个值、多个值的“或”关系和一个取值范围。一个CASE语句最多只能有一个OTHERS分支,OTHERS表示其他可能的取值,如果使用了OTHERS分支,则该分支必须放在CASE语句的最后一个分支的位置上。3.LOOP语句LOOP语句有两种格式,一种是由FOR循环组成,另一种是由WHILE循环组成。FOR语句执行根据控制值的规定数目重复,WHILE语句将连续执行操作,直到控制逻辑条件判断为TRUE。FOR循环语句的一般格式为:[循环标号:]FOR循环变量IN范围LOOP顺序处理语句;ENDLOOP[循环标号];WHILE循环语句的一般格式为:[循环标号:]WHILE条件LOOP顺序处理语句;ENDLOOP[循环标号];4.NEXT语句NEXT语句主要用在LOOP语句执行中有条件或无条件转向控制。其一般格式为:17NEXT[循环标号][WHEN条件];NEXT语句执行后,将停止当前的循环,而转入下一次新的循环。NEXT后跟的循环标号表明下一次循环的起始位置,而WHEN条件则表明NEXT语句执行的条件。如果NEXT语句后面既无“循环标号”又无“WHEN条件”说明,则只要执行到该语句则无条件地跳出本次循环,从LOOP语句的起始位置进入下一次循环即开始新的一次循环。5.EXIT语句EXIT语句也是LOOP语句中使用的循环控制语句,与NEXT语句不同的是,EXIT语句用于退出循环,并用在循环语句内部。EXIT语句的一般格式为:EXIT[循
本文标题:vhdl教案
链接地址:https://www.777doc.com/doc-2854722 .html