реклама на сайте
подробности

 
 
> Как правильно вставить две одинаковые компоненты?, вопрос новичка
asya
сообщение May 16 2005, 23:39
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 43
Регистрация: 4-02-05
Пользователь №: 2 412



Учусь работать с компонентами. Задача: вставить две одинаковые компоненты. Т.е. например есть два входа и два выхода. первая компонента складывает оба входа и подает на первый выход. Вторая такая же компонента делает тоже самое, только на второй выход. Написал вот такой вот код:
Код
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 - работает как и написано (с отключенным вторым выходом).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
CITY
сообщение May 17 2005, 02:42
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 52
Регистрация: 23-04-05
Пользователь №: 4 422



в данном случае могу сказать - компилятор прав! biggrin.gif
на самом деле повторяющиеся блоки, ведущие к получению такого же результата, он выкидывает... по поводу того, как писать, чтоб не выкинул... очевидно, что самый простой способ - завести на входы разные сигналы - тогда не выкинет... ну еще можешь попробовать через буфер туда данные кидать...
Go to the top of the page
 
+Quote Post
asya
сообщение May 17 2005, 23:09
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 43
Регистрация: 4-02-05
Пользователь №: 2 412



Цитата(CITY @ May 17 2005, 06:42)
в данном случае могу сказать - компилятор прав!  biggrin.gif
на самом деле повторяющиеся блоки, ведущие к получению такого же результата, он выкидывает... по поводу того, как писать, чтоб не выкинул... очевидно, что самый простой способ - завести на входы разные сигналы - тогда не выкинет... ну еще можешь попробовать через буфер туда данные кидать...
*

аааа. понятно. т.е. я написал все правильно - просто неумно это? а если подам разные сигналы, то он не выкинет?
Go to the top of the page
 
+Quote Post
CITY
сообщение May 18 2005, 02:44
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 52
Регистрация: 23-04-05
Пользователь №: 4 422



не выкинет... в общем-то проблем никаких не вижу... один компонент, разные lable... все нормально...
Go to the top of the page
 
+Quote Post
oval
сообщение May 18 2005, 11:27
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 265
Регистрация: 15-03-05
Из: Москва
Пользователь №: 3 367



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

PS: никакая вставка буферов и т. д. не поможет, умный синтезатор все равно все лишнее выкинет.
Go to the top of the page
 
+Quote Post
Genn
сообщение May 18 2005, 18:35
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 48
Регистрация: 14-04-05
Пользователь №: 4 146



Цитата(oval @ May 18 2005, 14:27)
...
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;


Следует обратить внимание на логическую связь: не сокращаются входные сигналы модулей (они считаются разными и несвязанными), поэтому следующая за ними логика синтезируется не обращая внимание на то, что существует другой аналогичный экземпляр.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 19:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016