Чем сигнал отличается от переменной в VHDL
В предыдущем уроке мы узнали, как объявить переменную в процессе. Переменные хороши для создания алгоритмов внутри процесса, но они недоступны для внешнего мира. Если область действия переменной находится только в пределах одного процесса, как она может взаимодействовать с любой другой логикой? Решением для этого является сигнал .
Сигналы объявляются между architecture <architecture_name> of <entity_name> is
строка и begin
операторы в файле VHDL. Это называется декларативной частью архитектуры.
Эта запись в блоге является частью серии учебных пособий по основам VHDL.
Синтаксис объявления сигнала:signal <name> : <type>;
При желании сигнал может быть объявлен с начальным значением:signal <name> : <type> := <initial_value>;
Упражнение
В этом видеоуроке мы научимся объявлять сигнал. Мы также узнаем основное различие между переменной и сигналом:
Окончательный код, который мы создали в этом руководстве:
06
Вывод в консоль симулятора, когда мы нажали кнопку запуска в ModelSim:
15
Анализ
Мы создали сигнал и переменную с одинаковым начальным значением 0. В нашем процессе мы обращались с ними точно так же, но распечатки показывают, что они вели себя по-разному. Сначала мы увидели, что присваивание переменной и сигналу в VHDL записывается по-разному. Присвоение переменной использует
:=
оператор, в то время как назначение сигнала использует<=
оператор.
MyVariable
ведет себя так, как можно было бы ожидать от переменной. В первой итерации цикла оно увеличивается до 1, а затем до 2. Последняя распечатка из первой итерации показывает, что его значение по-прежнему равно 2, как и следовало ожидать.
MySignal
ведет себя немного иначе. Первое приращение +1, похоже, не имеет никакого эффекта. Распечатка показывает, что его значение по-прежнему равно 0, начальному значению. То же самое верно и после второго приращения +1. Теперь значениеMyVariable
равно 2, но значениеMySignal
по-прежнему 0. Послеwait for 10 ns;
третья распечатка показывает, что значениеMySignal
теперь равно 1. Последующие распечатки также следуют этому шаблону.Что это за колдовство? Я дам вам подсказку,
wait for 10 ns;
имеет какое-то отношение к этому. Сигналы обновляются только тогда, когда процесс приостановлен. Наш процесс приостанавливается только в одном месте, вwait for 10 ns;
. Таким образом, значение сигнала меняется только каждый раз, когда эта линия попадает. 10 наносекунд — это произвольное значение, это может быть что угодно, даже 0 наносекунд. Попробуйте!Другим важным наблюдением является то, что событие, несмотря на то, что сигнал был дважды увеличен до
wait
, его значение увеличивается только один раз. Это связано с тем, что при назначении сигналу в процессе последнее назначение «выигрывает».<=
оператор только назначает новое значение на сигнал, оно не изменяется до тех пор, пока не будетwait
. Следовательно, при втором приращенииMySignal
, 1 добавляется к его старому ценность. При повторном увеличении первое приращение полностью теряется.
Вывод
- Переменная может использоваться в рамках одного процесса, тогда как сигналы имеют более широкий охват.
- Назначение переменной вступает в силу немедленно, а сигналы обновляются только тогда, когда процесс приостанавливается.
- Если сигнал назначается несколько раз без
wait
, последнее задание «выигрывает»
Перейти к следующему руководству »
VHDL
- Подписанный и неподписанный в VHDL
- Переменные — пример VHDL
- Чем облачные вычисления отличаются от традиционных вычислений?
- Как создать список строк в VHDL
- Как остановить симуляцию в тестовом стенде VHDL
- Как создать ШИМ-контроллер на VHDL
- Как генерировать случайные числа в VHDL
- Как использовать процедуру в процессе в VHDL
- Как использовать функцию в VHDL
- Что такое навигационная спутниковая система BeiDou? Чем он отличается от GPS?