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

问题描述

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

例如:

我有这个组成部分:

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

类型t_CAM_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;

但是我想参数化信号 pixel_data

在组件 C1 一个实例中,我要求 pixel_data 为16位,而在另一实例中,它必须为32位。

什么是最好的方法

解决方法

如果您乐于使用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;
entity ent1 is
port (
  clk               : in  std_logic;
  reset_n           : in  std_logic; 
  cam               : out t_CAM_OUT( pixel_data(15 downto 0) );
);
entity generic_ent is
generic (
  W : natural
);
port(
  clk               : in  std_logic;
  reset_n           : in  std_logic; 
  cam               : out t_CAM_OUT( pixel_data(W-1 downto 0) );
);
,

我经常这样做的方法是在模块的端口级别上对数据进行序列化,并将其从记录类型序列化为架构内的std_logic_vector(或从std_logic_vector反序列化)输入端口的情况下记录到记录中。)

即该组件将变为:

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中通用软件包的部分答案,因为不适用于此特定问题。