Parameters 参数化端口中使用的记录中的元素

Parameters 参数化端口中使用的记录中的元素,parameters,vhdl,record,hdl,Parameters,Vhdl,Record,Hdl,参数化记录元素的最佳方法是什么 例如: 我有这个部分: component C1 is port ( clk : in std_logic; reset_n : in std_logic; cam : out t_CAM_OUT ); end component C1; 包中定义了类型t\u CAM\u OUT: package camera_signals_pkg is -- Output

参数化记录元素的最佳方法是什么

例如:

我有这个部分:

component C1 is
port (
  clk               : in  std_logic;
  reset_n           : in  std_logic; 
  cam               : out t_CAM_OUT
);
end component C1;

包中定义了类型
t\u CAM\u OUT

package camera_signals_pkg is

  -- Output signals related to camera
  type t_CAM_OUT is record
    ...
    pixel_data      : std_logic_vector(31 downto 0);
    ...
  end record t_CAM_OUT;

end package camera_signals_pkg;
但是,我想参数化信号像素_数据

在组件C1的一个实例化中,我要求像素_数据为16位,而在另一个实例化中,它必须为32位


最好的方法是什么?

我经常这样做的方式是在模块的端口级别序列化数据,并将其从记录类型序列化为体系结构中的
std_逻辑向量
(或者在输入端口的情况下将其从
std_逻辑向量
反序列化为记录)

即,组件将成为:

component C1 is
  generic (
    g_cam_length : positive
  );
  port (
    clk     : in  std_logic;
    reset_n : in  std_logic; 
    cam     : out std_logic_vector(f_CAM_OUT_length(g_cam_length) - 1 downto 0)
  );
end component C1;

architecture RTL of C1 is
  type t_CAM_OUT is record
    pixel_data : std_logic_vector(g_pixel_length - 1 downto 0);
  end record t_CAM_OUT;

  function to_slv (data : t_CAM_OUT) return std_logic_vector is
    variable result : std_logic_vector(f_CAM_OUT_length(g_cam_length - 1) downto 0);
  begin
    ...
  end function to_slv;
begin
end architecture RTL;
因此,在一个包中有一个函数
f_CAM_OUT_length
,它可以帮助计算序列化的
t_CAM_OUT
记录的长度

这取决于您的设计是如何构造的,这并不是真正理想的,因为它在不同的模块和包之间创建了相当多的耦合

当然,这意味着您不能在包中定义记录。也就是说,你必须在你的模块架构中定义你的记录


编辑:删除了VHDL-2008中关于通用软件包的部分答案,因为它不适用于此特定问题。

我经常这样做的方式是在模块的端口级别序列化数据,并将其从记录类型序列化为体系结构中的
std\u logic\u vector
(或者在输入端口的情况下,将其从
std_逻辑_向量
反序列化回记录中)

即,组件将成为:

component C1 is
  generic (
    g_cam_length : positive
  );
  port (
    clk     : in  std_logic;
    reset_n : in  std_logic; 
    cam     : out std_logic_vector(f_CAM_OUT_length(g_cam_length) - 1 downto 0)
  );
end component C1;

architecture RTL of C1 is
  type t_CAM_OUT is record
    pixel_data : std_logic_vector(g_pixel_length - 1 downto 0);
  end record t_CAM_OUT;

  function to_slv (data : t_CAM_OUT) return std_logic_vector is
    variable result : std_logic_vector(f_CAM_OUT_length(g_cam_length - 1) downto 0);
  begin
    ...
  end function to_slv;
begin
end architecture RTL;
因此,在一个包中有一个函数
f_CAM_OUT_length
,它可以帮助计算序列化的
t_CAM_OUT
记录的长度

这取决于您的设计是如何构造的,这并不是真正理想的,因为它在不同的模块和包之间创建了相当多的耦合

当然,这意味着您不能在包中定义记录。也就是说,您必须在模块体系结构中定义记录


编辑:删除了VHDL-2008中有关泛型包的部分答案,因为不能解决此特定问题。

如果您愿意使用VHDL 2008,只需在类型中保留
pixel_data
不受约束,然后在端口声明期间对其进行约束,无论是从每个实体的文本还是从泛型,就像您所希望的那样任何类型

-- Output signals related to camera
  type t_CAM_OUT is record
    ...
    pixel_data      : std_logic_vector;
    ...
  end record t_CAM_OUT;

如果您愿意使用VHDL 2008,只需在类型中保留
pixel_data
不受约束,然后在端口声明期间对其进行约束,无论是从每个实体的文本还是从泛型,就像任何类型一样

-- Output signals related to camera
  type t_CAM_OUT is record
    ...
    pixel_data      : std_logic_vector;
    ...
  end record t_CAM_OUT;

包泛型似乎有些过分,您可以简单地将类型保留为不受约束的类型并将其约束在实体中。并非所有工具都支持包泛型,而大多数工具已经支持不受约束的类型很长一段时间了。因此,我现在只在被迫时使用序列化(如将记录类型连接到通用FIFO)。此外,您的示例将包显示为泛型,但映射不正确。实例化的包必须位于声明性区域中,然后将包映射为任何其他泛型。直到最近,作为泛型的包甚至很少得到sim供应商的支持。对于否决我的人,请解释原因。我的回答显示了一个可能的解决方案有效的解决方案(并已用于一些超大型>100M门ASIC的设计).@刁钻-你能举个例子说明如何使用组件的泛型实例化包吗?正如我所说的,由于缺乏工具支持,我从来没有使用过这种方法。@刁钻-那些不受约束的记录看起来确实是一个很好的解决方案!下次我需要一些东西时,我一定会尝试通过合成和正式验证来实现这一点喜欢它。包泛型似乎有些过分,你可以简单地让类型不受约束,并将其约束在实体中。并非所有工具都支持包泛型,而大多数工具已经支持不受约束的类型很长时间了。因此,我现在只在被迫时使用序列化(比如将记录类型连接到通用FIFO)。此外,您的示例将包显示为泛型,但映射不正确。实例化的包必须位于声明性区域中,然后将包映射为任何其他泛型。直到最近,作为泛型的包甚至很少得到sim供应商的支持。对于否决我的人,请解释原因。我的回答显示了一个可能的解决方案有效的解决方案(并已用于一些超大型>100M门ASIC的设计).@刁钻-你能举个例子说明如何使用组件的泛型实例化包吗?正如我所说的,由于缺乏工具支持,我从来没有使用过这种方法。@刁钻-那些不受约束的记录看起来确实是一个很好的解决方案!下次我需要一些东西时,我一定会尝试通过合成和正式验证来实现这一点在VHDL-2008中有很多方法。实例化一个通用包(一个主要单元),将上下文声明引用为上下文项,传递记录子类型的泛型类型,提供记录子类型的Tricky的子类型指示,使用其中任何一个的能力都取决于整个工具链中的-2008功能支持,例如,在进行混合语言模拟或合成时。最佳方面是什么?我们可以从到目前为止你正在征求意见的两个答案来看。我发现找到所有可以做到这一点的方法,然后选择最好的方法有点挑战性。我依靠StackOverflow来了解其他人如何解决我遇到的相同类型的问题。你能推荐任何参考/文档吗?在VHDL-2008中有许多方法。实例化e一个通用包(一个主要单元),引用一个上下文声明作为一个上下文项,一个传递了记录子类型的通用类型,Tricky的子类型indicati