Цитата(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;
Следует обратить внимание на логическую связь: не сокращаются входные сигналы модулей (они считаются разными и несвязанными), поэтому следующая за ними логика синтезируется не обращая внимание на то, что существует другой аналогичный экземпляр.