【问题标题】:Passing Generics to Record Port Types将泛型传递给记录端口类型
【发布时间】:2011-10-28 05:06:54
【问题描述】:

我最近确实开始使用记录来定义我的端口,特别是如果我想对属于某个接口的信号进行分组。但是,我在这里面临的问题是我无法通过泛型将 std_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。

谢谢一百万, T

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    你可以在 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;
    

    然后您可以为您的各种用途创建subtypes:

    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 是否支持其中任何一个选项 - 请告诉我们!

    【讨论】:

    • 嗨马丁,感谢您的建议,两者都很漂亮和优雅。但是,这在 Quartus 11.0 sp1 中不起作用。到目前为止,似乎 quartus 只支持非常有限的 vhdl 2008 子集。还有其他想法来完成这项工作吗?我想知道这是否适用于 Synplify...谢谢,T
    • 这是一种耻辱(关于 Quartus),但并非完全出乎意料。 Synplify 帮助文件暗示它确实知道具有不受约束的数组类型泛型的记录。
    • 我在 edaboard (edaboard.com/thread224912.html#post959333) 上发现了一个类似的线程,其中 ppl 得出了相同的结论,在 12.1 版本之前,不希望在 quartus 中集成无约束记录的子类型...跨度>
    • Quartus 不支持通用包或无约束数组作为记录元素。这是不幸的,但如果没有来自客户和用户的任何压力,它将无法实施。去告诉你的 FAE :-)
    • 在第二个示例中,声明子类型应类似于 subtype fifo1_data_type is fifo_in_type( data_in(31 downto 0) );。除此之外,非常感谢,它真的帮助了我:)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      相关资源
      最近更新 更多