不同类型,单个模块

时间:2017-04-29 19:16:45

标签: types vhdl

我想知道是否可以使用(实例化)具有不同类型的相同(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内部或外部使用了一些参数化(通用)包?

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

谢谢!

1 个答案:

答案 0 :(得分: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;

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

  • 合成支持很少。
  • 您不能像Inputs中的数组一样使用OutputsE1,因为类型是不完整的接口类型。该工具不会知道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;