Сигналы могут использоваться для передачи значений между процессами.Переменные не могут.Есть shared variables
, которые могут в старых компиляторах, но вы действительно напрашиваетесь на проблемы (с условиями гонки), если вы делаете это - если вы не используете protected types
, которые немного похожи на классы.Тогда они одинаковы для использования в коммуникации, но не (насколько я знаю) синтезируемыми.
Это фундаментальное ограничение на коммуникацию исходит из того, как работают обновления сигналов и переменных.
БольшойРазличие заключается в том, что переменные обновляются сразу же после назначения (с помощью оператора :=
).Сигналы имеют обновление запланированное при назначении (с оператором <=
), но значение, которое каждый видит при чтении сигнала, не изменится, пока не пройдет некоторое время.
(За исключением: это количество времени может быть таким же маленьким, как дельта-цикл, который является наименьшим количеством времени в симуляторе VHDL - «реальное» время не проходит. Что-то вроде wait for 0 ps;
заставляет симулятордождитесь следующего дельта-цикла, прежде чем продолжить.)
Если вам нужна одна и та же логика для подачи в нескольких триггеров, переменная является хорошим способом разложить эту логику в одну точку, а некопирование / вставка кода.
С точки зрения логики, в рамках синхронизированного процесса сигналы всегда выводят триггер.Переменные могут использоваться как для комбинаторной логики, так и для вывода триггера.Иногда оба для одной и той же переменной.Некоторые думают, что это сбивает с толку, лично я думаю, что это нормально:
process (clk)
variable something : std_logic;
if rising_edge(clk) then
if reset = '1' then
something := '0';
else
output_b <= something or input c; -- using the previous clock's value of 'something' infers a register
something := input_a and input_b; -- comb. logic for a new value
output_a <= something or input_c; -- which is used immediately, not registered here
end if;
end if;
end process;
Одна вещь, которую нужно наблюдать с помощью переменных, заключается в том, что, поскольку, если они читаются после записи, никакой выходной регистр не используется, вы можете получить длинные цепочкилогики, которая может привести к пропуску вашей цели fmax
Одна вещь, которую нужно наблюдать при использовании сигналов (в синхронизированных процессах), заключается в том, что они всегда выводят регистр и, следовательно, приводят к задержке.