Арифметические операторы используются для выполнения арифметических операций сложения и вычитания над группами и числами. В языке AHDL применяются арифметические операторы перечисленные в таблице 2.9.
Таблица 2.9 – Арифметические операторы
Оператор | Пример | Описание |
+ (унарный) | +1 | Положительное значение |
- (унарный) | -a[4..1] | Отрицательное значение |
+ | count [7..1] + delta[7..0] | Сложение |
- | Rightmost_x[] – leftmost_x[] | Вычитание |
Унарные плюс (+) и минус (-) являются префиксными операторами. Оператор “+” не влияет на свой операнд, и разработчик может использовать его для иллюстративных целей (то есть для указания положительного числа). Оператор “-” интерпретирует свой операнд в двоичном представлении (если он таковым не является с самого начала). Затем
он выполняет операцию унарного минуса, то есть получает дополнение операнда как двоичного числа.
К другим арифметическим операторам применяются следующие правила:
─ операции выполняются между двумя операндами, которые должны быть группами узлов или числами;
─ если оба операнда представляют собой группы узлов, то они должны иметь одинаковый размер;
─ если оба операнда представляют собой числа, то более короткое (в двоичном представлении) число расширяется (дополняется незначащими нулями), чтобы сравняться по числу битов с другим операндом;
─ если один операнд представляет собой число, а другой является группой узлов, то число усекается или расширяется в двоичном представлении до размера группы. Если при этом усекаются значащие биты, компилятор системы MAX+PLUS II генерирует сообщение об ошибке.
2.3.3 Управление синтезом.
2.3.3.1 Реализация примитивов LCELL и SOFT
Можно ограничить логический синтез с помощью замены переменных типа узел (NODE) примитивами SOFT и LCELL. Переменные NODE и примитивы LCELL обеспечивают наилучшее управление логическим синтезом. Примитивы SOFT обеспечивают более слабое управление логическим синтезом.
Переменные NODE, которые объявляются в секции VARIABLE, не накладывают больших ограничений на логический синтез. Во время синтеза модуль логического синтеза компилятора системы MAX+PLUS II заменяет каждый пример использования переменной NODE логикой, которую она представляет. Затем происходит минимизация логики до одной логической ячейки. Этот метод обычно приводит к ускорению работы схемы, но в результате может получиться слишком сложная логика или же её трудно свести к одной ячейке.
Буферы SOFT обеспечивают лучшее управление использованием ресурсов, чем переменные NODE. Модуль логического синтезатора выбирает, когда заменить примеры использования примитивов SOFT примитивами LCELL.
Буферы SOFT могут помочь уничтожить логику, которая оказалась слишком сложной, и сделать проект проще; однако при этом может быть увеличено количество
логических операций и скорость выполнения программы соответственно уменьшится.
Наиболее сильное управление процессом логического синтеза обеспечивается примитивами LCELL. Модуль логического синтезатора минимизирует всю логику, которая запускает примитив LCELL, таким образом, чтобы можно было свести её к одной логической ячейке. Примитивы LCELL реализуются в виде одной логической ячейки (их нельзя убрать из проекта, даже если они имеют единственный вход). Если проект минимизирован до такой степени, что один примитив LCELL имеет единственный вход, в этом случае вместо примитивов LCELL можно использовать примитивы SOFT, которые убираются в процессе логического синтеза.
2.3.3.2 Значения констант по умолчанию
Логический синтезатор автоматически выполняет подключение к GND всех выходов таблицы истинности, если не удовлетворяется ни одно из условий входа в таблицы. Для присвоения выходам таблицы истинности значения VCC можно использовать одно или несколько объявлений языка AHDL по умолчанию. С помощью этих объявлений можно задать значения по умолчанию для соответствующих выходов. Например, если большинство выходов таблицы истинности равны 1, можно задать значение по умолчанию VCC.
2.3.4 Использование чисел и констант в языке AHDL
2.3.4.1 Использование чисел
Числа используются для представления констант в булевых выражениях и уравнениях. Язык AHDL поддерживает все комбинации десятичных, двоичных, восьмеричных и шестнадцатеричных чисел.
Ниже приведён файл decode1.tdf, который представляет собой дешифратор адреса, генерирующий высокий активный уровень сигнала разрешения доступа к шине, если адрес равен шестнадцатеричному числу 370h.
SUDESIGN decode1
(
address[15..0] : INPUT;
chip_enable : OUTPUT;
)
BEGIN
chip_enable = (adress[15..0] == H"0370");
END;
В этом примере десятичные числа использованы для указания размерности массива бит, которым записывается адрес шины. Шестнадцатеричным числом H"0370" записано значение адреса, при котором обеспечивается высокий уровень сигнала.
В файле AHDL можно использовать константы для описательных имён разных чисел. Такое имя, используемое на протяжении всего файла, может быть более информативным, чем число; например, имя UPPER_LI несёт больше информации, чем число 103. В языке AHDL константы вводятся объявлением CONSTANT.
Приведённый выше файл можно записать по-другому, используя вместо числа H”0370” константу IO_ADDRESS.
CONSTANT IO_ADRESS = H"0370";
SUBDESIGN decode2
(
a[15..0] : INPUT;
ce : OUTPUT;
)
BEGIN
Ce = (a[15..0] == IO_ADDRESS);
END;
Преимущество использования констант особенно заметно, если одно и то же число используется в файле несколько раз. Тогда, если его нужно изменить, его меняют только один раз в объявлении константы.
2.3.5 Комбинационная логика
Как известно, логическая схема называется комбинационной, если состояния выходов являются только функциями входов независимо от момента времени. Комбинационная логика в языке AHDL реализована булевыми выражениями и уравнениями, таблицами истинности и большим количеством макрофункций. В число примеров комбинаторных логических функций входят дешифраторы, мультиплексоры и сумматоры.
2.3.5.1 Реализация булевых выражений и уравнений
Булевы выражения – это множества узлов, чисел, констант и других булевых выражений, выделяемых операторами, компараторами и, возможно, сгруппированных в заключающих круглых скобках. Булево уравнение устанавливает равенство между узлом или группой и булевым выражением.
В качестве примера приведён файл boole1.tdf, в котором даны два простых булевых выражения, представляющих два логических элемента.
SUBDESIGN boole1
(
a0, a1, b : INPUT;
out1, out2 : OUTPUT;
)
BEGIN
out1 = a1 & !a0;
out2 = out1 # b;
END;
Здесь выход out1 получается в результате логической операции И, применённой ко входу a1 и инвертированному входу a0, а выход out2 получается в результате применения логической операции ИЛИ к выходу out1 и входу b. Поскольку эти уравнения обрабатываются одновременно, последовательность их следования в файле не важна.
2.3.5.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. Использование узлов помогает экономить ресурсы устройств, если узел используется в нескольких выражениях.
2.3.5.3 Определение групп
Важным понятием AHDL является группа. Она может включать в себя до 256 элементов (бит), рассматривается как совокупность узлов и участвует в различных действиях как единое целое. В булевых уравнениях группа может быть приравнена булевому выражению, другой группе, одному узлу, VCC, GND, 1 или 0. В каждом случае значения группы разные.
Если группа определена, для краткого указания всего диапазона ставят две квадратные скобки [ ]. Например, группу a[4..1] можно кратко записать как a[ ].
2.3.6 Описание цифровой схемы на языке AHDL
Рисунок 2.24 – Меню New
Затем, исходя из заданного булева выражения создаём в окне текстового редактора программу.
SUBDESIGN project2 % Задание символического имени подпроекта %
( % и объявление его входов и выходов %
A : INPUT; % Назначение ресурсов %
B : INPUT;
C : INPUT;
D : INPUT;
Y : OUTPUT;
)
BEGIN
Y = A & B & C & D -- Присвоение Y значения
# !A & !B & !C & !D -- булева ыражения
# A & !B & !C & D
# A & B & !C & !D
# !A & B & C & !D
# !A & B & !C & D
# !A & !B & C & D;
END; % Оператор окончания проекта %
Рисунок 2.25 – Сохранение файла AHDL
Теперь можно создать графическое изображение символа, реализующего функцию, описанную в файле project2.tdf. Для этого выбирается пункт New… из меню File, где в уже знакомом меню (рисунок 2.24) задаётся тип создаваемого файла – Symbol Editor file. В открывшемся символьном редакторе, с помощью примитивов рисования создаётся графическое изображение символа. При этом следует задать контакты символа. Для этого следует дважды кликнуть левой кнопкой мышки в том месте, где предполагается создать контакт. Появится окно (рисунок 2.26), в котором нужно указать имя контакта, его тип