
- •Учебник по языку 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.Импорт и экспорт конечных автоматов
2.9.1.1.1.Булевы операторы, использующие not
Оператор НЕ является префиксом инвертора. Поведение оператора НЕ зависит от операнда, на который он воздействует.
С оператором НЕ можно использовать три типа операндов:
Если операнд - одиночный узел, GND, или VCC, выполняется одиночная инверсия. Например, !a означает, что сигнал проходит через инвертор.
Если операнд - группа узлов, то каждый член группы проходит через инвертор. Например, шина !a[4..1] интерпретируется как (!a4, !a3, !a2, !a1).
Если операнд - число, он трактуется как двоичное число и каждый его бит инвертируется. Например, !9 интерпретируется как !B"1001", то есть B"0110".
2.9.1.2.1.Булевы операторы, использующие and, nand, or, nor, xor, и xnor
С бинарными операторами существует пять сочетаний операндов. Каждое из этих сочетаний интерпретируется различно:
Если оба операнда - одиночные узлы или константы GND и VCC, оператор выполняет логическую операцию над двумя элементами. Например, (a & b).
Если оба операнда - группы узлов, оператор действует на соответствующие узлы каждой группы, выполняя побитовые операции между группами. Группы должны иметь одинаковый размер. Например, (a, b, c) # (d, e, f) интерпретируется как (a # d, b # e, c # f).
Если один операнд - одиночный узел, GND, или VCC, а другой группа узлов, одиночный узел или константа дублируется для создания группы такого же размера как другой оператор. Затем выражение трактуется как групповая операция. Например, a & b[4..1] интерпретируется как (a & b4, a & b3, a & b2, a & b1).
Если оба операнда - числа, то более короткое число расширяется с учетом знака для согласования с размером другого числа и трактуется затем как групповая операция. Например, в выражении (3 # 8), 3 и 8 преобразуются в двоичные числа B"0011" и B"1000", соответственно. Результатом будет B"1011".
Если один операнд - число, а другой узел или группа узлов, то число разделяется на биты для согласования с размером группы и выражение рассматривается как групповая операция. Например, в выражении (a, b, c) & 1, 1 преобразуется к B"001" и выражение становится (a, b, c) & (0, 0, 1). Результатом будет (a & 0, b & 0, c & 1).
Выражение, которое использует VCC как операнд, интерпретируется в зависимости от выражения, которое использует 1 как операнд. Например, в первом выражении, 1 - число в знакорасширенном формате . Во втором выражении, узел VCC дублируется . Затем каждое выражение трактуется как групповая операция.
(a, b, c) & 1 = (0, 0, c)
(a, b, c) & VCC = (a, b, c)
2.9.2.Арифметические операторы
Арифметические операторы используются для арифметических операций сложения и вычитания над числами и шинами в булевых выражениях. В них используются следующие операторы.
Таблица 6. Операторы сложения и вычитания языка AHDL
Оператор: |
Пример: |
Описание: |
+ (унарный) |
+1 |
плюс |
- (унарный) |
-a[4..1] |
минус |
+ |
count[7..0] + delta[7..0] |
сложение |
- |
rightmost_x[] - leftmost_x[] |
вычитание |
К бинарным операторам применимы следующие правила:
Операции выполняются между двумя операндами, которые должны быть шинами или числами.
Если оба операнда - шины, то они должны иметь один размер.
Если оба операнда числа, более короткое число расширяется до размеров другого операнда.
Если один оператор - число, а другой группа узлов, то число усекается или расширяется для согласования размеров операндов. Если отбрасываются любые значимые биты, то компилятор MAX+PLUS II выдает сообщение об ошибке.
Когда Вы складываете две шины вместе с правой стороны булева уравнения с помощью оператора +, Вы можете поместить 0 с левой стороны группы для расширения ширины шины. Этот метод обеспечивает добавление дополнительного бита данных с левой стороны уравнения, который можно использовать как сигнал выходного переноса. Например, шины count[7..0] и delta[7..0] дополняются нулями для обеспечения информацией сигнала cout:
(cout, answer[7..0]) = (0, count[7..0]) + (0, delta[7..0])