VHDL语言的基本语法.ppt

上传人:小飞机 文档编号:5452211 上传时间:2023-07-08 格式:PPT 页数:53 大小:276.49KB
返回 下载 相关 举报
VHDL语言的基本语法.ppt_第1页
第1页 / 共53页
VHDL语言的基本语法.ppt_第2页
第2页 / 共53页
VHDL语言的基本语法.ppt_第3页
第3页 / 共53页
VHDL语言的基本语法.ppt_第4页
第4页 / 共53页
VHDL语言的基本语法.ppt_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《VHDL语言的基本语法.ppt》由会员分享,可在线阅读,更多相关《VHDL语言的基本语法.ppt(53页珍藏版)》请在三一办公上搜索。

1、,一、VHDL语言的基本语法,1、VHDL语言的标识符,VHDL中的标识符可以是常数、变量、信号、端口、子程序或参数的名字。使用标识符要遵守如下规则:,标识符由字母(AZ,az)、数字和下划线字符组成;任何标识符必须以英文字母开头;末字符不能为下划线;不允许出现两个连续下划线;标识符中不区分大小写字母;VHDL定义的保留字或称关键字,不能用作标识符;VHDL中的注释由两个连续的虚线(-)开始,直到行尾;,VHDL语言要素,例,_Decoder_1,-起始为非英文字母,3DOP,-起始为数字,Large#number,-“#”不能成为标识符的构成符号,Date_ _bus,-不能有双下划线,Co

2、pper_,-最后字符不能为下划线,on,-关键字,2、VHDL语言的数字,2.1 数字型文字的值有多种表达方式,现列举如下:(1)整数文字:整数文字都是十进制的数,如:5,678,0,156E2(=15600),45_234_287(=45234287)(2)实数文字:实数文字也都是十进制的数,但必须带有小数点,如:188.993,88_670_551.453_909(=88670551.453909),1.0,44.99E-2(=0.4499),1.335,0.0,数字前可加0,数字中间不能有空格,2.2 以数制基数表示的文字:数制#基数#指数数制和指数部分是用十进制数表示的数。指数部分的

3、数如果是0可以省去不写。现举例如下:,10#170#-(十进制数表示,等于170)2#1111_1110#-(二进制数表示,等于254)16#E#E1-(十六进制数表示,等于2#11100000#,等于224)16#F.01#E+2-(十六进制数表示,等于3841.00)8#377#-(与16#FF#,016#0FF#,2#11111111都为255),3、字符串型文字 字符是用单引号引起来的ASCII字符,可以是数值,也可以是符号或字母,如:R,A,*,Z。而字符串则是一维的字符数组,须放在双引号中。VHDL中有两种类型的字符串:文字字符串和数位字符串。,文字字符串是用双引号引起来的一串文字

4、,如:“ERROR”,“BOTH S AND Q EQUA TO L”,“X”,“BB$CC”,进制基数符号“数位字符串”,(1)文字字符串,(2)数位字符串,也称数值字符串、位矢量,是预定义的数据类型BIT的一维数组,它们所代表的是二进制、八进制或十六进制的数组,其位矢量的长度即为等值的二进制数的位数。,例如:B“1_1101_1110”-二进制数数组,位矢数组长度是9 X“AD0”-十六进制数数组,位矢数组长度是12,B:二进制基数符号,表示二进制数位0或1。O:八进制基数符号。X:十六进制基数符号(0F)。,4、下标名及下标段名 下标名用于指示数组型变量或信号的某一元素,如:a(2),b

5、(n),下标段名则用于指示数组型变量或信号的某一段元素,其语句格式如下:,数组类型信号名或变量名(表达式1 TO/DOWNTO 表达式2);,SIGNAL A,B,C:BIT_VECTOR(0 TO 7);SIGNAL M:INTEGER RANGE 0 TO 3;SIGNAL Y,Z:BIT;Y=A(M);-M是不可计算型下标表示Z=B(3);-3是可计算型下标表示C(0 TO 3)=A(4 TO 7);-以段的方式进行赋值C(4 TO 7)=A(0 TO 3);-以段的方式进行赋值,如下是下标名及下标段名使用示例:,1、常数(Constant)常数是一个固定的值,主要是为了使设计实体中的常

6、数更容易阅读和修改。常数一旦被赋值就不能再改变。一般格式:,CONSTANT 常数名:数据类型:=表达式;,例:CONSTANT fbus:BIT_VECTOR:=“01011001”;-总线上数据设备向量,CONSTANT dely:TIME:=25 ns;-输入/输出的延迟时间 常数所赋的值应与定义的数据类型一致。,二、VHDL语言的数据对象,常量的使用范围取决于它被定义的位置:,(1)程序包中定义的常量具有最大的全局化特性,可以用在调用此程序包的所有设计实体中;,(2)设计实体中定义的常量,其有效范围为这个实体定义的所有的结构体;,(3)设计实体中某一结构体中定义的常量只能用于此结构体;

7、,(4)结构体中某一单元定义的常量,如一个进程中,这个常量只能用在这一进程中。,2、变量(Variable)变量是一个局部变量,它只能在进程语句、函数语句和过程语句结构中使用,用作局部数据存储。变量常用在实现某种算法的赋值语句中。,VARIABLE 变量名:数据类型 约束条件:=表达式;,例:VARIABLE x,y:INTEGER;-定义x,y为整数变量,VARIABLE count:INTEGER RANGE 0 TO 255:=10;-定义计数变量范围,一般格式:,变量赋值语句的语法格式如下:,目标变量:=表达式;,(1)赋值语句右方的表达式必须是一个与目标变量有相同数据类型的数值。,(

8、4)若将变量用于进程之外,必须将该值赋给一个相同的类型的信号,即进程之间传递数据靠的是信号。,(2)变量不能用于硬件连线和存储元件。,(3)变量的适用范围仅限于定义了变量的进程或子程序中。,例VARIABLE x,y:REAL;,VARIABLE a,b:BIT_VECTOR(0 TO 7);,x:=100.0;,-实数赋值,x是实数变量,y:=1.5+x;,-运算表达式赋值,y也是实数变量,a:=b;,a:=”1010101”;,-位矢量赋值,a的数据类型是位矢量,a(3 TO 6):=(1,1,0,1);,-段赋值,a(0 TO 5):=b(2 TO 7);,a(7):=0;-位赋值,3、

9、信号(Signal)信号是描述硬件系统的基本数据对象,它类似于连接线。它除了没有数据流动方向说明以外,其他性质与实体的端口(Port)概念一致。信号说明格式为:,SIGNAL 信号名:数据类型 约束条件:=初始值;,信号初始值的设置不是必需的,而且初始值仅在VHDL的行为仿真中有效。,例:SIGNAL temp:STD_LOGIC:=0;,SIGNAL flaga,flagb:BIT;,SIGNAL date:STD_LOGIC_VECTOR(15 DOWNTO 0);,信号的使用和定义范围是实体、结构体和程序包.,在程序中:(1)信号值的代入采用“=”代入符,而且信号代入时可以附加延时。(2

10、)变量赋值时用“:=”,不可附加延时。(3)信号的初始赋值符号仍是“:=”。,例:X=Y AFTER 10 ns;-X,Y都是信号,且Y的值经过10ns延时以后才被代入X。,信号是一个全局量,它可以用来进行进程之间的通信。,例 进程1:PROCESS(A,B,C,D)BEGIN D=A;X=B+D;D=C;Y=B+D;END PROCESS;,D中最初代入的值是A,接着又代入C值。尽管D中先代入A值,后代入C值,在时间上有一个的延时,但是,在代入时由于不进行处理,因此仿真时认为是时间0值延时。所以D的最终值应为C,这样执行的结果:X,Y的内容都为B+C。,进程2:PROCESS(A,B,C)V

11、ARIABLE D:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN D:=A;X=B+D;D:=C;Y=B+D;END PROCESS;,在执行“D:=A;”语句后,A的值就被赋给D,所以X为B+A。此后又执行“D:=C;”,从而使Y为B+C。由此可看出,信号的值将进程语句最后所代入的值作为最终代入值。而变量的值一经赋值就变成新的值。,在仿真过程中,信号到了规定的仿真时间才进行赋值,变量的赋值是立即生效的。,信号与变量的区别,(2)赋值符不同,信号 signal count:std_logic_vector(7 downto 0);变量 variable tema:std

12、_logic_vector(3 downto 0);信号在结构体中声明;变量在进程中声明,(1)声明的形式与位置不同,count=“00000000”,count=“ZZZZZZZZ”count=tema;tema:=0000;,(3)赋值生效的时间不同,信号:进程结束时变量:立即生效,(4)进程对信号敏感,对变量不敏感,(5)作用域不同,信号可以是多个进程的全局信号,变量只在定义后的顺序域可见,三、VHDL语言的数据类型,标量型(Scalar Type),复合类型(Composite Type),存取类型(Access Type),文件类型(Files Type),VHDL中的数据类型可以分

13、成四大类。,标量型(SCALAR TYPE):属单元素的最基本的数据类型,通常用于描述一个单值数据对象,它包括实数类型、整数类型、枚举类型和时间类型。复合类型(COMPOSITE TYPE):可以由细小的数据类型复合而成,如可由标量复合而成。复合类型主要有数组型(ARRAY)和记录型(RECORD)。存取类型(ACCESS TYPE):为给定的数据类型的数据对象提供存取方式。文件类型(FILES TYPE):用于提供多值存取类型。,1VHDL的预定义数据类型 VHDL的预定义数据类型都是在VHDL标准程序包STANDARD中定义的,在实际使用中,已自动包含进VHDL的源文件中,因而不必通过US

14、E语句以显式调用。,1).布尔(BOOLEAN)数据类型,2).位(BIT)数据类型,3).位矢量(BIT_VECTOR)数据类型,4).字符(CHARACTER)数据类型,5).整数(INTEGER)数据类型,6).实数(REAL)数据类型,7).字符串(STRING)数据类型,8).时间(TIME)数据类型,9).错误等级(SEVERITY_LEVEL),1)布尔(BOOLEAN)数据类型,程序包STANDARD中定义布尔数据类型的源代码如下:TYPE BOOLEAN IS(FALSE,TRUE);布尔数据类型实际上是一个二值枚举型数据类型,它的取值有FALSE和TRUE两种。,位数据类型

15、也属于枚举型,取值只能是1或0。位数据类型的数据对象,如变量、信号等,可以参与逻辑运算,运算结果仍是位的数据类型。VHDL综合器用一个二进制位表示BIT。在程序包STANDARD中定义的源代码是:TYPE BIT IS(0,1);,2)位(BIT)数据类型,位矢量只是基于BIT数据类型的数组,在程序包STANDARD中定义的源代码是:TYPE BIT _VECTOR IS ARRAY(NATURAL RANGE)OF BIT;,3)位矢量(BIT_VECTOR)数据类型,4)字符(CHARACTER)数据类型,字符类型通常用单引号引起来,如A。字符类型区分大小写,如B不同于b。字符类型已在ST

16、ANDARD程序包中作了定义。,整数类型的数代表正整数、负整数和零。,5)整数(INTEGER)数据类型,常用整数常量的书写方式示例如下:2-十进制整数10E4-十进制整数16#D2#-十六进制整数2#11011010#-二进制整数,自然数和正整数是整数的一个子类型。在STANDARD程序包中定义的源代码如下:SUBTYPE NATURAL IS INTEGER RANGE 0 TO INTEGER HIGH;SUBTYPE POSITIVE IS INTEGER RANGE 1 TO INTEGER HIGH;,自然数(NATURAL)和正整数(POSITIVE)数据类型,实数常量的书写方式

17、举例如下:65971.333333-十进制浮点数8#43.6#E+4-八进制浮点数43.6E-4-十进制浮点数,6)实数(REAL)数据类型,VHDL的实数类型类似于数学上的实数,或称浮点数。实数的取值范围为-1.0E38+1.0E38。通常情况下,实数类型仅能在VHDL仿真器中使用,VHDL综合器不支持实数,因为实数类型的实现相当复杂,目前在电路规模上难以承受。,字符串数据类型是字符数据类型的一个非约束型数组,或称为字符串数组。字符串必须用双引号标明。如:,7)字符串(STRING)数据类型,VARIABLE string_var:STRING(1 TO 7);string_var:=a b

18、 c d;,VHDL中唯一的预定义物理类型是时间。完整的时间类型包括整数和物理量单位两部分,整数和单位之间至少留一个空格,如55 ms,20 ns。,8)时间(TIME)数据类型,TYPE time IS RANGE 2147483647 TO 2147483647 units fs;-飞秒,VHDL中的最小时间单位 ps=1000 fs;-皮秒 ns=1000 ps;-纳秒 us=1000 ns;-微秒 ms=1000 us;-毫秒 sec=1000 ms;-秒 min=60 sec;-分 hr=60 min;-时end units;,STANDARD 程序包中定义时间如下:,在VHDL仿真

19、器中,错误等级用来指示设计系统的工作状态,共有四种可能的状态值:NOTE(注意)、WARNING(警告)、ERROR(出错)、FAILURE(失败)。在仿真过程中,可输出这四种值来提示被仿真系统当前的工作情况。STANDARD 程序包中定义如下:TYPE SEVERITY_LEVEL IS(NOTE,WARNING,ERROR,FAILURE);,9)错误等级(SEVERITY_LEVEL),在IEEE库的程序包STD_LOGIC_1164中,定义了两个非常重要的数据类型,即:标准逻辑位STD_LOGIC 标准逻辑矢量STD_LOGIC_VECTOR,1)标准逻辑位STD_LOGIC数据类型,

20、2.IEEE预定义标准逻辑位与矢量,TYPE STD_LOGIC IS(U,X,0,1,Z,W,L,H,-);,在IEEE库程序包STD_LOGIC_1164中的数据类型STD_LOGIC的定义如下所示:,“U”未初始化“X”强不定“0”0“1”1“Z”高阻“W”弱信号不定“L”弱信号0“H”弱信号1“_”忽略(或不可能情况),注意在使用该类型数据时,在程序中必须写出库说明语句和使用包集合的说明语句。,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;,STD_LOGIC_VECTOR类型定义如下:TYPE STD_LOGIC_VECTOR IS ARRAY(N

21、ATURAL RANGE)OF STD_LOGIC;,2)标准逻辑矢量(STD_LOGIC_VECTOR),VHDL综合工具配带的扩展程序包中,定义了一些有用的类型。如Synopsys公司在IEEE库中加入的程序包STD_LOGIC_ARITH中定义了如下的数据类型:无符号型(UNSIGNED)有符号型(SIGNED)小整型(SMALL_INT),3.其他预定义标准数据类型,TYPE UNSIGNED IS ARRAY(NATURAL RANGE)OF STD_LOGIC;TYPE SIGNED IS ARRAY(NATURAL RANGE)OF STD_LOGIC;SUBTYPE SMALL

22、_INT IS INTEGER RANGE 0 TO 1;,如果将信号或变量定义为这几个数据类型,就可以使用本程序包中定义的运算符。在使用之前,请注意必须加入下面的语句:,在程序包STD_LOGIC_ARITH中的类型定义如下:,LIBRARY IEEE;USE IEEE.STD_LOGIC_ARITH.ALL;,1)无符号数据类型(UNSIGNED TYPE)UNSIGNED数据类型代表一个无符号的数值,在综合器中,这个数值被解释为一个二进制数,这个二进制数的最左位是其最高位。2)有符号数据类型(SIGNED TYPE)SIGNED数据类型表示一个有符号的数值,综合器将其解释为补码,此数的最

23、高位是符号位,例如:SIGNED(“0101”)代表+5,5;SIGNED(“1101”)代表-5。,VHDL允许用户自行定义新的数据类型,它们可以有多种,如:,4.用户自定义数据类型方式,可由用户定义的数据类型常见的有8种:枚举(Enumerated)类型;整数(Integer)类型 实数(Real),浮点数(Floating)类型;数组(Array)类型;存取(Access)类型;文件(File)类型;记录(Recode)类型;时间(Time)类型。,语法结构如下:,1)TYPE语句用法,TYPE 数据类型名 IS 数据类型定义 OF 基本数据类型;TYPE 数据类型名 IS 数据类型定义

24、 OF 基本数据类型 约束范围;,TYPE current IS REAL RANGE-1E4 TO 1E4;TYPE digit IS INTEGER;TYPE digit1 IS INTEGER RANGE 0 TO 9;,例如:,数据类型如果没有被指定,则默认为整数类型。,子类型SUBTYPE只是由TYPE所定义的原数据类型的一个子集。子类型SUBTYPE的语句格式如下:,2)SUBTYPE语句用法,SUBTYPE 子类型名 IS 基本数据类型 RANGE 约束范围;,SUBTYPE N1 IS INTEGER RANGE 10 TO 100;,例如:,VHDL中的枚举数据类型是用文字符

25、号来表示一组实际的二进制数的类型(若直接用数值来定义,则必须使用单引号)。,【例】TYPE M_STATE IS(STATE1,STATE2,STATE3,STATE4,STATE5);,3)枚举类型,4)数组类型,数组类型属复合类型,它是将一组具有相同数据类型的元素集合在一起,作为一个数据对象来处理的数据类型。数组可以是一维(每个元素只有一个下标)数组或多维数组(每个元素有多个下标)。VHDL仿真器支持多维数组,但VHDL综合器只支持一维数组。数组的元素可以是任何一种数据类型,用以定义数组元素的下标范围子句决定了数组中元素的个数以及元素的排序方向,即下标数是由低到高,或是由高到低。,限定性数

26、组定义语句格式如下:TYPE 数组名 IS ARRAY(数组范围)OF 数据类型;,【例】TYPE STB IS ARRAY(7 DOWNTO 0)OF STD_LOGIC;,【例】TYPE X IS(LOW,HIGH);TYPE DATA_BUS IS ARRAY(0 TO 7,X)OF BIT;首先定义X为两元素的枚举数据类型,然后将DATA_BUS定义为一个数组类型,其中每一元素的数据类型是BIT。,非限制性数组的定义语句格式如下:TYPE 数组名 IS ARRAY(数组下标名 RANGE)OF 数据类型;其中,数组名是定义的非限制性数组类型的取名;数组下标名是以整数类型设定的一个数组下

27、标名称;符号“”是下标范围待定符号,用到该数组类型时,再填入具体的数值范围;数据类型是数组中每一元素的数据类型。,【例】TYPE BIT_VECTOR IS ARRAY(NATURAL RANE)OF BIT;VARIABLE VA:BIT_VECTOR(1 TO 6);-将数组取值范围定在16,【例】TYPE LOGIC_VECTOR IS ARRAY(NATURAL RANGE,POSITIVE RANGE)OF LOGIC;VARIABLE L16_OBJECT:LOGIC_VECTOR(0 TO 7,1 TO 2);-限定范围,由已定义的、数据类型不同的对象元素构成的数组称为记录类型的

28、对象。定义记录类型的语句格式如下:TYPE 记录类型名 IS RECORD 元素名:元素数据类型;元素名:元素数据类型;END RECORD 记录类型名;,5)记录类型,【例】TYPE RECDATA IS RECORD element1 TIME;element2 TIME;element3 STD_LOGIC;END RECORD RECDATA;,【例】利用记录类型定义的一个微处理器命令信息表。TYPE REGNAME IS(AX,BX,CX,DX);TYPE OPERATION IS RECORD OPSTRSTRING(1 TO 10);OPCODEBIT_VECTOR(3 DOWN

29、TO 0);OP1,OP2,RES:REGNAME;END RECORD OPERATION;,由于VHDL是一种强类型语言,这就意味着即使对于非常接近的数据类型的数据对象,在相互操作时,也需要进行数据类型转换。a)类型转换函数方式 类型转换函数的作用就是将一种属于某种数据类型的数据对象转换成属于另一种数据类型的数据对象。,6)数据类型转换,DATAIO库中的程序包STD_LOGIC_OPS中的两个数据类型转换函数:,TO_VECTOR 将INTEGER 转换成STD_LOGIC_VECTORTO_INTEGER 将STD_LOGIC_VECTOR转换成INTEGER,b)直接类型转换方式 直

30、接类型转换的一般语句格式是:数据类型标识符(表达式);一般情况下,直接类型转换仅限于非常关联(数据类型相互间的关联性非常大)的数据类型之间,必须遵循以下规则:(1)所有的抽象数字类型是非常关联的类型(如整型、浮点型),如果浮点数转换为整数,则转换结果是最接近的一个整型数。,(2)如果两个数组有相同的维数,且两个数组的元素是同一类型,并且在各处的下标范围内索引是同一类型或非常接近的类型,那么这两个数组是非常关联类型。(3)枚举型不能被转换。如果类型标识符所指的是非限定数组,则结果会将被转换的数组的下标范围去掉,即成为非限定数组。,【例】VARIABLE DATAC,PARAMC:INTEGER;DATAC:=INTEGER(74.94*REAL(PARAMC);,在类型与其子类型之间无需类型转换。即使两个数组的下标索引方向不同,这两个数组仍有可能是非常关联类型的。,整数和实数的数据类型在标准的程序包中已作了定义,但在实际应用中,特别在综合中,由于这两种非枚举型的数据类型的取值定义范围太大,综合器无法进行综合。,实际应用中,VHDL仿真器通常将整数或实数类型作为有符号数处理,VHDL综合器对整数或实数的编码方法是:对用户已定义的数据类型和子类型中的负数,编码为二进制补码;对用户已定义的数据类型和子类型中的正数,编码为二进制原码。,整数和实数说明,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号