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

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

...
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 до начала процесса.

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

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

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

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

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

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


person Andry    schedule 20.02.2011    source источник


Ответы (3)


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

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

person Philippe    schedule 21.02.2011
comment
Спасибо, Филипп, сейчас немного лучше, но я до сих пор не понимаю, почему пример не работает. Я имею в виду, что первый оператор пытается присвоить x te значение y. Хорошо, это назначение выполняется в конце процесса, поэтому, когда я снова использую сигнал x для обновления другого сигнала, у меня нет значения этого сигнала. Я предполагаю, что все выражения обработки сигналов хранятся в очереди, чтобы они обрабатывались в конце процесса. В конце процесса рассматривается очередь назначения сигналов и обновляется x, а после этого обновляется и z .... что я ошибаюсь? - person Andry; 21.02.2011
comment
@Andry Запланированное значение сигнала может быть перезаписано последовательным назначением сигнала позже в процессе. - person Jan Decaluwe; 21.02.2011
comment
@Jan Мне очень жаль, Ян, но я все еще не понимаю. Может быть, этот аргумент мне трудно понять или ... я не знаю. Я просто хотел бы понять, почему этот пример не работает, пожалуйста, посмотрите мои правки. - person Andry; 21.02.2011
comment
@Andry: что ты не понимаешь? Это то, что вы указали в своей возможности (2) выше. z получает свое значение на основе старого значения x, потому что он не видит новое значение - person N.S.; 06.12.2018

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

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

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

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

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

person WuHoUnited    schedule 20.02.2011
comment
Но ... разве это не в последовательных операторах внутри архитектуры после предложения begin ????? Напротив, процесс - это просто способ, которым мы создаем последовательные операторы ... я прав ??? - person Andry; 21.02.2011
comment
Сам процесс может быть 1 последовательным оператором в списке других последовательных операторов. Вещи внутри процесса - нет. - person WuHoUnited; 21.02.2011
comment
Не верно. Оператор процесса сам по себе является параллельным оператором. Он содержит последовательные операторы, такие как назначения переменных и последовательные назначения сигналов. - person Jan Decaluwe; 21.02.2011
comment
Пожалуйста, примите решение, потому что я не очень хорошо это понимаю. Я с самого начала знал, что ВСЕ в операторе процесса выполняется последовательно, и это мне неоднократно демонстрировалось, поэтому я считаю это одним из столпов своих знаний. Пожалуйста, не разрушайте мою колонну :) - person Andry; 21.02.2011
comment
@ Андрей Я предлагаю решить для себя, кто здесь имеет смысл. Возьмите хороший учебник или LRM. Подсказка: существует разница между последовательной и переменной семантикой. - person Jan Decaluwe; 21.02.2011

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

сигнал x, y, clk; процесс (clk) начало x ‹= y конец процесса

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

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

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

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

О "ОК КОНЕЦ ПРОЦЕССА: Что случилось ?????":

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

person user1058795    schedule 29.09.2013
comment
ИСКЛЮЧЕНИЕ: неверно. Изменения в if rising_edge(clk) происходят во времени СЛЕДУЮЩЕГО ДЕЛЬТА-ЦИКЛА после края clk. Однако их видит только синхронизированный процесс в следующем тактовом цикле. - person user_1818839; 29.09.2013