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 函数通常在赋值语句的表达式中调用,函数返回类型应与 该表达式类型一致; 例. 用函数表达三输入端与门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; 其他示例:P.277 表4-36 BA?的函数表达 P.279 表4-38 数据类型转换 数据流设计特点: 不讨论具体逻辑电路图(元件),只针对逻辑表达式进行 设计;设计思想比较抽象,灵活性大(不需要依赖基本元件), 方便于进行基本组合逻辑关系的设计; 赋值语句的每一句通常被综合为一个多输入单输出的电 路模块;在设计中应适当考虑赋值表达式的复杂程度,避免 引入过多的信号点; 进程语句: 行为描述方式 以电路功能块为基础,直接考虑信号流程或状态变化过程 电路功能块采用进程表达,通过信号进行功能块之间的交流; 行为描述方式的结构体形式 Architecture b of 实体名 is 类型说明;常量说明;信号说明; 函数定义;过程定义; begin 各类进程; (每个进程可作为一条并行语句,表达 一个电路功能块) end b; 进程的结构形式:p.289 表4-55 进程名: process(信号名,….信号名) (敏感量表) 类型、变量、常量、函数、过程的声明或定义 begin 顺序语句; ….. 顺序语句; end process; 进程结构要点: 1 进程可以使用结构体的各种信号,在进程中可以改变这些 信号的值;这是进程与主程序交换信息的方式; 2 进程内不允许定义信号,但可以定义局部变量、常量、函 数等; 3 进程本身为结构体内的一条并行语句,其内部可执行部分 是顺序语句;进程可以进行命名(标号)以区分不同进程的 作用; 4 进程通常带有敏感量表(信号名列表),当表中任一信号值 发生变化时,进程就从头到尾执行一次;若不带敏感量表, 则进程在仿真零点执行; 5 在进程中,变量赋值立即进行,信号赋值在该次进程结束 时进行; 6 若进程的执行导致进程内部变量或信号的任何变化,进程 将立即再次执行;当进程的的执行不再导致进程内部量发生 任何变化时,进程将停止执行,此时进程功能块处于稳定状 态;进程的编写应确保进程在任何时刻能够在有限次变化之 后进入稳定状态。 进程的物理模型 进程为结构体的子结构,可以相当于一个抽象的电路功 能块,其输入信号为其敏感量表所列信号,输出信号可以是 在进程中赋值的任何信号;使用进程可以方便地表达电路的 各部分相互影响; 进程的内部构造类似于电路(信号)流程框图,程序的 执行按顺序进行,简单功能框用代入语句、分支语句、循环 语句表达,复杂的功能框采用过程语句表达。 进程中典型的顺序语句 顺序赋值语句 信号赋值语句 (形式与并行代入语句相同) 信号名<=表达式 变量赋值语句 变量名:= 表达式 要点: 信号赋值语句在进程末尾执行或出现wait语句时执行; 变量赋值语句立即执行; 条件赋值语句和选择赋值语句不属于顺序语句; 赋值语句在表达式中可以利用函数进行运算; 例: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 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; 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;