Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УчебПособ_Гончаровский.doc
Скачиваний:
17
Добавлен:
13.11.2019
Размер:
3.75 Mб
Скачать

1.10.2.3. Операторы присваивание и process [22]

Цифровые устройства функционируют непрерывно и параллельно. Множество компонентов схемы работают одновременно, формируя значения определенных сигналов. В результате в моделируемом устройстве параллельно, в физическом времени, происходит множество изменений состояния сигналов. Соответственно, и в модели устройства изменения значений сигналов должны производиться параллельно, в модельном времени. Это определяет построение VHDL как языка параллельного по своей природе.

Тело архитектурного описания специфицируемого объекта, заключенное между begin и end, содержит совокупность параллельных операторов. Это определяет построение VHDL как языка параллельного по своей природе. Последовательность записи параллельных операторов в теле архитектурного описания значения не имеет. Порядок выполнения определяется не порядком их текстуальной записи, а другими правилами. Основным принципом здесь является управление от потока изменений сигналов, входных для параллельного оператора. Событие изменения сигнала, являющегося входным для параллельного оператора, запускает срабатывание данного оператора.

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

В VHDL существует два вида операторов присвоения значения: переменной и сигналу. Синтаксис оператора присвоения значения переменной:

Идентификатор переменной:= выражение;

Этот оператор присвоения выполняется как в обычных языках программирования.

Понятие сигнала не имеет аналогов в традиционных языках программирования высокого уровня типа C, PASCAL и др. Цифровые устройства работают во времени, преобразуя и передавая сигналы. Поэтому понятие сигнала является базовым в VHDL. Сигналы являются абстракцией, представлением в модели на VHDL состояния проводников в структуре цифрового устройства.

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

Модельное время – это время в модели устройства. Модельное время является обобщенным представлением физического времени, в котором работает моделируемое устройство. Модельное время дискретно.

Время моделирования – это время выполнения программы на VHDL. В семантике программы на VHDL оно напрямую не наблюдается, однако, проявляется через упорядочение операторов программы по времени выполнения. Не имея для программиста на VHDL числовых значений, время работы системы моделирования позволяет определить отношение порядка над событиями – выполнением операторов программы на VHDL. Для каждой пары исполняемых операторов программы определены отношения «выполнен раньше»/«выполнен позже».

Изменение сигнала на входе некоторого элемента может привести к изменению сигналы на его выходе, но не мгновенно, а через интервал времени td, определяемый задержкой элемента. Таким образом, подавая сигнал на вход элемента в момент времени t1, мы как бы “запланировали” изменение сигнала на его выходе на время t2=t1+td.

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

Переменная характеризуется только значением, тогда как сигнал парой значений – значение момента модельного времени/значение уровня сигнала, которое сигнал имеет в этот момент времени. Последовательность значений сигнала в привязке к моментам модельного времени в течение некоторого промежутка времени формирует временную диаграмму сигнала. В модели устройства на VHDL воздействие, изменяющее состояние сигнала, принимает форму присвоения значения сигналу.

Параллельный оператор присваивания значения сигналу имеет следующий синтаксис:

Идентификатор сигнала <= выражение;

Идентификатор сигнала <= transport выражение after величина задержки;

Идентификатор сигнала <= выражение after величина задержки;

Идентификатор сигнала <= reject время inertial выражение after величина задержки;

Оператор присваивания значения сигналу <= включает в себя как определение нового значения сигнала (выражение), так и определение момента времени, в который сигнал примет это новое значение (after величина задержки). Префиксы transport и inertial используются для представления моделей транспортной и инерциальной задержек.

Для оператора присвоения значения сигналу без пункта after (первая форма оператора) изменение сигнала будет иметь место после бесконечно малой величины времени, называемой δ-задежкой, но не мгновенно. Из всех операторов присваивания только этот оператор является синтезируемым.

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

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

signal имя1,имя2, …, имяN: идентификатор_типа [:=начальное значение];

Например: signal flag: bit:=’1’;

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

[метка_процесса:] process [(список_сигналов)] [is]

[декларативная_часть_процесса;]

begin

последовательные_операторы;

end process [метка_процесса];

«Список_сигналов» в круглых скобках называется списком чувствительности. Если в описании процесса задан список чувствительности, то процесс активизируется при изменении значения любого из этих сигналов. Если список чувствительности отсутствует, то процесс активизируется при изменении любого сигнала в модели, если не указано иное с помощью операторов ожидания внутри самого процесса. Для синтеза список чувствительности не имеет значения. Когда по программе на VHDL выполняется синтез, для процесса синтезируется фрагмент схемы, использующий все сигналы, указанные в теле процесса, т.е. синтезирующий компилятор игнорирует список чувствительности.

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

В секции «декларативная_часть_процесса» могут включаться описания локальных констант, типов и переменных, используемых в процессе. Сигналы не могут быть описаны как локальные данные процесса.

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

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

Оператор wait позволяет управлять моментами времени, в которые параллельные операторы будут реагировать на изменения сигналов. Операторы ожидания имеют следующий синтаксис:

wait [on имя_сигнала {, …}]

[until булево_выражение]

[for выражение_времени] ;

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

Для синтеза используется секция until, позволяющая определить булево выражение, которое должно иметь значение true (для того, чтобы процесс продолжил выполнение после этой инструкции). Если же в момент выполнения оператора wait условие уже имело значение true, то выполнение процесса будет продолжено только после того , как заданное условие сначала примет значение false, потом вновь значение true.

Рассмотрим модель синхронного (по фронту) D-триггера.

Пусть:

signal c,d,q: bit; -- с-вход синхронизации

--d-вход данных

--q-выход

тогда

process

begin

wait until rising_edge( с);

q<=d;

end process;

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