Как назначение сигнала работает в процессе?

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

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

В этом примере сказано следующее:

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

Ну, мне нужно понять некоторые вещи:

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

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

Номер возможности 1) Значение в x изменяется так, что x имеет новое значение. Обновлен второй сигнал z, обновлен первый сигнал x и, учитывая, что z зависит от x, его значение изменяется на основе НОВОГО ОБНОВЛЕННОГО значения x. И пример должен работать нормально.

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

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

Ответ 1

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

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

Jan Decaluwe более подробно объясняет этот материал здесь: http://www.sigasi.com/content/vhdls-crown-jewel

Ответ 2

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

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

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

Z будет присвоен not X old value, но не до конца процесса

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

Ответ 3

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

сигнал x, y, clk; Процесс (CLK) начать   x <= y конечный процесс

Это создает синхронную защелку, флип-флоп.

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

Мое понимание всего предмета таково:

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

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

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