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

时间:2015-04-03 13:29:39

标签: 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;

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

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;

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

component alu32;

3 个答案:

答案 0 :(得分:5)

你可以,因为VHDL-93。您可以使用

进行实例化
Alu_0: entity work.alu32
port map (
    ...
);

在此代码段中,您可以将work替换为要实例化的组件的VHDL库,work 始终 VHDL源所在的当前库。

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

答案 1 :(得分:3)

基本上语言设计师都在尽可能仔细地向前看,这个世界......并没有那样发生。

component声明的想法是它确切地定义了实例化时的预期,因此使用这些组件的实体/体系结构是自洽的,可以编译并在某种程度上作为来自它使用的组件的独立任务 - 甚至可能在编写这些组件之前。

比尔林奇的评论在这里是相关的,今天很容易忘记:当编译花了一千倍的时间,这是一个很大的生产力胜利

稍后,当您构建整体设计时,将在组件库中搜索该组件,并找到完全匹配的实体(默认配置),或者通过configuration语句选择特定组件。或者细化失败,将不匹配报告为错误 - 没有机会创建一个不太合适的部分的设计。该库可以包含各种具有不同特性的“alu32”组件,用于不同目的(快速,小型,有/无浮点等)。这种情况发生在“详细说明”,大致与软件中的链接阶段相同,当(希望)找到正确的实体/ arch时,其端口与组件的端口进行核对。对于那些以“The TTL Data Book”成长的设计师来说,这是一种自然的方式,可以看到设计的发展 - 这是一个TTL IC形式的物理构建模块库。

但是,在今天的典型用例中,我们不会在很大程度上使用组件库,因此您的示例中的“alu32”可能是同一项目中的另一个文件,编译到您的“工作”库中

在这种情况下,Jonathan Drolet回答的更短,更简单的“直接实体实例化”(1993年引入)是正确的方法。下行?它确实意味着你必须编写 - 并成功编译 - “alu32”实体,然后才能进行语法检查顶级设计(尽管你可以在以后编写架构,然后再详细说明)。

答案 2 :(得分:0)

IEEE Std 1076-2008,6.8组件声明

  

组件声明声明了可以在组件实例化语句中使用的虚拟设计实体的接口。组件配置或配置规范可用于将组件实例与驻留在库中的设计实体相关联。

3.4配置声明

  

但是,在某些情况下,将未指定的组件实例绑定留在给定块中并将此类规范推迟到以后可能是合适的。

组件声明就像Function prototype。通用映射或端口映射方面是绑定指示的一部分。

附件一:

  

绑定:将设计实体和(可选)架构与组件实例相关联的过程。可以在显式或默认绑定指示中指定绑定。 (3.4,7.3.2,7.3.3,14.4.3.3,14.5.4)

作为您想要考虑与配置声明一起使用的组件声明的示例,内部块具有相同接口的设计:

component sbox
    port (
        B:  in  std_logic_vector (1 to 6);
        S:  out std_logic_vector (1 to 4)
    );
end component;

它们实际上是截然不同的,您使用多个:

S1: sbox
    port map (
        B   => ExK(1 to 6),
        S   => PO(1 to 4)
    );

S2: sbox
    port map (
        B   => ExK(7 to 12),
        S   => PO(5 to 8)
    );

封闭实体在其他方面是相同的(dslice)。

您可以指定在详细说明中使用的实体:

configuration behave_config of des is
    for behave
    for DSLICE0: dslice
        use entity work.dslice(behave);        
        for behave
            for S1: sbox
                use entity work.sbox1(behave);
            end for;
            for S2: sbox
                use entity work.sbox2(behave);
            end for;
        end for;
    end for;
    ...

此实例中的DES加密算法可以描述为由替换框内容和外部互连区分的四个部分中的硬件。

此设计模型演示了数字加密标准(FIPS Pub 46,单DES)中的数字加密算法的硬件特性。您可以仔细查看此链接 - vhdl_des.tar.gz

对于不支持配置的综合或模拟工具,替代方案是统一包含实例化实体的块,在这种情况下,将设计描述的大小增加几乎四倍,同时增加维护和不必要的复制的危险。