基于泛型的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;