asya 0 16 мая, 2005 Опубликовано 16 мая, 2005 · Жалоба Учусь работать с компонентами. Задача: вставить две одинаковые компоненты. Т.е. например есть два входа и два выхода. первая компонента складывает оба входа и подает на первый выход. Вторая такая же компонента делает тоже самое, только на второй выход. Написал вот такой вот код: 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 - работает как и написано (с отключенным вторым выходом). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CITY 0 17 мая, 2005 Опубликовано 17 мая, 2005 · Жалоба в данном случае могу сказать - компилятор прав! на самом деле повторяющиеся блоки, ведущие к получению такого же результата, он выкидывает... по поводу того, как писать, чтоб не выкинул... очевидно, что самый простой способ - завести на входы разные сигналы - тогда не выкинет... ну еще можешь попробовать через буфер туда данные кидать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asya 0 17 мая, 2005 Опубликовано 17 мая, 2005 · Жалоба в данном случае могу сказать - компилятор прав! на самом деле повторяющиеся блоки, ведущие к получению такого же результата, он выкидывает... по поводу того, как писать, чтоб не выкинул... очевидно, что самый простой способ - завести на входы разные сигналы - тогда не выкинет... ну еще можешь попробовать через буфер туда данные кидать... <{POST_SNAPBACK}> аааа. понятно. т.е. я написал все правильно - просто неумно это? а если подам разные сигналы, то он не выкинет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CITY 0 18 мая, 2005 Опубликовано 18 мая, 2005 · Жалоба не выкинет... в общем-то проблем никаких не вижу... один компонент, разные lable... все нормально... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
oval 0 18 мая, 2005 Опубликовано 18 мая, 2005 · Жалоба Написано все верно. И синтезатор тоже прав. Он просто оптимизирует схему, т. к. оба выхода функционально эквивалентны. Иногда действительно может потребоваться сохранение одинаковых элементов (для, например, выдерживания временных или нагрузочных параметров схемы), в этом случае нужно использовать специальные атрибуты или директивы синтезатора, чтобы запретить оптимизацию. По моему опыту это требуется крайне редко, думаю Вам не стоит этим заморачиваться. Но понимать почему так, надо обязательно. PS: никакая вставка буферов и т. д. не поможет, умный синтезатор все равно все лишнее выкинет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Genn 0 18 мая, 2005 Опубликовано 18 мая, 2005 · Жалоба ... PS: никакая вставка буферов и т. д. не поможет, умный синтезатор все равно все лишнее выкинет. <{POST_SNAPBACK}> На самом деле при проектировании скоростных схем часто приходится дублировать, например, выходной сигнал контакта ПЛИС. Эта копия должна используется в алгоритме работы контроллера. Ситуация осложняется тем, что выходной сигнал формируется в блоке ввода-вывода, и защелкивается там же в триггере 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; Следует обратить внимание на логическую связь: не сокращаются входные сигналы модулей (они считаются разными и несвязанными), поэтому следующая за ними логика синтезируется не обращая внимание на то, что существует другой аналогичный экземпляр. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться