Является ли процесс в реестре VHDL?

Возможно ли выполнить два или более последовательных прогона для процесса в VHDL?

Что произойдет, если произойдет другое событие (в списке сигналов чувствительности), в то время как последовательное выполнение процесса не завершено?

Возможно ли это или моя модель VHDL для процесса полностью неправильна?

Ответ 1

Событие не будет происходить во время выполнения процесса!

Когда процесс пробуждается событием, он запускается до завершения ( "конечный процесс" ) или явного выражения "wait" и переходит в режим сна. Это занимает, как правило, время ZERO. Это означает, что если у вас есть циклы в вашем процессе, они эффективно развернуты полностью, и когда вы синтезируете, вы создадите достаточно аппаратного обеспечения для запуска КАЖДОЙ итерации параллельно. Кроме того, любые процедуры, функции и т.д. Принимают нулевое время - если только они не содержат явного выражения ожидания (в этом случае процесс приостанавливается при "ожидании", как если бы процедура была встроена).

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

Когда процесс приостанавливается (при "wait" или "end process" ), ничего не происходит до тех пор, пока ВСЕ другие процессы также не приостанавливаются. (Но помните, что все они берут нулевое время!). Если процесс приостанавливается в "конечном процессе", он перезапускается с самого начала, когда его список чувствительности пробуждает его. Если он приостанавливается при явном "ожидании", "wait" будет указывать событие или будущее время, которое перезапустит его после "Wait". (ПРИМЕЧАНИЯ: 1: не смешивайте список чувствительности и стили ожидания в том же процессе! 2: Wait До тех пор, пока какое-либо событие не будет синтезировано (хотя некоторые инструменты могут возражать); Подождите некоторое время только для моделирования)

Затем все назначения сигналов выполняются. Поскольку все процессы спали, это устраняет все условия гонки и временные опасности. Некоторые из этих назначений (например, "1" на часах) заставят события планироваться на чувствительных к ним процессах.

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

Это продолжается до тех пор, пока не произойдет дельта-цикл, в котором запланированы НЕТ новых событий, и, наконец, симуляция может продвигаться на шаг в реальном времени.

Таким образом,

process(clk)
begin
if rising_edge(clk) then
   A <= B;
   B <= A;
end if;
end process;

не опасен в VHDL.

Если вам когда-либо понадобится использовать Verilog, имейте в виду, что некоторые из них происходят по-другому, и вы не можете полагаться на тот же уровень предсказуемости результатов моделирования.


В синтезе, конечно же, мы создаем аппаратное обеспечение, которое займет некоторое время для выполнения этого процесса. Тем не менее, синтез и вспомогательные средства (место и маршрут) гарантируют, что они добросовестно подчиняются этой модели или не могут сообщить о том, почему они потерпели неудачу. Например, они суммируют все реальные задержки и проверяют, что сумма меньше указанного периода времени. (Если вы не установили слишком высокую тактовую частоту!).

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

Ответ 2

При запуске с использованием VHDL (или любого другого HDL, если на то пошло) очень важно отказаться от всех понятий последовательного кода и вместо этого сосредоточиться на потоке данных через аппаратное обеспечение. В аппаратном обеспечении все по сути является параллельным (все происходит одновременно), но использует постоянно изменяющиеся данные (входные сигналы) для вычисления постоянно изменяющихся результатов (выходные сигналы)!

Не вдаваясь в более сложные темы, такие как переменные, команды ожидания и т.д., все внутри процесса происходит одновременно. Если конфликтующие вещи происходят в одном и том же процессе (многократная запись на один и тот же сигнал), выигрывает последний оператор процесса, который часто возникает из-за путаницы в отношении "последовательного" кода в VHDL.

Это работает благодаря тому, что значения присваиваются сигналам. При присвоении значения сигналу значение сигнала сразу не изменяется! Вместо этого назначенное значение запоминается и будет передано как фактическое значение сигнала позже (при подготовке к следующему дельта-циклу, который фактически является следующим квантом времени).

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

Если процесс чувствителен к сигналу, который он также записывает, у вас есть так называемый комбинаторный цикл, например, затвор, в который вывод подает вход. Это (почти) всегда является ошибкой в ​​вашей схеме и обычно заставляет тренажеры вводить бесконечный цикл цикла дельта-цикла.

Это все, что я сейчас напишу, поскольку ответ Брайана Драммонда просто появился, когда я писал это, но не стесняйтесь оставлять комментарий, и я добавлю еще несколько деталей.

Ответ 4

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