Перейти к содержанию
    

Как правильно вставить две одинаковые компоненты?

Учусь работать с компонентами. Задача: вставить две одинаковые компоненты. Т.е. например есть два входа и два выхода. первая компонента складывает оба входа и подает на первый выход. Вторая такая же компонента делает тоже самое, только на второй выход. Написал вот такой вот код:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity top is
   Port ( intop1 : in std_logic;
          intop2 : in std_logic;
          outtop1 : out std_logic;
          outtop2 : out std_logic);
end top;

architecture Behavioral of top is
    COMPONENT low1
    PORT(
 in1 : IN std_logic;
 in2 : IN std_logic;          
 out1 : OUT std_logic
 );
    END COMPONENT;

begin

 Inst_low1: low1 PORT MAP( in1 => intop1, in2 => intop2, out1 => outtop1);
     Inst_low2: low1 PORT MAP( in1 => intop1,    in2 => intop2, out1 => outtop2);
end Behavioral;

Выдает warning, что inst_low1 и inst_low2 одинаковые, поэтому inst_low2 убран. НО работает так, как я и задумывал. Т.е. написал я неправильно, но синтезатор сам додумывается, что мне надо (и делает это правильно), но как мне узнать как надо? Пробывал в одном inst_low1 в port map прописывать два раза порт out1 направляя его на разные выходы - ругается. Пробывал убирать вообще inst_low2 - работает как и написано (с отключенным вторым выходом).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в данном случае могу сказать - компилятор прав! :biggrin:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в данном случае могу сказать - компилятор прав!  :biggrin:

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

аааа. понятно. т.е. я написал все правильно - просто неумно это? а если подам разные сигналы, то он не выкинет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не выкинет... в общем-то проблем никаких не вижу... один компонент, разные lable... все нормально...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Написано все верно. И синтезатор тоже прав. Он просто оптимизирует схему, т. к. оба выхода функционально эквивалентны. Иногда действительно может потребоваться сохранение одинаковых элементов (для, например, выдерживания временных или нагрузочных параметров схемы), в этом случае нужно использовать специальные атрибуты или директивы синтезатора, чтобы запретить оптимизацию. По моему опыту это требуется крайне редко, думаю Вам не стоит этим заморачиваться. Но понимать почему так, надо обязательно.

 

PS: никакая вставка буферов и т. д. не поможет, умный синтезатор все равно все лишнее выкинет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

PS: никакая вставка буферов и т. д. не поможет, умный синтезатор все равно все лишнее выкинет.

 

 

На самом деле при проектировании скоростных схем часто приходится дублировать, например, выходной сигнал контакта ПЛИС. Эта копия должна используется в алгоритме работы контроллера. Ситуация осложняется тем, что выходной сигнал формируется в блоке ввода-вывода, и защелкивается там же в триггере OFD, а копия сигнала должна формироваться тоже триггером. Возникает вопрос, какая аналогия с темой обсуждения? Аналогия следующая: для формирования двух сигналов создаются два процесса, которые можно определить и в отдельные модули. Естественно, если не предпринять никаких мер, то синтезатор минимизирует схему и реализует один процесс с разветвлением сигнала на два потребителя: блок ввода-вывода и внутренний контроллер. Однако при этом не получится реализовать триггер в блоке ввода-вывода (и соответственно заданные временные параметры). Другим примером может быть подобное распараллеливание внутри кристалла для уменьшения задержек, т.к. зачастую разветвление одного сигнала на несколько потребителей снижает быстродействие (тактовую частоту) в сравнении с дублированием узлов, формирующих данный сигнал. Поэтому иногда

приходится жертвовать ресурсами для получения заданного быстродействия.

 

Для решения данной задачи есть способ указать синтезатору на то, чтобы он не оптимизировал (удалял второй экземпляр) логику. Это - аттрибуты. Для Synplify - это атрибут "syn_keep", для Leonardo тоже что-то есть, но я не помню.

 

Этот атрибут запрещает оптимизировать (удалять) данный сигнал.

 

Ниже приведу "подправленный" пример, представленный в первом сообщении.

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity top is
  Port ( intop1 : in std_logic;
         intop2 : in std_logic;
         outtop1 : out std_logic;
         outtop2 : out std_logic);
end top;

architecture Behavioral of top is
COMPONENT low1
PORT(
in1 : IN std_logic;
in2 : IN std_logic;          
out1 : OUT std_logic
);
END COMPONENT;

  ---************   advanced   *********************---
  --- additional signals (copy) ---
    signal intop1_copy1 : std_logic;
    signal intop1_copy2 : std_logic;
    signal intop2_copy1 : std_logic;
    signal intop2_copy2 : std_logic;

  --- new attribute ---
  attribute syn_keep : boolean;
  attribute syn_keep of intop1_copy1, intop1_copy2, intop2_copy1, intop2_copy2: signal is true;



begin
  --- signal copy ---
    intop1_copy1 <= intop1;
    intop1_copy2 <= intop1;
    intop2_copy1 <= intop2;
    intop2_copy2 <= intop2;
  

 Inst_low1: low1 PORT MAP( in1 => intop1_copy1, in2 => intop2_copy_1, out1 => outtop1);
 Inst_low2: low1 PORT MAP( in1 => intop1_copy2, in2 => intop2_copy_2, out1 => outtop2);

end Behavioral;

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...