1、第3章 VHDL编程基础,3.1 概述 3.2 VHDL程序基本结构 3.3 VHDL语言要素 3.4 VHDL顺序语句 3.5 VHDL并行语句 3.6 子程序(SUBPROGRAM) 3.7 库、程序包及其他 3.8 VHDL描述风格 3.9 基本逻辑电路设计 3.10 状态机的VHDL设计 习题,教学提示,1 教学内容: 31概述 32 VHDL程序基本结构 33 VHDL语言要素 34 VHDL顺序语句 35 VHDL并行语句 36 子程序 37库、程序包 38 VHDL描述风格 39基本逻辑电路 310状态机的VHDL设计 2 教学重点:VHDL程序基本结构,VHDL数据对象,VHD
2、L数据类型,VHDL顺序语句中的转向语句,VHDL并行语句中的进程语句、并行信号赋值语句、元件例化语句,重载函数和过程,状态机的VHDL设计。 3 教学难点:(1)VHDL的三个“精髓”的理解:软件的强数据类型与硬件电路的唯一性,硬件行为的并行性决定了VHDL语言的并行性,软件仿真的顺序性与实际硬件行为的并行性;(2)实际设计系统的分析与建模方法;(3)怎样将各种基本语法规定熟练地运用于自己的设计中。4 教学要求:主要讲述VHDL的程序结构,语言要素、基本语句、子程序以及VHDL描述风格,并概括性地讲述基本逻辑电路和状态机的设计。要求学生掌握VHDL程序基本结构,VHDL数据对象,VHDL数据
3、类型,VHDL顺序语句中的转向语句,VHDL并行语句中的进程语句、并行信号赋值语句、元件例化语句,重载函数和过程,基本逻辑电路和状态机的VHDL设计。5 课后作业:习题3234,36,311,315,316,318,322,323,326,328。,3.1 概 述,3.1.1 常用硬件描述语言简介常用硬件描述语言有VHDL、Verilog和ABEL语言。VHDL起源于美国国防部的VHSIC;Verilog起源于集成电路的设计;ABEL来源于可编程逻辑器件的设计。下面从使用方面将三者进行对比。(1) 逻辑描述层次。一般的硬件描述语言可以在三个层次上进行电路描述,其层次由高到低依次可分为行为级、R
4、TL级和门电路级。VHDL语言是一种高级描述语言,适用于行为级和RTL级的描述,最适于描述电路的行为;Verilog语言和ABEL语言是一种较低级的描述语言,适用于RTL级和门电路级的描述,最适于描述门级电路。,(2) 设计要求。用VHDL进行电子系统设计时可以不了解电路的结构细节,设计者所做的工作较少;用Verilog和ABEL语言进行电子系统设计时需了解电路的结构细节,设计者需做大量的工作。(3) 综合过程。VHDL语言源程序的综合通常要经过行为级RTL级门电路级的转化。而Verilog语言和ABEL语言源程序的综合过程要稍简单,即经过RTL级门电路级的转化。 (4) 对综合器的要求。VH
5、DL描述语言层次较高,不易控制底层电路,因而对综合器的性能要求较高;Verilog和ABEL对综合器的性能要求较低。(5) 支持的EDA工具。支持VHDL和Verilog的EDA工具很多,但支持ABEL的综合器仅仅Dataio一家。(6) 国际化程度。VHDL和Verilog已成为IEEE标准;ABEL正朝国际化标准努力。,3.1.2 VHDL的优点VHDL的英文全名是Very-High-Speed Integrated Circuit Hardware Description Language,诞生于1982年。1987年底, VHDL被IEEE ( The Institute of Ele
6、ctrical and Electronics Engineers)和美国国防部确认为标准硬件描述语言。自IEEE公布了VHDL的标准版本(IEEE-1076)之后,VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准硬件描述语言。 1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的10761993版本。 VHDL主要用于描述数字系统的结构、行为、功能和接口。,应用VHDL进行工程设计的优点:(1) 与其他的硬件描述语言相比,VHDL具有更强的行为描述能力。 (2) VHDL具有丰富的仿真语句和库函
7、数,使得在任何大系统的设计早期,就能查验设计系统的功能可行性,随时可对系统进行仿真模拟,使设计者对整个工程的结构和功能可行性做出判断。(3) VHDL语句的行为描述能力和程序结构,决定了它具有支持大规模设计的分解和已有设计的再利用功能。 (4) 用VHDL完成一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动把VHDL描述设计转变成门级网表(根据不同的实现芯片)。(5) VHDL对设计的描述具有相对独立性。 (6) VHDL具有类属描述语句和子程序调用等功能,对于完成的设计,在不改变源程序的条件下,只需改变类属参量或函数,就能轻易地改变设计的规模和结构。,3.1.3 VHDL程序设计
8、约定为了便于程序的阅读和调试,本书对VHDL程序设计特作如下约定:(1) 语句结构描述中方括号“ ”内的内容为可选内容。 (2) 对于VHDL的编译器和综合器来说,程序文字的大小写是不加区分的。 (3) 程序中的注释使用双横线“-”。 (4) 为了便于程序的阅读与调试,书写和输入程序时,使用层次缩进格式,同一层次的对齐,低层次的,较高层次的缩进两个字符。(5) 考虑到MAX+plusII要求源程序文件的名字与实体名必须一致,因此为了使同一个VHDL源程序文件能适应各个EDA开发软件的使用要求,建议各个源程序文件的命名均与其实体名一致。,3.2 VHDL程序基本结构,3.2.1 VHDL程序设计
9、举例使用一个集成芯片至少应了解三个方面的信息: 该芯片符合什么规范,是谁生产的,是否大家认可; 该芯片有多少管脚,每个管脚是输入还是输出,每个管脚对输入/输出有什么要求; 该芯片各管脚之间的关系,以及能完成什么逻辑功能。相应地,使用VHDL语言设计一个硬件电路时,我们至少需要描述三个方面的信息: 设计是在什么规范范围内设计的,亦即此设计符合某个设计规范,能得到大家的认可,这就是库、程序包使用说明; 所设计的硬件电路与外界的接口信号,这就是设计实体的说明; 所设计的硬件电路其内部各组成部分的逻辑关系以及整个系统的逻辑功能,这就是该设计实体对应的结构体说明。其中,库、程序包使用说明用于打开(调用)
10、本设计实体将要用到的库、程序包;实体说明用于描述该设计实体与外界的接口信号说明,是可视部分;结构体说明用于描述该设计实体内部工作的逻辑关系,是不可视部分。,下面以一个74LS00的设计过程来具体说明VHDL程序的设计。 1设计思路 根据数字电子技术的知识,我们知道,74LS00是一个四2输入与非门,亦即该芯片由四个2输入与非门组成,因此我们设计时可先设计一个2输入与非门(如图3.1(a)所示),再由四个2输入与非门构成一个整体MY74LS00(如图3.1(b)所示)。,2VHDL源程序 1) 2输入与非门NAND2的逻辑描述 - IEEE库及其中程序包的使用说明LIBRARY IEEE;USE
11、 IEEE.STD_LOGIC_1164.ALL; -实体NAND2的说明ENTITY NAND2 ISPORT(A,B:IN STD_LOGIC;Y:OUT STD_LOGIC);END ENTITY NAND2; -实体NAND2的结构体ART1的说明 ARCHITECTURE ART1 OF NAND2 ISBEGINY=A NAND B;END ARCHITECTURE ART1;,2) MY74LS00的逻辑描述- IEEE库及其中程序包的使用说明LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;-实体MY74LS00的说明ENTITY MY74LS0
12、0 ISPORT(A1,B1,A2,B2,A3,B3,A4,B4:IN STD_LOGIC;Y1,Y2,Y3,Y4: OUT STD_LOGIC);END ENTITY MY74LS00;,-实体MY74LS00的结构体ART2的说明ARCHITECTURE ART2 OF MY74LS00 IS-元件调用声明COMPONENT NAND2 ISPORT(A,B:IN STD_LOGIC;Y:OUT STD_LOGIC);END COMPONENT NAND2;-元件连接说明BEGINU1:NAND2 PORT MAP(A=A1,B=B1,Y=Y1);U2:NAND2 PORT MAP(A=A
13、2,B=B2,Y=Y2);U3:NAND2 PORT MAP(A3, B3, Y3);U4:NAND2 PORT MAP(A4, B4, Y4);END ARCHITECTURE ART2;,3说明与分析(1) 整个设计包括两个设计实体,分别为NAND2和MY74LS00,其中,实体MY74LS00为顶层实体。 (2) 实体NAND2定义了2输入与非门NAND2的引脚信号A、B(输入)和Y(输出),其对应的结构体ART1描述了输入与输出信号间的逻辑关系,即将输入信号A、B与非后传给输出信号端Y。(3) 实体MY74LS00及对应的结构体ART2描述了一个如图3.1(b)所示的四2输入与非门。由
14、其结构体的描述可以看到,它是由四个2输入与非门构成的。(4) 在MY74LS00接口逻辑VHDL描述中,根据图3.1(b)右侧的MY74LS00的原理图,实体MY74LS00定义了引脚的端口信号属性和数据类型。 (5) 在结构体ART2中,COMPONENTEND COMPONENT 语句结构对所要调用的NAND2元件作了声明。(6) 实体MY74LS00引导的逻辑描述也是由三个主要部分构成的,即库、程序包使用说明,实体说明和结构体。,3.2.2 VHDL程序的基本结构一个相对完整的VHDL程序(或称为设计实体)具有如图3.2所示的比较固定的结构,即至少应包括三个基本组成部分:库、程序包使用说
15、明,实体说明和实体对应的结构体说明。,图3.2 VHDL程序设计基本结构,3.2.3 实体(ENTITY)实体是一个设计实体的表层设计单元,其功能是对这个设计实体与外部电路进行接口描述。它规定了设计单元的输入/输出接口信号或引脚,是设计实体经封装后对外的一个通信界面。1实体语句结构ENTITY 实体名 ISGENERIC(类属表);PORT(端口表); END ENTITY 实体名;其中实体说明单元必须以语句“ENTITY 实体名IS”开始,以语句“END ENTITY 实体名;”结束,其中的实体名是设计者自己给设计实体的命名,可作为其他设计实体对该设计实体进行调用时用。中间在方括号内的语句描
16、述,在特定的情况下并非是必须的。,2类属(GENERIC)说明语句类属(GENERIC)参量是一种端口界面常数,常以一种说明的形式放在实体或块结构体前的说明部分。类属为所说明的环境提供了一种静态信息通道,类属的值可以由设计实体外部提供。因此,设计者可以从外面通过类属参量的重新设定而容易地改变一个设计实体或一个元件的内部电路结构和规模。类属说明的一般书写格式如下:GENERIC(常数名:数据类型:设定值;常数名:数据类型:=设定值 );在一个实体中定义的、可以通过GENERIC参数类属的说明,为它创建多个行为不同的逻辑结构。比较常见的情况是选用类属来动态规定一个实体端口的大小,或设计实体的物理特
17、性,或结构体中的总线宽度,或设计实体中、底层中同种元件的例化数量等。,3PORT端口说明由PORT引导的端口说明语句是对于一个设计实体界面的说明。 实体端口说明的一般书写格式如下:PORT(端口名:端口模式 数据类型;端口名:端口模式 数据类型);其中,端口名是设计者为实体的每一个对外通道所取的名字;端口模式是指这些通道上的数据流动方式,如输入或输出等;数据类型是指端口上流动的数据的表达格式。,IEEE 1076标准包中定义了四种常用的端口模式,各端口模式的功能及符号分别见表3.1和图3.3。,表3.1 端口模式说明,在实用中,端口描述中的数据类型主要有两类:位(BIT)和位矢量(BIT_VE
18、CTOR)。若端口的数据类型定义为BIT,则其信号值是一个1位的二进制数,取值只能是0或1;若端口数据类型定义为BIT_VECTOR,则其信号值是一组二进制表。,图3.3 端口模式符号图,3.2.4 结构体(ARCHITECTURE)结构体是用于描述设计实体的内部结构以及实体端口间的逻辑关系。结构体内部构造的描述层次和描述内容一般可以用图3.4来说明。一般地,一个完整的结构体由两个基本层次组成:对数据类型、常数、信号、子程序和元件等元素的说明部分。描述实体逻辑行为的,以各种不同的描述风格表达的功能描述语句。,图3.4 结构体构造图,结构体将具体实现一个实体。每个实体可以有多个结构体,每个结构体
19、对应着实体不同结构和算法实现方案,其间的各个结构体的地位是同等的,它们完整地实现了实体的行为,但同一结构体不能为不同的实体所拥有。结构体不能单独存在,它必须有一个界面说明,即一个实体。对于具有多个结构体的实体,必须用CONFIGURATION(配置)语句指明用于综合的结构体和用于仿真的结构体,即在综合后的可映射于硬件电路的设计实体中,一个实体只对应一个结构体。在电路中,如果实体代表一个器件符号,则结构体描述了这个符号的内部行为。当把这个符号例化成一个实际的器件安装到电路上时,则需用配置语句为这个例化的器件指定一个结构体(即指定一种实现方案),或由编译器自动选一个结构体。,1. 结构体的一般语句
20、格式ARCHITECTURE 结构体名 OF 实体名 IS说明语句;BEGIN功能描述语句;END ARCHITECTURE 结构体名;2结构体说明语句结构体中的说明语句是对结构体的功能描述语句中将要用到的信号(SIGNAL)、数据类型(TYPE)、常数(CONSTANT)、元件(COMPONENT)、函数(FUNCTION)和过程(PROCEDURE)等加以说明的语句。,3功能描述语句结构如图3.4所示的功能描述语句结构可以含有五种不同类型的、以并行方式工作的语句结构,而在每一语句结构的内部可能含有并行运行的逻辑描述语句或顺序运行的逻辑描述语句。各语句结构的基本组成和功能分别是:(1) 块语
21、句是由一系列并行执行语句构成的组合体,它的功能是将结构体中的并行语句组成一个或多个模块。(2) 进程语句定义顺序语句模块,用以将从外部获得的信号值,或内部的运算数据向其他的信号进行赋值。(3) 信号赋值语句将设计实体内的处理结果向定义的信号或界面端口进行赋值。(4) 子程序调用语句用于调用一个已设计好的子程序。(5) 元件例化语句对其他的设计实体作元件调用说明,并将此元件的端口与其他的元件、信号或高层次实体的界面端口进行连接。,3.3 VHDL语言要素,VHDL的语言要素,作为硬件描述语言的基本结构元素,主要有数据对象(Data Object,简称Object),数据类型(Data Type,
22、简称Type)和各类操作数(Operands)及运算操作符(Operator)。 3.3.1 VHDL文字规则VHDL文字(Literal)主要包括数值和标识符。数值型文字主要有数字型、字符串型和位串型等。1数字型文字(1) 整数文字:如:678。(2) 实数文字:如: 188.993。,(3) 以数制基数表示的文字:用这种方式表示的数由五个部分组成。第一部分,用十进制数标明数制进位的基数;第二部分,数制隔离符号“#”;第三部分,表达的文字;第四部分,指数隔离符号“#”;第五部分,用十进制表示的指数部分,这一部分的数如果是0可以省去不写。现举例如下: 16#E#E1-(十六进制数表示,等于2#
23、11100000#,等于224) 2#1111_1110# -(二进制数表示,等于254) 16#F.01#E+2 -(十六进制数表示,等于3841.00) (4) 物理量文字(VHDL综合器不接受此类文字)。如:60 s(60秒),100 m(100米),k (千欧姆),2. 字符串型文字字符是用单引号引起来的ASCII字符,可以是数值,也可以是符号或字母,如:R,A,*,Z。而字符串则是一维的字符数组,须放在双引号中。VHDL中有两种类型的字符串:文字字符串和数位字符串。(1) 文字字符串:文字字符串是用双引号引起来的一串文字,如:“ERROR”, “BB$CC”(2) 数位字符串:数位字
24、符串也称位矢量,是预定义的数据类型BIT的一维数组,它们所代表的是二进制、八进制或十六进制的数组,其位矢量的长度即为等值的二进制数的位数。数位字符串的表示首先要有计算基数,然后将该基数表示的值放在双引号中,基数符以“B”(2进制)、“O” ”(8进制)和“X” ”(16进制)表示,并放在字符串的前面。例如: B“1_1101_1110” -二进制数数组,位矢数组长度是9 ; X“AD0” -十六进制数数组,位矢数组长度是12。,3标识符标识符用来定义常数、变量、信号、端口、子程序或参数的名字。VHDL的基本标识符就是以英文字母开头,不连续使用下划线“_”,不以下划线“_”结尾的,由26个大小写
25、英文字母、数字09以及下划线“_”组成的字符串。 VHDL93标准还支持扩展标识符,但是目前仍有许多VHDL工具不支持扩展标识符。标识符中的英语字母不分大小写。VHDL的保留字不能用于作为标识符使用。如:DECODER_1,FFT,Sig_N,NOT_ACK,State0,Idle是合法的标识符;而_DECODER_1,2FFT,SIG_#N,NOT-ACK,RYY_RST_,data_ _BUS,RETURN则是非法的标识符。,4下标名及下标段名含义:下标名用于指示数组型变量或信号的某一元素,而下标段名则用于指示数组型变量或信号的某一段元素。语句格式:数组类型信号名或变量名(表达式1 TO/
26、DOWNTO 表达式2);注意:表达式的数值必须在数组元素下标号范围以内,并且必须是可计算的。TO表示数组下标序列由低到高,如“2 TO 8”;DOWNTO表示数组下标序列由高到低,如“8 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); -以段的方式进行赋值,3.3.2 VH
27、DL数据对象在VHDL中,数据对象(Data Objects)类似于一种容器,它接受不同数据类型的赋值。数据对象有三种,即常量(CONSTANT)、变量(VARIABLE)和信号(SIGNAL)。其中信号是具有更多的硬件特征的特殊数据对象,是VHDL中最有特色的语言要素之一。1常量(CONSTANT)常量的定义和设置主要是为了使设计实体中的常数更容易阅读和修改。例如,将位矢的宽度定义为一个常量,只要修改这个常量就能很容易地改变宽度,从而改变硬件结构。在程序中,常量是一个恒定不变的值,一旦作了数据类型的赋值定义后,在程序中不能再改变,因而具有全局意义。常量的定义形式:CONSTANT 常量名:数
28、据类型:=表达式;例如:CONSTANT FBUSBIT_VECTOR:=“010110”;CONSTANT VCCREAL:=5.0;CONSTANT DELYTIME:=25 ns;,VHDL要求所定义的常量数据类型必须与表达式的数据类型一致。常量的数据类型可以是标量类型或复合类型,但不能是文件类型(File)或存取类型(Access)。常量定义语句所允许的设计单元有实体、结构体、程序包、块、进程和子程序。在程序包中定义的常量可以暂不设具体数值,它可以在程序包体中设定。常量的可视性,即常量的使用范围取决于它被定义的位置。在程序包中定义的常量具有最大全局化特征,可以用在调用此程序包的所有设计
29、实体中;定义在设计实体中的常量,其有效范围为这个实体定义的所有的结构体;定义在设计实体的某一结构体中的常量,则只能用于此结构体;定义在结构体的某一单元的常量,如一个进程中,则这个常量只能用在这一进程中。,2变量(VARIABLE)变量是一个局部量,只能在进程和子程序中使用。变量不能将信息带出对它作出定义的当前设计单元。变量的赋值是一种理想化的数据传输,是立即发生,不存在任何延时的行为。定义格式:VARIABLE 变量名:数据类型:=初始值;例如:VARIABLE A:INTEGER; -定义A为整数型变量VARIABLE B,C:INTEGER:=2; -定义B和C为整型变 量,初始值为2,变
30、量作为局部量,其适用范围仅限于定义了变量的进程或子程序中。仿真过程中惟一的例外是共享变量。变量的值将随变量赋值语句的运算而改变。变量定义语句中的初始值可以是一个与变量具有相同数据类型的常数值,也可以是一个全局静态表达式,这个表达式的数据类型必须与所赋值变量一致。此初始值不是必需的,综合过程中综合器将略去所有的初始值。赋值语句的语法格式:目标变量名:=表达式;赋值语句的用法见3.4节。,3. 信号(SIGNAL)信号是描述硬件系统的基本数据对象,它类似于连接线。信号可以作为设计实体中并行语句模块间的信息交流通道。在VHDL中,信号及其相关的信号赋值语句、决断函数、延时语句等很好地描述了硬件系统的
31、许多基本特征。如硬件系统运行的并行性;信号传输过程中的惯性延时特性;多驱动源的总线行为等。信号作为一种数值容器,不但可以容纳当前值,也可以保持历史值。这一属性与触发器的记忆功能有很好的对应关系。信号的定义格式: SIGNAL 信号名: 数据类型:=初始值;信号初始值的设置不是必需的,而且初始值仅在VHDL的行为仿真中有效。与变量相比,信号的硬件特征更为明显,它具有全局性特性。,信号的定义示例:SIGNAL S1:STD_LOGIG:=0; -定义了一个标准位的单值信号S1,初始值为低电平SIGNAL S2,S3:BIT; -定义了两个为BIT的信号S2和S3SIGNAL S4: STD_LOG
32、IC_VECTOR(15 DOWNTO 0); -定义了一个标准位矢量信号,共有16个信号元素信号的使用和定义范围是实体、结构体和程序包。 信号的赋值语句格式:目标信号名=表达式;其赋值语句的用法见3.4节。,4三者的使用比较(1) 从硬件电路系统来看,常量相当于电路中的恒定电平,如GND或VCC接口,而变量和信号则相当于组合电路系统中门与门间的连接及其连线上的信号值。(2) 从行为仿真和VHDL语句功能上看,信号和变量的区别主要表现在接受和保持信息的方式、信息保持与传递的区域大小上。(3) 从综合后所对应的硬件电路结构来看,信号一般将对应更多的硬件结构,但在许多情况下,信号和变量并没有什么区
33、别。 (4) 虽然VHDL仿真器允许变量和信号设置初始值,但在实际应用中,VHDL综合器并不会把这些信息综合进去。,3.3.3 VHDL数据类型 VHDL是一种强类型语言,要求设计实体中的每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型,并且只有数据类型相同的量才能互相传递和作用。VHDL作为强类型语言的好处是能使VHDL编译或综合工具很容易地找出设计中的各种常见错误。 VHDL设计成一种强类型语言的目的是为了保证硬件设计的唯一性。从数据类型的构成VHDL数据类型可分成四大类:标量型(SCALAR TYPE):属单元素的最基本的数据类型,通常用于描述一个单值数据对象,它包
34、括实数类型、整数类型、枚举类型和时间类型。复合类型(COMPOSITE TYPE):可以由细小的数据类型复合而成,如可由标量复合而成。复合类型主要有数组型(ARRAY)和记录型(RECORD)。存取类型(ACCESS TYPE):为给定的数据类型的数据对象提供存取方式。文件类型(FILES TYPE):用于提供多值存取类型。从数据类型能否直接使用, VHDL数据类型可分为两种:预定义数据类型和用户自定义数据类型。,1VHDL的预定义数据类型VHDL的预定义数据类型都是在VHDL标准程序包STANDARD中定义的,在实际使用中,已自动包含进VHDL的源文件中,因而不必通过USE语句以显式调用。1
35、) 布尔(BOOLEAN)数据类型程序包STANDARD中定义布尔数据类型的源代码如下:TYPE BOOLEAN IS(FALSE,TRUE);布尔数据类型实际上是一个二值枚举型数据类型,它的取值有FALSE和TRUE两种。例如,当A大于B时,在IF语句中的关系运算表达式(AB)的结果是布尔量TRUE,反之为FALSE。综合器将其变为1或0信号值,对应于硬件系统中的一根线。,2) 位(BIT)数据类型位数据类型也属于枚举型,取值只能是1或0。在程序包STANDARD中定义的源代码是: TYPE BIT IS (0,1);3) 位矢量(BIT_VECTOR)数据类型位矢量只是基于BIT数据类型的
36、数组,在程序包STANDARD中定义的源代码是: TYPE BIT _VETOR IS ARRAY(NATURA RANGE)OF BIT;4) 字符(CHARACTER)数据类型5) 整数(INTEGER)数据类型6) 自然数(NATURAL)和正整数(POSITIVE)数据类型7) 实数(REAL)数据类型8) 字符串(STRING)数据类型9) 时间(TIME)数据类型10) 错误等级(SEVERITY_LEVEL),2. IEEE预定义标准逻辑位与矢量在IEEE库的程序包STD_LOGIC_1164中,定义了两个非常重要的数据类型,即标准逻辑位STD_LOGIC 和标准逻辑矢量STD_
37、LOGIC_VECTOR。1) 标准逻辑位STD_LOGIC数据类型在IEEE库程序包STD_LOGIC_1164中STD_LOGIC的定义如下:TYPE STD_LOGIC IS (U,X,0,1,Z,W,L,H,-);各值的含义是:U-未初始化的,X-强未知的,0-强0,1-强1,Z-高阻态,W-弱未知的,L-弱0,H-弱1, -忽略。在程序中使用此数据类型前,需加入下面的语句:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;注意:在条件语句中,如果未考虑到STD_LOGIC的所有可能的取值情况,综合器可能会插入不希望的锁存器。在仿真和综合中,STD_LO
38、GIC值是非常重要的,它可以使设计者精确模拟一些未知和高阻态的线路情况。对于综合器,高阻态和“-”忽略态可用于三态的描述。但就综合而言,STD_LOGIC型数据能够在数字器件中实现的只有其中的4种值,即“-”、“0”、“1”和“Z”。,2) 标准逻辑矢量(STD_LOGIC_VECTOR)数据类型 STD_LOGIC_VECTOR类型定义如下: TYPE STD_LOGIC_VECTOR IS ARRAY (NATURA RANGE) OF STD_LOGIC; 【例3.3.1】 TYPE T_DATA IS ARRAY(7 DOWNTO 0) OF STD_LOGIC; - 自定义数组类型S
39、IGNAL DATABUS,MEMORY:T_DATA; -定义信号DATABUS,MEMORY CPUPROCESS IS -CPU工作进程开始 VARIABLE REG1T_DATA; -定义寄存器变量REG1 ,3. 其他预定义标准数据类型VHDL综合工具配带的扩展程序包中,定义了一些有用的类型。如Synopsys公司在IEEE库中加入的程序包STD_LOGIC_ARITH中定义了如下的数据类型:无符号型(UNSIGNED)、有符号型(SIGNED)和小整型(SMALL _INT)。在程序包STD_LOGIC_ARITH中的类型定义如下:TYPE UNSIGNED IS ARRAY (N
40、ATURA RANGE ) OF STD_LOGIC;TYPE SIGNED IS ARRAY (NATURA RANGE) OF STD_LOGIC;SUBTYPE SMALL_INT IS INTEGER RANGE 0 TO 1;如果将信号或变量定义为这几个数据类型,就可以使用本程序包中定义的运算符。在使用之前,请注意必须加入下面的语句:LIBRARY IEEE;USE IEEE.STD_LOGIC_ARITH.ALL;,1) 无符号数据类型(UNSIGNED TYPE)UNSIGNED数据类型代表一个无符号的数值,在综合器中,这个数值被解释为一个二进制数,这个二进制数的最左位是其最高位
41、。 VARIABLE VARUNSIGNED(0 TO 10);SIGNAL SIGUNSIGNED(5 TO 0);其中,变量VAR有11位数值,最高位是VAR(0),而非VAR(10);信号SIG有6位数值,最高位是SIG(5)。 2) 有符号数据类型(SIGNED TYPE)SIGNED数据类型表示一个有符号的数值,综合器将其解释为补码,此数的最高位是符号位,例如:SIGNED(“0101”) 代表+5,5;SIGNED(“1011”) 代表-5。若将上例的VAR定义为SIGNED数据类型,则数值意义就不同了,如:VARIABLE VARSIGNED(0 TO 10);其中,变量VAR有
42、11位,最左位VAR(0)是符号位。,4. 用户自定义数据类型方式VHDL允许用户自行定义新的数据类型,它们可以有多种,如枚举类型(ENUMERA-TION TYPE)、整数类型(INTEGER TYPE)、数组类型(ARRAY TYPE)、记录类型(RECORD TYPE)、时间类型(TIME TYPE)、实数类型(REA TYPE)等。用户自定义数据类型是用类型定义语句TYPE和子类型定义语句SUBTYPE实现的。,1) TYPE语句用法TYPE 数据类型名 IS 数据类型定义 OF 基本数据类型;其中,数据类型名由设计者自定;数据类型定义部分用来描述所定义的数据类型的表达方式和表达内容;
43、关键词OF后的基本数据类型是指数据类型定义中所定义的元素的基本数据类型,一般都是取已有的预定义数据类型,如BIT、STD_LOGIC或INTEGER等。以下列出了两种不同的定义方式:TYPE ST1 IS ARRAY(0 TO 15) OF STD_LOGIC;TYPE WEEK IS (SUN,MON,TUE,WED,THU,FRI,SAT);,2) SUBTYPE语句用法子类型SUBTYPE只是由TYPE所定义的原数据类型的一个子集,它满足原数据类型的所有约束条件,原数据类型称为基本数据类型。子类型SUBTYPE的语句格式如下:SUBTYPE 子类型名 IS 基本数据 RANGE 约束范围
44、;如:SUBTYPE DIGITS INTEGER RANGE 0 TO 9;例中,INTEGER是标准程序包中已定义过的数据类型,子类型DIGITS只是把INTEGER约束到只含10个值的数据类型。,5. 枚举类型VHDL中的枚举数据类型是用文字符号来表示一组实际的二进制数的类型(若直接用数值来定义,则必须使用单引号)。例:TYPE M_STATE IS( STATE1,STATE2,STATE3,STATE4,STATE5);SIGNAL CURRENT_STATE,NEXT_STATE:M_STATE;信号CURRENT_STATE和NEXT_STATE的数据类型定义为M_STATE,它
45、们的取值范围是可枚举的,即从STATE1STATE5共五种,而这些状态代表五组惟一的二进制数值。在综合过程中,枚举类型文字元素的编码通常是自动的,编码顺序是默认的,一般将第一个枚举量(最左边的量)编码为0,以后的依次加1。综合器在编码过程中自动将第一枚举元素转变成位矢量,位矢的长度将取所需表达的所有枚举元素的最小值。如上例中用于表达5个状态的位矢长度应该为3,编码默认值为如下方式:STATE1=000;STATE2=001;STATE3=010;STATE4=011;STATE5=100;于是它们的数值顺序便成为STATE1STATE2STATE3STATE4 STATE5。一般而言,编码方法
46、因综合器不同而不同。为了某些特殊的需要,编码顺序也可以人为设置。,6整数类型和实数类型整数和实数的数据类型在标准的程序包中已作了定义,但在实际应用中,特别在综合中,由于这两种非枚举型的数据类型的取值定义范围太大,综合器无法进行综合。 实际应用中,VHDL仿真器通常将整数或实数类型作为有符号数处理,VHDL综合器对整数或实数的编码方法是:对用户已定义的数据类型和子类型中的负数,编码为二进制补码;对用户已定义的数据类型和子类型中的正数,编码为二进制原码。,7数组类型数组类型属复合类型,它是将一组具有相同数据类型的元素集合在一起,作为一个数据对象来处理的数据类型。数组可以是一维(每个元素只有一个下标
47、)数组或多维数组(每个元素有多个下标)。VHDL仿真器支持多维数组,但VHDL综合器只支持一维数组。数组的元素可以是任何一种数据类型,用以定义数组元素的下标范围子句决定了数组中元素的个数以及元素的排序方向,即下标数是由低到高,或是由高到低。VHDL允许定义两种不同类型的数组,即限定性数组和非限定性数组。它们的区别是,限定性数组下标的取值范围在数组定义时就被确定了,而非限定性数组下标的取值范围需留待随后根据具体数据对象再确定。,限定性数组定义语句格式:TYPE 数组名 IS ARRAY (数组范围) OF数据类型;其中,数组名是新定义的限定性数组类型的名称,可以是任何标识符,其类型与数组元素相同
48、;数组范围明确指出数组元素的定义数量和排序方式,以整数来表示其数组的下标;数据类型即指数组各元素的数据类型。【例3.3.4】TYPE STB IS ARRAY(7 DOWNTO 0) OF STD_LOGIC;这个数组类型的名称是STB,它有八个元素,它的下标排序是7,6,5,4,3,2,1,0,各元素的排序是STB(7),STB(6),STB(1),STB(0)。,非限制性数组的定义语句格式:TYPE 数组名 IS ARRAY (数组下标名 RANGE) OF 数据类型;其中,数组名是定义的非限制性数组类型的取名;数组下标名是以整数类型设定的一个数组下标名称;符号“”是下标范围待定符号,用到
49、该数组类型时,再填入具体的数值范围;数据类型是数组中每一元素的数据类型。【例3.3.6】TYPE BIT_VECTOR IS ARRAY(NATURA RANE) OF BIT;VARABLE VA:BIT_VECTOR(1 TO 6); -将数组取值范围定在16,8记录类型由已定义的、数据类型不同的对象元素构成的数组称为记录类型的对象。定义记录类型的语句格式如下:TYPE 记录类型名 IS RECORD 元素名 : 元素数据类型;元素名 : 元素数据类型;END RECORD 记录类型名;【例3.3.9】TYPE RECDATA IS RECORD -将RECDATA定义为三元素记录类型ELEMENT1 TIME; -将元素ELEMENT1定义为时间类型ELEMENT2 TIME; -将元素ELEMENT2定义为时间类型ELEMENT3 STD_LOGIC;-将元素ELEMENT3定义为标准位类型END RECORD RECDATA;,