Язык описания аппаратуры AHDL
1. Язык описания
аппаратуры AHDL
Язык описания аппаратуры AHDL
разработан фирмой Altera и предназначен для описания комбинационных и
последовательностных логических устройств, групповых операций, цифровых
автоматов (state machine) и таблиц истинности с учетом архитектурных
особенностей ПЛИС фирмы Altera. Он полностью интегрируется с системой
автоматизированного проектирования ПЛИС MAX+PLUS II. Файлы описания аппаратуры,
написанные на языке AHDL, имеют расширение *.TDF (Text design file). Для
создания TDF-файла можно использовать как текстовый редактор системы MAX+PLUS
II, так и любой другой. Проект, выполненный в виде TDF-файла, компилируется,
отлаживается и используется для формирования файла программирования или
загрузки ПЛИС фирмы Altera.
Система MAX+PLUS II позволяет
автоматически создать символ компонента, алгоритм функционирования которого
описывается TDF-файлом, и затем вставить его в файл схемного описания
(GDF-файл). Подобным же образом можно вводить собственные функции разработчика
помимо порядка 300 макрофункций, разработанных фирмой Altera, в любой TDF-файл.
Для всех функций, включенных в макробиблиотеку системы MAX+PLUS II, фирма Altera
поставляет файлы с расширением *.inc, которые используются в операторе
включения INCLUDE.
Разработчик может пользоваться
командами текстового редактора или операторами языка AHDL для того, чтобы
сделать назначения ресурсов и устройств. Кроме того, разработчик может
проверить синтаксис или выполнить полную компиляцию для отладки и запуска
проекта. Любые ошибки автоматически обнаруживаются обработчиком сообщений и
высвечиваются в окне текстового редактора.
Особенности языка AHDL.
· Язык
AHDL не различает прописные и строчные буквы. Однако, рекомендуется для
улучшения читаемости ключевых слов использовать прописные буквы;
· Строка
в TDF-файле может быть длиной до 255 символов. Однако следует стремиться к
длине строки, умещающейся на экране. Строки заканчиваются нажатием клавиши Enter;
· Новую
строку можно начинать в любом свободном месте, т.е. на местах пустых строк, табуляций,
пробелов.
· Основные
конструкции языка отделяются пустым пространством;
· Ключевые
слова, имена и числа должны разделяться соответствующими символами или
операторами и / или одним или более пробелами;
· Комментарии
должны быть заключены в символы процента (%). Комментарии не могут быть
вложенными.
Числа и константы
Числа используются для представления
констант в булевых выражениях и уравнениях. Язык AHDL поддерживает все
комбинации десятичных, двоичных, восьмеричных и шестнадцатеричных чисел. Десятичные,
двоичные, восьмиричные и шестнадцатиричные числа можно использовать в любой
комбинации. Синтаксис записи чисел в языке AHDL для каждой из указанных систем
счисления следующий:
• десятичная - содержит
последовательность цифр 0 - 9;
• двоичная - содержит
последовательность из цифр 0, 1 и символа Х (данный символ отражает
безразличное состояние), размещенных в кавычках («»), следующих за буквой B;
• восьмеричная - содержит
последовательность цифр от 0 до 7, размещенных в кавычках, следующих за буквой O или Q;
• шестнадцатиричная - содержит
последовательность цифр от 0 до 9 и букв от A до F, размещенных в кавычках, следующих
за буквой H или X.
Примеры записи чисел: B «0110X1X10», Q «4671223», H «123AECF».
К числам в языке AHDL применяются
следующие правила:
) компилятор системы MAX+PLUS
II всегда интерпретирует числа как группы двоичных цифр;
) в булевых выражениях числа
нельзя присваивать одиночным узлам (вершинам). Вместо этого нужно использовать
константы VCC (соответствует уровню логической единицы) и GND (соответствует
уровню логического нуля).
Константы удобно использовать как
имена чисел. Преимущество использования констант состоит в том, что если одно и
то же число задано через имя константы и используется в программе несколько
раз, то его значение можно изменить во всех элементах программы, изменив
указанное значение только один раз при объявлении константы.
Использование числа и константы
проиллюстрируем примером программы, представляющей описание дешифратора адреса,
генерирующего высокий уровень сигнала разрешения доступа к шине, если входной
адрес равен шестнадцатиричному числу 370h.
CONSTANT IO_ADDRESS = H
«0370»;decoder
([15..0]: INPUT;_enable:
OUTPUT;: OUTPUT;
)_enable = (address
[15..0] == H «0370»);= (a [15..0] == IO_ADDRESS);;
Преимущество использования констант
особенно заметно, если одно и то же число используется в файле несколько раз.
Тогда, если его нужно изменить, меняют его только один раз в объявлении
константы.
Зарезервированные ключевые слова
FUNCTION
|
OTHERS
|
|
CASE
|
TABLE
|
JKFFE
|
BITS
|
SRFFE
|
NCLUDE
|
DFF
|
VCC
|
NODE
|
DFFE
|
WHEN
|
NOR
|
ELSE
|
WITH
|
NOT
|
END
|
XNOR
|
OPTIONS
|
EXP
|
XOR
|
OR
|
AND
|
GLOBAL
|
OUTPUT
|
BEGIN
|
GND
|
RETURNS
|
BURIED
|
INPUT
|
SOFT
|
BIDIR
|
IF
|
SRFF
|
CARRY
|
IS
|
STATES
|
CASCADE
|
JKFF
|
SUBDESIGN
|
CLIQUE
|
TFF
|
CONNECTED_PINS
|
LCELL
|
TFFE
|
CONSTANT
|
MACHINE
|
THEN
|
DEFAULTS
|
MACRO
|
TITLE
|
DESIGN
|
MCELL
|
TRI
|
DEVICE
|
NAND
|
VARIABLE
|
ELSIF
|
OF
|
X
|
Зарезервированные ключевые слова
используются для следующих целей:
· для
обозначения начала, конца и переходов в объявлениях языка AHDL;
· для
обозначения предопределенных констант, т.е. GND и VCC.
Ключевые слова можно использовать
как символические имена, только если они заключены в символы одинарных кавычках
('). Их можно также использовать в комментариях.
Для того чтобы получить контекстовую
помощь по ключевому слову, убедитесь, что ваш файл сохранен с расширением .tdf,
затем нажмите одновременно две кнопки Shift+F1 в окне текстового
редактора Text Editor и щелкните кнопкой мыши Button 1 на ключевом
слове.рекомендует все ключевые слова набирать прописными буквами.
Ниже приведены символы, имеющие
определенное значение в языке AHDL. В этот перечень не включены символы, используемые в булевых
выражениях и для операций сравнения.
Символы
Символ
|
Функция
|
_ (подчеркивание)
|
Используемые пользователем идентификаторы
|
- (тире)
|
символы в символических именах
|
- (два тире)
|
Начинает комментарий в стиле VHDL, который продолжается до конца
строки
|
% (процент)
|
Заключает с двух сторон комментарий стиля AHDL
|
() (круглые скобки)
|
Заключают и определяют последовательные имена групп. Заключают
имена выводов в секции подпроекта (Subdesign Section) и в прототипах функций.
Заключают (необязательно) входы и выходы таблиц в объявлении Truth Table.
Заключают состояния в объявлении цифрового автомата State Machine. Заключают
более приоритетные операции в булевых выражениях. Заключают необязательные
варианты в секции проекта Design Section (внутри объявления назначения
ресурсов Assignment).
|
[] (квадратные скобки)
|
Заключают диапазон значений в десятичном имени группы
|
'…' (одинарные кавычки)
|
Заключают символические имена.
|
«…» (двойные кавычки)
|
Заключают строку в объявлении названия Title Заключают цифры в
не десятичных номерах Заключают путь в объявлении Include. Могут
(необязательно) заключать имя проекта и устройства в секции проекта Design
Section. Могут (необязательно) заключать имя в объявлении назначения клики
графа Clique Assignment.
|
(точка)
|
Отделяет символические имена переменных в макрофункции или
примитиве от имен портов. Отделяет имя файла от расширения
|
… (многоточие)
|
Разделяет наименьшее и наибольшее значение в диапазонах
|
; (точка с запятой)
|
Заканчивает объявления и секции в языке AHDL
|
(запятая)
|
Разделяет элменты последовательных групп и списков
|
: (двоеточие)
|
Отделяет символические имена от типов в объявлениях и
назначениях ресурсов.
|
@ «собака»
|
Присваивает символические узлы выводам устройства и логическим
ячейкам в объявлениях назначения ресурсов Resource Assignment
|
= (равенство)
|
Присваивает значения по умолчанию GND и VCC входам в секции
подпроекта Subdesign. Присваивает установочные значения в вариантах.
Присваивает значения состояниям в машине состояний. Присваивает значения в
булевых уранениях
|
=> (стрелка)
|
Отделяет входы от выходов в объявлениях таблицы истинности Truth
Table. Отделяет предложения с WHEN от булевых выражений в операторе Case
|
2. Реализация
иерархического проекта
В иерархической структуре проекта
TDF-файлы, написанные на языке AHDL, можно использовать вместе с другими
файлами проектов. На нижнем уровне проекта могут быть макрофункции,
поставляемые фирмой Altera или разработанные пользователями.
Использование макрофункций системы
Altera MAX+PLUS II
В системе MAX+PLUS II есть большая
библиотека, в которую входят 74 стандартных макрофункций, реализующих шины с
последовательным опросом, оптимизацию архитектуры и конкретные приложения.
Библиотека представляет собой собрание блоков высокого уровня, используемых для
создания проекта с иерархической логикой. Во время инсталляции системы эти
макрофункции автоматически записываются в каталог \maxplus2\max2lib и его
подкаталоги, создаваемые в процессе инсталляции.
В языке AHDL существуют два способа
вызова (то есть вставки в качестве примера) макрофункции:
объявить переменную типа
<macrofunction> в объявлении примеров INSTANCE в секции VARIABLE и
использовать порты примера макрофункции в логической секции. В этом способе
важное значение имеют имена портов;
использовать для макрофункции
непосредственную ссылку в логической секции файла TDF. В этом способе важен
порядок портов.
Входы и выходы макрофункций
перечисляются в описании прототипов функций (FUNCTION PROTOTYPE). Прототипы
функций можно записать в отдельный файл и указать его в своем файле с помощью
директивы INCLUDE. Такие Include-файлы создаются автоматически для данного
проекта с помощью команды Create Default Include File. Include-файл вставляется
вместо вызывающей его директивы INCLUDE. Для всех макрофункций системы MAX+PLUS
II Include-файлы должны находиться в каталоге \maxplus2\max2inc.
Ниже приведен файл macro1.tdf,
который реализует четырех битовый счетчик, подсоединенный к дешифратору 4 бит
-> 16 бит. Соответствующие макрофункции вызываются объявлениями примеров в
секции VARIABLE
INCLUDE «4count»;
(: INPUT;[15..0]:
OUTPUT;
): 4count;: 16dmux;.clk
= clk;.dnup = GND;. (d, c, b, a) = counter. (qd, qc, qb, qa);[15..0] =
decoder.q [15..0];
END;
В данном файле используются
директивы INCLUDE для импортирования прототипов функций для двух макроофункций
фирмы Altera: 4count и 16dmux. В секции VARIABLE объявляются две переменные:
counter и decoder как примеры этих макрофункций. В логической секции
определяются входные порты для обеих макрофункций в формате <имя
переменной-примера>.<имя порта>. (Они ставятся в левой части булевых
уравнений, а выходные порты - справа.) Порядок портов в прототипе функции не
важен, так как имена портов в логической секции перечисляются явно.
Ниже приведен файл macro2.tdf,
выполняющий те же функции, что и предыдущий, но макрофункции в нем вызываются
непосредственной ссылкой.
INCLUDE «4count»;«16dmux»;macro2
(: INPUT;[15..0]:
OUTPUT;
)[3..0]: NODE;
(q [3..0],) = 4count
(clk, GND,);
%[15..0] = 16dmux (. (d,
c, b, a)=q [3..0]);
% equivalent in-line
ref. with positional port association%
% out [15..0] = 16dmux (q [3..0]);%;
Вызов макрофункций 4count и 16dmux
осуществляется в логической секции непосредственной ссылкой (в правой части
булевых уравнений).
Ниже приведены прототипы этих
макрофункций, записанные в файлах 4count.inc 16dmux.inc:
FUNCTION 4count (clk,
clrn, setn, ldn, cin, dnup, d, c, b, a)(qd, qc, qb, qa, cout);16dmux (d, c, b,
a)
RETURNS (q [15..0]);
Соединение портов показано в
логической секции файла macro2.tdf. Порядок портов важен, так как должно быть
однозначное соответствие между портами, описанными в прототипе функции и при ее
реализации в логической секции. В данном примере запятыми отделяются (но не
перечисляются) порты, для которых не делается явного подключения.
Создание и применение
пользовательских макрофункций
В файлах, написанных на AHDL можно
легко создавать и использовать пользовательские макрофункции, выполняя
следующие действия:
Создать логику для макрофункции в
файле проекта.
Определить порты макрофункции в
объявлении прототипа функции.
Прототип функции дает краткое
описание функции: ее имя, а также входные, выходные и двунаправленные порты.
Можно также использовать машинные порты для макрофункций, которые импортируют
или экспортируют цифрового автомата.
Объявление прототипов функций может
быть размещено в Include-файле, который вызывается в пользовательском файле.
Используя команду Create Default Include File, можно автоматически создавать
Include-файл с прототипом функции для любого файла проекта.
Вставить в файл пример макрофункции
с помощью объявления примера в секции VARIABLE или с помощью непосредственной
ссылки в тексте.
Использовать макрофункцию в файле.
Определение пользовательской
макрофункции
Для использования макрофункции ее
нужно либо включить в описание прототипа функции в TDF-файле, либо указать в
директиве INCLUDE файла TDF имя Include-файла, содержащего прототип этой
макрофункции. Как уже упоминалось выше, Include-файлы можно создавать
автоматически.
3. Реализация с помощью
оператора выбора
Рассмотрим использование оператора
выбора (case statement) для реализации мультиплексора. Следует отметить что этот способ
наиболее прост и наименее трудоемок.
Единственное отличие - выход out определен как регистр(register), это сделано для того,
чтобы назначить его значения явно и не управлять им. Такое назначение сигнала
называется процедурным назначением (procedural assignment). Данные типа «цепь (wire)» не могут быть назначены явно, они нуждаются в сигнале драйвере,
такое назначение называется непрерывным назначением.
Always ϱ (inl or
in2 or in3 or in4 or cntrl1 or cntrl2)
аппаратура язык истинность
иерархический
Эта конструкция читается так же, как
и пишется, т.е. значение вычисляется всегда при изменении хотя бы одного
операнда - система постоянно их отслеживает. Несколько забегая вперед, следует
отметить, что данная конструкция является синтезируемой во многих системах
проектирования, в частности и в MAX+PLUS фирмы Altera. Список переменных
называется списком чувствительности, поскольку данная конструкция чувствительная
к их изменениям.
Синтаксис оператора выбора case в Verilog сходен с синтаксисом
оператора выбора в языке С. Условием является конкатенация или объединение
переменных cntrl1 и cntrl2 в двухразрядное число. Завершает оператор выбора endcase.
Реализация с использованием
условного оператора
В принципе ничего нового мы уже не
видим - ясно, что в нашем случае условный оператор проигрывает оператору case в наглядности
представления (хотя для большинства систем проектирования синтезируемые
реализации окажутся идентичными).