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;