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

时间:2018-09-11 14:55:58

标签: vhdl ghdl

 [Doctrine\DBAL\Exception\NotNullConstraintViolationException]             
  An exception occurred while executing 'INSERT INTO password (slug, share  
  d, date, nb_applications, title, url, login, password, content, updated_  
  at, user_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params ["-5"  
  , 1, "2018-09-11 16:46:04", 0, null, null, null, null, "my str", null, n  
  ull]:                                                                     
  SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'title' can  
  not be null  

我使用这种架构成功地进行了编译和分析。但是在进行阐述时却显示出

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;

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

2 个答案:

答案 0 :(得分: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)用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_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;

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

答案 1 :(得分:0)

component 是一个声明,有点像其他编程语言中的函数原型。它告诉编译器子电路的接口是什么样的。对于编译器来说足够了,但还不够自给。在某一点(阐述),它必须与( bound )关联到真实的子电路描述,即 entity -体系结构对。某些工具可以基于名称执行此类关联:当且仅当存在一个 entity 且可见(已在声明的 library 中进行编译)时,该工具才具有完全相同的名称作为 component 并只有一个 architecture ,该工具会选择该元素并将其与 component 的所有实例相关联。

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

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是实体名称。
  • AE体系结构的名称。
  • EA必须先在LIB中编译,然后再{strong>您详细阐述ripple_carry_adder;该工具需要它们。

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

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