Программа VHDL для сумматора пульсации, показывающая предупреждение об отсутствии привязки экземпляра компонента - PullRequest
0 голосов
/ 11 сентября 2018
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))

и я получаю нулевой сигнал во всем. что мне нужно сделать ??

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Ваша проблема не может быть воспроизведена без [Пример минимального, полного и проверяемого].Здесь, по крайней мере, включая объявление объекта для 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 Конфигурация компонента:

Если данный экземпляр компонентаunbound в соответствующем блоке, тогда любая явная конфигурация компонента для этого экземпляра, которая не содержит явного указания привязки, будет содержать неявное указание привязки по умолчанию (см. 7.3.3).Точно так же, если данный экземпляр компонента не связан в соответствующем блоке, тогда любая неявная конфигурация компонента для этого экземпляра будет содержать неявное указание привязки по умолчанию.

Вы не предоставляете объявление конфигурации сконфигурация компонента, обеспечивающая указание привязки.Конфигурация неявного компонента будет содержать указание привязки по умолчанию.

7.3.3 Указание привязки по умолчанию

В определенных обстоятельствах указание привязки по умолчанию будет применяться при отсутствии явного указания привязки,Индикация привязки по умолчанию состоит из аспекта объекта по умолчанию, вместе с аспектом общей карты по умолчанию и аспектом карты порта по умолчанию, в зависимости от ситуации.

Если ни одно видимое объявление сущности не имеет такого же простого имени, как у экземпляра экземпляра, то аспект сущности по умолчанию открыт.Объявление видимой сущности - это первое объявление сущности, если оно есть, в следующем списке:

a) Объявление сущности, которое имеет такое же простое имя, как и у экземпляра, созданного в качестве экземпляра, и которое является непосредственно видимым (см. 12.3),

b) Объявление сущности, которое имеет то же простое имя, что и имя экземпляра компонента, и которое было бы непосредственно видимым в отсутствие непосредственно видимого (см. 12.3) объявления компонента с таким же простымname как объявление сущности или

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.

Предупреждения говорят о том, что либо имя вашего компонента не совпадает с видимым именем объекта, возможно, объект не был проанализирован в справочной библиотеке.

Вот полный_прием, который я создал для демонстрации:

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;

Также могут быть ошибки при разработке.Объявление компонента и объявление сущности должны совпадать, формалы, найденные в родовом аспекте карты или аспекте карты порта в экземпляре, должны соответствовать объявлению сущности, режимы должны согласовываться, должен быть соответствующий элемент для каждого элемента составного формальности.и актуально в списке ассоциаций....

0 голосов
/ 12 сентября 2018

A 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 - это имя объекта.
  • A - это название архитектуры E.
  • E и A должны быть скомпилированы в LIB до вашего уточнения ripple_carry_adder; инструмент нуждается в них.

Существуют и другие способы решения такого рода проблем ( конфигурация проектные единицы или экземпляры сущностей), но этого должно быть достаточно для вашей текущей проблемы.

Последнее замечание о поведении инструмента, которое вы наблюдали: если вы не предоставите эту спецификацию конфигурации и инструмент не сможет использовать стратегию по умолчанию для привязки экземпляров компонента к парам entity-architecture, выдается предупреждение о том, что экземпляры некоторых компонентов остаются несвязанными. Эти экземпляры рассматриваются как черные ящики, и их выходы не приводятся во время моделирования. Это то, что вы видите в своих сигналах.

...