Карта портов и карта настройки в языке VHDL.

Описание структуры объекта строится как описание связей конкретных компонент, каждая из которых имеет имя, тип и карты портов. Карта портов portmap определяет соответствие портов компонент поступающим на них сигналам, можно интерпретировать карту портов как разъём, на который приходят сигналы и в который вставляется объект-компонента.

Принятая в VHDL форма описания связей конкретных компонент имеет следующий вид:

Имя : тип_связи (сигнал, порт);

Например, описание связей объекта Q1, представленного на рис. 3, выглядит следующим образом:

K1: SM port map (X1, X2, S);

K3: M port map (S, Y1);

K2: SM port map (S, X3, Y2);

Здесь K1, K2, K3 - имена компонент; SM, M - типы компонент; X1, X2, X3, Y1, Y2 - имена сигналов, связанных с портами.

Полное VHDL описание архитектуры STRUCTURA объекта Q1 имеет вид:

Architecture STRUXTURA of Q1 is

Component SM port (A, B : in real; C : out real);

End component;

Component M port (E : in real; D : out real);

End component;

Signal S : real;

Begin

K1: SM port map (X1, X2, S);

K3: M port map (S, Y1);

K2: SM port map (S, X3, Y2);

EndSTRUCTURA.

45. Параллельный оператор generate в языке VHDL: назначение, общая формаописания, примеры применения.

Если необходимо неоднократно повторить один или несколько параллельных операторов, то используют оператор generate. Его синтаксис:
\оператор generate\ ::= \метка\: for \идентификатор\in \диапазон\ generate
[{\объявление в блоке\}
begin]
{ \параллельный оператор\}
end generate [\метка\];
Метка оператора generate необходима для обозначения сгенерированной структуры,\идентификатор\ - это параметр оператора generate, а фраза \диапазон\ - диапазон его изменения. Они имеют такие же синтаксис и семантику, как и в операторе loop. В операторе могут быть вставлены такие же объявления, как в декларативной части тела архитектуры. В отличие от оператора loop, который повторяет в цикле один или несколько последовательных операторов, оператор generate делает несколько копий параллельных операторов, когда параметр оператора пробегает все значения из заданного диапазона. В следующем примере с помощью оператора generate запрограммирована схема сдвигового регистра длиной n на триггерах FD из библиотеки компонентов ПЛИС Xilinx, описанного в пакете UNISIM.unisim_VITAL с входом DI и выходом DO, тактируемого синхросерией CLK.

signal t: std_logic_vector(1 to n+1); …t(1)<=DI; FIFO: for i in 1 to n generate U_ TT: FD(C=>CLK, D=>t(i), Q=>t(i+1));end generate; DO<=t(n+1);

УСЛОВНЫЙ ОПЕРАТОР GENERATE

Для того чтобы управлять структурой проектируемого устройства используется условный оператор generate. Его синтаксис:
\условный оператор generate\ ::= \метка\: if \булевское выражение\ generate
[ {\объявление в блоке\}
begin]
{ \параллельный оператор\}
end generate [\метка\];

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

RESn: if \подключить_PULLUP\=1 generate RES1:for i in DATA_BUS'range generate U_ RES: PULLUP(DATA_BUS(i));end generate;end generate;

Еслицелоезначение \подключить_PULLUP\ равно 1, токшине DATA_BUSподключаютсякомпонентынагрузочныхрезисторов PULLUP избиблиотеки UNISIM. Направлением научной деятельности автора является синтез структур вычислительных устройств. Поэтому язык VHDL нравится именно тем, что с помощью таких средств, как оператор generate можно программировать структуру устройства в зависимости от параметров ее настройки. Например, можно создать проект универсального цифрового фильтра, число ступеней которого изменяется в зависимости от заданного качества фильтрации.

Алфавит языка VHDL.

Как и любой другой язык программирования, VHDL имеет свой алфавит – набор символов, разрешенных к использованию и воспринимаемых компилятором. В алфавит языка входят:

  • Латинские строчные и прописные буквы: A, B, . . . , Z и a, b, . . . , z
  • Цифры от 0 до 9.
  • Символ подчеркивания «_» (код ASCII номер 95).

Из символов, перечисленных в пп. 1–3 (и только из них!) могут конструироваться идентификаторы в программе. Кроме того, написание идентификаторов должно подчиняться следующим правилам:

  • идентификатор не может быть зарезервированным словом языка;
  • идентификатор должен начинаться с буквы;
  • идентификатор не может заканчиваться символом подчеркивания «_»;
  • идентификатор не может содержать двух последовательных символов подчеркивания «__»;

Примеры корректных идентификаторов:

cont, clock2, full_add

Примеры некорректных идентификаторов:

1clock, _adder, add__sub, entity

Следует отметить что прописные и строчные буквы не различаются, т.е. идентификаторы clock и CLOCK являются эквивалентными.

Символ «пробел» (код 32), символ табуляции (код 9), символ новой строки (коды 10 и 13).

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

count:=2+2;

count := 2 + 2 ;

count := 2

+

2;

Специальные символы, участвующие в построении конструкций языка:

+ – * / = <> . , ( ) : ; # ' " |

Составные символы, воспринимаемые компилятором как один символ:

<= >= => := /=

Разделители между элементами составных символов недопустимы.

Скалярные типы в VHDL.

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

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

type Bus_width is range 0 to 64;
type Bus_width is range 63 downto 0;
– объявление переменных и сигналов данных типов
variable address_range: Bus_width:=32;
signal current_slot: Bus_index;

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

if Bus_index (address_range) > current_slot …

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

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

type Speed is range 0.0 to 100.0;
constant low_speed: Speed := 5.0;
variable current_speed: Speed;

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

Перечислимый тип (enumeration)
Перечисление определяется множеством возможных значений объектов данного типа. Значения перечислимых типов упорядочены и отношение упорядочения определяется последовательностью их появления в списке объявления типа. Примерыобъявленияперечислимыхтиповиобъектов:

type Oruent is (North, South, West, East);
type bit4 is (‘U’, ’0′, ’1′, ‘Z’);
signal synch, ready: bit4;
variable direction: Orient;
variable test result:probability;
signal proceed:boolean; — предопределенныйперечислимыйтип

Существует несколько предопределенных перечислимых типов: boolean, bit, character и т.д.

Подтипы скалярных типов
Для ограничения диапазона принимаемых скалярным объектом значений используется объявление подтипа. Объявление подтипа определяет базовый тип (base type) и ограничение диапазона (range constraint); базовый тип и ограничение диапазона могут быть включены прямо в объявление объекта:

subtype SW_orient is Orient range South to West;
signal unit_orient: SW_orient;
signal unit_orient1: Orient range South to West;

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

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

Предопределенные атрибуты скалярных типов
Характеристики скалярных типов и подтипов могут быть определены в программе при помощи атрибутов. Для скалярного типа Т доступны следующие атрибуты:
• T’low — возвращает наименьшее значение объекта данного типа;
• T’high — возвращает наибольшее значение объекта данного типа;
• T’left — возвращает левую границу значений объекта данного типа;
• T’right — возвращает правую границу значений объекта данного типа;

Примеры значений атрибутов для типа:

type Bus_index is range 63 downto 0;
Bus_index’low = 0
Bus_index’high = 63
Bus_index’left = 63
Bus_index’right = 0

Целый, перечислимый и физический типы имеют позиционный номер (0-based), связанный с каждым значением типа. Для определения соответствия элемента типа и его позиции, а также для итерирования позиции определены следующие атрибуты:
• T’pos(value) — возвращает позицию указанного элемента;
• T’val(position) — возвращает элемент, находящийся в заданной позиции;
• T’pred(value) — возвращает предыдущий указанному элемент (без учета направления диапазона);
• T’succ(value) — возвращает следующий за указанным элемент (без учета направления диапазона);
• T’leftof(value) — возвращает элемент слева от указанного;
• T’rightof(position) — возвращает элемент справа от указанного.

Регулярные типы в VHDL.

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

Регулярный тип представляет собой множество элементов одинакового типа. Различают неограниченные и ограниченные регулярные типы.

Неограниченный тип объявляется как:

type\имя регулярного типа\is
array(\имя типа диапазона\range<>) of \имя типа элемента\;

где <="" font="">- имя типа integer или какого-либо подтипа от integer.

Ограниченный регулярный тип объявляется как:

type \имя регулярного типа\ is
array (\диапазон целых\ of \имя типа элемента\);

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

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

type matrixis array (integer range <>, integer range <>) of integer.


Наши рекомендации