
- •Учебник по языку ahdl Оглавление
- •1.Введение
- •1.1.Общие положения
- •1.2.Как работает ahdl?
- •2.Элементы языка ahdl
- •2.1.Зарезервированные слова
- •2.2.Зарезервированные идентификаторы
- •2.3.Символы
- •2.4.Строковые и символьные имена
- •2.5.Шины
- •2.5.1.Способы объявления шин
- •2.5.2.Диапазоны и поддиапазоны шин
- •2.6.Числа в ahdl
- •2.7.Арифметические выражения
- •2.8.Встроенные оценочные функции
- •2.9.Логические выражения
- •2.9.1.Операторы логических функций
- •2.9.1.1.1.Булевы операторы, использующие not
- •2.9.1.2.1.Булевы операторы, использующие and, nand, or, nor, xor, и xnor
- •2.9.2.Арифметические операторы
- •2.9.3.Компараторы
- •2.9.4.Приоритеты логических и арифметических операторов
- •2.10.Прототипы логических функций
- •2.10.1.Примитивы
- •2.10.2.Массивы примитивов
- •2.10.3.Макрофункции
- •2.10.4.Мегафункции и библиотеки параметризуемых модулей
- •2.10.5.Не используемые входы примитивов, мегафункций и макрофункций
- •2.11.Порты
- •2.11.1.Типы портов:
- •2.11.2.Порты экземпляров
- •3.Структура описания проекта на языке ahdl
- •3.1.Общая структура
- •Раздел Subdesign
- •Раздел Variable
- •Раздел Logic
- •3.2.Определение заголовка описания (оператор Title)
- •3.3.Определение включаемого текста (оператор Include)
- •3.4.Определение констант (оператор Constant)
- •3.5.Обозначение арифметических выражений (оператор Define)
- •3.6.Определение параметров (оператор Parameters)
- •3.7.Определение прототипов логических функций (оператор Function Prototype).
- •3.8.Определение порядка следования битов (оператор Options)
- •3.9.Контроль арифметических выражений (оператор Assert)
- •3.10.Раздел интерфейса проекта (Subdesign)
- •3.11.Раздел переменных проекта (Variable)
- •Раздел Variable может включать следующие операторы и конструкции:
- •Раздел Variable может также содержать операторы If Generate, которые могут быть использованы для генерирования объектов, узлов, регистров, конечных автоматов, и псевдоимен конечных автоматов.
- •Раздел Variable имеет следующие характеристики:
- •3.11.1.Объявление объектов (Instance Declarations)
- •3.11.2.Объявление узлов (Node Declarations)
- •3.11.3.Объявление регистров (Register Declarations)
- •3.11.4.Объявление конечных автоматов (State Machine Declarations)
- •3.11.5.Объявления псевдоимен конечных автоматов (Machine Alias Declaration)
- •3.12.Раздел тела проекта (Logic)
- •3.12.1.Задание исходных значений (Defaults Statment)
- •3.12.2.Булевские выражения (Boolean Equations)
- •3.12.3.Управляющие булевские выражения (Boolean Control Equations)
- •3.12.4.Оператор проверки списка (Case.)
- •3.12.5.Оператор проверки логического выражения (If Then.)
- •3.12.6.Оператор проверки логического выражения (If Generate )
- •3.12.7.Оператор цикла (For Generate)
- •3.12.8.Использование ссылок на прототипы функций (In-Line Logic Function Reference)
- •3.12.9.Определение таблицы истинности (Truth Table)
- •4.Применение языка ahdl
- •4.1.Использование шаблонов ahdl
- •4.2.Создание текстового выходного файла
- •4.3.Использование чисел
- •4.4.Использование констант и оценочных функций
- •4.5.Использование итеративно-генерируемой логики
- •4.6.Использование условно-генерируемой логики
- •4.7.Выполнение контроля выражений с помощью оператора Assert
- •4.8.Управление логическим синтезом с помощью примитивов lcell & soft
- •4.9.Реализация комбинационной логики
- •4.9.1.Реализация логических выражений и уравнений
- •4.9.2.Именование логических операторов и компараторов
- •4.9.3.Использование узлов
- •4.9.4.Использование шин
- •4.9.5.Реализация условной логики
- •4.9.5.1.1.Оператор If Then
- •4.9.5.2.1.Оператор Case
- •4.9.5.3.1.Оператор If Then против оператора Case
- •4.9.6.Создание дешифраторов
- •4.9.7.Использование значений переменных по умолчанию
- •4.9.8.Реализация логики с активными низкими уровнями
- •4.9.9.Реализация двунаправленных выводов
- •4.9.10.Реализация тристабильных шин
- •4.10.Реализация последовательностной логики
- •4.10.1.Объявление регистров
- •4.10.2.Объявление регистровых выходов
- •4.10.3.Создание счетчиков
- •4.10.4.Конечные автоматы
- •4.10.5.Реализация конечных автоматов
- •4.10.6.Управление записью, сбросом и разрешением (Clock, Reset & Enable)
- •4.10.7.Присваивание состояний
- •4.10.8.Конечные автоматы с синхронными выходами
- •4.10.9.Конечные автоматы с асинхронными выходами
- •4.10.10.Выход из некорректных состояний
- •4.11.Реализация запоминающих устройств
- •4.12.Реализация иерархических проектов
- •4.12.1.Использование непараметрических функций
- •4.12.2.Использование параметрических функций
- •4.12.3.Использование заказных мега- и макрофункций
- •4.12.4.Импорт и экспорт конечных автоматов
4.12.2.Использование параметрических функций
MAX+PLUS II содержит параметрические мегафункции, а также функции библиотеки параметрических модулей (LPM). Например, параметры используются для определения ширины порта или будет ли блок памяти RAM реализован как синхронный или асинхронный. Параметрические функции могут содержать другие подпроекты, которые в свою очередь могут быть параметрическими или непараметрическими. Параметры можно использовать с некоторыми макрофункциями, которые не являются параметрическими. (Примитивы не могут быть параметрическими). Все логические функции MAX+PLUS II можно использовать для создания иерархических проектов. Мега и макрофункции автоматически устанавливаются в подкаталоги каталога \maxplus2\max2lib, созданного во время инсталляции; логика примитивов встроена в язык AHDL.
Параметрические функции объявляются с помощью ссылки на функцию или объявления Instance таким же образом как для непараметрических функций, но с некоторыми дополнительными шагами:
Экземпляр логической функции должен содержать в себе предложение WITH, которое основано на предложении WITH в прототипе функции, в котором приводится список параметров, используемых экземпляром. Вы можете использовать предложение WITH для дополнительного присваивания значений параметрам экземпляра, однако, для всех необходимых параметров в функции, параметрическое значение должно прикладываться где-нибудь в пределах проекта. Если сам по себе экземпляр не содержит некоторых или всех значений для требуемых параметров, компилятор ищет их в порядке поиска значений параметров.
Так как параметрические функции не обязательно имеют начальные значения для не подсоединенных входов, Вы должны убедиться что все необходимые порты подсоединены. С другой стороны, примитивы и макрофункции всегда имеют начальные значения для не подсоединенных входов.
Файл lpm_add1.tdf, приведенный ниже, реализует 8-битный сумматор с помощью ссылки на параметрическую мегафункцию lpm_add_sub.
INCLUDE "lpm_add_sub.inc";
SUBDESIGN lpm_add1
(
a[8..1], b[8..1] : INPUT;
c[8..1] : OUTPUT;
carry_out : OUTPUT;
)
BEGIN
% Экземпляр мегафункции со связью порта по положению %
(c[], carry_out, ) = lpm_add_sub(GND, a[], b[], GND,,)
WITH (LPM_WIDTH=8,
LPM_REPRESENTATION="unsigned");
%Эквивалентный экземпляр со связью по имени %
--(c[],carry_out,)= lpm_add_sub(.dataa[]=a[],.datab[]=b[],
-- .cin=GND, .add_sub=GND)
-- WITH (LPM_WIDTH=8,
LPM_REPRESENTATION="unsigned");
END;
Прототип функции для lpm_add_sub приведен ниже:
FUNCTION lpm_add_sub(cin, dataa[LPM_WIDTH-1..0], datab[LPM_WIDTH-1..0], add_sub)
WITH (LPM_WIDTH, LPM_REPRESENTATION, LPM_DIRECTION, ADDERTYPE,
ONE_INPUT_IS_CONSTANT)
RETURNS (result[LPM_WIDTH-1..0], cout, overflow);
Здесь требуется только параметр LPM_WIDTH и экземпляр функции lpm_add_sub в файле lpm_add1.tdf определяет значения параметров только для LPM_WIDTH и LPM_REPRESENTATION.
Файл lpm_add2.tdf, приведенный ниже, идентичен с lpm_add1.tdf, но реализует 8-битный сумматор с помощью объявления Instance.
INCLUDE "lpm_add_sub.inc";
SUBDESIGN lpm_add2
(
a[8..1], b[8..1] : INPUT;
c[8..1] : OUTPUT;
carry_out : OUTPUT;
)
VARIABLE
8bitadder : lpm_add_sub WITH (LPM_WIDTH=8,
LPM_REPRESENTATION="unsigned");
BEGIN
8bitadder.cin = GND
8bitadder.dataa[] = a[]
8bitadder.datab[] = b[]
8bitadder.add_sub = GND
c[] = 8bitadder.result[]
carry_out = 8bitadder.cout
END;