我想知道是否可以使用(实例化)具有不同类型的相同(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内部或外部使用了一些参数化(通用)包?
我希望这是有道理的......
谢谢!
答案 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
中的数组一样使用Outputs
和E1
,因为类型是不完整的接口类型。该工具不会知道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;