《第3章VHDL编程基础.ppt》由会员分享,可在线阅读,更多相关《第3章VHDL编程基础.ppt(590页珍藏版)》请在三一文库上搜索。
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设计,3.1 概 述,3.1.1 常用硬件描述语言简介 常用硬件描述语言有VHDL、Verilog和ABEL语言。VHDL起源于美国国防部的VHSIC,Verilog起源于集成电路的设计,ABEL则来源于可编程逻辑器件的设计。下面从使用方面将三者进行对比。 (1) 逻辑描述层次:一般的硬件描述语言可以在三个
2、层次上进行电路描述,其层次由高到低依次可分为行为级、RTL级和门电路级。VHDL语言是一种高级描述语言,适用于行为级和RTL级的描述,最适于描述电路的行为;Verilog语言和ABEL语言是一种较低级的描述语言,适用于RTL级和门电路级的描述,最适于描述门级电路。,(2) 设计要求:VHDL进行电子系统设计时可以不了解电路的结构细节,设计者所做的工作较少;Verilog和ABEL语言进行电子系统设计时需了解电路的结构细节,设计者需做大量的工作。 (3) 综合过程:任何一种语言源程序,最终都要转换成门电路级才能被布线器或适配器所接受。因此,VHDL语言源程序的综合通常要经过行为级RTL级门电路级
3、的转化,VHDL几乎不能直接控制门电路的生成。而Verilog语言和ABEL语言源程序的综合过程要稍简单,即经过RTL级门电路级的转化,易于控制电路资源。,(4) 对综合器的要求:VHDL描述语言层次较高,不易控制底层电路,因而对综合器的性能要求较高,Verilog和ABEL对综合器的性能要求较低。 (5) 支持的EDA工具:支持VHDL和Verilog的EDA工具很多,但支持ABEL的综合器仅仅Dataio一家。 (6) 国际化程度:VHDL和Verilog已成为IEEE标准,而ABEL正朝国际化标准努力。,3.1.2 VHDL的优点 VHDL的英文全名是Very-High-Speed In
4、tegrated Circuit Hardware Description Language,诞生于1982年。1987年底, VHDL被IEEE ( The Institute of Electrical and Electronics Engineers)和美国国防部确认为标准硬件描述语言。自IEEE公布了VHDL的标准版本(IEEE-1076)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准硬件描述语言。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上
5、扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本。现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。有专家认为,在新的世纪中,VHDL与Verilog语言将承担起几乎全部的数字系统设计任务。,VHDL主要用于描述数字系统的结构、行为、功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件、一个电路模块或一个系统)分成外部(或称可视部分,即端口)和
6、内部(或称不可视部分),即设计实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。应用VHDL进行工程设计的优点是多方面的,具体如下:,(1) 与其他的硬件描述语言相比,VHDL具有更强的行为描述能力。强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。就目前流行的EDA工具和VHDL综合器而言,将基于抽象的行为描述风格的VHDL程序综合成为具体的FPGA和CPLD等目标器件的网表文件已不成问题,只是在综合与优化效率上略有差异。 (
7、2) VHDL具有丰富的仿真语句和库函数,使得在任何大系统的设计早期,就能查验设计系统的功能可行性,随时可对系统进行仿真模拟,使设计者对整个工程的结构和功能可行性做出判断。,(3) VHDL语句的行为描述能力和程序结构,决定了它具有支持大规模设计的分解和已有设计的再利用功能。符合市场需求的大规模系统高效、高速的完成必须有多人甚至多个开发组共同并行工作才能实现,VHDL中设计实体的概念、程序包的概念、设计库的概念为设计的分解和并行工作提供了有利的支持。,(4) 用VHDL完成一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动把VHDL描述设计转变成门级网表(根据不同的实现芯片)。这种方
8、式突破了门级设计的瓶颈,极大地减少了电路设计的时间和可能发生的错误,降低了开发成本。利用EDA工具的逻辑优化功能,可以自动地把一个综合后的设计变成一个更小、更高速的电路系统。反过来,设计者还可以容易地从综合和优化的电路获得设计信息,返回去更新修改VHDL设计描述,使之更加完善。,(5) VHDL对设计的描述具有相对独立性。设计者可以不懂硬件的结构,也不必管最终设计的目标器件是什么,而进行独立的设计。正因为VHDL的硬件描述与具体的工艺技术和硬件结构无关,所以VHDL设计程序的硬件实现目标器件有广阔的选择范围,其中包括各种系列的CPLD、FPGA及各种门阵列器件。 (6) 由于VHDL具有类属描
9、述语句和子程序调用等功能,对于完成的设计,在不改变源程序的条件下,只需改变类属参量或函数,就能轻易地改变设计的规模和结构。,3.1.3 VHDL程序设计约定 为了便于程序的阅读和调试,本书对VHDL程序设计特作如下约定: (1) 语句结构描述中方括号“ ”内的内容为可选内容。 (2) 对于VHDL的编译器和综合器来说,程序文字的大小写是不加区分的。本书一般使用大写。 (3) 程序中的注释使用双横线“-”。在VHDL程序的任何一行中,双横线“-”后的文字都不参加编译和综合。,(4) 为了便于程序的阅读与调试,书写和输入程序时,使用层次缩进格式,同一层次的对齐,低层次的较高层次的缩进两个字符。 (
10、5) 考虑到MAX+plusII要求源程序文件的名字与实体名必须一致,因此为了使同一个VHDL源程序文件能适应各个EDA开发软件上的使用要求,建议各个源程序文件的命名均与其实体名一致。,3.2 VHDL程序基本结构,3.2.1 VHDL程序设计举例 1设计思路 全加器可以由两个1位的半加器构成,而1位半加器可以由如图3.1所示的门电路构成。 1位半加器的端口信号A 和B分别是2位相加的二进制输入信号,SO是相加和的输出信号,CO是进位输出信号,左边的门电路结构构成了右边的半加器H_ADDER。在硬件上可以利用半加器构成如图3.2所示的全加器,当然还可以将一组这样的全加器级联起来构成一个串行进位
11、的加法器。图3.2中,全加器 F_ADDER内部的功能结构是由3个逻辑器件构成的,即由两个半加器U1、U2和一个或门U3连接而成。,图3.1 1位半加器逻辑原理图,图3.2 1 位全加器逻辑原理图,2. VHDL源程序 1) 或门的逻辑描述 - IEEE库的使用说明 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; -实体OR2的说明 ENTITY OR2 IS PORT(A,B:IN STD_LOGIC; C:OUT STD_LOGIC); END ENTITY OR2; -实体OR2的结构体ART1的说明 ARCHITECTURE ART1 OF OR2
12、 IS BEGIN C=A OR B; END ARCHITECTURE ART1;,2) 半加器的逻辑描述 - IEEE库的使用说明 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; -实体H_ADDER的说明 ENTITY H_ADDER IS PROT(A,B:IN STD_LOGIC; CO,SO:OUT STD_LOGIC);,END ENTITY H_ADDER; - 实体H_ADDER的结构体ART2的说明 ARCHITECTURE ART2 OF H_ADDER IS BEGIN SO=(A OR B) AND (A NAND B); CO=
13、NOT (A NAND B); END ARCHITECTURE ART2;,3) 全加器的逻辑描述 - IEEE库的使用说明 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; -实体F_ADDER的说明 ENTITY F_ADDER IS PORT(AIN,BIN,CIN:IN STD_LOGIC; COUT,SUM: OUT STD_LOGIC); END ENTITY F_ADDER; -实体F_ADDER的结构体ART3的说明 ARCHITECTURE ART3 OF F_ADDER IS -元件调用声明,COMPONENT H_ADDER PORT
14、(A,B:IN STD_LOGIC; CO,SO:OUT STD_LOGIC); END COMPONENT; COMPONENT OR2 PORT(A,B:IN STD_LOGIC; C: OUT STD_LOGIC); END COMPONENT; SIGNAL D,E,F:STD_LOGIC; -元件连接说明 BEGIN U1:H_ADDER PORT MAP(A=AIN,B=BIN,CO=D,SO=E); U2:H_ADDER PORT MAP(A=E,B=CIN,CO=F,SO=SUM); U3:OR2 PORT MAP(A=D,B=F,C=COUT); END ARCHITECTU
15、RE ART3;,3. 说明及分析 (1) 整个设计包括三个设计实体,分别为OR2、H_ADDER和_ADDER,其中实体F_ADDER为顶层实体。三个设计实体均包括三个组成部分:库、程序包使用说明,实体说明和结构体说明。这三个设计实体既可以作为一个整体进行编译、综合与存档,也可以各自进行独立编译、独立综合与存档,或被其他的电路系统所调用。,(2) 实体 OR2定义了或门OR2的引脚信号A、B(输入)和C(输出),其对应的结构体ART1描述了输入与输出信号间的逻辑关系,即将输入信号A、B相或后传给输出信号端C,由此实体和结构体描述一个完整的或门元件。 (3) 实体H_ADDER及对应的结构体A
16、RT2描述了一个如图3.1所示的半加器。由其结构体的描述可以看到,它是由一个与非门、一个非门、一个或门和一个与门连接而成的,其逻辑关系来自于半加器真值表。在VHDL中,逻辑算符NAND、NOT、OR和AND分别代表“与非”、“非”、“或”和“与”4种逻辑运算关系。,(4) 在全加器接口逻辑VHDL描述中,根据图3.2右侧的1位二进制全加器F_ADDER的原理图,实体F_ADDER定义了引脚的端口信号属性和数据类型。其中,AIN和BIN分别为两个输入的相加位,CIN为低位进位输入,COUT 为进位输出,SUM为1位和输出。其对应的结构体ART3的功能是利用COMPONENT声明语句和COMPON
17、ENT例化语句将上面由两个实体OR2和H_ADDER描述的独立器件,按照图3.2全加器内部逻辑原理图中的接线方式连接起来。,(5) 在结构体ART3中,COMPONENTEND COMPONENT 语句结构对所要调用的或门和半加器两元件作了声明(COMPONENT DECLARATION),并由SIGNAL语句定义了三个信号D、E和F,作为中间信号转存点,以利于几个器件间的信号连接。接下去的“PORT MAP( )”语句称为元件例化语句(COMPONENT INSTANTIATION)。所谓例化,在电路板上,相当于往上装配元器件;在逻辑原理图上,相当于从元件库中取了一个元件符号放在电路原理图上
18、,并对此符号的各引脚进行连线。例化也可理解为元件映射或元件连接,MAP是映射的意思。例如,语句“U2:H_ADDER PORT MAP(A=E,B=CIN,CO=F,SO=SUM)”表示将实体H_ADDER描述的元件U2的引脚信号A、B、CO和SO分别连向外部信号E、CIN、F和SUM。符号“=”表示信号连接。,(6) 实体F_ADDER引导的逻辑描述也是由三个主要部分构成的,即库、实体和结构体。从表面上看来,库的部分仅包含一个IEEE标准库和打开的IEEE.STD_LOGIC_1164.ALL程序包。但实际上,从结构体的描述中可以看出,其对外部的逻辑有调用的操作,这类似于对库或程序包中的内容
19、作了调用。因此,库结构部分还应将上面的或门和半加器的VHDL描述包括进去,作为工作库中的两个待调用的元件。由此可见,库结构也是VHDL程序的重要组成部分。,3.2.2 VHDL程序的基本结构 从前面的设计实例可以看出,一个相对完整的VHDL程序(或称为设计实体)具有如图3.3所示的比较固定的结构。至少应包括三个基本组成部分:库、程序包使用说明,实体说明和实体对应的结构体说明。其中,库、程序包使用说明用于打开(调用)本设计实体将要用到的库、程序包;实体说明用于描述该设计实体与外界的接口信号说明,是可视部分;结构体说明用于描述该设计实体内部工作的逻辑关系,是不可视部分。在一个实体中,可以含有一个或
20、一个以上的结构体,而在每一个结构体中又可以含有一个或多个进程以及其他的语句。根据需要,实体还可以有配置说明语句。配置说明语句主要用于以层次化的方式对特定的设计实体进行元件例化,或是为实体选定某个特定的结构体。,如何才算一个完整的VHDL程序(设计实体),并没有完全一致的结论,因为不同的程序设计目的可以有不同的程序结构。通常认为,一个完整的设计实体的最低要求应该能为VHDL综合器所接受,并能作为一个独立设计单元,即以元件的形式存在的VHDL程序。这里所谓的元件,既可以被高层次的系统所调用,成为该系统的一部分,也可以作为一个电路功能块而独立存在和独立运行。,图3.3 VHDL程序设计基本结构,3.
21、2.3 实体(ENTITY) 实体是一个设计实体的表层设计单元,其功能是对这个设计实体与外部电路进行接口描述。它规定了设计单元的输入输出接口信号或引脚,是设计实体经封装后对外的一个通信界面。 1实体语句结构 实体说明单元的常用语句结构如下: ENTITY 实体名 IS GENERIC(类属表); PORT(端口表); END ENTITY 实体名;,实体说明单元必须以语句“ENTITY 实体名IS”开始,以语句“END ENTITY 实体名;”结束,其中的实体名是设计者自己给设计实体的命名,可作为其他设计实体对该设计实体进行调用时用。中间在方括号内的语句描述,在特定的情况下并非是必须的。例如构
22、建一个VHDL仿真测试基准等情况中可以省去方括号中的语句。,2类属(GENERIC)说明语句 类属(GENERIC)参量是一种端口界面常数,常以一种说明的形式放在实体或块结构体前的说明部分。类属为所说明的环境提供了一种静态信息通道,类属的值可以由设计实体外部提供。因此,设计者可以从外面通过类属参量的重新设定而容易地改变一个设计实体或一个元件的内部电路结构和规模。,类属说明的一般书写格式如下: GENERIC(常数名;数据类型:设定值 ;常数名:数据类型:设定值 ); 类属参量以关键词GENERIC引导一个类属参量表,在表中提供时间参数或总线宽度等静态信息。类属表说明用于确定设计实体和其外部环境
23、通信的参数,传递静态的信息。类属说明在所定义的环境中的地位十分接近常数,但却能从环境(如设计实体)外部动态地接受赋值,其行为又有点类似于端口PORT。因此,常如以上的实体定义语句那样,将类属说明放在其中,且放在端口说明语句的前面。,在一个实体中定义的、可以通过GENERIC参数类属的说明,为它创建多个行为不同的逻辑结构。比较常见的情况是选用类属来动态规定一个实体端口的大小,或设计实体的物理特性,或结构体中的总线宽度,或设计实体中、底层中同种元件的例化数量等。一般在结构体中,类属的应用与常数是一样的。例如,当用实体例化一个设计实体的器件时,可以用类属表中的参数项定制这个器件,如可以将一个实体的传
24、输延时、上升和下降延时等参数加到类属参数表中,然后根据这些参数进行定制,这对于系统仿真控制是十分方便的。类属中的常数名是由设计者确定的类属常数名,数据类型通常取INTEGER或TIME等类型,设定值即为常数名所代表的数值。但需注意,综合器仅支持数据类型为整数的类属值。,【例3.2.1】 ENTITY MCK IS GENERIC(WIDTH:INTEGER:=16); PORT(ADD_BUS:OUT STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0) ; . 在这里,GENERIC语句对实体MCK的作为地址总线的端口ADD_BUS的数据类型和宽度作了定义,即定义ADD_BU
25、S为一个16位的位矢量。,【例3.2.2】 2输入与门的实体描述。 ENTITY AND2 IS GENERIC(RISEW:TIME:=1 ns; FALLW:TIME:=1 ns); PORT( A1:IN STD_LOGIC; A0:IN STD_LOGIC; Z0:OUT STD_LOGIC); END ENTITY AND2; 这是一个准备作为2输入与门的设计实体的实体描述,在类属说明中定义参数RISEW为上沿宽度,FALLW为下沿宽度,它们分别为 1 ns,这两个参数用于仿真模块的设计。,3PORT端口说明 由PORT引导的端口说明语句是对于一个设计实体界面的说明。 实体端口说明的
26、一般书写格式如下: PORT(端口名:端口模式 数据类型; 端口名:端口模式 数据类型);,其中,端口名是设计者为实体的每一个对外通道所取的名字;端口模式是指这些通道上的数据流动方式,如输入或输出等;数据类型是指端口上流动的数据的表达格式。由于VHDL是一种强类型语言,它对语句中的所有操作数的数据类型都有严格的规定。一个实体通常有一个或多个端口,端口类似于原理图部件符号上的管脚。实体与外界交流的信息必须通过端口通道流入或流出。,IEEE 1076标准包中定义了4种常用的端口模式,各端口模式的功能及符号分别见表3.1和图3.4。在实际的数字集成电路中,IN相当于只可输入的引脚,OUT相当于只可输
27、出的引脚,BUFFER相当于带输出缓冲器并可以回读的引脚(与TRI引脚不同),而INOUT相当于双向引脚(即BIDIR引脚)。由图3.4的INOUT电路可见,此模式的端口是普通输出端口(OUT)加入三态输出缓冲器和输入缓冲器构成的。 在实用中,端口描述中的数据类型主要有两类:位(BIT)和位矢量(BIT_VECTOR)。若端口的数据类型定义为BIT,则其信号值是一个1位的二进制数,取值只能是0或1;若端口数据类型定义为BIT_VECTOR,则其信号值是一组二进制。,表3.1 端口模式说明,图3.4 端口模式符号图,3.2.4 结构体(ARCHITECTURE) 结构体是用于描述设计实体的内部结
28、构以及实体端口间的逻辑关系。结构体内部构造的描述层次和描述内容一般可以用图3.5来说明。一般地,一个完整的结构体由两个基本层次组成: 对数据类型、常数、信号、子程序和元件等元素的说明部分。 描述实体逻辑行为的,以各种不同的描述风格表达的功能描述语句。,图3.5 结构体构造图,结构体将具体实现一个实体。每个实体可以有多个结构体,每个结构体对应着实体不同结构和算法实现方案,其间的各个结构体的地位是同等的,它们完整地实现了实体的行为,但同一结构体不能为不同的实体所拥有。结构体不能单独存在,它必须有一个界面说明,即一个实体。对于具有多个结构体的实体,必须用CONFIGURATION配置语句指明用于综合
29、的结构体和用于仿真的结构体,即在综合后的可映射于硬件电路的设计实体中,一个实体只对应一个结构体。在电路中,如果实体代表一个器件符号,则结构体描述了这个符号的内部行为。当把这个符号例化成一个实际的器件安装到电路上时,则需配置语句为这个例化的器件指定一个结构体(即指定一种实现方案),或由编译器自动选一个结构体。,1. 结构体的一般语句格式 结构体的语句格式如下: ARCHITECTURE 结构体名 OF 实体名 IS 说明语句 BEGIN 功能描述语句 END ARCHITECTURE 结构体名; 其中,实体名必须是所在设计实体的名字,而结构体名可以由设计者自己选择,但当一个实体具有多个结构体时,
30、结构体的取名不可重复。,2结构体说明语句 结构体中的说明语句是对结构体的功能描述语句中将要用到的信号(SIGNAL)、数据类型(TYPE)、常数(CONSTANT)、元件(COMPONENT)、函数(FUNCTION)和过程(PROCEDURE)等加以说明的语句。但在一个结构体中说明和定义的数据类型、常数、元件、函数和过程只能用于这个结构体中,若希望其能用于其他的实体或结构体中,则需要将其作为程序包来处理。,3功能描述语句结构 如图3.5所示的功能描述语句结构可以含有五种不同类型的,以并行方式工作的语句结构。而在每一语句结构的内部可能含有并行运行的逻辑描述语句或顺序运行的逻辑描述语句。各语句结
31、构的基本组成和功能分别是: (1) 块语句是由一系列并行执行语句构成的组合体,它的功能是将结构体中的并行语句组成一个或多个模块。,(2) 进程语句定义顺序语句模块,用以将从外部获得的信号值,或内部的运算数据向其他的信号进行赋值。 (3) 信号赋值语句将设计实体内的处理结果向定义的信号或界面端口进行赋值。 (4) 子程序调用语句用于调用一个已设计好的子程序。 (5) 元件例化语句对其他的设计实体作元件调用说明,并将此元件的端口与其他的元件、信号或高层次实体的界面端口进行连接。,3.3 VHDL语言要素,3.3.1 VHDL文字规则 VHDL文字(Literal)主要包括数值和标识符。数值型文字主
32、要有数字型、字符串型、位串型。 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 (3) 以数制基数表示的文字:用这种方式表
33、示的数由五个部分组成。第一部分,用十进制数标明数制进位的基数;第二部分,数制隔离符号“#”;第三部分,表达的文字;第四部分,指数隔离符号“#”;第五部分,用十进制表示的指数部分,这一部分的数如果是0可以省去不写。现举例如下:,10#170# -(十进制数表示,等于170) 2#1111_1110# -(二进制数表示,等于254) 16#E#E1 -(十六进制数表示,等于2#11100000#,等于224) 16#F.01#E+2 -(十六进制数表示,等于3841.00),(4) 物理量文字(VHDL综合器不接受此类文字)。如: 60s(60秒),100m(100米),k(千欧姆),177A(1
34、77安培),2. 字符串型文字 字符是用单引号引起来的ASCII字符,可以是数值,也可以是符号或字母,如:R,A,*,Z。而字符串则是一维的字符数组,须放在双引号中。VHDL中有两种类型的字符串:文字字符串和数位字符串。 (1) 文字字符串:文字字符串是用双引号引起来的一串文字,如: “ERROR”,“BOTH S AND Q EQUAL TO L”,“X”,“BB$CC”,(2) 数位字符串:数位字符串也称位矢量,是预定义的数据类型BIT的一位数组,它们所代表的是二进制、八进制或十六进制的数组,其位矢量的长度即为等值的二进制数的位数。数位字符串的表示首先要有计算基数,然后将该基数表示的值放在
35、双引号中,基数符以“B”、“O”和“X”表示,并放在字符串的前面。它们的含义分别是: B:二进制基数符号,表示二进制数位0或1,在字符串中每一个位表示一个BIT。 O:八进制基数符号,在字符串中的第一个数代表一个八进制数,即代表一个3位(BIT)的二进制数。, X:十六进制基数符号(0F),代表一个十六进制数,即代表一个4位的二进制数。 例如: B“1_1101_1110” -二进制数数组,位矢数组长度是9 X“AD0” -十六进制数数组,位矢数组长度是12,3标识符 标识符用来定义常数、变量、信号、端口、子程序或参数的名字。VHDL的基本标识符就是以英文字母开头,不连续使用下划线“_”,不以
36、下划线“_”结尾的,由26个大小写英文字母、数字09以及下划线“_”组成的字符串。VHDL 93标准还支持扩展标识符,但是目前仍有许多VHDL工具不支持扩展标识符。标识符中的英语字母不分大小写。VHDL的保留字不能用于作为标识符使用。如:DECODER_1,FFT,Sig_N,NOT_ACK,State0,Idle是合法的标识符;而_DECODER_1,2FFT,SIG_#N,NOT_ACK,RYY_RST,data_BUS,RETURN则是非法的标识符。,4下标名及下标段名 下标名用于指示数组型变量或信号的某一元素,而下标段名则用于指示数组型变量或信号的某一段元素,其语句格式如下: 数组类型
37、信号名或变量名(表达式1 TO/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
38、=B(3); -3是可计算型下标表示 C (0 TO 3)=A (4 TO 7); -以段的方式进行赋值 C (4 TO 7)=A (0 TO 3); -以段的方式进行赋值,3.3.2 VHDL数据对象 在VHDL中,数据对象(Data Objects)类似于一种容器,它接受不同数据类型的赋值。数据对象有三种,即常量(CONSTANT)、变量(VARIABLE)和信号(SIGNAL)。前两种可以从传统的计算机高级语言中找到对应的数据类型,其语言行为与高级语言中的变量和常量十分相似。但信号是具有更多的硬件特征的特殊数据对象,是VHDL中最有特色的语言要素之一。,1常量(CONSTANT) 常量的
39、定义和设置主要是为了使设计实体中的常数更容易阅读和修改。例如,将位矢的宽度定义为一个常量,只要修改这个常量就能很容易地改变宽度,从而改变硬件结构。在程序中,常量是一个恒定不变的值,一旦作了数据类型的赋值定义后,在程序中不能再改变,因而具有全局意义。常量的定义形式如下: CONSTANT 常量名:数据类型=表达式; 例如: CONSTANT FBUSBIT_VECTOR=“010115”; CONSTANT VCCREAL=5.0; CONSTANT DELYTIME=25ns;,VHDL要求所定义的常量数据类型必须与表达式的数据类型一致。常量的数据类型可以是标量类型或复合类型,但不能是文件类型
40、(File)或存取类型(Access)。 常量定义语句所允许的设计单元有实体、结构体、程序包、块、进程和子程序。在程序包中定义的常量可以暂不设具体数值,它可以在程序包体中设定。,常量的可视性,即常量的使用范围取决于它被定义的位置。在程序包中定义的常量具有最大全局化特征,可以用在调用此程序包的所有设计实体中;定义在设计实体中的常量,其有效范围为这个实体定义的所有的结构体;定义在设计实体的某一结构体中的常量,则只能用于此结构体;定义在结构体的某一单元的常量,如一个进程中,则这个常量只能用在这一进程中。,2变量(VARIABLE) 在VHDL语法规则中,变量是一个局部量,只能在进程和子程序中使用。变
41、量不能将信息带出对它作出定义的当前设计单元。变量的赋值是一种理想化的数据传输,是立即发生,不存在任何延时的行为。VHDL语言规则不支持变量附加延时语句。变量常用在实现某种算法的赋值语句中。,定义变量的语法格式如下: VARIABLE 变量名:数据类型:=初始值; 例如: VARIABLE A:INTEGER; -定义A为整数型变量 VARIABLE B,C:INTEGER:=2; -定义B和C为整型变量,初始值为2,变量作为局部量,其适用范围仅限于定义了变量的进程或子程序中。仿真过程中惟一的例外是共享变量。变量的值将随变量赋值语句的运算而改变。变量定义语句中的初始值可以是一个与变量具有相同数据
42、类型的常数值,也可以是一个全局静态表达式,这个表达式的数据类型必须与所赋值变量一致。此初始值不是必需的,综合过程中综合器将略去所有的初始值。 变量数值的改变是通过变量赋值来实现的,其赋值语句的语法格式如下: 目标变量名:=表达式;,3. 信号(SIGNAL) 信号是描述硬件系统的基本数据对象,它类似于连接线。信号可以作为设计实体中并行语句模块间的信息交流通道。在VHDL中,信号及其相关的信号赋值语句、决断函数、延时语句等很好地描述了硬件系统的许多基本特征。如硬件系统运行的并行性;信号传输过程中的惯性延时特性;多驱动源的总线行为等。 信号作为一种数值容器,不但可以容纳当前值,也可以保持历史值。这
43、一属性与触发器的记忆功能有很好的对应关系。信号的定义格式如下: SIGNAL 信号名: 数据类型=初始值;,信号初始值的设置不是必需的,而且初始值仅在VHDL的行为仿真中有效。与变量相比,信号的硬件特征更为明显,它具有全局性特性。例如,在程序包中定义的信号,对于所有调用此程序包的设计实体都是可见的;在实体中定义的信号,在其对应的结构体中都是可见的。 事实上,除了没有方向说明以外,信号与实体的端口(PORT)概念是一致的。相对于端口来说,其区别只是输出端口不能读入数据,输入端口不能被赋值。信号可以看成是实体内部的端口。反之,实体的端口只是一种隐形的信号,端口的定义实际上是作了隐式的信号定义,并附
44、加了数据流动的方向。信号本身的定义是一种显式的定义,因此,在实体中定义的端口,在其结构体中都可以看成一个信号,并加以使用而不必另作定义。以下是信号的定义示例:,SIGNAL S1:STD_LOGIG=0;-定义了一个标准位的单值信号S1,初始值为低电平 SIGNAL S2,S3:BIT; -定义了两个位BIT的信号S2和S3 SIGNAL S4: STD_LOGIC_VECTOR(15 DOWNTO 0); -定义了一个标准位矢的位矢量 -(数组、总线)信号,共有16个信号元素 以下示例定义的信号数据类型是设计者自行定义的,这是VHDL所允许的: TYPE FOUR IS(X,0,I,Z);
45、SIGNAL S1FOUR; SIGNAL S2FOUR=X; SIGNAL S3FOUR=L;,其中,信号S1的初始值取为默认值,VHDL规定初始值取值以取LEFTMOST项(即数组中的最左项)为默认值。在此例中是X(任意状态)。 信号的使用和定义范围是实体、结构体和程序包。在进程和子程序中不允许定义信号。信号可以有多个驱动源,或者说赋值信号源,但必须将此信号的数据类型定义为决断性数据类型。 在进程中,只能将信号列入敏感表,而不能将变量列入敏感表。可见进程只对信号敏感,而对变量不敏感。,4三者的使用比较 (1) 从硬件电路系统来看,常量相当于电路中的恒定电平,如GND或VCC接口,而变量和信
46、号则相当于组合电路系统中门与门间的连接及其连线上的信号值。 (2) 从行为仿真和VHDL语句功能上看,二者的区别主要表现在接受和保持信号的方式、信息保持与传递的区域大小上。例如信号可以设置延时量,而变量则不能;变量只能作为局部的信息载体,而信号则可作为模块间的信息载体。变量的设置有时只是一种过渡,最后的信息传输和界面间的通信都靠信号来完成。,(3) 从综合后所对应的硬件电路结构来看,信号一般将对应更多的硬件结构,但在许多情况下,信号和变量并没有什么区别。例如在满足一定条件的进程中,综合后它们都能引入寄存器。这时它们都具有能够接受赋值这一重要的共性,而VHDL综合器并不理会它们在接受赋值时存在的
47、延时特性。 (4) 虽然VHDL仿真器允许变量和信号设置初始值,但在实际应用中,VHDL综合器并不会把这些信息综合进去。这是因为实际的FPGA/CPLD芯片在上电后,并不能确保其初始状态的取向。因此,对于时序仿真来说,设置的初始值在综合时是没有实际意义的。,3.3.3 VHDL数据类型 VHDL是一种强类型语言,要求设计实体中的每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型,并且相同数据类型的量才能互相传递和作用。VHDL作为强类型语言的好处是使VHDL编译或综合工具很容易地找出设计中的各种常见错误。VHDL中的数据类型可以分成四大类。 标量型(SCALAR TYPE)
48、:属单元素的最基本的数据类型,通常用于描述一个单值数据对象,它包括实数类型、整数类型、枚举类型和时间类型。,复合类型(COMPOSITE TYPE):可以由细小的数据类型复合而成,如可由标量复合而成。复合类型主要有数组型(ARRAY)和记录型(RECORD)。 存取类型(ACCESS TYPE):为给定的数据类型的数据对象提供存取方式。 文件类型(FILES TYPE):用于提供多值存取类型。 这四大数据类型又可分成在现成程序包中可以随时获得的预定义数据类型和用户自定义数据类型两个类别。预定义的VHDL数据类型是VHDL最常用、最基本的数据类型。这些数据类型都已在VHDL的标准程序包STAND
49、ARD和STD_LOGIC_1164及其他的标准程序包中作了定义,并可在设计中随时调用。,用户自定义的数据类型以及子类型,其基本元素一般仍属VHDL的预定义数据类型。尽管VHDL仿真器支持所有的数据类型,但VHDL综合器并不支持所有的预定义数据类型和用户自定义数据类型。如REAL、TIME、FILE、ACCES等数据类型。在综合中,它们将被忽略或宣布为不支持。,1VHDL的预定义数据类型 1) 布尔(BOOLEAN)数据类型 程序包STANDARD中定义布尔数据类型的源代码如下: TYPE BOOLEAN IS(FALES,TRUE); 布尔数据类型实际上是一个二值枚举型数据类型,它的取值有FALSE和TRUE两种。综合器将用一个二进制位表示BOOLEAN型变量或信号。 例如,当A大于B时,在IF语句中的关系运算表达式(AB)的结果是布尔量TRUE,反之为FALSE。综合器将其变为1或0信号值,对应于硬件系统中的一根线。,2) 位(BIT)数据类型 位