сигнал против переменной - PullRequest
2 голосов
/ 04 ноября 2011

VHDL предоставляет два основных типа объектов для хранения данных, namel signal и variable, но я не могу найти нигде, чтобы было ясно, когда использовать один тип данных над другим. Может ли кто-нибудь пролить свет на их сильные стороны / ограничения / возможности / синтез / ситуации, в которых использование одного было бы лучше, чем другого?

Ответы [ 2 ]

5 голосов
/ 04 ноября 2011

Сигналы могут использоваться для передачи значений между процессами.Переменные не могут.Есть 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

Одна вещь, которую нужно наблюдать при использовании сигналов (в синхронизированных процессах), заключается в том, что они всегда выводят регистр и, следовательно, приводят к задержке.

3 голосов
/ 04 ноября 2011

Как уже говорили, сигналы обновляются в соответствии с их новым значением в конце временного интервала, но переменные обновляются немедленно.

// 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 избегают микширования ... и вы не можете избежать сигналов.

Другие баллы:

  • Сигналы имеют видимость объекта. Переменные являются локальными для процесса.
  • Оба синтезируют
...