Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.sm.bmstu.ru/sm5/n4/oba/gl4.html
Дата изменения: Thu Feb 15 17:43:25 2007
Дата индексирования: Mon Oct 1 18:46:38 2012
Кодировка: Windows-1251
СМ5 : Глава 4. Язык описания аппаратуры VHDL
 

Глава 4. Язык описания аппаратуры VHDL
Стешенко В.Б.


4.1.Общие сведения

Языки описания аппаратуры (Hardware Description Language), является формальной записью, которая может быть использована на всех этапах разработки цифровых электронных систем. Это возможно вследствие того, что язык легко воспринимается как машиной, так и человеком он может использоваться на этапах проектирования, верификации, синтеза и тестирования аппаратуры также как и для передачи данных о проекте, модификации и сопровождения. Наиболее универсальным и распространенным языком описания аппаратуры является VHDL. На этом языке возможно как поведенческое, так структурное и потоковое описание цифровых схем.

Язык VHDL используется во многих системах для моделирования цифровых схем, проектирования программируемых логических интегральных микросхем, базовых матричных кристаллов, заказных интегральных микросхем

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

Общеалгоритмическая компонента VHDL- это язык, близкий по синтаксису и семантике к современным языкам программирования типа Паскаль, C и др. Язык относится к классу строго типизированных. Помимо встроенных (пакет STANDART) простых (скалярных) типов данных: целый, вещественный, булевский, битовый, данных типа время, данных типа ссылка (указатель) пользователь может вводить свои типы данных (перечислимый, диапазонный и др.).

Помимо скалярных данных можно использовать агрегаты: массивы array, в том числе и битовые векторы bit_vector, и символьные строки string, записи record, файлы file.

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

  • оператор присваивания переменной (:=);
  • последовательный оператор назначения сигналу (<=);
  • последовательный оператор утверждения (assert);
  • условный (if);
  • выбора (case);
  • цикла (loop);
  • пустой оператор (null);
  • оператор возврата процедуры- функции (return);
  • оператор последовательного вызова процедуры.

Язык поддерживает концепции пакетного и структурного программирования. Сложные операторы заключены в операторные скобки: if- end if; process- end process; case- end case; loop- end loop и т. д.

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

Фрагменты описаний, которые могут независимо анализироваться компилятором и при отсутствии ошибок помещаться в библиотеку проекта (рабочую библиотеку Work),называются проектными пакетами design unit. Такими пакетами могут быть объявление интерфейса объекта проекта entity, объявление архитектуры architecture, объявление конфигурации configuration, объявление интерфейса пакета package и объявление тела пакета package body.

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

Каждый проанализированный модуль проекта помещается в библиотеку проекта (design library) и становится библиотечным модулем (library unit).

Каждая библиотека проекта в языке VHDL имеет логическое имя (идентификатор).

По отношению к сеансу работы с VHDL- системой существует два класса рабочих библиотек проекта: рабочие библиотеки и библиотеки ресурсов.

Рабочая библиотека- это библиотека WORK, с которой в данном сеансе работает пользователь и в которую помещается пакет, полученный в результате анализа пакета проекта.

Библиотека ресурсов - это библиотека, содержащая библиотечные модули, ссылка на которые имеется в анализируемом модуле проекта.

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

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

Так же, как в описаниях проектируемых систем разделяются описания интерфейсов и тел, в VHDL у пакета разделяются описание интерфейса и тела пакета. По умолчанию предусмотрено подключение стандартных пакетов STANDART и TEXT 10. Пакет STANDART, в частности, содержит описание булевских операций над битовыми данными и битовыми векторами. Нестандартные пакеты реализуются пользователями, желающими более точно отобразить свойства описываемых ими объектов. Например, можно в пользовательском пакете переопределить логические операции И, ИЛИ и НЕ и перейти от булевского (0, 1) к многозначному (1, 0, X? Z) алфавиту моделирования.

Проблемно- ориентированная компонента позволяет описывать цифровые системы в привычных, разработчику понятиях и терминах. Сюда можно отнести:

  • понятие модельного времени now.
  • данные типа time, позволяющие указывать время задержки в физических единицах
  • данные вида сигнал signal, значение которых изменяется не мгновенно, как у обычных переменных, а с указанной задержкой, а также специальные операции и функции над ними
  • Средства объявления объектов entity и их архитектур architecture.

Если говорить про операторную часть проблемно- ориентированной компоненты, то условно ее можно разделить на средства поведенческого описания аппаратуры (параллельные процессы и средства их взаимодействия); средства потокового описания (описание на уровне межрегистровых передач) - параллельные операторы назначения сигнала (<=) с транспортной transport или инерциальной задержкой передачи сигналов и средства структурного описания объектов (операторы конкретизации компонент с заданием карт портов port map и карт настройки generic map, объявление конфигурации и т. д.).

Параллельные операторы VHDL включают:

  • оператор процесса process;
  • оператор блока block;
  • параллельный оператор назначения сигналу <=;
  • оператор условного назначения сигналу when;
  • оператор селективного назначения сигналу select;
  • параллельный оператор утверждения assert;
  • параллельный оператор вызова процедуры;
  • оператор конкретизации компоненты port map;
  • оператор генерации конкретизации generate;

Как видно из этого перечня, последовательные и параллельные операции назначения, вызова процедуры и утверждения различаются контекстно, то есть внутри процессов и процедур они последовательные, вне- параллельные.

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

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

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

  1. Латинские строчные и прописные буквы:
  2. A, B, . . . , Z и a, b, . . . , z

  3. Цифры от 0 до 9.
  4. Символ подчеркивания '_' (код ASCII номер 95).

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

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

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

cont, clock2, full_add

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

1clock, _adder, add__sub, entity

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

  1. Символ 'пробел' (код 32), символ табуляции (код 9), символ новой строки (коды 10 и 13).
  2. Данные символы являются разделителями слов в конструкциях языка. Количество разделителей не имеет значения. Т.о. следующие выражения для компилятора будут эквивалентны:

    count:=2+2;

    count := 2 + 2 ;

    count := 2

    +

    2;

  3. Специальные символы, участвующие в построении конструкций языка:
  4. + - * / = < > . , ( ) : ; # ' " |

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

<= >= => := /=

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

4.2.1.Комментарии

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

4.2.2.Числа

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

К разновидности числовых значений можно отнести также битовые строки.

4.2.3. Символы

Запись символа представляет собой собственно символ, заключенный в одиночные кавычки. Например:

'A', '*', ' '

В средствах синтеза ПЛИС область применения символов ограничена использованием их в качестве элементов перечислимых типов.

4.2.4. Строки

Строки представляют собой набор символов, заключенных в двойные кавычки. Чтобы включить двойную кавычку в строку, необходимо ввести две двойных кавычки. Например:

" A string"

"A string in a string ""A string"" "

4.3. Типы данных.

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

Необходимо отметить, что в данном пособии рассматриваются не все типы данных, определенные в стандарте, а только те, которые поддерживаются средствами синтеза ПЛИС.

4.3.1. Простые типы

Следующие простые типы являются предопределенными:

  1. BOOLEAN (логический) - объекты данного типа могут принимать значения FALSE (ложь) и TRUE (истина).
  2. INTEGER (целый) - значения данного типа представляют собой 32-разрядные числа со знаком. Объекты типа INTEGER могут содержать значения из диапазона -(231-1):231-1 (-2147483647 : 2147483647).
  3. BIT (битовый) - представляет один логический бит. Объекты данного типа могут содержать значение '0' или '1'.
  4. STD_LOGIC (битовый) - представляет один бит данных. Объекты данного типа могут принимать 9 состояний. Данный тип определен стандартом IEEE 1164 для замены типа BIT.
  5. STD_ULOGIC (битовый) - представляет один бит данных. Объекты данного типа могут принимать 9 состояний. Данный тип определен стандартом IEEE 1164 для замены типа BIT (см. Примечание).
  6. ENUMERATED (перечислимый) - используется для задания пользовательских типов.
  7. SEVERITY_LEVEL - перечислимый тип, используется только в операторе ASSERT.
  8. CHARACTER - символьный тип.

Примечание

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

Пример: Выходы двух буферов с тремя состояниями подключены к одной цепи X. Пусть выход одного буфера установился в состояние 'Z', а выход другого - в состояние '1'. Функция разрешения определяет, что в этом случае значение сигнала X будет равно '1'.

Поскольку для типа STD_ULOGIC не определена функция разрешения, сигналы этого типа могут иметь только один источник.

Далее рассматривается только тип STD_LOGIC, однако все сказанное будет справедливо и для типа STD_ULOGIC. На практике, в подавляющем большинстве случаев достаточно использования типа STD_LOGIC.

4.3.2. Сложные типы

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

Следующие типы-массивы являются предопределенными:

  1. BIT_VECTOR - одномерный массив элементов типа BIT;
  2. STD_LOGIC_VECTOR - одномерный массив элементов типа STD_LOGIC;
  3. STD_ULOGIC_VECTOR - одномерный массив элементов типа STD_ULOGIC;
  4. STRING - одномерный массив элементов типа CHARACTER;

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

4.3.3. Описание простых типов

Тип BOOLEAN

Тип BOOLEAN является перечислимым типом. Объект данного типа может принимать значения FALSE (ложь) и TRUE (истина), причем FALSE эквивалентно 0, а TRUE эквивалентно 1.

Все три типа объектов в VHDL (константы, переменные и сигналы) могут иметь тип BOOLEAN. Таким объектам может быть присвоено только значение типа BOOLEAN.

Пример

PROCESS (a, b)

VARIABLE cond : BOOLEAN;

BEGIN

cond := a > b;

IF cond THEN

output <= '1';

ELSE

output <= '0';

END IF;

END PROCESS;

 

Операторы отношения

Значения типа BOOLEAN могут участвовать в выражениях. Операторы отношения (=, /=, <, <=, >, >=) определены для операндов типа BOOLEAN и одномерных массивов, содержащих элементы типа BOOLEAN. Результат выражения также имеет тип BOOLEAN.

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

Логические операторы

Для операндов типа BOOLEAN и одномерных массивов, содержащих элементы типа BOOLEAN определены все логические операции (AND, OR, NAND, NOR, XOR и NOT). Тип и размер операндов должны быть одинаковыми. Тип и размер результата такой же как тип и размер операндов.

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

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

Другие операторы

Другие операции над операндами типа BOOLEAN не определены.

Тип INTEGER

Стандарт VHDL определяет тип INTEGER для использования в арифметических выражениях. По умолчанию объекты типа INTEGER имею размерность 32 бита и представляют целое число в интервале -(231-1) . . . 231-1 (-2147483647 . . . 2147483647). Стандарт языка позволяет также объявлять объекты типа INTEGER, имеющие размер меньше 32 бит, используя ключевое слово RANGE, ограничивающее диапазон возможных значений:

SIGNAL X : INTEGER RANGE -127 TO 127

Данная конструкция определяет X как 8-битное число.

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

TYPE имя_типа IS RANGE диапазон_индексов;

диапазон_индексов определяется следующим образом:

m TO n

n DOWNTO m

где m, n - целочисленные константы, m <= n.

Пример

TYPE byte_int 0 TO 255;

TYPE signed_word_int is range -32768 TO 32768;

TYPE bit_index is range 31 DOWNTO 0;

Значения типа INTGER записываются в следующей форме:

[ основание # ] разряд { [_ ] разряд} [ # ]

По умолчанию "основание" принимается равным 10. Допустимыми также являются значения 2, 8, 16.

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

Пример

CONSTANT min : INTEGER := 0;

CONSTANT group : INTEGER := 13_452; - - эквивалентно 13452

CONSTANT max : INTEGER := 16#FF#;

Допустимое использование

Операторы отношения

Значения типа INTEGER могут участвовать в выражениях. Операторы отношения (=, /=, <, <=, >, >=) определены для операндов типа INTEGER и одномерных массивов, содержащих элементы типа INTEGER. Результат выражения имеет тип BOOLEAN.

Арифметические операторы

Операторы +, -, ABS допустимы для операндов типа INTEGER. Результат выражения имеет тип INTEGER.

Операторы *, /, MOD, REM допустимы в следующих случаях:

  • если оба операнда являются константами (CONSTANT);
  • если второй операнд является константой и его значение равно 2