Как назначение сигнала работает в процессе?
Я узнал, что сигнал сразу не изменяется при встрече с выражением, но когда процесс заканчивается. В этом примере:
...
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)) будут выполняться в начале следующего тактового цикла.