ПРОБЛЕМНО-ОРИЕНТИРОВАННАЯ СОСТАВЛЯЮЩАЯ ЯЗЫКА

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

Параллельные операторы определяют параллельное (во времени) поведение проекта,

и порядок их выполнения не связан с порядком их появления внутри архитектурного типа данного иерархического уровня. К параллельным операторам этого типа принадлежат:

• оператор процесса (Process Statement);

• оператор блока (Block Statement);

• оператор условного назначения сигнала (Condition Signal Assignment Statement);

• оператор выборочного назначения сигнала (Selected Signal Assignment Statement);

• оператор параллельного вызова процедуры (Procedure Call Statement);

• оператор параллельного сообщения (Assert Statement);

При создании структуры соединений объектов используются два параллельных оператора — оператор конкретизации (создания экземпляра) компонента (Component Instantiation Statement) и оператор генерации. Альтернативным вариантом задания компонент и их соединений между собой является понятие блока.

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

 

СТРУКТУРНОЕ ОПИСАНИЕ

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

Определение тела объекта (модуля проекта)

<Architecture_Declaration>::=

ARCHITECTURE<имя_архитектуры_объекта>OF<имя_объекта>IS

—объявление конфигурации

— объявление глобальных переменных и констант

— объявление функции и подпрограмм

—объявление сигналов

[{SIGNAL<Список_имён>:<тип>;}]

—объявление компонент

[{COMPONENT<имя_типа_компонента>

[GENERIC(<параметры_настройки>);]

[PORT(<имя_имен_входов>:IN<тип>);

<список_имен_выходов>: OUT<тип>;]

END COMPONENT;}]

BEGIN

—описание структурного соединения

[{<имя_компонента>:< имя_типа_компонента>

[GENERIC МАР (<список_настроек>);]

РОRT МАР (<список сигналов>);]

— описание поведения

[<параллельные_операторы>]

END [<имя_архитектуры_объекта>];

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

Оператор конкретизации компонента

Определение оператора.

<Component_Instantiation_Statement>::=

<имя_компонента>: <имя_типа компонента>

[GENERIC МАР(<параметры_настройки>)]

[PORT МАР(<параметры соединения>)];

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

Альтернативным вариантом разбиения проекта на отдельные структурные элементы (декомпозицию проекта) является использование оператора блока.

Оператор-блок (Block Statement)

Определение.

< Block_Statement>::=

<метка_блока>: ВLОСК [(<охранное_выражениение>)]

[GENERIC (<список_парметров_настройки>);]

[GENERIC МАР (<список_настроек>);]

РОRТ (<список_выводов>);

РОRТ МАР (<список_соединений>);

<декларации_блока>;

BEGIN

<параллельные_операторы>

END BLOCK <метка_блока>;

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

В разделе деклараций блока могут размещаться: декларации подпрограмм; тела подпрограмм; типы, подтипы; декларации констант; константы; декларации атрибутов; спецификации атрибутов; альтернативные точки входа; сигналы. Использование конструкции «охранное выражение» позволяет блокировать выполнение охраняемых (сопровождаемых опцией GUARDED) параллельных операторов назначения сигналов в теле блока.

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

Оператор генерации (Generate Statement)

Описание оператора.

<Generate_Statement>::=<метка>: FOR<параметр>IN<диапазон>GENERATE

| IF<условие> GENERATE

<параллельные операторы>

END GENERATE[<метка>]

Оператор генерации является удобным механизмом для описания объединения компонентов в регулярных структурах. Наличие вариантов FOR и IF упрощает создание структур с некоторыми вариациями начальных и конечных компонентов. Несмотря на внешнее сходство с последовательными операторами FOR и IF, следует учитывать специфику этого оператора: только параллельные операторы могут использоваться внутри параллельного оператора генерации.

 

ОПИСАНИЕ ПОВЕДЕНИЯ

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

Оператор процесса (Process Statement)

Синтаксис оператора.

< Process_ Statement>::=[<имя_процесса>] PROCESS

[<список_чувствительности>]

<декларативная_часть>

BEGIN

<список_пользовательских_операторов>

END PROCESS[<имя_процесса>]

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

Последовательный оператор ожидания (Wait Statement)

Описание оператора.

<Wait_Statement>::=WAIT [ON (<список_чувствительности>)]

[ UNTIL<булевское_ выражение>] [FOR<выражение_времени>]

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

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

Последовательный оператор назначения сигнала (Signal Assignment Statement)

Описание оператора.

< Signal_Assignment_Statement >::=<идентификатор_сигнала><=[TRANSPORT]

{<выражение>[AFTER<время>] | NULL[AFTER<время>]}

Отнесение этих операторов к последовательным позволяет включать их в совокупность последовательных операторов (прежде всего помещать внутри операторов процесса), но благодаря основному свойству сигналов—изменение значения сигнала происходит только после того, как завершены преобразования во всех процессах, инициированных общим событием, обеспечивается бесконфликтное планирование будущих значений сигнала. Использование ключевого слова позволяет заменить предполагаемую по умолчанию инерционную задержку на транспортную задержку. При транспортной задержке все изменения <выражения> будут передаваться (назначаться) определяемому оператором сигналу независимо стих временной протяженности. В отличие от транспортной задержки инерционная задержка позволяет отразить в языке поведение реальных электронных схем, отфильтровывающих входные сигналы с длительностью менее определенного отрезка времени (величина отрезка указана после ключевого слова АFТЕR).

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

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

Оператор условного назначения сигнала (Conditional Signal Assignment Statement)

Описание оператора.

<Conditional_Signal_Assignment_Statement>::=

<идентификатор_сигнала><=[QUARDED][TRANSPORT]

{<диаграмма>WHEN<условие>ELSE}<диаграмма>

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

Диаграмма задает порядок (или условия) изменения сигнала от текущего момента системного времени.

Определение диаграммы.

<диаграмма>::= <элемент_диаграмма>{<элемент_диаграммы>}

<элемент_диаграммы>::=<выражение_значения_сигнала>

[AFTER<выражение_значение_времени>].

Оператор селективного назначения сигнала (Selected Signal Assignment Statement)

Определение оператора.

<Selected_Signal_Assignment_Statement >::=

[<метка>:]WITH<выражение>SELECT

{<идентификатор_сигнала><= [QUARDED][TRANSPORT]

{<диаграмма> WHEN<выбор>;<диаграмма>WHEN<выбор>;

Оператор вызова процедуры (Call Procedure Statement)

Определение оператора.

<Call_Procedure_Statement>::=

[<метки>:]<имя_процедуры>[(<список_фактических_параментов>)].

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

Оператор параллельного сообщения (Assert Statement)

Определение оператора.

< Assert_Statement>::=[<метка>:]ASSERT <условие> [REPORT<сообщение>]

[SEVERITY<уровень_серьёзности>]

<уровень_серьёзности>::=

NOTE | WARNING | ERROR | FAILURE

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