Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
XilinxCourse_v2.0.doc
Скачиваний:
80
Добавлен:
22.04.2019
Размер:
3.26 Mб
Скачать

4.4.2 Блок always

Блок always служит для упрощения описания цифровой аппаратуры. Как было отмечено ранее, в теле модуля все конструкции выполняются параллельно, что соответствует реальному функционированию аппаратуры. Однако блок always позволяет отойти от этого правила и выполнять операторы последовательно. Несмотря на это, блок always может быть успешно синтезирован, если в процессе его описания разработчик будет следовать некоторым правилам и шаблонам, с другой стороны, использование данной техники может привести к ненужному усложнению реализации или ошибкам на стадии синтеза.

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

Упрощенный синтаксис блока always представлен на рисунке 4.4.2.

Рисунок 4.4.2 — Упрощенный синтаксис блока always

  • [sens_list] – Список сигналов и событий, на которые реагирует постоянный блок. Это те события, при наступлении которых always блок начинает свою работу и выполняет внутренние процедурные операторы. Для комбинационных схем все входные сигналы должны быть включены в этот лист, для чего используется символ «*». Тело составлено из некоторого набора процедурных операторов. Разделители begin и end могут быть пропущены, если в теле имеется только один оператор. Можно также сказать, что такой блок представляет собой бесконечный цикл;

  • [label] – Данная конструкция служит для облегчения чтения кода и является опциональной;

  • [data_type] – Тип сигнала, переменной и т.д. При этом, стоит отметить, что в блоке always нельзя использовать тип сигнала wire. Вместо этого нужно пользоваться типом сигнала reg;

  • [data_name] – Название сигнала, переменной и т.д.;

  • [proc_statement] – Процедурное присваивание.

Процедурное присваивание может быть использовано только внутри блока always или блока initial (о нем позже). Есть два типа присваивания: блокирующее присваивание и не блокирующее присваивание. Их базовый синтаксис представлен на рисунке 4.4.3:

Рисунок 4.4.3 — Базовый синтаксис блокирующего и неблокирующего присваиваний

  • [variable_name] – Название сигнала или переменной;

  • [expression] – Некоторое выражение.

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

Для выбора нужного типа процедурного присваивания можно пользоваться простыми правилами:

  • для комбинационных схем, используйте блокирующее присваивание;

  • для последовательных схем, используйте не блокирующее присваивание.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]