0
architecture rtl of ripple_carry_adder is

  component full_adder is
    port (
      i_bit1  : in  std_logic;
      i_bit2  : in  std_logic;
      i_carry : in  std_logic;
      o_sum   : out std_logic;
      o_carry : out std_logic);
  end component full_adder;

  signal w_CARRY : std_logic_vector(g_WIDTH downto 0);
  signal w_SUM   : std_logic_vector(g_WIDTH-1 downto 0);


begin

  w_CARRY(0) <= '0';                    -- no carry input on first full adder

  SET_WIDTH : for ii in 0 to g_WIDTH-1 generate
    i_FULL_ADDER_INST : full_adder
      port map (
        i_bit1  => i_add_term1(ii),
        i_bit2  => i_add_term2(ii),
        i_carry => w_CARRY(ii),
        o_sum   => w_SUM(ii),
        o_carry => w_CARRY(ii+1)
        );
  end generate SET_WIDTH;

  o_result <= w_CARRY(g_WIDTH) & w_SUM;  -- VHDL Concatenation

end rtl;

使用此架构我成功编译和分析。但是在详细说明时它显示

warning: component instance "i_full_adder_inst" is not bound
warning: (in default configuration of ripple_carry_adder(rtl))

而且我的波形始终为零。我需要做什么??

4

2 回答 2

1

如果没有[最小、完整和可验证的示例],您的问题就无法复制。这里至少包括实体声明ripple_carry_adder和实际的完整警告:

例如添加时:

library ieee;
use ieee.std_logic_1164.all;

entity ripple_carry_adder is
    generic ( g_WIDTH:  natural := 4);  -- a default value for convenience
    port (
        i_add_term1:    in  std_logic_vector (g_WIDTH - 1 downto 0);
        i_add_term2:    in  std_logic_vector (g_WIDTH - 1 downto 0);
        o_result:       out std_logic_vector (g_WIDTH downto 0)
    );
end entity;

警告(全部):

ghdl -a ripple_carry_adder.vhdl
ghdl -e ripple_carry_adder
ripple_carry_adder.vhdl:34:5:warning: component instance "i_full_adder_inst" of 'full_adder' is not bound
[-Wbinding]   ripple_carry_adder.vhdl:13:14:warning: (in default configuration of ripple_carry_adder(rtl)) [-Wbinding]

这里告诉我们未绑定实体的名称。第 13 行是full_adder. 第 34 行是组件实例化,当尝试在组件配置中生成隐式绑定指示时找不到该实例化。

使用未绑定的组件详细说明设计并导致绑定指示打开,这并不违法。在自顶向下设计的增量开发过程中,允许未绑定的组件可能很有用。

参见 IEEE Std 1076-2008
3.4.3 组件配置:

如果给定组件实例在相应块中未绑定,则该实例的任何不包含显式绑定指示的显式组件配置将包含隐式默认绑定指示(参见 7.3.3)。类似地,如果给定组件实例在相应块中未绑定,则该实例的任何隐式组件配置将包含隐式默认绑定指示。

您不提供带有提供绑定指示的组件配置的配置声明。隐式组件配置将包含默认绑定指示。

7.3.3 默认绑定指示

在某些情况下,默认绑定指示将在没有明确绑定指示的情况下应用。默认绑定指示由默认实体方面以及默认通用映射方面和默认端口映射方面(视情况而定)组成。

如果没有可见实体声明与实例化组件具有相同的简单名称,则默认实体方面是打开的。可见实体声明是以下列表中的第一个实体声明(如果有):

a) 与实例化组件具有相同简单名称且直接可见的实体声明(见 12.3),

b) 与实例化组件具有相同简单名称的实体声明,并且在没有与实体声明具有相同简单名称的直接可见(参见 12.3)组件声明的情况下将直接可见,或

c) 由 LC 表示的实体声明,其中 L 是目标库,C 是实例化组件的简单名称。目标库是包含声明组件 C 的设计单元的库的库逻辑名称。

这些可见性检查是在导致应用默认绑定指示的缺少显式绑定指示时进行的。

在细化(这里是链接和加载的静态链接部分)组装模型期间,VHDL 工具将搜索具有相同名称的实体声明(这里full_adder)。

如果在细化过程中发现具有架构的实体,full_adder它将被默认绑定指示绑定:

ghdl -a full_adder.vhdl
ghdl -a ripple_carry_adder.vhdl
ghdl -e ripple_carry_adder

如果模型驱动 full_adder 输出,则没有警告并且使用测试台,您将看到有效的信号电平。(如果没有测试台,模拟只会显示没有复合匹配元素错误,并且所有类型都正确。full_adder和ripple_carry_adder的分析顺序并不重要,只要在阐述ripple_carry_adder之前对两者进行分析即可。

警告告诉您的是您的组件名称与可见实体名称不匹配,可能该实体尚未分析到参考库中。

这是我生成的用于演示的 full_adder:

library ieee;
use ieee.std_logic_1164.all;

entity full_adder is
  port (
    i_bit1:   in  std_logic;
    i_bit2:   in  std_logic;
    i_carry:  in  std_logic;
    o_sum:    out std_logic;
    o_carry:  out std_logic
  );
end entity full_adder;

architecture foo of full_adder is
begin
    o_sum <= i_carry xor i_bit1 xor i_bit2;
    o_carry <= (i_carry and i_bit1) or 
               (i_carry and i_bit2) or 
               (i_bit1 and i_bit2);
end architecture;

也可能存在详细说明错误。组件声明和实体声明必须匹配,实例化中通用映射方面或端口映射方面的形式必须对应于实体声明,模式必须一致,复合形式的每个元素必须有一个匹配元素并且实际在关联列表中。...

于 2018-09-12T08:07:01.803 回答
0

组件是一个声明,有点像其他编程语言中的函数原型。它告诉编译器子电路的接口是什么样的。对于编译器来说已经足够了,但它不是自给自足的。在某一点(细化),它必须关联(绑定)到一个真实的子电路描述,即一个实体-架构对。一些工具可以基于名称执行此类关联:当且仅当实体存在、可见(已在声明的库中编译)、与组件具有完全相同的名称并且只有一个架构,该工具会选择这个并将其与组件的所有实例相关联。

否则,或者如果您的工具默认不执行此类关联,则您必须使用配置规范自己指定:

library LIB;
...
architecture rtl of ripple_carry_adder is
  component full_adder is
    ...
  end component full_adder;

  for all: full_adder use entity LIB.E(A);

  signal w_CARRY : std_logic_vector(g_WIDTH downto 0);
  ...

在哪里:

  • LIB是一个图书馆。如果它work与您在其中编译ripple_carry_adder. library work不需要声明,因为work总是隐式声明。
  • E是实体名称。
  • A是一个架构的名称E
  • E并且A必须在您详细说明LIB 之前ripple_carry_adder编译;该工具需要它们。

还有其他方法可以解决此类问题(配置设计单元或实体实例化),但这应该足以解决您当前的问题。

关于您观察到的工具行为的最后一点说明:如果您不提供此配置规范并且该工具无法使用默认策略将组件的实例化绑定到entity-architecture对,则会发出警告以通知您某些组件的实例化被留下未绑定。这些实例被视为黑匣子,它们的输出在仿真过程中不被驱动。这就是您在波形中看到的内容。

于 2018-09-12T05:26:08.787 回答