子程序调用语句

子程序调用语句

在进程中允许对子程序进行调用。从硬件的角度讲,一个子程序的调用类似于一个元件模块的例化,也就是说,VHDL综合器为子程序的每一次调用都生成一个电路逻辑块,所不同的是,元件的例化将产生一个新的设计层次,而子程序调用只对应于当前层次的一部分。子程序包括过程和函数。
1、过程调用过程调用就是执行一个给定名字和参数的过程。调用过程的语句格式如下:
过程名[([形参名=> ]实参表达式
{ ,[形参名=> ]实参表达式}) ];
一个过程的调用将分别完成以下三个步骤:(1)将IN和INOUT模式的实参值赋给欲调用的过程中与它们对应的形参;
(2)执行这个过程;(3)将过程中IN和INOUT模式的形参值返回给对应的实参。

PACKAGE data_types IS                             -- 定义程序包
SUBTYPE data_element IS INTEGER RANGE 0 TO 3 ;-- 定义数据类型
TYPE data_array IS ARRAY (1 TO 3) OF data_element;
END data_types;
USE WORK.data_types.ALL; --打开以上建立在当前工作库的程序包data_types
ENTITY sort IS
    PORT ( in_array : IN  data_array ;
           out_array : OUT data_array);
END sort;
  ARCHITECTURE exmp OF sort IS
  BEGIN
  PROCESS (in_array)       -- 进程开始,设data_types为敏感信号
   PROCEDURE swap(data : INOUT data_array;     
                               -- swap的形参名为data、low、highlow, high :    IN INTEGER ) IS
    VARIABLE       temp :  data_element ;
    BEGIN                      -- 开始描述本过程的逻辑功能  
       IF (data(low) > data(high)) THEN            -- 检测数据
             temp := data(low) ;
        data(low) := data(high);
       data(high) := temp ;
       END IF ;
      END swap ;                             -- 过程swap定义结束
   VARIABLE my_array : data_array ;  -- 在本进程中定义变量my_arrayBEGIN                                     -- 进程开始 
    my_array := in_array ;             -- 将输入值读入变量
swap(my_array, 1, 2); 
-- my_array、1、2是对应于data、low、high的实参   
    swap(my_array, 2, 3); -- 位置关联法调用, 第2、第3元素交换
swap(my_array, 1, 2); -- 位置关联法调用, 第1、第2元素再次交换
     out_array <= my_array ;
 END Process ;

END exmp ;

ENTITY sort4 is
GENERIC (top : INTEGER :=3);
    PORT (a, b, c, d : IN BIT_VECTOR (0 TO top);
      ra, rb, rc, rd : OUT BIT_VECTOR (0 TO top));
END sort4;
ARCHITECTURE muxes OF sort4 IS
PROCEDURE sort2(x, y : INOUT BIT_VECTOR (0 TO top)) is
    VARIABLE tmp : BIT_VECTOR (0 TO top);BEGIN
    IF x > y THEN  tmp := x;  x := y;     y := tmp;
    END IF;
END sort2;
BEGIN
 PROCESS (a, b, c, d)
    VARIABLE va, vb, vc, vd : BIT_VECTOR(0 TO top);
BEGIN
    va := a;  vb := b; vc := c;  vd := d;
    sort2(va, vc); 
    sort2(vb, vd);
    sort2(va, vb); 
    sort2(vc, vd);
    sort2(vb, vc);
    ra <= va;      rb <= vb;  rc <= vc;  rd <= vd;
    END PROCESS;
END muxes;

2、函数调用函数调用与过程调用是十分相似的,不同之处是,调用函数将返还一个指定数据类型的值,函数的参量只能是输入值。


你可能感兴趣的:(VHDL)