通过泛型来记录端口类型

时间:2011-10-28 05:06:55

标签: vhdl

我最近开始使用记录作为我的端口定义,特别是如果我想对属于某个接口的信号进行分组。但是,我在这里遇到的问题是我无法通过泛型传递给stl_logic_vector的宽度。所以我基本上想要做的是:

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;   

所以理想的解决方案就是当我在记录中使用与我在实体中使用相同的通用时。 (因此DATA_WIDTH与DATA_WIDTH_ ??相同)。我知道这应该以某种方式与vhdl 2008一起工作,但是我的quartus II 11sp1不支持记录中的泛型。

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

万分感谢 Ť

2 个答案:

答案 0 :(得分:9)

你可以在Quartus中使用类型泛型吗?

然后,您完全不指定类型,以便您可以创建integers的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_in_typefifo_out_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

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是否支持这些选项 - 请告诉我们!

答案 1 :(得分:0)

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