
- •1. Введение 3
- •2. Использование ahdl 13
- •3. Элементы ahdl 64
- •4. Структура проекта 83
- •1. Введение
- •1.1 Описание устройства с помощью ahdl
- •1.1.1 Как работает ahdl?
- •1.2 Структура ahdl-файла
- •1.2.1 Разделы ahdl-файла
- •1.2.2 Иерархические проекты
- •1.2.3 Подключение библиотек
- •1.3.1 Шаблоны и примеры ahdl
- •1.3.2 Контекстно-зависимая помощь
- •1.3.3 Выделение цветом групп символов
- •1.3.4 Локализация ошибок
- •1.4 Компиляция ahdl-проектов
- •1.5 Советы
- •2. Использование ahdl
- •2.1 Введение
- •2.1.1 Использование чисел
- •2.1.2 Использование констант и вычисленных функций
- •2.1.3 Вставка ahdl-шаблона
- •2.1.4 Примеры ahdl
- •2.2 Комбинационные устройства
- •2.2.1 Описание комбинационных устройств с помощью логических уравнений
- •2.2.2 Объявление узлов
- •2.2.3 Описание групп
- •2.2.4 Использование операторов ветвления
- •Использование оператора if…then
- •Использование оператора case
- •Сравнение операторов if…then и case
- •2.2.5 Создание декодеров
- •2.2.6 Использование значений «по умолчанию» для переменных
- •2.2.7 Описание активно-низкой логики
- •2.2.8 Двунаправленные выводы
- •2.2.9 Описание тристабильных выводов
- •2.3 Устройства с памятью
- •2.3.1 Использование регистров
- •2.3.2Определение регистровых входов
- •2.3.3 Создание счетчиков
- •2.4 Графы переходов
- •2.4.1 Описание графа переходов
- •2.4.2 Назначение автомату сигналов синхронизации, сброса, разрешения по входу
- •2.4.3 Кодирование состояний автомата
- •2.4.4 Описание автомата Мура (Moore machine)
- •2.4.5 Описание автомата Мили (Mealy machine)
- •2.5 Создание иерархического проекта
- •2.5.1 Использование не параметризированных функций
- •2.5.2 Использование параметризированных функций
- •2.5.3 Создание и использование макрофункций
- •2.5.4 Экспорт и импорт графов переходов автоматов
- •2.6 ИспользованиеLcell иSofTпримитивов
- •2.8 Перегрузка имени оператора
- •2.9 Использование циклически генерируемой логики
- •2.10 Использование условно генерируемой логики
- •3. Элементыahdl
- •3.1 Ключевые слова и идентификаторы
- •3.1.1 Ключевые слова
- •3.1.2 Зарезервированные идентификаторы
- •3.2 Символы
- •3.3 Имена вAhdl, использование кавычек
- •3.4 Группы
- •3.4.1 Способы объявления и записи групп
- •3.4.2 Размеры групп и подгрупп
- •3.5 Числа вAhdl
- •3.6 Арифметические выражения
- •3.7 Логические выражения
- •3.7.1 Логические операторы
- •3.7.2 Использование оператораNot
- •3.7.3 Использование операторовAnd, nand, or, nor, xor, xnor
- •3.7.4 Использование арифметических операторов в логических выражениях
- •3.7.5 Операторы сравнения
- •3.7.6 Приоритеты логических операторов и операторов сравнения
- •3.8 Мегафункции
- •3.9 Порты
- •3.9.1 Порты файла
- •3.9.2 Использование портов
- •4. Структура проекта
- •4.1 Введение
- •4.2 Заголовок (Title Statement)
- •4.2 Раздел объявления параметров (Parameters Statement)
2.2.6 Использование значений «по умолчанию» для переменных
Вы можете указать значение «по умолчанию» для узла или группы, которые используют числовое значение, которое нигде им не присваивается. Если узлу или группе никакое значение программистом не присваивается, то компилятор присваивает этой переменной значение GND.
В AHDL значения по умолчанию переменным назначаются в разделе Default Statement. В этом разделе вы можете указать значение для переменной, которая впоследствии будет использоваться в таблице истинности, в операторе IF, операторе CASE и т.д.
Пример default1.tdf иллюстрирует вышеизложенное. В этом примере на выходах устройства устанавливается код одного из пяти ASCII символов, выбираемого в соответствии с кодом на входе.
Работа устройства состоит в следующем:
Если входная последовательность совпадает с последовательностью стоящей в левой стороне таблицы истинности, то на выходе устанавливается соответствующий код. Если входная последовательность не совпадает ни с одним числом, стоящим в левой половине таблицы, то на выходе устанавливается код B”00111111”.
В примере 2.15 показаны проблемы, возникающие при присвоении одной и той же переменной нескольких значений, и то, как их разрешить при помощи AHDL.
SUBDESIGN
default2 ( a,
b, c : INPUT; select_a,
select_b, select_c : INPUT; wire_or,
wire_and : OUTPUT; ) BEGIN
DEFAULTS wire_or
= GND; wire_and
= VCC; END
DEFAULTS;
IF
select_a THEN wire_or
= a; wire_and
= a; END
IF; IF
select_b THEN wire_or
= b; wire_and
= b; END
IF;
На
рисунке 2.6 представлена схема устройства,
описанного в примере 2.15.
2.2.7 Описание активно-низкой логики
Активно-низкий вход становиться активным, если на него подан сигнал GND. Активно-низкие входы часто используются в микропроцессорных устройствах, устройствах, контролирующих работу памяти, периферии.
Одним из методов идентификации прерывающего устройства в мини- и микро-ЭВМ является метод аппаратного полинга, который заключается в следующем:
В аппаратном полинге (синонимы: дейзи-цепь, приоритетная цепочка, гирляндное или каскадное включение устройств) процессор и все периферийные устройства соединяются таким образом, что процессор может осуществить автоматический опрос с целью идентификации прерывающего устройства. Когда процессор реагирует на запрос прерывания, он формирует сигнал подтверждения прерывания INT ACK на линии, которая последовательно проходит через все устройства. При прохождении сигнала по цепочке проверяется состояние флажков готовности устройств. Если устройство не формирует прерывания, сигнал INT ACK проходит в следующее устройство, пока не встретится прерывающее (активное) устройство. Оно блокирует дальнейшее распространение сигнала INT ACK по цепочке. Таким образом, здесь приоритеты устройств определяются их физической близостью к процессору по линии INT ACK. Затем активное устройство передает по шине данных свой адрес (идентификатор или вектор) вместе со стробирующим (синхронизирующим) импульсом ~STROBE. Последний информирует процессор о нахождении на шине данных адреса устройства с наибольшим приоритетом, запрашивающего обслуживания. Этот адрес имеет однозначное соответствие с начальным адресом подпрограммы обслуживания прерывания данного устройства, в простейшем случае равен начальному адресу. Иногда возвращаемый адрес представляет собой индекс, прибавляемый к содержимому базового регистра процессора.
Устройство, разработанное в примере 2.16 (daisy.tdf) является узлом описанной дейзи-цепи.
Все входы в данном примере активно-низкие. Для обозначения активно-низких входов рекомендуется использовать символ «/» перед именем. Этот символ не является оператором, он – часть имени.
В данном примере операторы IF используются для определения активности модуля, т.е. когда сигнал на его входах равен GND.
Для
получения более подробной информации
см. разделы:
Перегрузка имени оператора
Использование значений «по умолчанию» для переменных