程序包
VHDL引入程序包的结构,使一些通用的对象、数据类型及子程序能被其他程序的实体共同使用
一个程序包由两大部分组成:程序包说明和程序包体。程序包体是一个可选项一般情况,程序包说明列出所有项的名称,而程序包体给出各项的细节。
程序包说明
通常的常量、信号数据类型及子类型的数据范围、函数和过程等说明的集合,称程序包说明。
下述内容中只要是通用的全局量,都可以在程序包中加以说明。
对象(常量、变量、信号)的数据类型说明
对象(常量、变量、信号)子类型的数值范围说明
函数与过程说明
元件语句说明
信号连接说明
延时常量说明
文件说明
设计者自定义的属性说明
程序包说明格式如下:
package 程序包名 is
说明语句;
end 程序包名;
程序包名:设计者自定义便于记忆的标识符
说明语句:包括各种类型的说明语句
程序包体
描述函数和过程功能的函数体与过程等的集合称程序包体
程序包说明中,定义了数据类型和子程序中的函数、过程说明,而程序包体中才具体地描述该函数、过程功能的语句和数据的赋值。
程序包体格式:
package body 程序包名 is
顺序语句;
end 程序包名;
程序包名:与程序包说明中的程序包名相同
顺序语句:描述函数、过程及其他功能的程序流
子程序——过程
VHDL中,所谓子程序指主程序调用它后能将处理结果返回主程序的程序模块。
VHDL语言中,子程序有两种类型,过程(procedure)和函数(function)。
他们的区别:
1、过程可具有多个返回值,而函数只能有一个
2、过程通常用来定义一个算法,而函数往往用来产生一个特定的值
3、过程中的参数可具有3种端口模式:in、out、inout,而函数中的参数只能具有一直端口模式:in
过程的书写结构
对于VHDL子程序来说,它通常包括子程序说明部分和子程序定义部分。
其中,子程序说明部分定义了其他设计调用子程序的接口;子程序定义部分则描述该子程序具体功能的实现。
因此,通常将子程序说明部分和子程序定义部分的书写结构分别介绍
在VHDL中,过程说明部分的书写结构:
procedure:过程名
(对象类型1 参数名1: 端口模式1 数据类型1;
对象类型2 参数名2: 端口模式2 数据类型2;......);
过程说明部分以保留字“procedure”开始,紧跟着的是过程名;然后是过程的参数列表。参数列表中的每个参数包括它的对象类型、参数名、端口模式及数据类型,其中对象类型、端口模式是可选项。
在VHDL语言中,过程定义部分
procedure 过程名
(对象类型1 参数名1: 端口模式1 数据类型1;
对象类型2 参数名2: 端口模式2 数据类型2;......)is
过程说明部分;
begin
过程顺序语句部分;
end 过程名;
可以看出,过程定义部分仍以保留字“procedure”开始,紧跟其后的是过程名;接下来是过程参数列表;然后以保留字“is”开始过程的说明部分,它主要是对过程中要用到的变量、常量和数据类型进行说明,并且说明只对该过程可见;接下来是以保留字“begin”开始的顺序语句部分,用来描述过程的具体功能;最后以“end”结尾。
参数列表中:每个参数包括它的对象类型、参数名、端口模式以及数据类型
参数的对象类型包括:常量、信号、变量
参数名是用来表示参数的唯一标识
端口模式:包括in、out、inout
若过程中没有指明参数的对象类型,那么参数的对象类型将默认为一个变量
过程定义在程序包中的定义规则为:过程说明部分书写在程序包的说明部分,过程定义部分书写在程序包体部分
过程定义在结构体中:即将过程定义部分书写在结构体的说明部分,然后在结构体进程语句里调用
函数
函数包括:函数说明部分和函数定义部分
函数说明部分定义了主程序调用函数的接口
函数定义部分描述了该函数具体逻辑功能的实现
函数的书写结构
function 函数名
(对象类型1 参数名1; in 数据类型1;
对象类型2 参数名2; in 数据类型2;......) return 数据类型;其中对象类型和端口模式in是可选项
函数定义部分书写结构
function 函数名
(对象类型1 参数名1; in 数据类型1;
对象类型2 参数名2; in 数据类型2;......) return 数据类型 is
函数说明部分:
begin
函数顺序语句部分;
return(参数值);
end 函数名;函数参数的对象类型只能包括常量和信号:参数的端口模式只能是in,因此参数端口模式可以省略。
函数的返回值只能有一个。
函数定义在程序包中:函数说明部分书写在程序包说明部分,函数定义部分书写在程序包体部分。如果需要使用程序包中定义的函数,那么只需要通过use语句使其对设计实体可见。
函数定义在结构体中:只需将函数定义部分书写在结构体说明部分即可。然后在结构体中调用这个函数。