用于纹波进位加法器的vhdl程序显示组件实例未绑定的警告


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))

我得到的是零波形。我需要做什么??

如果没有[最小、完整和可验证的示例],您的问题就无法复制。这里至少包括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) 由L.c表示的实体声明,其中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_cary_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;

也可能存在阐述错误。组件声明和实体声明必须匹配,在实例化中的通用映射方面或端口映射方面中找到的形式必须与实体声明相对应,模式必须一致,关联列表中复合形式和实际的每个元素都必须有一个匹配的元素。。。

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

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

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是一个库。如果它与编译ripple_carry_adder的库相同,则它可能是work。不需要声明library work,因为work总是隐式声明的
  • E是一个实体名称
  • CCD_ 11是CCD_
  • EA在您阐述ripple_carry_adder之前必须已在LIB中编译;工具需要它们

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

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

最新更新