从程序结构上看,VHDL具有相对清晰的结构构成。从程序开始到结束,各部分结构都具有特定的功能和语法结构。在VHDL中,将一个能够完成特定独立功能的设计成为设计实体(Design Entity)。一个基本的VHDL设计实体的结构模型如图2-1所示。
图2-1 VHDL设计实体的结构模型
事实上,并非要列出图中所有的语法结构才能完成一个逻辑部件设计,有些部分是可以省略的。一个有意义的设计实体中至少包含库(或程序包)、实体和结构体三个部分。下面就结合图2-1对VHDL的程序框架进行功能上的介绍。
实体是设计中最基本的模块,用于描述设计实体的外部接口特性,即该设计实体对外的输入/输出端口数量和端口特性。一个由多个模块构成的设计实体中可能包含多个实体,其中包括一个顶层实体和处于底层的底层实体,底层实体可以作为组件(Component)例化到高层次实体中。此时,顶层实体就可以对应于芯片的外部引脚定义。
结构体用于描述实体所代表的系统内部的结构和行为。每个实体都必须有至少一个结构体与之相对应。结构体描述了设计实体的结构、行为、元件及内部连接关系。也就是说,它定义了设计实体的具体功能实现,规定了设计实体的数据流程,制定了实体内部元件的连接关系。结构体的功能和行为描述可以采用多种描述形式。
库是用来存放已经编译过的实体、结构体、程序包等数据集合;程序包主要用来存放各个设计都能共享的数据类型、子程序、常量和元件等。库和程序包的作用就是使得设计者可以共享已经编译过的设计结果。
在VHDL中,数据类型、常量及子程序在实体声明和结构体内定义,而这些数据类型、常量及子程序对其他设计实体是不可见的。为了能够在其他设计实体中使用这些资源,VHDL提供了程序包作为载体。在程序包中,用户可以定义一些公用的子程序、常量和自定义的数据类型。
各种VHDL编译系统都含有多个标准程序包,如STD_LOGIC_1164和STANDARD程序包。用户可以打开编译系统安装目录下的库文件夹内的各个程序包文件,查看各个程序包的内容。用户也可以自行定义程序包。
一个设计中,实体可以对应多个结构体,即有多种实现方式。那么在具体硬件实现时,要采用哪种方式呢?这时就需要配置来发挥作用了。配置,就是从与某个实体对应的多个结构体中选定一个作为具体实现。配置在某些系统中不被支持。
下面以一个完整的VHDL实例来说明在VHDL设计实体中的各个组成部分及其功能。
(为便于说明,在程序各行行首加以标号。)
上述VHDL程序描述了一个可配置的单步减法器decr4,该减法器包括两个输入端口mod_6、in_value和一个输出端口out_value。mod_6控制该减法器的模配置,当其逻辑值为“1”时,按六进制执行单步减法,否则按十进制进行单步减法。in_value是一个四位总线输入端口,代表被减数;out_value是一个四位总线输出端口,代表输出结果,即被减数减1后的结果。
该程序的第1行是库声明,表示该设计将使用IEEE库。
第2~4行是程序包声明,表示要使用IEEE库中的几个程序包。这些程序包将提供程序中用到的数据类型定义及位矢量和整数的算术运算操作。
第5~9行是实体声明和定义部分,它定义了该设计的实体名称、输入/输出端口的数量和类型。
第10~15行是与实体对应的结构体描述部分,它完成了实体功能的行为描述,是实体功能的具体实现。
第16~19行是配置部分,它指明了实体decr4采用的结构体是behavior。
【 提示 】VHDL程序对语言书写时的大小写不敏感。例如,标识符“ABc”与“aBc”在程序中将作为同一标识符对待。程序书写可依个人习惯,以清晰易辨、格式统一为原则。