Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЛИС_20_01_15 / Учебное пособие Основы VHDL_3.doc
Скачиваний:
48
Добавлен:
12.02.2015
Размер:
84.48 Кб
Скачать

Оператор цикла Loop

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

[метка_цикла :] loop

{выполняемые действия}

end loop[метка_цикла];

В таком виде цикл выполняется бесконечное число раз, для выполнения цикла конечное число раз, в его тело добавляется оператор завершения цикла exit со следующим синтаксисом:

exit [метка_цикла] when [условие];

Цикл завершается при выполнении условия, стоящего после оператора when, если оператор when не указан, то выполнение цикла завершается сразу по достижению оператора exit.

В заголовке цикла можно поместить условие while его выполнения. Синтаксис оператора в это случае будет:

[метка_цикла :] while [условие] loop

{выполняемые действия}

end loop[метка_цикла];

Также заголовке цикла можно задать число его повторений:

[метка_цикла :] for [переменная_цикла] in

[левая_граница] to|downto [правая_граница] loop

{выполняемые действия}

end loop[метка_цикла];

Переменную цикла не нужно объявлять, ей нельзя проводить операции присваивания, в самой программе может существовать сигнал или переменная с таким же именем, при этом они совершенно независимы от переменной цикла. При использовании оператора loop стоит учитывать, что при синтезе проекта для ПЛИС выполняемые действия оператора loop распараллеливаются, выполняясь одновременно. Например, если цикл должен выполниться 128 раз, производя каждый раз операцию умножения, то синтезатор создаст из цикла 128 умножителей, которые могут занять существенные ресурсы ПЛИС. Во многих случаях нет необходимости производить одновременно столь затратные операции, и можно организовать их последовательное выполнение с помощью оператора process без использования loop.

Структура vhdl-описания объекта

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

entiy [имя_объекта] is

Generic(

[имя параметра1] : [тип данных] := [значение параметра1];

[имя параметраN] : [тип данных] := [значение параметраN]

);

Port(

[имя порта1] : [тип порта1] [тип данных];

[имя портаN] : [тип портаN] [тип данных]

);

end [имя_объекта];

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

  • in – входной порт,

  • out – выходной порт,

  • inout – двунаправленный порт,

  • buffer – двунаправленный порт,

  • linkage.

Последние два типа применяются очень редко, но описаны в стандарте на язык VHDL, как правило при создании VHDL-описаний применяют первые три типа портов. Отличие типов inout и buffer состоит в том, что у порта типа buffer может быть только один источник, который изменяет его значение.

Параметры настройки позволяют задавать константные значения для описываемого объекта, с помощью списка параметров удобно создавать экземпляры объектов с различными значениями их параметров. Каждый элемент списка в сециях generic и port оделяется точкой с запятой, после последнего элемента точка с запятой не ставится. Секции generic и port не являются обязательными, однако фактически секция port присутствует всегда, когда создается объект для дальнейшего синтеза на основе него конфигурации ПЛИС, секция generic часто отсутствует в декларативной части.

Непосредственное описание объекта происходит в архитектурном теле, синтаксис которого имеет следующий вид:

architecture [имя архитектуры] of [имя объекта] is

{декларативная часть архитектуры}

begin

{параллельно выполняемые операторы}

end [имя архитектуры];

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

Компоненты

Компоненты используются при структурном описании объекта. Для его использования использования, компонент должен быть объявлен согласно синтаксису:

component [имя компонента] is

Generic(

[имя параметра1] : [тип данных] := [значение параметра1];

[имя параметраN] : [тип данных] := [значение параметраN]

);

Port(

[имя порта1] : [тип порта1] [тип данных];

[имя портаK] : [тип портаK] [тип данных]

);

end component;

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

[метка экземпляра] : component [имя компонента]

generic map(

[имя параметра1] : = [значение параметра1];

[имя параметраN] := [значение параметраN]

);

port map(

[имя порта1] => [имя сигнала1];

[имя портаK] => [имя сигналаK]

);

end component;

В разделе отображения параметров настройки каждому параметру настройки сопоставляется фактичский параметр для данного экземпляра компонента. В разделе отображения портов port map происходит сопоставление каждому локальному порту компонента сигнала объекта, в архитектуру которого он включен. Этот сигнал будет фактическим портом данного экземпляра компонента. Для выходного порта вместо сигнала может использоваться ключевое слово open, если использование этого порта не предполагается. При описании объекта может использоваться любое число экземпляров компонентов, но каждый экземпляр должен иметь свою уникальную метку, которая фактически являтся его именем.

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

Если в VHDL-описании объекта присутствует множество однотипных структур, то размер описания можно сократить, если воспользоваться оператором генерации generate. Существует две формы оператора:

  • for generate

  • if generate.

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

[метка_оператора:] for [параметр] in [диапазон] generate

{выполняемые действия}

end generate [метка_оператора];

Оператор if generate вычисляет логическое выражение, стоящее после ключевого слова if и при значении выражения true, выполняет генерацию параллельно выполняемых операторов, стоящих в его теле. Синтаксис if generate похож на синтаксис for generate:

[метка_оператора:] if [выражение] generate

{выполняемые действия}

end generate [метка_оператора];