#variables #signals #vhdl
#переменные #сигналы #vhdl
Вопрос:
VHDL предоставляет два основных типа объектов для хранения данных: namel signal
и variable
, но я нигде не могу найти четкого указания на то, когда использовать один тип данных поверх другого. Может ли кто-нибудь пролить некоторый свет на свои сильные стороны / ограничения / область применения / синтез / ситуации, в которых использование одного было бы лучше, чем другого?
Ответ №1:
Сигналы могут использоваться для передачи значений между процессами. Переменные не могут. Есть 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
Одна вещь, которую следует учитывать при использовании сигналов (в синхронизированных процессах), заключается в том, что они всегда выводят регистр и, следовательно, приводят к задержке.
Ответ №2:
Как говорили другие, сигналы обновляются с их новым значением в конце временного интервала, но переменные обновляются немедленно.
// inside some process
// varA = sigA = 0. sigB = 2
varA := sigB 1; // varA is now 3
sigC <= varA 1; // sigC will be 4
sigA <= sigB 1; // sigA will be 3
sigD <= sigA 1; // sigD will be 1 (original sigA 1)
Для проектирования оборудования я использую переменные очень редко. Обычно, когда я взламываю какую-то функцию, которая действительно нуждается в пересмотре кода, но у меня крайний срок. Я избегаю их, потому что нахожу ментальную модель работы с сигналами и переменными слишком разной, чтобы хорошо уживаться в одном фрагменте кода. Это не значит, что это невозможно сделать, но я думаю, что большинство инженеров RTL избегают смешивания… и вы не можете избежать сигналов.
Другие моменты:
- Сигналы имеют область видимости объекта. Переменные являются локальными для процесса.
- Оба синтезируют
Комментарии:
1. Это нормально, если вы не используете переменные, но многие инженеры используют их постоянно. Одним из общедоступных примеров является GRLIB / LEON3, который используется в аэрокосмических приложениях.
2. Справедливо, у каждого есть свои стили. Я склонен немного перемещаться по мере сокращения, и я просто основывал свои комментарии на сделанных мною наблюдениях. В их использовании нет ничего «неправильного».