function函数 在赋值类语句中,经常引用函数来表达常用的运算 function的结构主要由参量表、说明部分和顺序执行部分构 成,具体结构形式如下P276表4-35 function function-name( signal-list) return return-type is declarations and definitions: begin sequential-statement; sequential-statement nd function-name function结构要点 1函数可以看作是一种多输入/单输出的电路模块 2函数信号表中带有若干形式参量,在调用时由实际信号取 代,实现主程序向函数的输入:在函数内部,信号被作为常 量对待; 3函数应用时,为了返回函数值,可在函数体中设置变量 在函数执行过程中为该变量赋值:然后用 return语句将该变量 返回(赋值给函数名);该变量应与规定的返回类型一致;函 数定义中可以设置多个返回语句,但在一次调用中,只有 个返回语句带回函数值 4函数内部可以定义局部使用的类型、常量、变量、函数
function 函数 在赋值类语句中,经常引用函数来表达常用的运算; function 的结构主要由参量表、说明部分和顺序执行部分构 成,具体结构形式如下 P.276 表 4-35: function function-name ( signal-list) return return-type is declarations and definitions; begin sequential-statement; …… sequential-statement; end function-name; function 结构要点: 1 函数可以看作是一种多输入/单输出的电路模块; 2 函数信号表中带有若干形式参量,在调用时由实际信号取 代,实现主程序向函数的输入;在函数内部,信号被作为常 量对待; 3 函数应用时,为了返回函数值,可在函数体中设置变量, 在函数执行过程中为该变量赋值;然后用 return 语句将该变量 返回(赋值给函数名);该变量应与规定的返回类型一致;函 数定义中可以设置多个返回语句,但在一次调用中,只有一 个返回语句带回函数值; 4 函数内部可以定义局部使用的类型、常量、变量、函数
过程;但不能定义信号 5函数的可执行部分由顺序语句构成:不包含信号赋值语句 6函数通常在赋值语句的表达式中调用,函数返回类型应与 该表达式类型一致 例用函数表达三输入端与门a·b·C library ieee td logic 1164. all entity kdec38 is port(x, y, Z: in std logic, f: out std logic vector(7 downto O)) end kdec38 architecture d of kdec 8 is function kand(a, b, c: std logic)return std logic is variable result: std logic result, a and b and c return result: end kand f(O)<=kand not z) f(I)<=kand(not x, not y, z) f(2)<=kand(not y, not z); f(3)<=kand(not x, y, z); f(4)<=kand(x, not y, not z) f(5)<=kand(x, not y, z) f(6)<=kand(x, y, not z); f(7)<=kand(x, y, z)
过程;但不能定义信号; 5 函数的可执行部分由顺序语句构成;不包含信号赋值语句; 6 函数通常在赋值语句的表达式中调用,函数返回类型应与 该表达式类型一致; 例. 用函数表达三输入端与门 ⋅ ⋅cba library ieee; use ieee.std_logic_1164.all; entity kdec38 is port (x,y,z: in std_logic; f: out std_logic_vector (7 downto 0)); end kdec38; architecture d of kdec38 is function kand3 (a,b,c:std_logic) return std_logic is variable result: std_logic; begin result:= a and b and c; return result; end kand3; begin f(0)<=kand3(not x,not y,not z); f(1)<=kand3(not x,not y, z); f(2)<=kand3(not x, y,not z); f(3)<=kand3(not x, y, z); f(4)<=kand3( x,not y,not z); f(5)<=kand3( x,not y, z); f(6)<=kand3( x, y,not z); f(7)<=kand3( x, y, z); end d;
其他示例:P277表436A·B的函数表达 P279表4-38数据类型转换 数据流设计特点 不讨论具体逻辑电路图(元件),只针对逻辑表达式进行 设计;设计思想比较抽象,灵活性大(不需要依赖基本元件), 方便于进行基本组合逻辑关系的设计; 赋值语句的每一句通常被综合为一个多输入单输出的电 路模块;在设计中应适当考虑赋值表达式的复杂程度,避免 引入过多的信号点 进程语句:行为描述方式 以电路功能块为基础,直接考虑信号流程或状态变化过程 电路功能块采用进程表达,通过信号进行功能块之间的交流 行为描述方式的结构体形式 Architecture b of实体名is 类型说明;常量说明;信号说明; 函数定义;过程定义 各类进程;(每个进程可作为一条并行语句,表达 一个电路功能块)
其他示例:P.277 表 4-36 A⋅ B 的函数表达 P.279 表 4-38 数据类型转换 数据流设计特点: 不讨论具体逻辑电路图(元件),只针对逻辑表达式进行 设计;设计思想比较抽象,灵活性大(不需要依赖基本元件), 方便于进行基本组合逻辑关系的设计; 赋值语句的每一句通常被综合为一个多输入单输出的电 路模块;在设计中应适当考虑赋值表达式的复杂程度,避免 引入过多的信号点; 进程语句: 行为描述方式 以电路功能块为基础,直接考虑信号流程或状态变化过程 电路功能块采用进程表达,通过信号进行功能块之间的交流; 行为描述方式的结构体形式 Architecture b of 实体名 is 类型说明;常量说明;信号说明; 函数定义;过程定义; begin 各类进程; (每个进程可作为一条并行语句,表达 一个电路功能块)
end be 进程的结构形式:p.289表455 进程名: process(信号名,…信号名)(敏感量表) 类型、变量、常量、函数、过程的声明或定义 顺序语句; 顺序语句 end pro 进程结构要点: 1进程可以使用结构体的各种信号,在进程中可以改变这些 信号的值;这是进程与主程序交换信息的方式 2进程内不允许定义信号,但可以定义局部变量、常量、函 数等 3进程本身为结构体内的一条并行语句,其内部可执行部分 是顺序语句;进程可以进行命名(标号)以区分不同进程的 作用 4进程通常带有敏感量表(信号名列表),当表中任一信号值 发生变化时,进程就从头到尾执行一次;若不带敏感量表 则进程在仿真零点执行; 5在进程中,变量赋值立即进行,信号赋值在该次进程结束 时进行
end b; 进程的结构形式:p.289 表 4-55 进程名: process(信号名,….信号名) (敏感量表) 类型、变量、常量、函数、过程的声明或定义 begin 顺序语句; ….. 顺序语句; end process; 进程结构要点: 1 进程可以使用结构体的各种信号,在进程中可以改变这些 信号的值;这是进程与主程序交换信息的方式; 2 进程内不允许定义信号,但可以定义局部变量、常量、函 数等; 3 进程本身为结构体内的一条并行语句,其内部可执行部分 是顺序语句;进程可以进行命名(标号)以区分不同进程的 作用; 4 进程通常带有敏感量表(信号名列表),当表中任一信号值 发生变化时,进程就从头到尾执行一次;若不带敏感量表, 则进程在仿真零点执行; 5 在进程中,变量赋值立即进行,信号赋值在该次进程结束 时进行;
6若进程的执行导致进程内部变量或信号的任何变化,进程 将立即再次执行;当进程的的执行不再导致进程内部量发生 任何变化时,进程将停止执行,此时进程功能块处于稳定状 态;进程的编写应确保进程在任何时刻能够在有限次变化之 后进入稳定状态。 进程的物理模型 进程为结构体的子结构,可以相当于一个抽象的电路功 能块,其输入信号为其敏感量表所列信号,输出信号可以是 在进程中赋值的任何信号:使用进程可以方便地表达电路的 各部分相互影响 进程的内部构造类似于电路(信号)流程框图,程序的 执行按顺序进行,简单功能框用代入语句、分支语句、循环 语句表达,复杂的功能框采用过程语句表达。 进程中典型的顺序语句 顺序赋值语句 信号赋值语句(形式与并行代入语句相同) 信号名<=表达式 变量赋值语句 变量名:=表达式 要点: 信号赋值语句在进程末尾执行或出现wait语句时执彳
6 若进程的执行导致进程内部变量或信号的任何变化,进程 将立即再次执行;当进程的的执行不再导致进程内部量发生 任何变化时,进程将停止执行,此时进程功能块处于稳定状 态;进程的编写应确保进程在任何时刻能够在有限次变化之 后进入稳定状态。 进程的物理模型 进程为结构体的子结构,可以相当于一个抽象的电路功 能块,其输入信号为其敏感量表所列信号,输出信号可以是 在进程中赋值的任何信号;使用进程可以方便地表达电路的 各部分相互影响; 进程的内部构造类似于电路(信号)流程框图,程序的 执行按顺序进行,简单功能框用代入语句、分支语句、循环 语句表达,复杂的功能框采用过程语句表达。 进程中典型的顺序语句 顺序赋值语句 信号赋值语句 (形式与并行代入语句相同) 信号名<=表达式 变量赋值语句 变量名:= 表达式 要点: 信号赋值语句在进程末尾执行或出现 wait 语句时执行;
变量赋值语句立即执行 条件赋值语句和选择赋值语句不属于顺序语句; 赋值语句在表达式中可以利用函数进行运算 例:2-4译码器的进程描述 library ieee use ieee std logic 1164. all entity kdec24 is port(a: in std logic vector(I downto 0) f: out std logic vector(3 downto 0)); end kdec24 architecture d of kdec24 is f(O)<=not a(1)and not alo) f(1)<=not a(1)and a(0) f(3)<=a(1)anda(0) end proce 例: 表456 质数检测器的行为设计 进程采用代入(赋值)语句,可与 prime对比 use ieee std logic 1164 all entity prime is port(n: in std logic vector (3 downto 0); f: out std logic) end prime architecture beh of prime is
变量赋值语句立即执行; 条件赋值语句和选择赋值语句不属于顺序语句; 赋值语句在表达式中可以利用函数进行运算; 例:2-4 译码器的进程描述 library ieee; use ieee.std_logic_1164.all; entity kdec24 is port (a: in std_logic_vector (1 downto 0); f: out std_logic_vector (3 downto 0) ); end kdec24; architecture d of kdec24 is begin process(a) begin f(0) <= not a(1) and not a(0); f(1) <= not a(1) and a(0); f(2) <= a(1) and not a(0); f(3) <= a(1) and a(0); end process; end d; 例:p.290 表 4-56 质数检测器的行为设计 进程采用代入(赋值)语句,可与 prime 对比 library ieee; use ieee.std_logic_1164.all; entity prime6 is port (n: in std_logic_vector (3 downto 0); f: out std_logic); end prime6; architecture beh of prime6 is begin
variable n3l nO, n3l n2I nl, n2l nl n0, n2 nll n0: std logic not n(3)and n(0); n31 n2I nl: =not n(3) and not n(2)and n(l) n2I nl n0 :=not n(2)and n(1)and n(0) n2 nll no :=n(2)and not n(1)and n(0); f<= n3l n0 or n31 n2I nI or n2I nI n0 or n2 nll n0 end process it语句 等待语句用于控制进程的执行时间,当进程执行到wait 语句时,将被挂起,直到wait语句的条件满足,才继续执行 后续语句:此时进程中该语句之前的信号赋值语句得到执行 wait on信号,信号; 等待所列举信号中任何一个发生变化 所起作用与进程的敏感信号表相同,两者不能同时存在 wait until布尔表达式; 利用表达式建立隐含的敏感信号表;当任何一个涉及的 信号发生变化时,就自动检测布尔表达式是否为真;如果为 真,则执行后续语句:如果为假,则继续等待 采用上述两种wait语句可以实现信号的顺序赋值: wait for时间表达式; 等待由时间常量或变量组成的表达式所表达的时间到 达,再执行后续语句;采用本语句可以描述电路信号在处理
process(n) variable n3l_n0,n3l_n2l_n1,n2l_n1_n0 ,n2_n1l_n0:std_logic; begin n3l_n0 := not n(3) and n(0); n3l_n2l_n1 := not n(3) and not n(2) and n(1); n2l_n1_n0 := not n(2) and n(1) and n(0); n2_n1l_n0 := n(2) and not n(1) and n(0); f<= n3l_n0 or n3l_n2l_n1 or n2l_n1_n0 or n2_n1l_n0; end process; end beh; wait 语句 等待语句用于控制进程的执行时间,当进程执行到 wait 语句时,将被挂起,直到 wait 语句的条件满足,才继续执行 后续语句;此时进程中该语句之前的信号赋值语句得到执行; wait on 信号,信号; 等待所列举信号中任何一个发生变化; 所起作用与进程的敏感信号表相同,两者不能同时存在; wait until 布尔表达式; 利用表达式建立隐含的敏感信号表;当任何一个涉及的 信号发生变化时,就自动检测布尔表达式是否为真;如果为 真,则执行后续语句;如果为假,则继续等待; 采用上述两种 wait 语句可以实现信号的顺序赋值; wait for 时间表达式; 等待由时间常量或变量组成的表达式所表达的时间到 达,再执行后续语句;采用本语句可以描述电路信号在处理
或传输中发生的延时; 注意:wait语句通常不存在具体电路对应,在电路综合时通 常不产生影响; 例:p.296表4-65 wAIT语句的应用 构成输入信号波形 entity inhibittestbench is end inhibittestbench architecture beh of inhibittestbench is component inhibit port(x, y: in bit; z: out bit); end component signal xt, yt zt: bit; ul: inhibit port map(xt, yt, zt); process wait for 10 ns wait for 10 xt<=1'yt=0 wait for 10 ns. wait,进入无限期等待,避免进入无限期循环
或传输中发生的延时; 注意:wait 语句通常不存在具体电路对应,在电路综合时通 常不产生影响; 例:p.296 表 4-65 WAIT 语句的应用 构成输入信号波形 entity inhibittestbench is end inhibittestbench; architecture beh of inhibittestbench is component inhibit port (x,y:in bit;z: out bit);end component; signal xt,yt,zt:bit; begin u1: inhibit port map (xt,yt,zt); process begin xt<='0';yt<='0'; wait for 10 ns; xt<='0';yt<='1'; wait for 10 ns; xt<='1';yt<='0'; wait for 10 ns; xt<='1';yt<='1'; wait; 进入无限期等待,避免进入无限期循环; end process; end beh;