Intel FPGA数字信号处理设计(基础版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2.2 程序结构

下面是一个完整的VHDL程序,程序功能为带异步复位的十进制计数器。VHDL程序主要包括库(library)、程序包(package)声明、实体(entity),以及对外接口声明、结构体(architecture)声明、属性配置等部分。其中,entity与architecture是每个VHDL程序都必须包括的内容,其他部分则依据具体设计而定。

1.库与程序包

程序开始为library声明。library是程序所需要参考到的对象集合文件,如声明的对象、调用的函数、过程等,这好比C++语言中的include语句所包含的头文件。与C++语言不同的是,在VHDL中除声明library外,还需要使用use语句指定该library中具体的程序包,如“use IEEE.STD_LOGIC_UNSIGNED.ALL”。也就是说,一个library中有多个package,可以用use语句指定需要使用到的具体package。程序中可以使用FPGA软件自带的library,如STD、IEEE、SYNOPSYS等,也可以使用程序员自己设计编译的library。ISE环境一般将用户设计编译的library放在当前工程目录下的名为work的library中。我们只需设计package中的内容,当设计好一个package文件后,对程序进行编译,编译成功后自动将库文件存放在名为work的library中,其他程序文件即可直接调用。

2.实体与结构

一个VHDL程序必须有一个实体和至少一个结构。实体以关键字entity开始,以关键字end结束,中间为以关键字port开始的实体对外接口声明。结构以关键字architecture开始,以关键字end结束,中间部分为结构的内部设计。相对于实体来讲,结构声明相对复杂一些,如“architecture Behavioral of mydesign is”表示实体mydesign的结构名为Behavioral。在结构体结束时,用关键字end后面接结构名来表示,如“end Behavioral;”表示结构名为Behavioral的结构体结束,同时注意该语句以分号(;)结束。

VHDL语言允许一个实体同时定义多个结构体,并提供一个配置管理器,负责管理特定编译及仿真期间使用的特定结构体。这种结构配置的好处是设计时可以同时设计多个可能用到的结构,文件综合时只需用configuration语句配置成所需的结构体即可。

VHDL还允许一个结构体内部定义多个独立的块(block),每个块都有相应的保护条件,只有当保护条件满足时才会执行程序块中的语句。虽然VHDL语言提供了block语法功能,但在实际设计中很少这样使用。

3.端口

关键字port在实体中表示对外接口声明,如果该实体表示顶层设计,则该设计的端口也表示芯片的对外接口或引脚定义;如果该实体表示模块设计,则设计端口表示该模块与其他模块或顶层设计之间的信号接口。从语法上讲,并非每个实体都必须有端口声明。当然,没有对外接口的设计是毫无意义的,这样的实体设计只能用在仿真设计方面。端口声明只能出现在实体声明中。

在前面实例的声明中,mydesign的entity有6个端口:clk和rst为输入端口,count为4根信号线组成的输出端口。端口的数据类型为std_logic及std_logic_vector,这两种数据类型在std_logic_1164程序包中定义。端口的数据类型有布尔型(BOOLEAN)、位类型(BIT)、位向量型(BIT_VECTOR)、整数型(INTEGER)、标准逻辑型(STD_LOGIC)及标准逻辑向量型(STD_LOGIC_VECTOR)6种;端口模式主要有输入(IN)、输出(OUT)、缓冲(BUFFER)及输入/输出(INOUT)4种。

4.内部结构设计

内部结构设计,即程序的实现部分,包括内部信号声明及代码编辑两部分。architecture与begin之间为内部声明区,可声明设计内部需用到的信号、常量及组件。内部信号指设计内部产生的中间信号,用于信号之间的连接;常量指设计体中所用到的固定值;组件指设计实体声明,该实体好比一片IC,用户只关心IC的对外接口及功能,不必关心其内部实现过程。begin与end之间就是我们所要编写代码的地方了。VHDL语句可分为两种:写在process之内的语句和写在process之外的语句。如果把process之内的语句当成一个语句体,process之外的每条语句均可当成一个语句体,则结构体设计中的每个语句体均是并行执行的,各语句体之间的先后顺序可以任意排列。例如,下面两段程序的代码顺序完全颠倒,但程序的执行、综合、实现均没有任何差别。

通常,把写在process之外的语句所形成的电路称为组合逻辑电路。当process中没有用到信号边沿触发功能时,写在process之内的语句所形成的电路也是组合逻辑电路;当用到信号边沿触发功能时,形成的电路叫作时序逻辑电路。写在process之外的语句不需要任何触发信号,而写在process之内的语句则需要触发信号,即只有当某个信号状态发生变化,或某个信号出现预期的状态时才会触发process之内的语句执行。