сигнал против переменной

#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. Справедливо, у каждого есть свои стили. Я склонен немного перемещаться по мере сокращения, и я просто основывал свои комментарии на сделанных мною наблюдениях. В их использовании нет ничего «неправильного».