为什么在使用组件时重新定义端口?

Nat*_*ate 1 vhdl

我正在学习VHDL并发现令人困惑的事情.假设您有以下实体:

entity alu32 is
    port(a, b       : in STD_LOGIC_VECTOR(31 downto 0);
         alucontrol : in STD_LOGIC_VECTOR(2 downto 0);
         result     : buffer STD_LOGIC_VECTOR(31 downto 0);
         zero       : out STD_LOGIC);
end alu32;
Run Code Online (Sandbox Code Playgroud)

当将它用作另一个实体架构中的组件时,它的定义如下:

component alu32
  port(
        a, b       : in STD_LOGIC_VECTOR(31 downto 0);
        alucontrol : in STD_LOGIC_VECTOR(2 downto 0);
        result     : buffer STD_LOGIC_VECTOR(31 downto 0);
        zero       : out STD_LOGIC
    );
 end component;
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么要重新定义港口?这似乎是一个毫无意义的练习,因为它与实体声明中的完全相同.为什么VHDL设计不允许您简单地使用这样的组件:

component alu32;
Run Code Online (Sandbox Code Playgroud)

Jon*_*let 6

你可以,因为VHDL-93.您可以实例化使用

Alu_0: entity work.alu32
port map (
    ...
);
Run Code Online (Sandbox Code Playgroud)

在此片段中,您可以替换work要实例化的组件的VHDL库,work始终是VHDL源所在的当前库.

为什么要使用组件声明?首先,如果要实例化的内容不是VHDL,则需要它们,例如Verilog,IP内核和网表.其次,使用配置允许更改端口/实体绑定,但您需要组件声明.