1.10.Встроенные оценочные функции В AHDL встроены следующие предопределенные оценочные функции, которые не нужно определять в операторах Define:
USED, которую можно использовать для контроля того, использовался ли порт, например, в операторе If Generate или Parameters. USED принимает имя порта в качестве входа и возвращает значение FALSE, если порт не используется.
CEIL, которая возвращает наименьшее целое число большее вещественного числа. Хотя эта операция применима ко всем арифметическим выражениям, она имеет смысл только для LOG2 и DIV, в которых результат может быть вещественным.
FLOOR, которая возвращает наибольшее целое число меньшее вещественного числа. Хотя эта операция применима ко всем арифметическим выражениям, она имеет смысл только для LOG2 и DIV, в которых результат может быть вещественным.
Примеры.
CEIL(LOG2(255)) = 8
FLOOR(LOG2(255)) = 7
Использованный статус протестирован в операторе Assert:
USED(aconst) == # 0 USED(AVALUE)
1.11.Логические выражения Логические выражения состоят из операндов, разделенных логическими и арифметическими операторами и компараторами и дополнительно сгруппированы с помощью круглых скобок. Выражения используются в булевых уравнениях также как и в других операторах таких как Case и If Then.
Логическое выражение может быть одним из следующих:
Операнд
Например, a, b[5..1], 7, VCC
Подставляемая ссылка на логическую функцию
Например, out[15..0] = 16dmux(q[3..0]);
Префиксный оператор (! или -), применяемый к логическому выражению
Например, !c
Два логических выражения, разделенных бинарным оператором
Например, d1 $ d3
Логическое выражение, заключенное в круглые скобки
Например, (!foo & bar)
Вы можете именовать логические операторы и компараторы в файлах AHDL для облегчения ввода присваиваний ресурсов и для интерпретации раздела Equations в файле отчета. За дополнительной информацией обратитесь к 1.34.2
1.11.1.Операторы логических функций В булевых выражениях можно использовать следующие логические операторы.
Таблица 5. Логические операторы языка AHDL
Оператор
| Пример
| Описание
| !
| !tob
| дополнение до 1
| 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 (!), который является префиксом инвертирования одного узла. Вы можете использовать или имя или символ для представления логического оператора.
Выражения, которые используют эти операторы, интерпретируются различно в зависимости от того, являются ли операнды одиночными узлами, шинами или числами.
Вы можете позволить компилятору заменить И операторы и все компараторы в булевых выражениях на lpm_add_sub и lpm_compare функции, включая логическую опцию Use LPM for AHDL Operators.
1.11.1.1.1.Булевы операторы, использующие NOT Оператор НЕ является префиксом инвертора. Поведение оператора НЕ зависит от операнда, на который он воздействует.
С оператором НЕ можно использовать три типа операндов:
Если операнд - одиночный узел, GND, или VCC, выполняется одиночная инверсия. Например, !a означает, что сигнал проходит через инвертор.
Если операнд - группа узлов, то каждый член группы проходит через инвертор. Например, шина !a[4..1] интерпретируется как (!a4, !a3, !a2, !a1).
Если операнд - число, он трактуется как двоичное число и каждый его бит инвертируется. Например, !9 интерпретируется как !B"1001", то есть B"0110".
1.11.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)
1.11.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])
1.11.3.Компараторы Для сравнения одиночных узлов или шин используются два типа компараторов: логические и арифметические. В булевых выражениях можно использовать следующие компараторы.
Таблица 7. Компараторы одиночных узлов и шин
Компаратор:
| Пример:
| Описание
| == (логический)
| addr[19..4] == B"B800"
| равно
| != (логический)
| b1 != b3
| не равно
| < (арифметический)
| fame[] < power[]
| меньше чем
| <= (арифметический)
| money[] <= power[]
| меньше чем или равно
| > (арифметический)
| love[] > money[]
| больше чем
| >= (арифметический)
| delta[] >= 0
| больше чем или равно
| Логические компараторы могут сравнивать одиночные узлы, шины и числа без неопределенных (X) значений. При сравнении шин или чисел, шины должны иметь одинаковый размер. Компилятор MAX+PLUS II выполняет побитовое сравнение шин, возвращая VCC, когда сравнение истинно, и GND, когда сравнение ложно.
Арифметические компараторы могут сравнивать только шины и числа; шины должны иметь одинаковый размер. Компилятор выполняет беззнаковое сравнение значений шин, т.е., каждая шина интерпретируется как положительное двоичное число и сравнивается с другой шиной.
1.11.4.Приоритеты логических и арифметических операторов Операнды, разделенные логическими и арифметическими операторами и компараторами вычисляются в соответствии с правилами приоритетов, приведенными ниже (приоритет 1 - наивысший). Операции одинакового приоритета оцениваются слева направо. С помощью скобок () можно менять порядок вычислений.
Таблица 8. Приоритеты логических и арифметических операторов и компараторов
Приоритет:
| Оператор/Компаратор:
| 1
| - (минус)
| 1
| ! (НЕ)
| 2
| + (сложение)
| 2
| - (вычитание)
| 3
| == (равно)
| 3
| != (не равно)
| 3
| < (меньше чем)
| 3
| <= (меньше чем или равно)
| 3
| > (больше чем)
| 3
| >= (больше чем или равно)
| 4
| & (И)
| 4
| !& (И-НЕ)
| 5
| $ (Исключающее ИЛИ)
| 5
| !$ (Исключающее ИЛИ-НЕ)
| 6
| # (ИЛИ)
| 6
| !# (ИЛИ-НЕ)
| |