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

Поисковые слова: п п п п п п п п п п п п п п п
СМ5 : Глава 3. Язык описания аппаратуры AHDL
 

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


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

Язык описания аппаратуры AHDL разработан фирмой Altera и предназначен для описания комбинационных и последовательностных логических устройств, групповых операций, цифровых автоматов (state machine) и таблиц истинности с учетом архитектурных особенностей ПЛИС фирмы Altera. Он полностью интегрируется с системой автоматизированного проектирования ПЛИС MAX+PLUS II. Файлы описания аппаратуры, написанные на языке AHDL, имеют расширение *.TDF (Text design file). Для создания TDF-файла можно использовать как текстовый редактор системы MAX+PLUS II, так и любой другой. Проект, выполненный в виде TDF-файла, компилируется, отлаживается и используется для формирования файла программирования или загрузки ПЛИС фирмы Altera.

Операторы и элементы языка AHDL являются достаточно мощным и универсальным средством описания алгоритмов функционирования цифровых устройств, удобным в использовании. Язык описания аппаратуры AHDL дает возможность создавать иерархические проекты в рамках одного этого языка или же в иерархическом проекте использовать как TDF-файлы, разработанные на языке AHDL, так и другие типы файлов. Для создания проектов на AHDL можно, конечно, пользоваться любым текстовым редактором, но текстовый редактор системы MAX+PLUS II предоставляет ряд дополнительных возможностей для ввода, компиляции и отладки проектов (см. Главу 2).

Проекты, созданные на языке AHDL, легко внедряются в иерархическую структуру. Система MAX+PLUS II позволяет автоматически создать символ компонента, алгоритм функционирования которого описывается TDF-файлом, и затем вставить его в файл схемного описания (GDF-файл). Подобным же образом можно вводить собственные функции разработчика помимо порядка 300 макрофункций, разработанных фирмой Altera, в любой TDF-файл. Для всех функций, включенных в макробиблиотеку системы MAX+PLUS II, фирма Altera поставляет файлы с расширением *.inc, которые используются в операторе включения INCLUDE.

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

При работе с AHDL следует соблюдать так называемые 'Золотые правила' (Golden Rules). Выполнение этих правил позволит эффективно применять язык AHDL и избежать многих ошибок:


  • Соблюдайте форматы и правила присвоения имен, описанные в руководстве по стилям AHDL, чтобы программа была читаемой и содержала меньше ошибок;
  • Несмотря на то, что язык AHDL не различает прописные и строчные буквы, Altera рекомендует для улучшения читаемости использовать прописные буквы для ключевых слов;
  • Не применяйте вложенные конструкции условного оператора If, если можно использовать оператор выбора Case;
  • Строка в TDF-файле может быть длиной до 255 символов. Однако следует стремится к длине строки, умещающейся на экране. Строки заканчиваются нажатием клавиши Enter;
  • Новую строку можно начинать в любом свободном месте, т.е. на местах пустых строк, табуляций, пробелов. Основные конструкции языка отделяются пустым пространством;
  • Ключевые слова, имена и числа должны разделяться соответствующими символами или операторами и/или одним или более пробелами;
  • Комментарии должны быть заключены в символы процента (%). Комментарий может включать любой символ, кроме символа %, поскольку компилятор системы MAX+PLUS II игнорирует все, заключенное в символы процента. Комментарии не могут быть вложенными;
  • При соединении одного примитива с другим используйте только 'разрешенные' связи между ними, не все примитивы могут соединяться друг с другом.
  • Используйте только макрофункции EXPDFF, EXPLATCH, NANDLTCH и NORLTCH, входящие в макробиблиотеку системы MAX+PLUS II. Не создавайте свои собственные структуры перекрестных связей. Избегайте многократного связывания вместе EXPDFF, EXPLATCH, NANDLTCH и NORLTCH. Многочисленные примеры этих макрофункций должны всегда разделяться примитивами LCELL.

Общие 'золотые правила' ввода проекта:

  • Если многочисленные двунаправленные или выходные выводы связаны вместе, разработчик не может использовать оператор Pin Connection для соединения выводов при функциональном моделировании с аппаратной поддержкой или функциональном тестировании;
  • Нет необходимости создавать прототипы функций для примитивов. Однако разработчик может переопределить примитивы в объявлениях прототипов функций для изменения порядка вызова входов в вашем TDF-ФАЙЛЕ;
  • Не редактируйте файл Fit. Если разработчик желает отредактировать назначения для проекта, необходимо сохранить сначала файл Fit как TDF-файл или сделать обратное назначение с помощью команды Project Back-Annotate и отредактировать их с помощью команд Chip to Device, Pin/LC/Chip и Enter Assignments;
  • Если разработчик хочет загрузить регистр по определенному фронту глобального тактового сигнала Clock, фирма Altera рекомендует, когда регистр загружен, использовать для управления вход Clock Enable одного из триггеров типа Enable: DFFE, TFFE, JKFFE или SRFFE;
  • Когда разработчик начинает работать с новым файлом проекта, сразу же необходимо задать семейство ПЛИС, на которые ориентирован проект, с помощью конструкции Family для того, чтобы в дальнейшем иметь возможность воспользоваться макрофункциями, специфичными для данного семейства. Если разработчик не задаст семейство, оно будет считаться таким же, как и в текущем проекте;
  • Используйте опцию Design Doctor для проверки надежности логики проекта во время компиляции.
  • Предоставляемые по умолчанию фирмой Altera стили для логического синтеза имеют разные установки для разных семейств устройств, что обеспечивает более эффективное использование архитектуры каждого устройства. Когда разработчик используете какой-нибудь из этих стилей, его установки изменятся, при переходе к другому семейству устройств. После смены семейства необходимо проверить новые установки стиля.

Общие 'золотые правила' системы MAX+PLUS II:

  • В начале работаты над новым проектом рекомендуется сразу же задать его имя как имя нового проекта с помощью меню Project Name для того, чтобы втдальнейшем его было бы легко компилировать. Позже разработчик всегда может изменить имя проекта;

  • Используйте иерархические возможности системы MAX+PLUS II для перемещения между файлами проекта. Для открытия файла нижнего уровня иерархии откройте файл верхнего уровня и затем используйте окно Hierarchy Display или Hierarchy Down и откройте файл более низкого уровня. Если разработчик выберает Open или Retrieve для открытия файла нижнего уровня, считается, что он является файлом верхнего уровня нового дерева и все назначения ресурсов, устройств и зондов сохраняются только для этой новой иерархии, а не для текущего проекта;

  • Если разработчик создает вспомогательный файл для какого-нибудь проекта, пиктограмма этого файла появится в окне Hierarchy Display, в том случае, если используется то же имя, что и для проекта;

  • Не рекомендуется редактировать системные файлы MAX+PLUS II, в том числе файлы с расширением .prb, файлы HIF или maxplus2.ini либо файлы <имя проекта>.ini;

  • Если разработчик желает переименовать файл проекта или вспомогательный файл, следует использовать команду Save As... Не рекомендуется переименовывать файлы проекта вне среды MAX+PLUS II (например, из MS-DOS или Windows File Manager);

  • После завершения проекта рекомендуется выполнить команду архивирования проекта Project Archive для создания резервной копии всего проекта (всех его файлов). На архивированную копию не повлияют никакие последующие редактирования.

3.2. Использование чисел и констант в языке AHDL

3.2.1 Использование чисел

Числа используются для представления констант в булевских выражениях и уравнениях. Язык AHDL поддерживает все комбинации десятичных, двоичных, восьмеричных и шестнадцатеричных чисел.

Ниже приведен файл decode1.tdf, который представляет собой дешифратор адреса, генерирующий высокий активный уровень сигнала разрешения доступа к шине, если адрес равен шестнадцатеричному числу 370h.

SUBDESIGN decode1

(

address[15..0] : INPUT;

chip_enable : OUTPUT;

)

BEGIN

chip_enable = (address[15..0] == H"0370");

END;

В этом примере десятичные числа использованы для указания размерности массива бит, которым записывается адрес шины. Шестнадцатеричным числом H'0370' записано значение адреса, при котором обеспечивается высокий уровень сигнала.

3.2.2. Использование констант

В файле AHDL можно использовать константы для описательных имен разных чисел. Такое имя, используемое на протяжении всего файла, может быть более информативным, чем число; например, имя UPPER_LI несет больше информации, чем число 103. В языке AHDL константы вводятся объявлением CONSTANT.

Приведенный выше файл можно записать по-другому, используя вместо числа H'0370' константу IO_ADDRESS.

CONSTANT IO_ADDRESS = H'0370';

SUBDESIGN decode2

(

a[15..0] : INPUT;

ce : OUTPUT;

)

BEGIN

ce = (a[15..0] == IO_ADDRESS);

END;

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

3.3. Комбинационная логика

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

3.3.1. Реализация булевых выражений и уравнений

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

В качестве примера приведен файл boole1.tdf, в котором даны два простых булевых выражения, представляющих два логических элемента.

SUBDESIGN boole1

(

a0, a1, b : INPUT;

out1, out2 : OUTPUT;

)

BEGIN

out1 = a1 & !a0;

out2 = out1 # b;

END;

Здесь выход out1 получается в результате логической операции И, примененной ко входу а1 и инвертированному входу а0, а выход out2 получается в результате применения логической операции ИЛИ к выходу out1 и входу b. Поскольку эти уравнения обрабатываются одновременно, последовательность их следования в файле не важна.

3.3.2. Объявление NODE (узел)

Узел, который объявляется в секции переменных VARIABLE в объявлении NODE, можно использовать для хранения промежуточных выражений.

Это полезно делать, если булево выражение повторяется несколько раз и его целесообразно заменить именем узла. Приведенный выше файл boole1.tdf можно переписать по-другому:

SUBDESIGN boole2

(

a0, a1, b : INPUT;

out : OUTPUT;

)

VARIABLE

a_equals_2 : NODE;

BEGIN

a_equals_2 = a1 & !a0;

out = a_equals_2 # b;

END;

Здесь объявляется узел a_equals_2 и ему присваивается значение выражения a1 & !a0. Использование узлов помогает экономить ресурсы устройств, если узел используется в нескольких выражениях.

3.3.3. Определение групп

Группа может включать в себя до 256 элементов (бит), рассматривается как совокупность узлов и участвует в различных действиях как единое целое. В булевых уравнениях группа может быть приравнена булевому выражению, другой группе, одному узлу, VCC, GND,1 или 0. В каждом случае значения группы разные.

Если группа определена, для краткого указания всего диапазона ставят две квадратные скобки [ ]. Например, группу а[4..1] можно кратко записать как а[ ].

Примеры определения групп:

  • При присваивании двух групп обе должны иметь одинаковое число бит. В приводимом ниже примере каждый бит первой группы соединяется с соответствующим битом второй групп, а именно, d2 соединяется с q8, d1 с q7 и d0 с q6:
  • d[2..0] = q[8..6]

  • При присваивании группы одному узлу все биты группы присоединяются к узлу. В приводимом ниже примере d1, d2 и d0 присоединяются все вместе к n:
  • d[2..0] = n

  • При присваивании группы значению VCC или GND все биты группы присоединяются к этому значению. В приводимом ниже примере d1, d2 и d0 присоединяются все вместе к VCC:
  • d[2..0] = VCC

  • При присваивании группы к 1 младший бит группы присоединяется к VCC, а все другие биты - к значению GND. В приводимом ниже примере только d0 присоединяется к VCC, значение 1 расширяется до представления B'001'.
  • d[2..0] = 1

3.3.4. Реализация условной логики

Условная логика делает выбор между режимами в зависимости от логических входов. Для реализации условной логики используются операторы IF или CASE:

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

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

3.3.4.1. Логика оператора IF

В качестве примера рассмотрим файл priority.tdf, в котором описан кодировщик приоритета, который преобразует уровень самого приоритетного активного входа в значение. Он генерирует двухразрядный код, показывающий вход с наивысшим приоритетом, запускаемый VCC.

 

SUBDESIGN priority

(

low, middle, high : INPUT;

highest_level[1..0] : OUTPUT;

)

BEGIN

IF high THEN

highest_level[] = 3;

ELSIF middle THEN

highest_level[] = 2;

ELSIF low THEN

highest_level[] = 1;

ELSE

highest_level[] = 0;

END IF;

END;

Здесь оцениваются входы low, middle и high, чтобы определить, запущены ли они VCC. На выходе получится код, соответствующий приоритету того входа, который был запущен VCC. Если ни один вход не запущен, значение кода станет 0.

3.3.4.2. Логика оператора CASE

В качестве примера рассмотрим файл decoder.tdf, реализующий функции Дешифратора, преобразующего код из двухразрядного в четырехразрядный. В результате его работы два двухразрядных двоичных входа преобразуются в один 'горячий код', который так называется потому, что четыре его допустимых значения содержат по одной единице: 0001, 0010, 0100, 1000.

SUBDESIGN decoder

(

code[1..0] : INPUT;

out[3..0] : OUTPUT;

)

BEGIN

CASE code[] IS

WHEN 0 => out[] = B"0001";

WHEN 1 => out[] = B"0010";

WHEN 2 => out[] = B"0100";

WHEN 3 => out[] = B"1000";

END CASE;

END;

Здесь группа входа code [1..2] может принимать значения 0, 1, 2, 3. В зависимости от реального кода активизируется соответствующая ветвь оператора и только она одна в данный момент времени. Например, если на входе code [] равен 1, на выходе out устанавливается значение В'0010'.

3.3.4.3. Сравнение операторов IF и CASE

Операторы IF и CASE похожи. Иногда использование любого из них приводит к одним и тем же результатам:


If Then

Case

IF a[] == 0 THEN

y = c & d;

ELSIF a[] == 1 THEN

y = e & f;

ELSIF a[] == 2 THEN

y = g & h;

ELSIF a[] == 3 THEN

y = i;

ELSE

y = GND;

END IF;

 

CASE a[] IS

WHEN 0 =>

y = c & d;

WHEN 1 =>

y = e & f;

WHEN 2 =>

y = g & h;

WHEN 3 =>

y = i;

WHEN OTHERS =>

y = GND;

END CASE;


 

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

  • В операторе IF можно использовать любое булево выражение. Каждое выражение, записываемое в предложении, следующем за IF или ELSEIF, может не быть связанным с другими выражениями в операторе. В операторе CASE одно единственное выражение сравнивается с проверяемым значением.
  • В результате интерпретации оператора IF может быть сгенерирована логика, слишком сложная для компилятора системы MAX+PLUS II. В приведенном ниже примере показано, как компилятор интерпретирует оператор IF. Если а и b - сложные выражения, то инверсия каждого из них даст еще более сложное выражение.

IF a THEN IF a THEN

c = d; c = d;

END IF;

ELSIF b THEN IF !a &