【问题标题】:Different types, single module不同类型,单个模块
【发布时间】:2017-05-01 15:47:12
【问题描述】:

我想知道是否可以使用(实例化)具有不同类型的相同(vhdl)模块。比如它的一些输入/输出端口会是不同长度的数组?

一个选项是:

    component PARITY
    generic (N : integer);
    port    (A : in  std_ulogic_vector
                (N-1 downto 0);
             ODD : out std_ulogic);
    end component;

但我希望将 std_ulogic_vector(N-1 downto 0) 预定义为一种类型。

也许在 PARITY 内部或外部使用了一些参数化(通用)包?

我希望这是有道理的......

谢谢!

【问题讨论】:

  • 是的。就像你说的......使用VHDL-2008。然后你甚至可以将T: type 放在通用列表中。
  • 对,但是如果有多个(/many)类型,那么我将不得不在任何模块的泛型中一次又一次地重新定义它们?
  • 你可以设置一个默认值:generic(T : type := std_logic_vector(9 downto 0));。如果你想要另一个参数的默认范围(例如N,因此N-1 downto 0),那么你应该使用通用包。
  • 通用包有什么好的参考吗?谢谢!
  • 我在答案here 中添加了一些代码。很难在网上找到好的资源。也许this

标签: types vhdl


【解决方案1】:

VHDL-2008 允许您拥有接口类型(通用子句中的类型和通用映射方面)。

实体声明:

entity E1 is
  generic (
    type myType
  );
  port (
    Clock   : std_logic;
    Inputs  : myType;
    Outputs : myType
  );
end entity;

architecture rtl of E1 is
begin
  -- Outputs(Outputs'left) <= Inputs(Inputs'right);
end architecture;

实体用法:

entity E2 is
end entity;

architecture rtl of E2 is
  constant N1 : positive := 8;
  subtype ST1 is std_logic_vector(N1 - 1 downto 0);
begin
  inst : entity work.E1
    generic map (
      myType => ST1
    )
    port map (
      Clock   => '0',
      Inputs  => (others => '1'),
      Outputs => open
    );
end architecture;

这就是理论。现在是缺点:

  • 很少支持合成。
  • 你不能像E1中的数组一样使用InputsOutputs,因为类型是不完整的接口类型。该工具不会知道 myType 映射到一个数组类型,例如允许索引和切片操作。属性也是如此。由于不了解该类型,'left'right 将不起作用。

这就是我为 VHDL-2017 编写 LCS-2016-059 的主要部分的原因。


替代方案

除了传递通用参数 N,您还可以在实体中使用不受约束的端口 - 如果您的工具支持:)。

entity E1 is
  port (
    Clock   : std_logic;
    Inputs  : std_logic_vector;
    Outputs : Inputs'range
  );
end entity;

【讨论】:

  • 非常感谢您的详细回答和示例。这听起来像我希望的那样,但由于我有几个不同类型的数组(全部由单个参数参数化),通用列表将很长,并且在交换这些 IO 的各种模块之间有点重复。我希望避免代码重复,因此参数化包可能是解决方案,但我仍然需要深入研究。
猜你喜欢
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 2014-04-21
  • 2018-07-07
  • 1970-01-01
  • 2015-02-26
  • 2013-03-21
相关资源
最近更新 更多