2015-04-03 64 views
0

我正在学习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; 
+0

http://stackoverflow.com/questions/3641341/vhdl-components?rq=1 – mstbaum 2015-04-03 14:12:46

+0

可能的重复此外,至于为什么这样设计的东西,请记住,该语言最初是在1987年标准化。计算机远那么强大一点。 – 2015-04-03 14:38:25

+0

另请参阅:http://electronics.stackexchange.com/questions/16692/vhdl-component-vs-entity – Josh 2015-04-03 14:53:19

回答

5

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

Alu_0: entity work.alu32 
port map (
    ... 
); 

在这个片段中,可以取代work您要实例化组件的VHDL库,work总是的VHDL源驻留在当前库。

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

+0

我有点困惑。你所展示的是实体声明?在架构内部使用组件声明时如何更改?是否如我的例子中给出的那样:'component alu32;'? – Nate 2015-04-03 17:42:15

+0

不,这是实例化(请注意使用*端口映射*)。这在'begin'关键字之后的结构中。不需要申报任何东西。 – 2015-04-03 17:44:41

3

基本上,语言设计师们一直在尽可能小心地向前看,这个世界......并非完全如此。

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

比尔·林奇的评论是与此有关,而且容易忘了今天:当编译所花的时间一千倍,这是一个很大的生产力赢得

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

但是,在今天的一个典型用例中,我们并没有在很大程度上使用组件库,因此您示例中的“alu32”可能是同一项目中的另一个文件,编译为您的“工作”图书馆。

在这种情况下,Jonathan Drolet的回答中较短,较简单的“直接实体实例化”(1993年引入)是正确的方法。下行?这意味着在语法检查顶层设计之前,您必须编写并成功编译“alu32”实体(尽管您可以在稍后详细阐述之前编写体系结构)。

0

IEEE标准1076至2008年,6.8元器件声明

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

3.4配置声明

在某些情况下,然而,它可能是适当的离去组件实例的非特定的结合在给定块和推迟这种规范,直到后来。

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

从附件I:

结合:关联设计实体的过程和任选的结构与部件的一个实例。可以在显式或默认绑定指示中指定绑定。 (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

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

相关问题