7.子程序:过程和函数
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 过程体: 过程体:
Procedure <过程名 参数表 is 过程名>(参数表 过程名 参数表) 说明部分; 说明部分 Begin 顺序语句; 顺序语句; [return;] --与c语言不一样 ; 与 语言不一样 End procedure 过程名; 过程名;
• 过程体用于具体描述过程的功能,可放在 过程体用于具体描述过程的功能, package体中 体中 • Return语句为可选项,用于提前结束进程 语句为可选项, 语句为可选项 如果没有return,则执行完所有语句。 体。如果没有 ,则执行完所有语句。
过程调用环境的顺序与并行
• 在顺序语句中调用过程语句
– 顺序执行 – 可视为一条复合语句
• 在并行语句中调用过程语句
– 整体与其他语句并行执行 – 由in或inout类型的参数触发,执行调用 类型的参数触发, 或 类型的参数触发
过程的复用(重载) 过程的复用(重载)
• 重载:具有不同参数数目或不同数据 重载: 类型的同名过程,称重载过程。 类型的同名过程,称重载过程。
函数的调用
直接以函数名(实参表 作为表达式使用 直接以函数名 实参表)作为表达式使用 实参表 Use work.packexp.all; …. Architecture … begin out1<=max(dat1,dat2); process(dat3,dat4) begin out2<= max(dat3,dat4); end process End;
– – – – P(val1,val2,val3,val4); P(a=>val1,b => val2,c => val3,d => val4); P(val1,val2, c => open,val4); P(val1,val2, ,val4);
• 函数的调用情况类似
• 过程说明: 过程说明: Procedure 过程名 (参数表 参数表); 参数表
– 过程名:标识符 过程名: – 参数表:形式参数及其端口类型和数据类型。 参数表:形式参数及其端口类型和数据类型。 – 若端口类型为in,而未说明常量还是变量,默 若端口类型为 ,而未说明常量还是变量, 认为常量 – 若端口类型为inout或out,默认为变量 若端口类型为 或 , – 若参数是信号,需特别说明。 若参数是信号,需特别说明。 如:procedure and2(signal a,b: in std_logic signal c: out std_logic);
四输入与非门过程描述: 四输入与非门过程描述: Package a_pack is procedure NAnd(signal a,b,c,d: in std_logic; signal y: out std_logic; constant delay :in time); end pack; …… Package body a_pack is procedure NAnd(signal a,b,c,d: in std_logic; signal y: out std_logic; constant delay :in time) is begin y<=not(a and b and c and d) after delay; return; --可选项 可选项 End NAnd; End a_pack;
过程调用
• 先定义后使用 • 调用: 调用: 过程名(参数表 参数表); 过程名 参数表
例:调用四输入与非门1 调用四输入与非门 Library IEEE; use ieee.std_logic_1164.all; use work a_pack.all; --work为当前库 为当前库 signal a: std_logic:=1; 相当于执行以下程序: 相当于执行以下程序: signal b: std_logic:=0; signal c: std_logic:=1; Y<=‘1’ after 10ns; ; signal d: std_logic:=0; 注意实参与形参的一致 signal y: std_logic; constant delay:time:=10ns; …… nand(a,b,c,d,y,delay);
函数 过程
过程语句 procedure
• 子程序的一种 • 目的: 目的:
– 把复杂的进程分块 – 把可复用的行为单独描述供调用
• 包括过程说明பைடு நூலகம்过程体
– 过程说明(外观),放在包的说明部分,便 过程说明(外观),放在包的说明部分, ),放在包的说明部分 于外部调用 – 过程体,具体描述过程的功能,可放在包、 过程体,具体描述过程的功能,可放在包、 进程和结构体中
函数的重载
• 函数名相同,形参数据类型不同 函数名相同,形参数据类型不同 数据类型 • 方便使用同一函数名定义多个相似功能 的函数 • 与过程的重载相似,参考课本 与过程的重载相似,参考课本P178程序 程序
过程与函数调用时的参数映射
Procedure p(a:in integer; b:in std_logic; c,d:out std_logic)… • 调用 时可以有如下形式: 调用p时可以有如下形式 时可以有如下形式:
函数的格式
• 函数说明: 函数说明:
function 函数名 (形参表 return 数据类型; 形参表) 数据类型; 形参表
• 函数体: 函数体:
function 函数名 (形参表 return 数据类型 is 形参表) 形参表 说明部分; 说明部分 Begin 顺序语句; 顺序语句; return; ; End function 函数名; 函数名; • 函数名可以是标识符或“运算符”(运算符重载,给运算符 函数名可以是标识符或“运算符” 运算符重载, 以新的定义) 以新的定义) • 函数的参数都是输入值,不必指定端口方向 函数的参数都是输入值, 函数
函数
• • • • 能和运算符一起参加运算的广义表达式 用顺序语句实现 先定义后调用 包括函数说明和函数体
– 函数说明(外观),放在包的说明部分,便于 函数说明(外观),放在包的说明部分, ),放在包的说明部分 外部调用 – 函数体,具体描述过程的功能,放在包、进程 函数体,具体描述过程的功能,放在包、 和结构体中
– 与oop中的重载类似。 中的重载类似。 中的重载类似 – Vhdl数据类型很难混用,故不同数据类 数据类型很难混用, 数据类型很难混用 型的复用很少, 型的复用很少,多为不同参数数目的过 程复用。 程复用。
– 例:3-8位译码器与 -3位编码器的过程描述和 位译码器与8- 位编码器的过程描述和 - 位译码器与 复用 描述程序
构造体的行为描述: 构造体的行为描述: 子程序
子程序: 子程序:代码的复用
• 实现重复出现的硬件结构,节省代码 实现重复出现的硬件结构, • 子程序用顺序语句编写
– 过程 – 函数
• 过程通过参数表与外界交换数据 • 函数通过参数接收外部数据,通过返回 函数通过参数接收外部数据, 值向外部反馈数据
Function max(a,b: std_logic_vector) Return std_logic_vector is begin if a>b then return a; else return b; 如果调用函数的进程 end if; 含有敏感信号表, 含有敏感信号表,函 end function max; 数中就不能使用wait 数中就不能使用 End;
调用
译码器的调用: 译码器的调用: dec_enc(“101”,’1’,’0’,’0’,bit8); Y<= bit8; ; 调用上述过程,把位矢量“ 调用上述过程,把位矢量“11011111”由 由 bit8传递给输出 。 传递给输出y。 传递给输出 编码器调用: 编码器调用: dec_enc(“11011111”,bit3); Y<= bit3; ; 把矢量“ 赋给输出Y。 把矢量“101”由bit3赋给输出 。 由 赋给输出
函 数 声 明 与 定
Package packexp is
Function max(a,b: std_logic_vector) Return std_logic_vector; Function “*”(a,b: integer) Return integer; End;
义 Package body packexp is