小提示:
过程可以具有多个返回值,而函数只能返回一个。 1. 过程语句
过程语句的格式为:
PROCEDURE 过程名称参数列表 --过程首 PROCEDURE 过程名称参数列表 IS --过程体 说明部分 BEGIN 顺序语句 END 过程名称; 调用过程语句的格式为: 过程名称 参数列表;
在VHDL中,过程定义由两部分组成,即过程首和过程体,在进程或结构体中过程首可 以省略,过程体放在结构体的说明部分。而在程序包中必须定义过程首,把过程首放在程序 包的包首部分,而过程体放在包体部分。
在PROCEDURE结构中,参数列表中的参数可以是输入也可以是输出,在参数表中可以 对常数、变量和信号三类数据对象作出说明,用IN、OUT和INOUT定义这些参数的端口模式,在没有特别的指定时,端口模式IN的参数默认常数,端口模式OUT和INOUT看作变量。在子程序调用时,IN和INOUT的参数传送数据至子程序,子程序调用结束返回时,OUT和INOUT的参数返回数据。
例1-4-5用一个过程语句来实现数据求和运算程序。 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY PADD IS PORT(
A, B, C : IN STD_LOGIC_VECTOR(3 DOWNTO 0); CLK, SET : IN STD_LOGIC;
D : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END PADD;
ARCHITECTURE a OF PADD IS --定义过程体
PROCEDURE ADD1 (DATAA, DATAB, DATAC : IN STD_LOGIC_VECTOR; DATAOUT : OUT STD_LOGIC_VECTOR ) IS BEGIN DATAOUT := DATAA+DATAB+DATAC; END ADD1; BEGIN
PROCESS (CLK)
VARIABLE TMP :STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN
IF (CLK'EVENT AND CLK ='1') THEN IF(SET= '1') THEN TMP:= \
ELSE
ADD1 (A, B, C, TMPTMP); --过程调用 END IF; END IF; D <= TMP; END PROCESS;
END a;
2. 函数语句
函数语句分为两个部分,函数首和函数体。 (1)函数首的格式为:
FUNCTION 函数名称(参数列表) RETURN 数据类型名;
(2)函数体的格式为:
FUNCTION 函数名称(参数列表) RETURN 数据类型名IS 说明部分
BEGIN 顺序语句
RETURN 返回变量
END 函数名称;
在进程或结构体中函数首可以省略,而在程序包中必须定义函数首,放在程序包的包首 部分,而函数体放在包体部分。
函数语句中参数列表列出的参数都是输入参数,在参数表中可以对常数、变量和信号三 类数据对象作出说明,默认的端口模式是IN,在函数语句中如果参数没有定义数据类型就 看作常数处理。调用函数语句的返回数据和返回数据的数据类型分别是由RETURN后的返 回变量和返回变量的数据类型决定的。 调用函数语句的格式为:
Y<= 函数名称(参数列表); 小提示:
子程序相当于C语言的自定义函数(函数相当于有返回值的函数,过程相当有输出参数 的函数),可以在结构体的进程中进行直接调用,使语句更加简洁明了。但是也有区别: VHDL中每调用一次子程序就相当于生成了一个相应的电路模块,所以不能无限制调用 子程序,而是要严格控制调用次数。 1.4.5 程序包的设计
在VHDL中,为了使已定义的数据类型、子程序和元件等被其他设计程序所利用,用户 可以自己设计一个程序包,将它们收集在程序包中。程序包分为两个部分,即包首和包体 两个部分,结构为: (1)包首部分
PACKAGE 程序包名称 IS 包首说明
END 程序包名称;
(2)包体部分
PACKAGE BODY 程序包名称 IS 包体说明语句
END 程序包名称;
包首说明部分定义数据类型、元件和子程序等。包体说明语句部分具体描述元件和子程 序的内容。在程序包结构中,程序包体不是必需的,因为在程序包首也可以具体定义元件和 子程序的内容。
在例1-4-6中,定义一个MAX函数在程序包文件bf1.VHD中,在smax.VHD程序中用函数 调用的方式直接调用包中的内容。
例1-4-6用FUNCTION语句描述在两个数中找出最大值,并用函数调用方式求出最大值。 这段程序放在一个程序包(PACKAGE)中。
(1)在程序包名称为BF1的程序包中定义函数名称为MAX1的函数,程序包文件名为 bf1.VHD,放在当前的WORK库中。
LIBRARYIEEE;
USE IEEE.STD_LOGIC_1164.ALL;
PACKAGE BF1 IS --定义程序包的包头,BF1是程序包名称
FUNCTION MAX1(A : STD_LOGIC_VECTOR; --定义函数首,函数名称是MAX B : STD_LOGIC_VECTOR)
RETURN STD_LOGIC_VECTOR; --定义函数返回值的类型 END BF1;
PACKAGE BODY BF1 IS --定义程序包体
FUNCTION MAX1 (A: STD_LOGIC_VECTOR; --定义函数体 B : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR IS
VARIABLE TMP : STD_LOGIC_VECTOR (A.RANGE);
--属性A.RANGE表示A的数组范围, 该例中A.RANGE=3 DOWNTO 0 BEGIN
IF (A>B) THEN TMP:=A; ELSE
TMP:=B; END IF;
RETURN TMP; --TMP是函数返回变量
END MAX1; END BF1;
(2)调用函数MAX1的程序,文件名是SMAX.VHD LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
LIBRARY WORK; --用户当前工作库,可以不列出 USE WORK.BF1.ALL; ENTITY SMAX IS PORT(
D1, DA, DB : IN STD_LOGIC_VECTOR(3 DOWNTO 0); CLK, SET : IN STD_LOGIC;
Do : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );
END SMAX;
ARCHITECTURE a OF SMAX IS BEGIN
PROCESS (CLK) BEGIN
IF (CLK.EVENT AND CLK =.1.) THEN IF(SET= .1.) THEN --SET=1,同步置数 DO <= D1;
ELSE
DO <= MAX1(DA, DB); --调用MAX1函数 END IF; END IF;
END PROCESS; END a; 小提示:
程序包是由VHDL语言编写的,所以其源程序要以XXX.VHD文件类型保存。若要使用 程序包中声明的内容,在设计实体的开始,要使用USE WORK.XXX.ALL打开程序包, 再调用程序包的内容;