Как назначение сигналов работает в процессе? - PullRequest
13 голосов
/ 21 февраля 2011

Я узнал, что сигнал изменяется не сразу при столкновении с выражением, а когда процесс заканчивается. В этом примере здесь:

...
signal x,y,z : bit;
...
process (y)
begin
  x<=y;
  z<=not x;
end process;

Пример говорит это:

Если сигнал у изменится, то событие будет запланировано на х, чтобы сделать его таким же, как у. Кроме того, событие запланировано на z, чтобы сделать его противоположным x. Вопрос в том, будет ли значение z противоположным y? Конечно, ответ отрицательный, потому что при выполнении второго оператора событие в x еще не было обработано, и запланированное на z событие будет противоположно значению x до начала процесса.

Ну, мне нужно кое-что понять:

  1. Из того, что я узнал, значения сигналов обновляются только в конце процесса . Это правильно?
  2. Сигнал x обновляется как первый оператор. Это по-прежнему не меняет значение x, это изменение помещается в очередь для выполнения после завершения процесса. Таким образом, все после этого оператора x <= y не увидит изменения и увидит x, имеющее старое значение. Это правильно?
  3. Второе утверждение - попытка изменить значение сигнала z. То же самое здесь, z не изменит свое значение, но это зависит от значения другого процесса. Изменение на z будет помещено в очередь для выполнения в конце процесса. Это правильно?

Что происходит в конце процесса?

Номер возможности 1) Значение в x изменено, поэтому x имеет новое значение. Второй сигнал z обновлен, первый сигнал x обновлен и, учитывая, что z зависит от x, его значение изменяется на основе значения NEW UPDATED x. И пример должен работать нормально.

Номер возможности 2) Значение в x изменено, поэтому x имеет новое значение. Второй сигнал z обновлен. Учитывая, что z было присвоено старое значение x, это значение, которое будет содержать z, старое значение x, которое было обновлено, но это обновление не рассматривается.

Не могли бы вы сказать мне, какой из них правильный путь?

Ответы [ 3 ]

11 голосов
/ 21 февраля 2011

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

a := '1'; -- variable
assert a = 1;
b <= '1'; -- signal
computationUsing(b); --reads old value of b
-- new value will be visible after this process ends or some time passes

Ян Декалаве объясняет это более подробно здесь: http://www.sigasi.com/content/vhdls-crown-jewel

6 голосов
/ 21 февраля 2011

Как это работает:

Y изменяется и процесс начинается.

X будет присвоено тому, что Y's value является текущим, но не до концапроцесс

Z будет назначен на not X's old value, но не до конца процесса

Процесс завершится, поэтому теперь X и Z будут обновлены

0 голосов
/ 29 сентября 2013

Я не согласен с постом Ашрафа. Я сам сделал VHDL-код, где переменные - это провода, а сигналы - защелки. Примеры:

сигнал x, y, clk; Процесс (CLK) начать х <= у конец процесса </p>

Создается синхронная защелка, триггер.

Любая переменная, которая не присваивает свое значение сигналу, а только другим переменным, является вполне приемлемым «проводом».

Мое понимание всей темы таково:

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

О "ОК КОНЕЦ ПРОЦЕССА: Что это происходит ?????":

Я думаю, что назначение сигнала будет происходить в кратчайшие сроки, когда это позволяет использовать аппаратное обеспечение процесса. ИСКЛЮЧЕНИЕ: Изменения в пределах if (rise_edge (clk)) произойдут в начале следующего тактового цикла.

...