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 (ИЛИ-НЕ)

хог (исключающее ИЛИ)

Сравнения             =|/=|<|<=|>|> =

Сложения              + | — | & (конкатенация)

Присвоение знака    +II

Умножение            *|/|mod (по модулю) | rem (остаток)

Смешанные           **возведение в степень) | abs (абсолютное значение)

Логические операции определены для типа BIT, типа BOOLEAN и для одномерных массивов, в которых каждый элемент имеет тип BIT или тип BOOLEAN; таким образом, они определены и для типа BITVECTOR.

Все операции сравнения возвращают результат типа 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.

Таблица 2.3

Полная форма оператора IF(если) имеет следующий вид:

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, используется для приостановки процесса на определенный период времени или до момента наступления определенного события.

Краткое содержание главы 2

В данной главе мы представили язык 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.

Дополнительная литература рекомендованная редактором перевода

Маклауд Д.ж. Развитие методон и средств моделирования/Электроника, 1989, ╟ 3, с. 24 30.
Маклауд Дж. Ведущая компания в области САЙТ внедряет язык VHDL/Элект-роника, 1989, ╟ 3. с. 30-35.