第11章 函数和过程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6 • VHDL Hardware Description Language Microelectronic Lab, Beijing Institute of Technology
11.2 函数的存放
PACKAGE (+PACKAGE BODY)
LIBRARY
FUNCTION/ PROCEDURE的位置 主代码
<parameter list> = [CONSTANT] 常量名:常量类型; <parameter list> = SIGNAL 信号名:信号类型;
1 • VHDL Hardware Description Language
Microelectronic Lab, Beijing Institute of Technology
13 • VHDL Hardware Description Language Microelectronic Lab, Beijing Institute of Technology
过程调用
♦ compute_min_max (in1,in2,in3,out1,out2); --直接进行过程调用 ♦ divide(dividend,divisor,quotient,remiander); --直接进行过程调用 ♦ IF (a>b) THEN compute_min_max(in1,in2,in3,out1out2); --在其他语句中进行过程调用
3 • VHDL Hardware Description Language
Microelectronic Lab, Beijing Institute of Technology
函数调用
♦ x <= conv_integer(a); -- 将a转换为整型 -- 函数自身构成表达式 ♦ y <= maximum(a,b); -- 返回a和b中较大的一个 -- 函数自身构成表达式 ♦ IF x>maximum(a,b) … -- 将x与a和b中较大的一个进行比较 --函数作为表达式的一个组成部分
PROCEDURE 过程名 [<参数列表>] IS [声明] BEGIN (顺序描述代码) END 过程名;
<parameter list> = [CONSTANT] 常量名:模式类型; <parameter list> = SIGNAL 信号名:模式类型; <parameter list> =VARIABLE变量名:模式类型;
11.1 函数
♦ 为了构建和使用函数,需要进行两个必要的步骤: 函数本身的创建和函数调用。 ♦ 函数体
FUNCTION function_name [<parameter list>] RETURN data type IS [声明] BEGIN (顺序描述代码) END function_name;
函数调用
1. 函数调用语句不具有独立的行为表现形式,它在 VHDL程序中不是一个完整的描述语句,而只是应 用在赋值语句或者表达式中。 2. 与过程调用语句相似,函数调用语句一般也省略参 数的对象类型和端口模式,因此函数调用语句中也 只含有实际参数名称。 3. 函数调用语句中只具有一个返回值,这与过程的多 返回值是完全不同的。
8 • VHDL Hardware Description Language Microelectronic Lab, Beijing Institute of Technology
例子: 函数在包集中定义
--------------------Package: ----------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; ---------------------------------------------------------------------PACKAGE my_package IS FUNCTION positive_edge(SIGNAL s: STD_LOGIC)RETURN BOOLEAN; END my_package; ---------------------------------------------------------------------PACKAGE BODY my_package IS FUNCTION positive_edge (SIGNAL s: STD_LOGIC) RETURN BOOLEAN IS BEGIN RETURN s'EVENT AND S = '1'; END positive_edge; END my_package; ---------------------------------------------------------------------
10 • VHDL Hardware Description Language Microelectronic Lab, Beijing Institute of Technology
11.3过程
♦ 过程可以具有多个返回值。但是函数只能具有一个 返回值 ♦ 过程的定义和使用包括两个部分:过程本身的定义 和过程调用。
11 • VHDL Hardware Description Language
Microelectronic Lab, Beijing Institute of Technology
例子:
PROCEDURE my_procedure ( a:IN BIT; SIGNAL b, c:IN BIT; SIGNAL x:OUT BIT_VECTOR(7 DOWNTO 0); SIGNAL y:INOUT INTEGER RANGE 0 TO 99) IS BEGIN … END my_procedure;
5 • VHDL Hardware Description Language Microelectronic Lab, Beijing Institute of Technology
conv_integer()函数
--------------------------------------函数-------------------------------------------FUNCTION conv_integer(SIGNAL vector: STD_LOGIC_VECTOR) RETURN INTEGER IS VARIABLE result: INTEGER RANGE 0 TO 2 **vector’ LENGTH-1; BEGIN IF(vector(vector’HIGH) = ‘1’) THEN result :=1; ELSE result :=0; END IF; FOR i IN(vector’HIGH-1) DOWNTO (vector’LOW)LOOP result := result*2; IF (vector(i) = ‘1’) THEN result:=result + 1; END IF; END LOOP; RETURN result; END conv_integer; ---------------------------------------函数调用----------------------------…… y <= conv_integer(a); ……
FUNCTION f1(a,b:INTEGER;SIGNAL c: STD_LOGIC_VECTOR) RETURN BOOLEAN IS BEGIN (顺序描述代码) END f1;
2 • VHDL Hardware Description Language
Microelectronic Lab, Beijing Institute of Technology
ARCHITECTURE (声明部分)
ENTITY
7 • VHDL Hardware Description Language
Microelectronic Lab, Beijing Institute of Technology
例子:函数在主代码中定义
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY dff IS PORT (d,clk,rst: IN STD_LOGIC; q: OUT STD_LOGIC); END dff; ARCHITECTURE my_arch OF dff IS FUNCTION positive_edge (SIGNAL s: STD_LOGIC) RETURN BOOLEAN IS BEGIN RETURN s'EVENT AND S = '1'; END positive_edge; BEGIN PROCESS (clk,rst) BEGIN IF ( rst = '1') THEN q <= '0'; ELSIF positive_edge(clk) THEN q <= d; END IF; END PROCESS; END my_arch;
12 • VHDL Hardware Description Language
Microelectronic Lab, Beijing Institute of Technology
过程调用:
♦ 过程作为子程序被主程序调用 1. 过程调用语句具有独立的行为表现形式,它在 VHDL程序中是一个完整的描述语句,而且它ຫໍສະໝຸດ Baidu前 面可以添加标号。 2. 过程调用语句中一般省略参数的对象类型、端口模 式和数据类型,可见过程调用语句中通常只含有参 数名称。 3. 过程调用语句允许具有多个返回值,这些返回值是 通过过程中定义的输出参数来带出过程调用语句的 。
4 • VHDL Hardware Description Language
Microelectronic Lab, Beijing Institute of Technology
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…… ……
9 • VHDL Hardware Description Language
Microelectronic Lab, Beijing Institute of Technology
---------------------Main code: ----------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; USE work.my_package.all; ---------------------------------------------------------------------ENTITY dff IS PORT (d,clk,rst: IN STD_LOGIC; q: OUT STD_LOGIC); END dff; ---------------------------------------------------------------------ARCHITECTURE my_arch OF dff IS BEGIN PROCESS (clk,rst) BEGIN IF ( rst = '1') THEN q <= '0'; ELSIF positive_edge(clk) THEN q <= d; END IF; END PROCESS; END my_arch;
11.2 函数的存放
PACKAGE (+PACKAGE BODY)
LIBRARY
FUNCTION/ PROCEDURE的位置 主代码
<parameter list> = [CONSTANT] 常量名:常量类型; <parameter list> = SIGNAL 信号名:信号类型;
1 • VHDL Hardware Description Language
Microelectronic Lab, Beijing Institute of Technology
13 • VHDL Hardware Description Language Microelectronic Lab, Beijing Institute of Technology
过程调用
♦ compute_min_max (in1,in2,in3,out1,out2); --直接进行过程调用 ♦ divide(dividend,divisor,quotient,remiander); --直接进行过程调用 ♦ IF (a>b) THEN compute_min_max(in1,in2,in3,out1out2); --在其他语句中进行过程调用
3 • VHDL Hardware Description Language
Microelectronic Lab, Beijing Institute of Technology
函数调用
♦ x <= conv_integer(a); -- 将a转换为整型 -- 函数自身构成表达式 ♦ y <= maximum(a,b); -- 返回a和b中较大的一个 -- 函数自身构成表达式 ♦ IF x>maximum(a,b) … -- 将x与a和b中较大的一个进行比较 --函数作为表达式的一个组成部分
PROCEDURE 过程名 [<参数列表>] IS [声明] BEGIN (顺序描述代码) END 过程名;
<parameter list> = [CONSTANT] 常量名:模式类型; <parameter list> = SIGNAL 信号名:模式类型; <parameter list> =VARIABLE变量名:模式类型;
11.1 函数
♦ 为了构建和使用函数,需要进行两个必要的步骤: 函数本身的创建和函数调用。 ♦ 函数体
FUNCTION function_name [<parameter list>] RETURN data type IS [声明] BEGIN (顺序描述代码) END function_name;
函数调用
1. 函数调用语句不具有独立的行为表现形式,它在 VHDL程序中不是一个完整的描述语句,而只是应 用在赋值语句或者表达式中。 2. 与过程调用语句相似,函数调用语句一般也省略参 数的对象类型和端口模式,因此函数调用语句中也 只含有实际参数名称。 3. 函数调用语句中只具有一个返回值,这与过程的多 返回值是完全不同的。
8 • VHDL Hardware Description Language Microelectronic Lab, Beijing Institute of Technology
例子: 函数在包集中定义
--------------------Package: ----------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; ---------------------------------------------------------------------PACKAGE my_package IS FUNCTION positive_edge(SIGNAL s: STD_LOGIC)RETURN BOOLEAN; END my_package; ---------------------------------------------------------------------PACKAGE BODY my_package IS FUNCTION positive_edge (SIGNAL s: STD_LOGIC) RETURN BOOLEAN IS BEGIN RETURN s'EVENT AND S = '1'; END positive_edge; END my_package; ---------------------------------------------------------------------
10 • VHDL Hardware Description Language Microelectronic Lab, Beijing Institute of Technology
11.3过程
♦ 过程可以具有多个返回值。但是函数只能具有一个 返回值 ♦ 过程的定义和使用包括两个部分:过程本身的定义 和过程调用。
11 • VHDL Hardware Description Language
Microelectronic Lab, Beijing Institute of Technology
例子:
PROCEDURE my_procedure ( a:IN BIT; SIGNAL b, c:IN BIT; SIGNAL x:OUT BIT_VECTOR(7 DOWNTO 0); SIGNAL y:INOUT INTEGER RANGE 0 TO 99) IS BEGIN … END my_procedure;
5 • VHDL Hardware Description Language Microelectronic Lab, Beijing Institute of Technology
conv_integer()函数
--------------------------------------函数-------------------------------------------FUNCTION conv_integer(SIGNAL vector: STD_LOGIC_VECTOR) RETURN INTEGER IS VARIABLE result: INTEGER RANGE 0 TO 2 **vector’ LENGTH-1; BEGIN IF(vector(vector’HIGH) = ‘1’) THEN result :=1; ELSE result :=0; END IF; FOR i IN(vector’HIGH-1) DOWNTO (vector’LOW)LOOP result := result*2; IF (vector(i) = ‘1’) THEN result:=result + 1; END IF; END LOOP; RETURN result; END conv_integer; ---------------------------------------函数调用----------------------------…… y <= conv_integer(a); ……
FUNCTION f1(a,b:INTEGER;SIGNAL c: STD_LOGIC_VECTOR) RETURN BOOLEAN IS BEGIN (顺序描述代码) END f1;
2 • VHDL Hardware Description Language
Microelectronic Lab, Beijing Institute of Technology
ARCHITECTURE (声明部分)
ENTITY
7 • VHDL Hardware Description Language
Microelectronic Lab, Beijing Institute of Technology
例子:函数在主代码中定义
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY dff IS PORT (d,clk,rst: IN STD_LOGIC; q: OUT STD_LOGIC); END dff; ARCHITECTURE my_arch OF dff IS FUNCTION positive_edge (SIGNAL s: STD_LOGIC) RETURN BOOLEAN IS BEGIN RETURN s'EVENT AND S = '1'; END positive_edge; BEGIN PROCESS (clk,rst) BEGIN IF ( rst = '1') THEN q <= '0'; ELSIF positive_edge(clk) THEN q <= d; END IF; END PROCESS; END my_arch;
12 • VHDL Hardware Description Language
Microelectronic Lab, Beijing Institute of Technology
过程调用:
♦ 过程作为子程序被主程序调用 1. 过程调用语句具有独立的行为表现形式,它在 VHDL程序中是一个完整的描述语句,而且它ຫໍສະໝຸດ Baidu前 面可以添加标号。 2. 过程调用语句中一般省略参数的对象类型、端口模 式和数据类型,可见过程调用语句中通常只含有参 数名称。 3. 过程调用语句允许具有多个返回值,这些返回值是 通过过程中定义的输出参数来带出过程调用语句的 。
4 • VHDL Hardware Description Language
Microelectronic Lab, Beijing Institute of Technology
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…… ……
9 • VHDL Hardware Description Language
Microelectronic Lab, Beijing Institute of Technology
---------------------Main code: ----------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; USE work.my_package.all; ---------------------------------------------------------------------ENTITY dff IS PORT (d,clk,rst: IN STD_LOGIC; q: OUT STD_LOGIC); END dff; ---------------------------------------------------------------------ARCHITECTURE my_arch OF dff IS BEGIN PROCESS (clk,rst) BEGIN IF ( rst = '1') THEN q <= '0'; ELSIF positive_edge(clk) THEN q <= d; END IF; END PROCESS; END my_arch;