VHDL中的子结构为了使设计简化,避免重复的工作,VHDL中通常使用子结构来规范一些常用的运算或简单的功能模块;
function函数:用于表达常用的运算;
procedure过程:用于表达简单的元件 ;
子结构中的执行语句都应为顺序语句。
VHDL中的函数,function
在赋值类语句中,经常引用函数来表达常用的运算组合或类型转换,以达到代码重用和共享的目的;
函数主要由参量表、说明部分和顺序执行部分构成。
函数的编写格式
function 函数名 (信号列表 )
return return-type is
declarations and definitions;--说明部分
begin
sequential-statement;--功能部分
……
sequential-statement;
end function-name;
函数的编写实例采用函数表达,设计 inhibit门
P.277(表 4-36)
architecture dat of inhibit is
function butnot (a,b:bit) return bit is
begin
if b='0' then return a;
else return ‘0’; end if;
end butnot;
begin
z<=butnot (x,y);
end dat;
函数的编写特点
1 函数 可以看作是一种 多输入 /单输出的电路模块 ;
2 函数信号表中带有若干形式参量,在调用时由实际信号取代,实现主程序向函数的输入; 在函数内部,信号被作为常量对待 ;
函数的编写特点
3 函数内部可以定义局部使用的类型、常量、
变量、函数、过程;但不能定义信号;
函数的输入只能是常数或信号,在函数中被作为 in模式,不能改变;
函数中不能有 out模式的数据对象,运算结果通过 return语句赋值给函数名输出。
函数的编写特点
4 函数应用时,为了进行运算,可在函数体中设置变量,在函数执行过程中为该变量赋值;用 return语句可以将该变量值 返回 ( 赋值给函数名 );该变量应与规定的返回类型一致;函数定义中可以设置多个返回语句,
但在一次调用中,只有一个返回语句带回函数值;
数据类型转换函数的实例从 std_logic_vector到 integer,p.279(表 4-38)
function conv_integer (x,std_logic_vector) return integer is
variable result,integer;
begin
result,= 0;
for I in x'range loop
result,=result*2;
case x(i) is
when '0'|'L' => null;
when '1'|'H' => result,= result+1;
when others => null;
end case;
end loop;
return result;
end conv_integer;
数据类型转换函数的实例程序中的一些语法解释:
x'range 属性描述:返回由 x的位数所指定的数据范围;
a|b,将两个(或多个)信号(变量)并列的表达形式;
=>,case语句的表达形式,当出现左边值时,执行右边的语句;注意与“大于等于”区分;
null:关键词语句,表示不执行任何操作;
用单引号所括的字母 'H','L'等必须大写;
数据运算函数的实例整数与逻辑位的加法;
function "+" (a:integer,b:bit) return
integer is
begin
if (b = '1') then return a+1;
else return a;
end if;
end "+";
数据运算函数的实例在 VHDL程序中,当遇上相关情况时,程序就可以自动调用该函数:
signal a,b:integer range 0 to 15;
signal c:bit;
…………
b <= 3+a+c;
第 1个 +进行预定义的算术操作,第 2个 +进行函数操作;
数据类型运算函数的实例在 VHDL程序中,当遇上相关情况时,程序就可以自动调用该函数:
signal a,b:integer range 0 to 15;
signal c:bit;
…………
b <= 3+a+c;
第 1个 +进行预定义的算术操作,第 2个 +进行自定义函数操作;这称为运算重载 overload。
VHDL中的结构设计,procedure 语句过程是 VHDL的一种子结构,可以看作简单的元件。过程可以对应于一个 多输入多输出的电路模块 。过程可以在结构体中调用(并行调用),
也可以在子结构中调用。
VHDL中的过程,procedure
过程的定义:
procedure 过程名( 参量:模式 类型) is
各种说明定义;
begin
执行语句(顺序语句);
End 过程名;
过程的调用:
过程名(信号列表);
procedure 语句的应用实例
architecture str of butnot1 is
procedure kinv1(a,in std_logic;
f,out std_logic) is
begin
f,= not a;
end kinv1;
procedure kand21(a,b,in std_logic;
f,out std_logic) is
begin
f:= a and b;
end kand21;
procedure 语句的应用实例
begin
process(x,y)
variable z1,temp:std_logic;
begin
kinv1(y,temp);
kand21 (x,temp,z1);
z<=z1;
end process;
end str;
procedure 语句的设计要点
1 过程依靠参量与主程序交换信息,参量说明紧跟在过程名后面的括号中;
2 参量模式为,in 输入,作为常量;
out 输出,作为变量或信号;
inout 双向,作为变量或信号;
若要作为信号,最好在参量名前加注 signal
procedure 语句的设计要点
3 过程内部可以定义局部使用的类型、
常量、变量、函数、过程,但不能定义信号,也不能进行元件调用;过程的内部不能包含或隐含寄存器;
过程内部的执行语句为顺序语句。
procedure 语句的设计要点
5 过程 可以进行 并行调用 (在结构体中),
也可以进行 顺序调用 (在进程中);并行过程的参量应该为信号量;顺序过程的参量为变量,可以利用顺序赋值语句将输出结果传递给信号量;