基于泛型的VHDL组件和输出

基于泛型的VHDL组件和输出,vhdl,Vhdl,我有一个由几个组件组成的系统,这些组件必须连接到总线上。然而,为了保持系统总线的独立性,我为系统提供了一个通用总线端口,该端口通过一个总线特定模块运行,该模块在系统和特定总线之间转换。因此,通过切换转换模块,很容易将整个系统连接到不同的总线 但是,我不想每次都麻烦地将系统与翻译模块连接起来。因此,我想知道是否有可能从通用参数实例化模块,并将其类型用于体系结构的输出 通过一个小插图,整体变得更加清晰,我的翻译模块有以下“签名” 实体翻译 端口(至系统:输出至系统), fromSystem:在fro

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

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

通过一个小插图,整体变得更加清晰,我的翻译模块有以下“签名”

实体翻译
端口(至系统:输出至系统),
fromSystem:在fromSystem\u t中,
托布斯:出去,
fromBus:in from\t
终端实体;
现在,我想构建一个包含系统和翻译器的实体,基于泛型,有点像这样:

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;
实体实体实体系统是
泛型(busType:=translate)
港口(托布斯:出港),
fromBus:in from\t)
终端实体
整个系统的架构genArc是
传输信号:来自系统;
Trans:To系统的信号;
开始
系统:系统(toTrans、fromTrans)
翻译:翻译(
fromTrans,
托特兰斯,
托布斯,
fromBus
)
终端架构;
我的问题是: 我是否可以使用泛型参数直接实例化组件,或者如果泛型=xxx generate,我是否必须转到
路径?我是否可以从泛型参数派生端口类型。
最好使用一个泛型参数来确定端口和实体,这样就不会意外地为实体选择错误的类型。使用函数从泛型参数派生类型就可以了

Can I use a generic parameter to directly instantiate a component, 
or do I have to go the if generic=xxx generate path?
您可以在模块实例化中使用
通用映射
语法将总线大小传递给您的子组件。例如:

u_system: system
generic map ( INPUT_WIDTH => INPUT_WIDTH, OUTPUT_WIDTH => OUTPUT_WIDTH )
port map    ( ... )
在顶层,您需要有两个泛型而不是一个

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

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;
我不这么认为,不

如果要基于泛型实例化不同的内容,必须使用
If..generate


泛型对端口类型的唯一影响是改变宽度基于泛型的
整数
布尔

我遇到的问题略有不同。首先,通常有一个为总线定义的记录,包含
数据
和几个
控制信号
。这可以在
vhdl2008
中通过
类型泛型
实现。我想知道的是什么如果我能将一个通用参数
AHB
传递给我的顶层,并在此基础上启动一个组件来处理
AHB
-总线,并定义相应类型系统的输入和输出(
AHB\U主控\U输入/输出
记录)。我问了一个与你的问题类似的问题:我可以写一个像
busOutRecord(bus)return recordType
这样的函数来在类型泛型中使用吗?这个函数应该返回
recordType
,而不是整数(我知道怎么做),我恐怕是这样做的,…只是想确保我不会错过一个很酷的新功能。
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;