Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VHDL.pdf
Скачиваний:
179
Добавлен:
10.02.2015
Размер:
730 Кб
Скачать
☆

программиста. Тем не менее, оператор case предпочтительнее, когда выбор ветви алгоритма связан с одной переменной, принимающей дискретное множество значений. Иногда набор условий легко приводится к одной такой переменной.

4.7.3. Оператор ожидания

Исполнение операторов, записанных в теле процесса, приостанавливается, если оче-

редной оператор является оператором ожидания (фактически — оператором приостано-

ва) wait. При этом результаты исполнения предшествующих операторов заносятся в календарь событий и могут быть инициализированы другие процессы. Прекращение состояния приостанова процесса зависит от условий, определенных в операторе wait. Определено несколько модификаций оператора wait:

<оператор ожидания>::= wait;

| wait on <имя сигнала> {,<имя сигнала>}; | wait until <условие>;

| wait for <выражение времени>;

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

Список сигналов в варианте wait on эквивалентен списку чувствительности процесса: исполнение будет продолжено после того, как один из сигналов списка изменит свое значение.

Приостанов, заданный конструкцией wait until, заканчивается, когда выполнено определенное оператором условие, т. е. соответствующее выражение принимает значение true.

Вариант ожидания по времени иллюстрируется процессом generator. Данный процесс выполняется бесконечно, приостанавливаясь каждые 50 ns модельного времени, причем перед приостановом уровень сигнала clock меняется на противоположный. В момент приостанова могут быть инициированы параллельные операторы программы, в том числе другие процессы.

generator: process begin

clock <= '0'; wait for 50 ns;

clock <= not clock; end process generator;

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

30

не вышло. Еще раз напомним, что оператор wait, как и другие последовательные операторы, может размещаться только в теле процесса или теле подпрограммы.

4.7.4. Операторы повторения

Операторы повторения loop позволяют сокращенно записывать совокупности однотипных действий.

<оператор повторения>::=

[<метка оператора повторения>:] [<итерационная схема>] loop <оператор> {<оператор>}

end loop [<метка оператора повторения>];

<итерационная схема>::= while <условие>

| for <имя переменной> in <диапазон>

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

ределяется итерационной схемой.

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

Оператор с ключевым словом while обязательно должен содержать в теле цикла операторы, изменяющие описанное в итерационной схеме условие. Операторы цикла повторяются, пока при вычислении условия не получается значения false. Условие проверяется каждый раз перед исполнением тела цикла.

Оператор повторения с ключевым словом for повторяется для всех значений переменной из заданного итерационной схемой диапазона.

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

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

31

Число устройств определяется итерационной схемой. Для оператора с ключевым словом for — это просто число значений переменной в объявленном диапазоне. Для варианта с ключевым словом while условие не может быть связано с сигнальными данными, способными изменяться в реальном устройстве. Операторы повторения должны иметь логически постоянные границы, т.к. в противном случае не ясно, сколько повторяющихся блоков в устройстве реально потребуется.

Кроме раздела итерационная схема порядок реализации повторений может задаваться дополнительными операторами: оператором перехода к следующему циклу next и оператором выхода из цикла exit.

Оператор next блокирует исполнение всех последующих операторов в текущем цикле и обеспечивает автоматический переход к следующей итерации.

Оператор записывается следующим образом:

<оператор перехода к следующей итерации>::=

[<метка>:] next [<метка оператора повторения>] [when <условие>]

Оператор exit прекращает исполнение не только текущего цикла, но и всех последующих циклов, заданных итерационной схемой исполняемого оператора. Синтаксис оператора exit имеет вид:

<оператор прекращения цикла>::=

[<метка>:] exit [<метка оператора повторения>] [when <условие>]

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

4.7.5. Операторы проверки

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

<оператор проверки>::= assert <булевское выражение> [report <строка сообщения>]

[severity <уровень важности>];

При выполнении этого оператора в процессе моделирования проверяется условие и, если получено значение true, выполняется переход к следующему оператору программы. В противном случае на терминал выводится строка сообщения. Если опция report <строка сообщения> отсутствует, выдается стандартное сообщение Assertion violation (нарушение условий проверки). После этого поведение программы моделирования определяется значением уровня важности. Уровень важности — это выражение (обычно константа) типа severity_level. Напомним, что данные этого типа могут принимать четыре значения, причем действия, которые выполняются при значении булевского выражения false зада-

32

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