函数(FUNCTION)和过程(PROCEDURE)统称为子程序,且两者与进程(PROCESS)的结构特征十分相似,内部包含的都是顺序描述语句,如IF,CASE和LOOP等(注意:FUNCTION和PROCEDURE中不允许使用WAIT语句)。
从应用的角度来说,它们的目的都是储存常用的VHDL代码,以达到代码重用和共享的目的。但是,PROCESS是直接在主代码中使用,而FUNCTION或PROCEDURE是为了建库而使用。
11.1 函数
一个函数(FUNCTION)就是一段顺序描述的代码。而且,在函数中禁止使用WAIT语句、进行信号的声明和元件实例化。
- 函数体
function function_name[(
parameter_list1; --输入参数
parameter_list2;
...
parameter_listN)]
return data_type is
[声明]
begin
(顺序描述代码)
end function_name;
parameter_list格式:[CONSTANT] 常量名:data_type;(关键字CONSTANT可以省略)
SIGNAL 信号名:data_type;
函数的输入参数(parameter_list)可以是常量(省略即默认)或信号,但不能是变量,且参数的个数可以是任意的,甚至可以不包含参数。参数的类型(data_type)可以是任意一种可综合的数据类型(布尔、标准逻辑、整数等),但不能指定取值范围。
另外,函数只有一个返回值,这个返回值的类型由RETURN后面的数据类型指定。
- 函数的调用
函数可以单独构成表达式,也可以作为表达式的一部分被调用。
--例:positive_edge()函数
--------------------函数体:------------------
function positive_edge(
signal s: std_logic
)
return boolean is
begin
return(s'event and s = '1');
end positive_edge;
-------------------函数调用:-----------------
...
if positive_edge(clk) then...
...
---------------------------------------------
- 函数的存放
函数及过程的典型存放位置如下图所示。注意,当函数被存放在PACKAGE中时,必须在PACKAGE BODY中进行函数的代码描述。
11.2 过程
过程与函数类似,主要差别在于过程可以具有多个返回值。
- 过程的定义
procedure 过程名[(
参数列表 --输入和输出参数
)] is
[声明]
begin
(顺序描述语句)
end 过程名;
parameter_list格式:(包含输入输出参数)
[constant] 常量名: 模式类型;
signal 信号名: 模式类型;
variable 变量名: 模式类型;
其中,模式类型可以是:in,out或inout。而且,对于输入模式(in)的参数,默认为常量;对于输出模式(out或inout)的参数,默认为变量。
另外,过程与函数类似,都禁止使用WAIT语句、进行信号的声明和元件实例化。但如果一个过程(PROCEDURE)在一个进程(PROCESS)中进行了声明,那么其内部可以声明信号。
此外,除了WAIT语句以外的任何边沿检测在过程中都是不可综合的。(即,与函数相比较,一个可综合的过程内部不能包含或隐含寄存器。)
- 过程的调用
函数的调用相当于一个表达式的一部分,而过程的调用相当于一个表达式或执行语句。
- 过程的存放
过程代码的存放位置与函数类似。
11.3 函数与过程小结
函数(FUNCTION) | 过程(PROCEDURE) | ||
输入参数 | 任意个,常量(默认)或信号。 | 输入模式(IN)的参数,默认为常量。 | 多个输入、输出或双向参数,可以是信号、变量或常量。 |
输出参数 | 1个返回值。 | 输出模式(OUT或INOUT)的参数,默认为变量。 | |
存放位置 | PACKAGE(PACKAGE BODY中存放函数或过程的功能描述代码)、主代码(ENTITY或ARCHITECTURE中) | ||
调用 | 表达式的一部分 | 表达式或执行语句 | |
禁用(不可综合) | WAIT语句、信号声明、元件实例化 | WAIT语句、信号声明、元件实例化、任何边沿检测 | 如果一个过程在一个PROCESS中进行了声明,其内部可以声明信号。 |
11.4 断言(ASSERT)语句
ASSERT语句是不可综合的(不会消耗硬件资源),它的作用是将仿真过程中发现的问题通过屏幕显示等方法指出来。
其语法格式如下:
assert condition
[report "message"]
[severity severity_level]
严重程度的等级可以划分为:注意(Note)、警告(Warning)、错误(Error)和失败(Failure),其中“错误”是默认的。当判断条件(condition)值为假(FALSE)时,就会显示message。