2 ОСНОВНЫЕ ЧЕРТЫ ЯЗЫКА VHDL
История появления языков описания аппаратуры
В эпоху СБИС процесс
проектирования должен быть структурированным. Поэтому в последнее время
большое внимание уделяется созданию соответствующих инструментальных
средств проектирования. Конкретным примером подобных
инструментальных средств являются языки описания аппаратуры, и на их
разработку затрачивается очень много усилий и ресурсов. Вообще
говоря, применение подобных языков нельзя считать чем-то новым. Такие
языки, как CDL, ISP и AHPL, используются
уже в течение приблизительно десяти лет. Однако они предназначаются преимущественно для целей верификации архитектуры проекта. Эти языки не дают возможности моделировать
проектируемые схемы с высокой точностью; другими
словами, они не позволяют создать адекватную
модель с учетом временных параметров и(или) их языковые
конструкции ориентированы обычно на какую-то конкретную структуру
аппаратных средств. Более современные языки описания аппаратуры,
например HHDL, ISP и VHDL, предусматривают построение
более универсальных моделей с временными параметрами и не ориентированы
на конкретные аппаратные структуры.
Языки описания аппаратуры имеют
два основных применения: для документирования проекта и для
моделирования. Хорошая документация проекта способствует
успеху разработки. Она необходима также для обеспечения
транспортабельности проекта, т.е. для разрешения потенциальной проблемы
«вавилонской башни», не позволяющей различным фирмам-изготовителям
эффективно сотрудничать (из-за отсутствия общего языка).
Все широко распространенные
языки описания аппаратуры поддерживаются соответствующими
системами моделирования. Благодаря этому модель, по сути содержащаяся в
описании проектируемой схемы или системы на языке описания аппаратуры,
может использоваться для доказательства
работоспособности этой схемы или системы. Макетирование сложных схем или
систем стоит очень дорого, поэтому цель разработчиков языков описания
аппаратуры заключается в том, чтобы процесс макетирования можно
было заменить верификацией проекта путем моделирования. Модели на
языках описания аппаратуры могут использоваться также для
автоматической генерации тестов и кремниевой компиляции. Эти
дополнительные возможности использования моделей рассматриваются в гл. 6.
Внедрение языков описания
аппаратуры в процесс проектирования предполагает подход к
разработке, отличающийся от традиционного. До недавнего времени
разработчикам цифровых схем и систем приходилось для представления
своих проектов использовать сочетание словесных описаний, блок-схем,
временных диаграмм и логических схем и формул. Кроме того, лично
участвовать в процессе моделирования разработчики обычно считали
ниже своего достоинства. «Пусть моделированием занимаются те, кто
не способен к разработке»,-говорили они. Сегодня ситуация
существенно меняется. Разработчики сейчас гораздо лучше знакомы с
программированием. Они подготавливают свои проекты при помощи рабочих
станций (автоматизированных рабочих мест-АРМ), где проект вводится как
исходный файл на языке описания аппаратуры, в виде
электрической принципиальной схемы или с использованием того или иного
сочетания обоих этих методов. Разработчики сами весьма часто
прибегают к моделированию для верификации проекта в процессе
его развития. Разработчики старой школы далеко не всегда с
легкостью приспосабливаются к новым условиям работы. Они могут
расценивать использование языка описания аппаратуры как
ненужное усложнение процесса проектирования. Будем надеяться, что их позиции изменятся, когда они увидят
результаты использования таких языков - более
совершенные проекты, причем с гораздо меньшим
числом ошибок.
VHDL-язык описания аппаратурына базе сверхскоростных ИС
Для иллюстрации принципов
моделирования на уровне СБИС необходимо выбрать конкретный язык
описания аппаратуры. До недавнего времени не существовало стандартного
языка описания аппаратуры, сравнимого с такими
стандартными языками программирования, как Фортран и Паскаль. Однако
начиная с 1983 г. Министерство обороны США выступает в
роли спонсора в разработке языка описания аппаратуры на базе
сверхскоростных интегральных схем (ССИС, VHSIC), языка VHDL. Первоначальное назначение
этого языка заключалось в том, чтобы обеспечить
возможность осуществлять обмен проектами между различными
соисполнителями работ по программе VHSIC. Однако
разработчики языка собрали и реализовали предложения и рекомендации многих известных специалистов в области
вычислительной техники, так что язык VHDL отражает общее мнение о том,
какими характеристиками должен обладать эффективный
стандартный язык описания аппаратуры.
В августе 1985 г. была выпущена
версия 7.2 языка VHDL, и этим завершился первый
важный этап разработки языка. Версия 7.2 представляет
вполне законченный язык в том смысле, что она содержит тщательно проработанные конструкции для структурного
(статического) и поведенческого
(функционального) представления, а также средства для
документирования проектов. Однако после выпуска версии 7.2 под эгидой
Министерства обороны США функции спонсора по дальнейшему развитию языка VHDL взял на себя ИИЭР, который
поставил конечную цель: создание усовершенствованной,
стандартной версии этого языка. Процесс пересмотра языка был
закончен к маю 1987 г., когда было подготовлено и
передано промышленным фирмам для рассмотрения справочное
руководство по языку VHDL. В июне 1987 г. полномочные
члены ИИЭР проголосовали за принятие этой версии языка VHDL в качестве стандартной и в
декабре 1987 г. ИИЭР официально утвердил ее как стандарт.
В данной книге мы используем VHDL как рабочий язык для иллюстрации концепции моделирования на уровне ИС. Этот язык
был выбран не только ввиду его растущей
популярности, но и потому, что, по мнению автора, существующий
набор конструкций языка VHDL обеспечивает весьма эффективное
моделирование на уровне ИС. Это мнение разделяет и Хан, который
в своей диссертации на соискание степени магистра «Языки описания
аппаратуры для моделирования на уровне СБИС» сравнивает
различные языки описания аппаратуры с точки зрения их эффективности
для моделирования на этом уровне. Хан также пришел к выводу, что язык VHDL является наиболее эффективным для подобной цели.
Как указано выше, существуют
две основные версии языка VHDL-версия 7.2 и стандартная
версия ШЕЕ. В данной книге мы используем стандартную версию IEEE.
В этой главе мы дадим краткое
описание языка VHDL. В последующих
главах более конкретные особенности этого языка будут представляться «оперативно» по мере необходимости. Автор
считает, что это самый эффективный подход к
изучению компьютерных языков. Более подробные сведения о языке VHDL читатель может найти в литературе, список которой приводится в конце главы.
Объекты проекта
В языке VHDL данная логическая схема
представляется как объект проекта.Представляемая логическая схема может быть достаточно сложной, как, например, микропроцессор, или весьма простой,
как логический вентиль И. Каждый объект проекта в свою очередь
имеет два различных типа описаний: описание интерфейса и одно
или более архитектурные тела. Мы проиллюстрируем эти понятия
на следующем примере. Рассмотрим описание интерфейса
для схемы, которая производит подсчет числа
единиц во входном битовом векторе, имеющем длину, равную 3:
entity
ONES_CNT is
port(A: in
BIT_VECTOR(0 to 2);C: out BIT_VECTOR(0 to 1));
end ONES_CNT;
Как можно видеть, в описании
интерфейса приводится имя объекта и характеризуются его входы и
выходы. Для сигналов в описании интерфейса указывается вид
сигнала (например, входной или выходной) и его тип, в данном случае BIT_VECTOR (0 to 2) и BIT_VECTOR (0 to 1) (т.е. битовые векторы длиной
3 и 2 бита).
В описании интерфейса может
содержаться также информация относительно природы данного
объекта, необходимая для документирования. Например, можно
переписать указанное описание интерфейса и включить в него в качестве
комментария таблицу истинности объекта (рис. 2.1).
Рис. 2.1. Описание интерфейса с
комментариями.
Отметим, что здесь в описании
интерфейса таблица истинности вставлена как комментарий, т.е. любая
строка, начинающаяся с двух знаков тире, интерпретируется
как комментарий. Это только один из примеров информации, которую
можно включать в описание интерфейса. В последующих главах мы
приведем и другие примеры.
Архитектурные тела
Описание интерфейса по существу
определяет только входы и выходы объекта проекта. Кроме
этого необходимо иметь средства описания поведения объекта. В
языке VHDL для этой цели служит так называемое архитектурное тело. Как будет показано ниже, это
тело может определять поведение объекта
непосредственно (т.е. быть телом-примитивом) или может представлять
структурную декомпозицию на более простые
компоненты. Приступая к процессу проектирования, разработчики
обычно уже имеют алгоритм, который необходимо реализовать. Вначале,
однако, им хотелось бы проверить правильность этого алгоритма, не описывая подробностей схемной реализации. Таким образом, первое архитектурное тело, которое будет описано,-
это чисто поведенческое тело. На рис. 2.2 показано подобное
поведенческое архитектурное тело для счетчика единиц ONES-CNT.
Рис. 2.2. Чисто поведенческое описание
счетчика единиц.
Отметим, что в архитектурном
теле, показанном на рис. 2.2, программный цикл
осуществляет сканирование входов от А(0) до А(2) и приращение
переменной NUM, когда оказывается, что
конкретный бит находится в состоянии 1. В зависимости от
конечного значения NUM оператор выбора CASE указывает, какой битовый код
выдать на выход С.
Это поведенческое тело идеально
описывает работу алгоритма, однако практически не отражает
построения и функционирования реальной аппаратуры. Говоря более
конкретно, здесь можно задать такие вопросы: какой логике
соответствует конструкция цикла и какова величина задержки для описанной
схемы? Данное архитектурное тело ответов на эти вопросы не дает.
Однако на первых этапах проектирования такие подробности обычно и не
имеют существенного значения.
Продолжая рассмотрение данного
примера, предположим, что процесс разработки счетчика единиц
вступает в этап логического проектирования. На рис. 2.3, а и 6показаны
карты Карно для обоих выходов, С1 и СО.
Рис. 2.3. Карты Карно для счетчика единиц.
Из этих карт можно установить,
что логические формулы для С1 и СО имеют вид:
С1 = А1-АО + А2-АО + А2-А1,
С0 = А2*А1*АО +А2*А1*АО
+А2*А1*АО +А2*А1*АО.
Следует также отметить - это
нам потребуется ниже,- что С1 есть мажоритарная функция для трех
входных сигналов, А2, А1 и АО [MAJ3(A2, Al, АО)], а СО - функция
нечетности для этих трех входов [OPAR3(A2, Al, АО)].
В этот момент разработчик может
заменить чисто поведенческое тело рис. 2.2 на архитектурное
тело, показанное на рис. 2.4.
Рис. 2.4. Двухуровневый «механизм»
представления логики счетчика единиц.
В операторах, реализующих
«суммы произведений» для С(1) и С(0), операторы AND(M) заключены в круглые скобки.
Это объясняется тем, что в языке VHDL операторы AND(H) и OR(HJIM) равны по старшинству
(равноприоритетны).
Двухуровневый «механизм»
представления логики на рис. 2.4 подразумевает стандартную структуру с
использованием логических вентилей AND, OR и инверторов. Однако, поскольку
значение С1 вычисляется при помощи мажоритарной функции MAJ3, а СО - при помощи функции OPAR3, это архитектурное тело можно
представить на еще более простом макроуровне.
architecture
MACRO of ONES_CNT is
begin
С(1) <=
MAJ3(A);
С(0) <=
OPAR3(A);
end MACRO;
Это архитектурное тело
предполагает, что на аппаратном уровне существуют логические вентили MAJ и OPAR. Если говорить об описании на
языке VHDL, для этого требуется, чтобы
функции MAJ3 и OPAR3 были объявлены и описаны
ранее. В следующем разделе мы покажем, каким образом это
делается.
Три архитектурных тела для
счетчика единиц, приведенные выше, являются поведенческими, поскольку
они описывают этот объект только по входам-выходам, без четкого
указания его внутренней структуры. Приведем теперь структурное
архитектурное тело для счетчика единиц. Воспользуемся при этом
иерархией проекта, показанной на рис. 2.5, т. е. при
декомпозиции счетчика единиц разобьем его вначале на логические
Рис. 2.5. Иерархия структурного
проектирования для счетчика единиц.
вентили MAJ3 и OPAR3, которые в свою очередь
разобьем на вентили AND и OR. Описание интерфейса и
архитектурных тел для вентиля MAJ3 двухвходовых вентилей AND2 и трехвходовых вентилей OR3 показаны на рис. 2.6 (а,
б, в) соответственно.
Рассмотрим теперь детали
архитектуры объекта MAJ3 уровня логических вентилей AND_OR. Логическая схема этого
объекта, его вентильная структура показана на рис. 2.7. Обращаясь снова
к рис. 2.6, а, отметим, что в разделе описания архитектуры AND _ OR объявляются два компонента AND2 и OR3. Здесь спецификации портов те
же самые, что используются в описаниях объектов для этих компонентов
(рис. 2.6, б и в). Затем объявляются три сигнала-А1, А2 и A3.
Выходы всех трех вентилей AND должны быть соединены с входами
логического вентиля OR, и такое описание сигналов
позволяет нам представить эти соединения.
После ключевого слова begin приводятся экземпляры описаний
четырех компонентов, т.е. для общих
объектов-компонентов создаются конкретные
экземпляры. Отметим, что каждый экземпляр имеет свою уникальную
метку (Gl, G2, G3 или G4), а также карту порта. Карта порта отображает связь между входами и выходами описания компонента и экземплярами этого компонента. В данном случае
связь осуществляется «позиционным» сопоставлением. В гл. 5 мы
рассмотрим другой способ связи.
Для полного описания работы
объекта MAJ3 необходимо иметь описания интерфейса и архитектурные тела для всех компонентов,
(«У
Рис. 2.6. а - Описание MAJ3; б -описание AND2; «-описание OR3.
Рис. 2.7. Схема уровня логических
вентилей для мажоритарной функции MAJ3.
экземпляры которых существуют в
рамках архитектурного тела для MAJ3. Эти описания приведены на
рис. 2.6, бив. Аналогичным образом описывается структура OPAR3. Читатель может сам сделать
это в качестве упражнения. После определения компонентов MAJ3 и OPAR3 можно
составить структурное архитектурное описание для счетчика единиц;
оно показано на рис. 2.8.
Рис. 2.8. Структурное архитектурное тело
для счетчика единиц.
Операторы блоков
Рис. 2.9.Пример архитектурного тела с
вложенными блоками
. |
Базовым элементом описания на
языке VHDL служит блок. Блок-это ограниченный фрагмент текста, содержащий раздел описания
и исполняемый раздел. Таким образом, само
архитектурное тело есть блок. Однако в рамках
архитектурного тела могут существовать внутренние блоки.
Рассмотрим пример, показанный на рис. 2.9. Здесь блоки А
и В вложены во внешний блок архитектурного тела. Вообще говоря, возможно любое число уровней вложенности; например, блоки А и
В также могут быть разбиты на подблоки. Использование такой структуры обусловлено двумя причинами. Во-первых, она
соответствует естественному иерархическому
представлению структуры проекта, а во-вторых,
позволяет для того или иного блока устанавливать условия «охраны» («защиты»). Если такое условие охраны будет иметь
значение ИСТИНА, это станет разрешением для выполнения определенных
типов внутренних операторов блока. В дальнейшем
мы увидим, что охранные конструкции весьма
полезны для моделирования последовательной логики.
Процессы
Еще одним важным элементом для
моделирования на языке VHDL является процесс. На
рис 2.2 приведен пример использования процесса для
представления поведенческого описания схемы счетчика единиц
ONES_ CNT. Отметим, что в данном случае
процесс начинается с
ключевого слова process(A). Здесь вектор А представляет так
называемый список чувствительности (сигналов запуска) процесса; другимисловами, когда какой-либо сигнал из этого списка меняет свое
значение, процесс активируется и выполняются
операторы блока этого процесса. Типичное
применение блока процесса - для реализации алгоритмов на абстрактном
уровне; это как раз случай, показанный на рис. 2.2.
Более подробно конструкция
процесса и особенности ее применения будут рассмотрены в гл. 3, где
показано, что это основной метод, позволяющий
представлять параллельные операции при моделировании цифровых схем и систем.
Типы данных
Большинство языков
программирования предусматривают различные типы данных, и язык VHDL не является в этом смысле исключением. Однако, поскольку этот язык используется для
представления аппаратных проектов в самых разных вариантах, средства
типизации данных приобретают здесь особенно
важное значение. Например, они дают разработчику
возможность представлять группу линий шины как 1) массив битов,
2) целое число или 3) мнемонический код. Кроме того, в языке VHDL реализована строгая
типизация; это означает, что непредумышленное
смешение различных типов в одной операции будет восприниматься как
ошибка. Средства строгого контроля типов играют ответственную
роль, поскольку позволяют уточнять намерения разработчика.
Обсуждение мы начнем с введения
следующих определений.
Тип - поименованное множество
значений с некоторыми общими характеристиками;
Подтип (типа) - подмножество значений
данного типа.
Так, например, множество,
охватывающее все целые числа, есть тип INTEGER. Хотя размер этого множества в
принципе бесконечен, с нашей точки зрения он
ограничивается длиной слова главного компьютера
(инструментальной ЭВМ). Общие характеристики элементов множества-их алгебраические свойства: а) это определенные для них операции
(сложение + и умножение •), б) неизменность суммы при прибавлении нуля и произведения при умножении на единицу и в)
закон симметрии, или обращения [X + (—X) = 0]. Натуральные числа (т.
е. все неотрицательные целые числа) составляют подтип NATURAL типа INTEGER. Отметим, что диапазон
подтипов ограничен; например, члены подтипа NATURAL не могут быть отрицательными
целыми.
Подтип может наследовать или не
наследовать все алгебраические свойства родительского типа.
Например, для подтипа NATURAL операции
сложения и умножения определены, однако закон симметрии, или обращения, не действует.
Типы данных, предусмотренные в
языке VHDL, приведены в табл. 2.1.
В левом столбце таблицы
приведены логические типы. Тип BOOLEAN состоит из значений TRUE (истина) и FALSE (ложь). Все операторы IF (если) в языке должны проверять
объекты или выражения
этого типа. Тип BIT состоит из значений 0 и 1. Тип BIT VECTOR
определяет массив битов,
например BIT VECTOR (0 to 7).
В среднем столбце табл. 2.1
указаны арифметические типы и подтипы. Тип INTEGER и тип NATURAL были рассмотрены выше. Подтип POSITIVE включает все целые, которые
больше нуля. Может показаться странным, что в языке описания аппаратуры
имеется тип REAL. Однако этот тип очень полезен
для высокоуровневых поведенческих описаний, например
аналого-цифрового интерфейса или алгоритма обработки сигналов.
В правом столбце табл. 2.1 даны символьныетипы.
Тип CHARACTER по сути представляет набор
символов кода ASCII (Американского
Таблица 2.1
Типы данных, определенные в
языке VHDL
BOOLEAN
(булев) INTEGER (целый) CHARACTER (символьный)
BIT (битовый) POSITIVE (положительный)- STRING (строковый)
BIT_VECTOR (битовый вектор) NATURAL (натуральный)
REAL (вещественный)
стандартного кода для обмена
информацией). Тип STRING -это строка символов, например STRING (0 to 9). Примеры этих и других типов будут приведены ниже.
До сих пор типы данных
рассматривались с точки зрения пользователя. В «Справочном
руководстве по языку VHDL» приведена удобная схема
классификации, показанная на рис. 2.10. Типы данных делятся на скалярные(одномерные)
и составные (многомерные). Самым общим из
скалярных типов является так называемый перечислимый тип, в
котором просто перечисляются члены типа. Например, мы будем использовать
тип многозначной логики MVL, который может быть описан следующим образом:
type MVL is ('О', ‘1’, 'Z');
Рис. 2.10. Схема классификации типов
данных языка VHDL.
Отметим, что типы BOOLEAN, BIT и CHARACTER-это перечислимые
типы.
Числовые типы - это либо INTEGER (целый), либо REAL (вещественный).
Они не требуют особого описания, поэтому ограничимся приведением
двух примеров, типа INDEX (индекс) и типа VOLTAGE (напряжение):
type INDEX
is range 0 to 9_ тип целый
type
VOLTAGE is range 0.0 to 10.0 тип вещественный.
Каждое из этих описаний типа
имеет диапазон, или область значений. Базовый тип (например, либо
целый, либо вещественный) неявно определяется значениями диапазона.
Поскольку VHDL - это язык описания аппаратуры,
в нем предусмотрены некоторые физические типы. Например, тип TIME (время) описывается
следующим образом:
type TIME is range 0 to 1E20
unitsfs;
ps =1000 fs;
ns = 1000 ps;
s = 1000 ns;
ms
= 1000 us;
s = 1000 ms;
min
= 60 s;
hr = 60 min;
end
units;
Здесь важно отметить, какая
единица выбрана в качестве базовой (фемтосекунда,
10"15 с) и какой взят диапазон (1Е20). Указанный диапазон при такой базовой единице обеспечивает представление
максимального периода времени 100 000 с (27,7 ч). И базовую
единицу времени, и диапазон может выбрать пользователь,
однако диапазон ограничивается длиной слова
инструментальной машины. В числе других
распространенных физических типов для языков описания аппаратуры можно назвать напряжение, ток, электрическую мощность, массу, частоту и т.д.
Составныетипы - это тип массив (индексируемый
тип) и тип запись
(структурный тип). Тип BIT VECTOR есть тип массив, который
неявно описывается следующим образом:
type BIT—
VECTOR is array (NATURAL range < >) of BIT;
BIT- это базовый тип элементов
массива. Выражение «NATURAL range» (диапазон
натуральный)-стандартный способ указать, что длина массива
будет задаваться диапазоном натуральных чисел. Пользователь должен задавать конкретный диапазон при применении такого
типа-
например, BIT_ VECTOR (0 to 3) (возрастающий диапазон) или
BIT_VECTOR
(7 down to 0) (убывающий диапазон). Возможны, естест
венно,
и другие типы массивов с другими базовыми типами. Например,
массив с убывающим диапазоном можно определить
при помощи
следующегр описания типа:
type INT—
ARRAY is array (99 downto 0) of INTEGER;
Как следует из названия, тип
запись-это составной тип, состоящий из ряда полей. Например, тип DATE (дата) можно описать как тип
запись следующим образом:
type DATE
is
record
DAY : INTEGER range 1 to 31;
MONTH : MONTH_NAME;
YEAR : INTEGER range 0 to 3000; end record;
Здесь тип MONTH_ NAME (имя месяца)-это перечислимый
тип,
содержащий имена месяцев.
Выше мы сказали, что язык VHDL-язык со строгим контролем типов. Поэтому программа
анализа исходного текста будет квалифицировать любую попытку
смешения различных типов как ошибку. Это относится, естественно, и к
типам и подтипам, определяемым пользователем. Например,
пользователь может написать следующее:
subtype ADDRESS is BIT_VECTOR(0 to 12);
subtype DATA is BIT_VECTOR{0 to 15);
variable PC: ADDRESS;
variable ACC: DATA;
После этого
операторы
PC: = ACC; или АСС: = PC;
окажутся недопустимыми,
поскольку переменные PC и АСС относятся к различным подтипам.
Чтобы закрепить наше
представление о типах, подтипах и о контроле типов, приведем еще один
пример. Предположим, что имеются следующие описания типов, подтипа
и сигналов:
type X_NT is range 1 to 50;
type
Y_NT is range 1 to 30;
subtype
Z_NT is X_NT range 1 to 30;
signal X: X_NT;
signal Y: Y_NT;
signal Z: Z_NT;
Попробуем ответить на вопрос:
какой из операторов назначения сигналов будет допустимым?
(2.1) X < = Y;
(2.2) X < = Z.
Здесь оператор 2.1 будет
недопустимым, поскольку X и Y-сигналы
различного типа, а оператор 2.2
будет допустимым, поскольку Z_INT
есть подтип X_INT.
Выше уже указывалось, что типы
и подтипы, чтобы их можно было использовать, должны быть
предварительно описаны. Объекты, архитектурные тела, блоки, процессы
и подпрограммы - все имеют для этой цели разделы описаний. Ниже мы
будем приводить соответствующие примеры. Мы покажем также, что для
удобства их можно объединять в так называемые «пакеты».
В дополнение к категориям
скалярных и составных типов, описанным выше, язык VHDL предусматривает также
определенные типы файлов и типы доступа. Однако эти типы
не используются в программах моделирования,
описанных в данной книге, поэтому мы их здесь рассматривать
не будем.
Операции
Язык VHDL имеет полный набор операций для
работы с предусмотренными типами данных. Перечень
операций приведен в табл. 2.2.
Таблица 2.2
Операции языка VHDL
Класс операций Члены класса
Логические not (НЕ) | and (И) | or (ИЛИ) | nand (И-НЕ) | nor (ИЛИ-НЕ)
хог (исключающее ИЛИ)
Сравнения =|/=|<|<=|>|>
=
Сложения +
| — | & (конкатенация)
Присвоение знака +I — I
Умножение *|/|mod (по модулю) | rem (остаток)
Смешанные **возведение
в степень) | abs (абсолютное значение)
Логические операции определены для типа BIT, типа BOOLEAN и для одномерных массивов, в
которых каждый элемент имеет тип BIT или тип BOOLEAN; таким образом, они определены
и для типа BIT— VECTOR.
Все операции сравнения возвращают
результат типа BOOLEAN (т. е. значение TRUE или FALSE). Все операции сравнения имеют
левые и правые операнды (например, А/ = В). Обе операции
контроля эквивалентности ( = ./ = ) в качестве левого и правого
операндов могут иметь любой тип, при условии, что это
один и тот же тип. Если тип составной (например,
массив), проверка выполняется по его элементам. Оба операнда составного типа считаются равными, если и только
если равны все их соответствующие элементы.
Операции отношения (<, <=, >, >=)
определены для любого скалярного типа; например,
перечислимый тип
type MVL is
('О', ‘1’, 'Z')
подразумевает упорядочение
слева направо, так что имеет место отношение 'Г < 'Z'. Операции отношения
определяются также для одномерных массивов, в которых
каждый элемент-это дискретный тип. Предположим,
например, что мы описали трехэлементный многозначный
тип массив следующим образом:
type MVL is
('O’,’1,’Z');
type
THREE_BIT_MVL is array (0 to 2) of MVL;
В этом случае операции
отношения могут выполняться над трехэлементными векторами. Сравнение
начинается с минимального индексного значения и продолжается до
максимального. Так, например, значение выражения ('О', ‘1’, ‘1’) <
= ('О', 'Z', ‘1’) есть истина.
Арифметические операции класса
сложения ( + ,
—) определены для
типов INTEGER и REAL. Для типа BIT_VECTOR они не определены,
так что пользователь должен сам
предусматривать подпрограммы для этой цели. Операция
конкатенации & выполняет свою обычную функцию, т. е.
объединяет два одномерных массива с образованием единого одномерного массива, длина которого есть сумма длин обоих массивов-операндов.
Так, например, ('О', ‘1’, ‘1’) & ('О', 'Z', ‘1’) = ('О', '1', '1’, 'О', 'Z', ‘1’).
Операции присвоения знака (« +
», « — »)-это унарные операции, при помощи которых перед одиночными
объектами типа INTEGER или REAL ставится арифметический знак,
обозначающий положительное или отрицательное значение.
Опять-таки для битовых векторов формирование дополнительного или
обратного кода должно производиться специальными подпрограммами
пользователя. Для типов INTEGER и REAL определены операции умножения и
деления (*, /). Остальные операции, указанные в таблице [т.е. операции
по модулю mod, нахождения остатка rem, абсолютного значения abs и возведения в степень **],
имеют обычные функции, как в стандартных языках программирования.
Операции и соответствующие
операнды встречаются, естественно, в выражениях [например, (А >
В) и (С/= D)]. Ниже будет приведено много других примеров.
Классы объектов
В языке VHDL имеются три класса объектов:
константы, переменные и сигналы. Объект создается, когда
дается его описание. По мере рассмотрения всех этих трех классов
объектов мы будем приводить примеры таких описаний.
Константы. Константа - это
объект, значение которого не может изменяться. В качестве примеров
описания констант приведем следующие:
constant TIEOFF : MVL : = '1;
constant
OVFL_MSG : STRING(1 to 20)
:=
"Переполнение аккумулятора";
constant
INT_VECTOR : BIT_VECTOR(0 to 7) := "00001000";
constant COEFF: REAL := 4.217;
Отметим, что в описании каждой
константы указывается ее имя, тип и значение.
Переменные. Переменные - это
объекты, значения которых могут меняться. Когда по описанию
создается некоторая переменная, вместе с ней создается и так называемый
«контейнер» для этого объекта. Изменение значений переменных
осуществляется путем выполнения оператора присваивания для переменной
(например, А: = В + С;). Операторы присваивания для
переменных не имеют временного параметра (т. е.
их результат сказывается немедленно). В связи с этим переменные не имеют прямого отображения в аппаратных средствах, но
полезны для алгоритмических представлений.
Приведем некоторые примеры описаний переменных:
variable RUN : BOOLEAN := FALSE;
variable COUNT : INTEGER := 0;
variable ADDR : BIT_VECTOR(0 to 11);
Таким образом, в описаниях
переменных указываются имя, тип и (необязательно) начальное
значение данной переменной.
Переменные, используемые в
блоке процесса, считаются статическими: т. е. система моделирования
сохраняет значение такой статической переменной до тех пор,
пока оно не изменится оператором присваивания. В качестве
примера рассмотрим блок процесса, используемый для моделирования работы
ЗУПВ (RAM):
RAM :
process(ADDR,RW,CS)
type MEMORY
is array(0 to 1023) of BIT_VECTOR(0 to 7);
variable MEM: MEMORY;
begin
Чтение из памяти MEM и запись в память MEM
end process RAM;
Поскольку переменная MEM является статической,
записанные в MEM значения будут сохраняться до
момента изменения ее оператором присваивания.
Сигналы.Сигналы- это объекты, значения
которых могут меняться и которые имеют временные
параметры. Значения сигналов меняются операторами назначения
сигналов, например
А < = В
+ С after 50 ns;
D < = Е nor С.
Отметим, что в операторе
назначения сигнала используется символ < =, чтобы отличить его от
оператора присваивания для переменной. В первом примере оператора
назначения сигнала указано «через 50 не» -это означает,
что сигнал А может в принципе принимать свое новое значение
спустя 50 не после текущего момента времени моделирования.
Мы говорим «в принципе»,
поскольку в рамках модели может быть более одного оператора назначения,
действующего для сигнала А.
Во втором примере нет фразы «after» (через), что эквивалентно
«через О не». Однако операторы назначения сигналов
применяются для представления событий в реальных
электрических схемах, так что, если даже нет фразы «after» или если в результате
вычисления оказывается, что фактический параметр этой
фразы равняется нулю, предполагается, что данный сигнал принимает свое
новое значение с некоторой дельта-задержкой. Здесь дельта - произвольно малое значение времени, большее нуля. Более подробно мы рассмотрим подразумеваемые
временные характеристики операторов сигналов в гл. 3.
Еще одно отличие сигналов от
переменных состоит в том, что сигналы могут иметь по многу
контейнеров, называемых драйверами, причем значение данного сигнала
есть функция всех его драйверов. Пример подобной ситуации
приведен на рис. 2.11. Здесь показаны два процесса, А и
В, каждый из которых содержит оператор назначения сигнала для
сигнала X. Для каждого процесса,
присваивающего значение сигналу X, создается драйвер,
фиксирующий результат такого присваивания. В данном примере драйверы
имеют метки Dax и Dbx. Значение сигнала X вычисляется при помощи функции
разрешения шины (здесь F). Функции разрешения шины
определяет пользователь; они вычисляются, когда один из
драйверов данного сигнала получает новое значение.
После этого значение сигнала меняется на значение, вычисленное
по функции разрешения шины. В гл. 5 мы объясним, каким образом
можно описать функции разрешения шины. Полный смысл концепции
сигналов в языке VHDL станет более понятным, когда мы будем обсуждать построение моделей и моделирование.
Рис. 2.11. Пример схемы с многими
драйверами сигнала и функции разрешения шины.
В языке VHDL функции можно описывать, указывая:
1. Имя функции.
2. Входные параметры, если таковые имеются.
3. Тип возвращаемого значения.
4. Описания, если они требуются для самой функции.
5. Алгоритм вычисления возвращаемого значения
В архитектурном теле MACRO для счетчика единиц ONES__CNT содержались функции MAJ3 (X, Y, Z) и OPAR3 (X, Y, Z). Чтобы эти функции можно было использовать, их необходимо вначале описать, например, следующим образом:
function MAJ3(signal X,Y,Z : BIT) return BIT is
begin
return (X and Y) or {X and Z) or (Y and Z);
end MAJ3;
Аналогичным образом описывается функция OPAR3. Отметим, что здесь возвращаемое значение имеет тип BIT. Возвращаемое значение может быть определено в виде выражения, как в приведенном примере, либо для вычисления возвращаемого значения может использоваться соответствующая последовательность операторов. Как отмечалось выше, могут создаваться локальные описания, однако в данном простом случае это не требуется.
Язык VHDL предусматривает также описание процедур. При описании
процедуры указываются :
1. Имя процедуры.
2. Входные и выходные параметры, если таковые имеются.
3. Описания, если они требуются для самой процедуры.
4. Алгоритм.
На рис. 2.12 показан пример описания процедуры для подсчета числа и
нулей в трехбитовом векторе. Отметим, что в списке параметров
указываются и входные, и выходные параметры. За списком параметров
следует раздел описания. Алгоритм, реализуемый данной процедурой,-это
последовательность операторов после ключевого слова begin.
рис. 2.12 Пример процедуры
Разработчику модели, конечно, обременительно повторять описания каждый раз, когда их нужно использовать. Поэтому, чтобы повысить эффективность программировании, в языке VHDL предусмотрен механизм пакетов для часто используемых описаний. Пакету присваивается имя. Описания, содержащиеся в пакете, можно сделать видимыми, давая ссылку на данный пакет. Вначале, однако, пакет нужно описать. Пример подобного описания приведен на рис. 2.13. Отметим, что в описании пакета для пакета HANDY имеются подтипы и интерфейс для функции.
Код функции содержится в теле пакета. Если в пакете нет подпрограмм,
тела пакета не требуется.
рис. 2.13 Определение пакета
Имея такое описание пакета HANDY, предположим, что нужно доступ к этому пакету со стороны объекта под именем LOGSYS. Это можно сделать, поместив фразу use (использовать) перед описанием интерфейса объекта LOGSYS:
use HANDY.ALL;
entity LOGSYS
port(X: in BITVECT3;Y: out BITVECT2);
end LOGSYS;
В этом случае все (All) описания, содержащиеся в пакете HANDY, будут видимыми для объекта LOGSYS, включая все его архитек-турные тела.
Пакеты-это очень полезная особенность языка описания аппарату-ры. Группы разработчиков могут использовать стандартные пакеты, содержащие описания типов и подпрограммы, относящиеся к проек-тируемой ими системе. Как показано в гл. 5, где мы обсуждаем вопросы системного моделирования, эти описания и подпрограммы имеют зна-ти объем кода. Механизм пакетов освобождает разработчика от необходимости многократно вводить этот код. Кроме того, если в группе разработчиков код коллективно используют несколько в, то обеспечивается непротиворечивость данных для всего проекта.
В языке VHDL предусмотрен пакет STANDARD (стандарт), который может использоваться всеми объектами. В числе прочих вещей этот пакет содержит описания типов BIT (битовый), BIT_VECTOR (би-товый вектор), BOOLEAN (булев), INTEGER (целый),REAL (вещест-венный), CHARACTER (символьный), STRING (строковый) и TIME (время), а также подтипы POSITIVE (положительный) и NATURAL (натуральный!
Операторы управления, используемые в языке VHDL приведены в табл.
2.3.
if CONDITION__1 then
последовательность операторов
elsif CONDITION__2 then
последовательность операторов
else
последовательность операторов
end if;
Оба условия CONDITION__1 и CONDITION__2, должны быть типа BOOLEAN. Возможно наличие любого числа фраз elsif. Фразы elsif и else являются необязательными.
Приведем два примера операторов case (выбор):
Пример 2.1
case X(0 to 1) is
when "00" => Z <= 0;
when "01" => Z <= 1;
when "10" => Z <= not Z;
when "11" => Z <= Z;
end case;
Пример 2.2
case N is
when 0 => Z <= 0;
when 1 => Z <= 1;
when 2 => Z <= not Z;
when 3 => Z <= Z;
end case;
Оператор выбора саsе осуществляет декодирование на основе значения
управляющего выражения, а затем выполняет выбранный оператор (или
группу операторов). В примере 2.1 управляющее выражение - это би-товый
вектор, а в примере 2.2 - целое. В общем случае в качестве управляющего
выражения может использоваться любой дискретный тип, как в показанных
примерах, либо одномерный массив символов.
Операторы цикла реализуют те же функции, что и во всех языках
программирования. Приведем четыре примера:
Пример 2.3
for l in 0 to 3 loop
A(l) := 2**l
end loop;
Пример 2.4
SUM : = 0;
I := 1;
SUM_INT: while I <= N loop
SUM := SUM +l;
l := l + 1;
end loop SUM_INT;
Пример 2.5
SUM : = 0;
I := 0;
SUM_INT: while I <= N loop
l := l + 1;
next SUM_INT when l=3;
SUM := SUM +l;
end loop SUM_INT;
Пример 2.6
SUM : = 1;
Ioop
VAL(X)
exit when X<0;
SUM := SUM +X;
end loop;
Пример 2.3 иллюстрирует базовый цикл for, а пример 2.4-цикл while и
использование метки цикла. Цикл примера 2.4 вычисляет сумму первых N
целых. В примере 2.5 производится вычисление той же самой суммы, но без
числа 3, поскольку эта итерация пропускается при помощи оператора next
(следующий). Пример 2.6 показывает потенциально бесконечный цикл,
который прибавляет к накопленной сумме значения, поступающие из
подпрограммы. Выход из этого цикла будет про-исходить в случае, когда
подпрограмма VAL(X) выдаст отрицательное значение.
Два последних оператора управления -RETURN (возврат) и WAIT(ожидание).
Оператор RETURN используется в процедурах и функциях, как было показано
выше. Оператор ожидания WAIT, как мы увидим в гл. 3, используется для
приостановки процесса на определенный период времени или до момента
наступления определенного события.
В данной главе мы представили язык VHDL. Наша цель -дать читателю основные сведения о языке, особенно о тех его средствах, которые будут использоваться в моделях в последующих главах. Оче-видно, что приведенные здесь сведения нельзя считать полными. Другие средства языка будут иллюстрироваться по мере рассмотрения под-ходов к построению моделей и моделированию. В качестве полных примеров будут приводиться модели, где будут объединяться все необ-ходимые средства языка. После освоения материала настоящей главы читатель должен получить достаточно полное представление о языке VHDL чтобы 1) суметь оценить эффективность этого языка для моде-лирования на уровне СБИС и 2) разбираться в структурах моделей. Те читатели, которые хотят сами разрабатывать модели на языке VHDL, должны обратиться к следующей литературе.
Han, D.,"Optimal Constructs for Chip Level Modeling," Masters
thesis. Department ofElectrical Engineering, Virginia Polytechnic
Institute, August 1986.
IEEE Computer, February 1985, "Special Issue on Hardware Description
Languages."
IEEE Design & Test of Computers," VHDL: The VHSIC Hardware
Description Lan-guage," April 1986.
"VHDL Language Reference Manual, Draft Standard 1076/B," April 1987,
CAD Lan-guage Systems, Inc.
"VHDL Language Reference Manual, Version 7.2," IR-MD-045-2, August
1985, Inter-metrics, Inc.
"VHDLTutorial for IEEE Standard 1076 VHDL," June 1987, CAD Language
Systems, Inc.
"VHDL User's Manual, Volume I: Tutorial," IR-MD-065-1, August 1985,
Intermetrics, Inc.
"VHDL User's Manual, Volume Hi User's Reference Guide," IR-MD-065-1,
August 1985, Intermetrics, Inc.