В языке AHDL можно использовать десятичные, двоичные, восьмеричные и шестнадцатеричные числа в любой комбинации. В таблице 2.6 приведён синтаксис записи чисел в языке AHDL для каждой системы счисления.
Таблица 2.6 – Синтаксис записи чисел
Система счисления | Значения |
Десятичная | <последовательность цифр 0-9> |
Двоичная | B¢¢<последовательность из 1, 0, X>¢¢, где символ X обозначает безразличное значение |
Восьмеричная | O¢¢<последовательность цифр 0-7>¢¢ или Q¢¢<последовательность цифр 0-7>¢¢ |
Шестнадцатиричная | X¢¢<последовательность цифр 0-9, букв A-F>¢¢ или H¢¢<последовательность цифр 0-9, букв A-F>¢¢ |
К числам в языке AHDL применяются следующие правила:
─ компилятор системы MAX+PLUS II всегда интерпретирует числа как группы двоичных цифр;
─ в булевых выражениях числа нельзя присваивать одиночным узлам (вершинам). Вместо этого нужно использовать константы VCC и GND.
2.3.2.5 Булевы выражения
Булевы выражения состоят из операндов, разделённых логическими и арифметическими операторами и компараторами и (необязательно) сгруппированных в круглые скобки. Выражения используются в булевых уравнениях, также в других конструкциях языка, таких, как операторы Case и If.
Существуют следующие применения булевых выражений.
─ Операнд. Пример: a, b[5..1], 7, VCC;
─ Встроенная в текст (in line) ссылка (reference) на примитив или макрофункцию;
─ Префиксный оператор (! Или -), применённый к булеву выражению. Пример: !a;
─ Два булевых выражения, разделённые двоичным (не префиксным) оператором. Пример: d1 & d3;
─ Заключённое в круглые скобки булево выражение. Пример: (!foo & bar)
Результат каждого булева выражения должен иметь ту же ширину, что и узел или группа (в левой стороне уравнения), которому он, в конечном счёте, присваивается.
2.3.2.6 Приоритеты в булевых уравнениях
Операнды, разделённые логическими и арифметическими операторами и компараторами, оцениваются по правилам приоритетов, перечисленным ниже (приоритет 1 является наивысшим). Равноприоритетные операции выполняются по очереди, слева направо. Порядок выполнения может быть изменён с помощью заключения в круглые скобки.
Таблица 2.7 – Приоритеты операторов
Приоритет | Оператор | Компаратор |
1 | - | (отрицание) |
1 | ! | (логическое НЕ) |
2 | + | (сложение) |
2 | - | (вычитание) |
3 | == | (равно?) |
3 | != | (не равно?) |
продолжение таблицы 2.7
Приоритет | Оператор | Компаратор |
3 | < | (меньше чем) |
3 | <= | (меньше либо равно) |
3 | > | (больше чем) |
3 | >= | (больше либо равно) |
4 | & | (AND) |
4 | !& | (NAND) |
5 | $ | (XOR) |
5 | !$ | (XNOR) |
6 | # | (OR) |
6 | !# | (NOR) |
2.3.2.7 Логические операторы
В таблице 2.8 приведены логические операторы для булевых выражений.
Таблица 2.8 – Логические операторы
Оператор | Пример | Описание |
! | !tob | Дополнение (префиксное обращение) |
NOT | NOT tob | |
& | bread & butter | Логическое И |
AND | bread AND butter | |
!& | a[3..1] !& b[5..3] | Обращение логического И |
NAND | a[3..1] NAND b[5..3] | |
# | trick & treat | Логическое ИЛИ |
OR | trick OR treat | |
!# | c[8..5] !# d[7..4] | Обращение логического ИЛИ |
NOR | c[8..5] NOR d[7..4] | |
$ | foo $ bar | Исключающее ИЛИ |
XOR | foo XOR bar | |
!$ | x2 !$ x4 | Обращение исключающего ИЛИ |
XNOR | x2 XNOR x4 | Обращение логического ИЛИ |
Каждый оператор представляет собой логический вентиль с двумя входами; исключение составляет оператор NOT, являющийся префиксным инвертором. Для записи логического оператора можно использовать его имя или символ.
Выражения, в которых используются эти операторы, интерпретируются по-разному в зависимости от того, что представляют собой операнды: одиночные узлы (вершины), группы или числа. Кроме того выражения с оператором NOT интерпретируются не так как другие логические операторы.
2.3.2.8 Выражения с оператором NOT
С оператором NOT можно использовать три типа операндов.
─ Если операнд представляет собой одиночный узел, константы GND или VCC, выполняется одна операция обращения. Пример: !a.
─ Если операнд представляет собой группу узлов, каждый элемент группы проходит через инвертор. Пример: !a[4..1] интерпретируется как (!a4, !a3, !a2, !a1).
─ Если операнд представляет собой число, он обрабатывается как двоичное число, то есть как группа соответствующего числа битов, где обращается каждый бит. Пример: !9 операнд интерпретируется как двоичное число !B"1001" (группа из четырёх элементов), результат и B"0110".
2.3.2.9 Выражения с операторами AND, NAND, OR, NOR, XOR и XOR
Существует четыре комбинации операндов с двоичными (не префиксными) операторами, и каждая из них интерпретируется по-особому.
─ Если операнд представляет собой одиночный узел, константы GND или VCC, оператор выполняет логическую операцию над двумя элементами. Пример: (a&b).
─ Если оба оператора являются группами узлов, оператор применяется к соответствующим узлам каждой группы, производя ряд операций на битовом уровне между группами. Группы должны быть одинакового размера. Пример: (a,b) # (c,d) интерпретируется как (a#c, b#d).
─ Если один оператор представляет собой одиночный узел, константы GND или VCC, а другой операнд – группу узлов, то одиночный узел или константа дублируются для образования группы такого же размера, что и второй операнд. Затем выражение интерпретируется как групповая операция. Пример: a & b[2..1] интерпретируется как (a&b2, a&b1).
─ Если оба операнда представляют собой числа, более короткое (в смысле числа битов в двоичном представлении) число дополняется незначащими нулями,
чтобы сравняться по числу битов с другим операндом. Затем выражение интерпретируется как групповая операция. Пример: в выражении (3#8) 3 или 8 преобразуются в двоичные числа B"0011" и B"1000". Результатом является B"1011".
─ Если один операнд представляет собой число, а другой – узел или группу узлов, то число усекается до или расширяется до размера группы. При усечении значащих битов генерируется сообщение об ошибке. Выражение затем интерпретируется как групповая операция. Пример: (a,b,c)&1 интерпретируется как (a&0, b&0, c&1).
Выражение с константой VCC интерпретируется не так как выражение с операндом 1. В первом выражении приведённого ниже примера число 1 расширяется по числу битов двоичного представления, чтобы соответствовать размеру группы. Во втором уравнении узел VCC дублируется для образования группы того же размера. Затем, каждое уравнение интерпретируется как групповая операция.
! operation.
(a, b, c) & 1 = (0, 0 c)
(a, b, c) & VCC = (a, b c).
2.3.2.10 Арифметические операторы