分享

generic的用法

 njnh 2014-06-08
类属 GENERIC 参量是一种端口界面常数,常以一种说明的形式放在实体或块结构体前的说明部分。类属为所说明的环境提供了一种静态信息通道,类属与常数不同,常数只能从设计实体的内部得到赋值且不能再改变,而类属的值可以由设计实体外部提供。因此设计者可以从外面通过类属参量的重新设定而容易地改变一个设计实体或一个元件的内部电路结构和规模。
    类属参量以关键词 GENERIC 引导一个类属参量表,在表中提供时间参数或总线宽度等静态信息。类属表说明用于设计实体和其外部环境通信的参数,传递静态的信息。类属在所定义的环境中的地位与常数十分接近,但却能从环境,如设计实体,外部动态地接受赋值,其行为又有点类似于端口 PORT,因此常如以上的实体定义语句那样将类属说明放在其中,且放在端口说明语句的前面。
     在一个实体中定义的来自外部赋入类属的值可以在实体内部或与之相应的结构体中读到,对于同一个设计实体,可以通过 GENERIC 参数类属的说明,为它创建多个行为不同的逻辑结构,比较常见的情况是利用类属来动态规定一个实体的端口的大小,或设计实体的物理特性,或结构体中的总线宽度,或设计实体中底层中同种元件的例化数量等等。
    一般在结构体中,类属的应用与常数是一样的,例如:当用实体例化一个设计实体的器件时,可以用类属表中的参数项定制这个器件,如可以将一个实体的传输延迟,上升和下降延时等参数加到类属参数表中,然后根据这些参数进行定制,这对于系统仿真控制是十分方便的。其中的常数名是由设计者确定的类属常数名,数据类型通常取 INTEGER 或TIME 等类型,设定值即为常数名所代表的数值,但需注意 VHDL 综合器仅支持数据类型为整数的类属值。
程序3-2和3-3是两个使用了类属说明的实例描述
   程序3-2
   ENTITY mcu1 IS
GENERIC (addrwidth : INTEGER := 16);
PORT(
     add_bus : OUT STD_LOGIC_VECTOR(addrwidth-1 DOWNTO 0) );
     ...
在这里 GENERIC 语句对实体 mcu1 作为地址总线的端口 add_bus 的数据类型和宽
度作了定义 即定义 add_bus 为一个 16 位的标准位矢量 定义 addrwidth 的数据类型是
整数INTEGER 其中 常数名addrwidth减 1 即为 15 所以这类似于将上例端口表写成
PORT (add_bus : OUT STD_LOGIC_VECTOR (15 DOWNTO 0));
由程序 3-2 可见 对于类属值 addrwidth 的改变将对结构体中所有相关的总线的
定义同时作了改变 由此将改变整个设计实体的硬件结构
程序3-3 2输入与门的实体描述VHDL实用教程 22
ENTITY PGAND2 IS
    GENERIC (    trise : TIME := 1 ns;
              tfall : TIME := 1 ns ) ;
       PORT (    a1 : IN STD_LOGIC ;
             a0 : IN STD_LOGIC ;
             z0 : OUT STD_LOGIC );
END ENTITY PGAND2;
这是一个准备作为 2 输入与门的设计实体的实体描述 在类属说明中定义参数 trise 为
上沿宽度 tfall为下沿宽度 它们分别为1ns 这两个参数用于仿真模块的设计
    以下的程序 3-5 是一个顶层设计文件 它在例化语句中调用了程序 3-4 读者应注
意到 在程序 3-4 中的类属变量 n 并没有如程序 3-2 那样明确规定了它的取值 n 的具
体取值是在程序 3-5 中的类属映射语句 GENERIC MAP ( )中指定的 并在两个不同的
类属映射语句中作了不同的赋值
    程序 3-4 和 3-5 给出了类属语句的一种典型应用。显然,类属语句的应用,为方便而迅速地改变电路的结构和规模提供了极便利的条件。
    程序3-4
    LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    ENTITY andn IS
       GENERIC ( n : INTEGER );
       PORT(a : IN STD_LOGIC_VECTOR(n-1 DOWNTO 0);
           c : OUT STD_LOGIC);
    END;
ARCHITECTURE behav OF andn IS
    BEGIN
      PROCESS (a)
       VARIABLE int : STD_LOGIC;
BEGIN
     int := '1';
     FOR i IN a'LENGTH - 1 DOWNTO 0 LOOP
    IF a(i)='0' THEN
     int := '0';
    END IF;
END LOOP;
c <=int ;
END PROCESS;
END;
程序3-5
    LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
ENTITY exn IS
   PORT(d1,d2,d3,d4,d5,d6,d7 : IN STD_LOGIC;
                           q1,q2 : OUT STD_LOGIC);
END;
ARCHITECTURE exn_behav OF exn IS
     COMPONENT andn
           GENERIC ( n : INTEGER);
      PORT(a: IN STD_LOGIC_VECTOR(n-1 DOWNTO 0);
          c: OUT STD_LOGIC);
          END COMPONENT ;
BEGIN
   u1: andn GENERIC MAP (n =>2)
     PORT MAP (a(0)=>d1,a(1)=>d2,c=>q1);
第3章   VHDL程序结构
23
      u2: andn GENERIC MAP (n =>5)
      PORT MAP (a(0)=>d3,a(1)=>d4,a(2)=>d5,
                           a(3)=>d6,a(4)=>d7, c=>q2);
        END;
程序 3-5 给出了类属映射语句 GENERIC MAP ( )配合端口映射语句 PORT MAP ( ) 语
句的使用范例 端口映射语句是本结构体对外部元件调用和连接过程中 描述元件间端口
的衔接方式的 而类属映射语句具有相似的功能 它描述相应元件类属参数间的衔接和传
送方式 读者不妨利用程序3-5 中GENERIC MAP ( )的使用方法 作一些相关的练习

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多