Vhdl 将泛型传递给记录端口类型

Vhdl 将泛型传递给记录端口类型,vhdl,Vhdl,我最近确实开始在端口定义中使用记录,特别是当我想对属于某个接口的信号进行分组时。然而,我在这里面临的问题是,我不能通过泛型将std_逻辑_向量的宽度传递给实体。所以我基本上想做的是: library ieee; use ieee.std_logic_1164.all; use work.math_pkg.all; package fifo_pkg is type fifo_in_type is record data_in : std_logic_vector(DATA_WIDT

我最近确实开始在端口定义中使用记录,特别是当我想对属于某个接口的信号进行分组时。然而,我在这里面临的问题是,我不能通过泛型将std_逻辑_向量的宽度传递给实体。所以我基本上想做的是:

library ieee;
use ieee.std_logic_1164.all;
use work.math_pkg.all;

package fifo_pkg is

  type fifo_in_type is record
    data_in : std_logic_vector(DATA_WIDTH_??- 1 downto 0);
    rd      : std_logic;
    wr      : std_logic;
  end record;

  type fifo_out_type is record
    data_out : std_logic_vector(DATA_WIDTH_?? - 1 downto 0);
    empty    : std_logic;
    full     : std_logic;
  end record;

  component fifo is
    generic
      (
        MIN_DEPTH  : integer;
        DATA_WIDTH : integer
        );
    port
      (
        clk   : in  std_logic;
        res_n : in  std_logic;
        i     : in  fifo_in_type;
        o     : out fifo_out_type
        );
  end component fifo;

end fifo_pkg;   
因此,理想的解决方案是,我可以在记录中使用与实体中相同的泛型。(以便数据宽度与数据宽度相同)。我知道这应该在vhdl 2008中起作用,但是我的quartus II 11sp1不支持记录中的泛型

有没有一种优雅的方式来实现这种可合成的“通用传递”?我知道可以只在包中存储一个常量,但是我不能使用同一个fifo包来实例化几个不同宽度的fifo

万分感谢,
T

您可以将类型泛型与Quartus一起使用吗

然后将该类型完全保留为未指定类型,以便可以创建
整数的FIFO
或任何其他数据类型:

package fifo_pkg is
  generic (type element_type);

  type fifo_in_type is record
    data_in : element_type;
    rd      : std_logic;
    wr      : std_logic;
  end record;

  type fifo_out_type is record
    data_out : element_type;
    empty    : std_logic;
    full     : std_logic;
  end record;

  component fifo is
    generic
      (
        MIN_DEPTH  : integer;
        DATA_WIDTH : integer
        );
    port
      (
        clk   : in  std_logic;
        res_n : in  std_logic;
        i     : in  fifo_in_type;
        o     : out fifo_out_type
        );
  end component fifo;

end fifo_pkg;
然后,当您想要使用它时:

package wide_fifo_pkg is new fifo_pkg
   generic map (type => std_logic_vector(31 downto 0));
然后您可以使用
fifo\u-in\u-type
fifo\u-out\u-type

signal i : fifo_in_type;
如果设计单元中有多个FIFO,则可以创建多个版本的软件包,并使用软件包前缀获得正确的类型:

package narrow_fifo_pkg is new fifo_pkg
   generic map (type => std_logic_vector(3 downto 0));

signal i32 : wide_fifo_pkg.fifo_in_type;
signal i4  : narrow_fifo_pkg.fifo_in_type;

另一个VHDL 2008选项:您可以拥有无约束的记录类型:

 type fifo_in_type is record
    data_in : std_logic_vector;
    rd      : std_logic;
    wr      : std_logic;
  end record;
然后,您可以为各种用途创建的子类型:

subtype fifo1_data_type is fifo_in_type(data_in(31 downto 0));
subtype fifo2_data_type is fifo_in_type(data_in(15 downto 0));


不知道Quartus是否支持这两个选项中的任何一个-请让我们知道

目前,Xilinx的Vivado工具集支持包中的泛型。参考他们的文档,标题为“包中的泛型”的部分,了解详细信息和代码示例。需要确保为VHDL-2008设置了源代码属性,如同一文档中的其他地方所述。

嗨,Martin,谢谢你的建议,两者都很漂亮、优雅。但是,这在Quartus版本11.0 sp1中不起作用。到目前为止,quartus似乎只支持非常有限的vhdl 2008子集。有没有其他办法来完成这件事?我想知道这是否适用于Synplify。。。谢谢,这是一个遗憾(关于夸特斯),但并非完全出乎意料。Synplify帮助文件意味着它确实知道具有无约束数组和类型泛型的记录,在版本12.1之前,不希望在quartus中集成无约束记录的子类型…quartus不支持通用包或无约束数组作为记录元素。这是不幸的,但如果没有来自客户和用户的任何压力,它将无法实现。去告诉你的FAE:-)在第二个例子中,声明子类型应该像
子类型fifo1_data_type
fifo_in_type(
数据_in(31到0)
。除此之外,非常感谢,它真的帮助了我:)