0

我有一个系统,它由必须连接到总线的几个组件组成。然而,为了保持系统总线的独立性,我为系统提供了一个通用总线端口,我通过一个总线特定模块运行该总线端口,该模块在我的系统和特定总线之间进行转换。因此,通过切换翻​​译模块很容易将整个系统连接到不同的总线。

但是,我不想每次都将系统与翻译模块连接起来。因此,我想知道是否可以从通用参数实例化模块,并将其类型用于体系结构的输出。

稍微说明一下,整体就更清楚了,我的翻译模块有以下“签名”。

entity translate<BusName>
port(toSystem: out toSystem_t,
  fromSystem: in fromSystem_t,
  toBus: out to<BusName>_t,
  fromBus: in from<BusName>_t
end entity;

我现在想构建一个包含系统和翻译器的实体,基于通用,有点像这样:

entity entireSystem is
  generic(busType := translate<BusName>)
  port(toBus: out to<BusName>_t,
       fromBus: in from<BusName>_t)
end entity

architecture genArc of entireSystem is
   signal toTrans: fromSystem;
   signal fromTrans: toSystem;
begin
   system: system(toTrans,fromTrans)
   translator: translate<BusName>(
       fromTrans,
       toTrans,
       toBus,
       fromBus
   )
end architecture;

我的问题是:我可以使用泛型参数直接实例化一个组件,还是必须走这if generic=xxx generate条路?我可以从通用参数派生端口的类型吗?如果我可以使用一个通用参数来确定端口和实体,那将是最好的,这样就不会意外地为实体选择错误的类型。使用函数从泛型参数派生类型会很好。

4

2 回答 2

2

我不这么认为,不。

如果你想基于泛型实例化不同的东西,你必须使用if..generate.

泛型对端口类型的唯一影响是改变宽度。您不能基于泛型在(例如)aninteger和 a之间切换。boolean

于 2013-07-31T13:59:46.863 回答
0
Can I use a generic parameter to directly instantiate a component, 
or do I have to go the if generic=xxx generate path?

您可以使用generic map模块实例化中的语法将总线大小传递给您的子组件。IE:

u_system: system
generic map ( INPUT_WIDTH => INPUT_WIDTH, OUTPUT_WIDTH => OUTPUT_WIDTH )
port map    ( ... )

在顶层,您需要有两个泛型而不是一个。

或者,假设您的顶级组件必须与子组件具有相同的总线大小,您可以尝试在包文件中执行此操作并使用函数调用定义总线大小。IE:

package pack is
  -- # Define support bus name here 
  constant BusA    : integer := 0;
  ...
  constant BusZ    : integer := 25;

  -- # Bus name here
  constant busname : integer := BusA;

  -- # Input and Output Width
  constant IWIDTH  : integer := getIWIDTH( busname )
  constant OWIDTH  : integer := getOWIDTH( busname )

  -- # Function declaration
  function getIWIDTH( ii: integer ) return integer;
  function getOWIDTH( ii: integer ) return integer;
end pack;

package body pack is
  function getIWIDTH( ii: integer ) return integer is
     variable oo : integer;
  begin
     -- # get iwidth here            
     return oo;
  end function;
  function getOWIDTH( ii: integer ) return integer is
     variable oo : integer;
  begin
     -- # get owidth here
     return oo;
  end function;
end package body;
于 2013-07-30T19:53:21.417 回答