Арифметические и логические выражения
В языке AHDL определены два типа выражений - арифметические и логические. Арифметические выражения - это средство формирования конструкций языка AHDL, эти выражения вычисляются компилятором на этапе синтаксического анализа, для их реализации ресурсы PLD не используются.
Логические выражения определяют собственно функционирование проектируемого устройства, правила их формирования и интерпретации связаны с особенностями элементов цифровых устройств.
Арифметические выражения используются для указания:
• выражений в разделе Define Statement;
• значений констант в разделе Constante Statement;
• границ диапазонов изменения индексов групп;
• границ диапазона переменной в операторе FOR GENERATE;
• выражения в операторах IF GENERATE и ASSERT.
Результат арифметического выражения должен быть целым положительным числом, если это не так, то он округляется до большего целого. Существуют две функции для явного задания правил округления: CETL - округление до большего целого; FLOOR - округление до меньшего целого. Арифметические и логические операции, операции сравнения (компараторы) имеют следующие приоритеты при вычислении арифметических выражений:
Таблица 3.7.
Операция/ Компаратор | Пример | Описание | Приоритет |
+ (унарный) | +1 | плюс | |
- (унарный) | -1 | минус | |
!NOT | !a | отрицание | |
^ | a^2 | степень | |
MOD | 4 MOD 2 | модуль | |
DIV | 4 DIV 2 | деление | |
* | a*2 | умножение | |
LOG2 | LOG2 (4-3) | логарифм по основанию 2 | |
+ | 1+1 | сложение | |
- | 1-1 | вычитание | |
= = (numeric) | 5= =5 | равенство чисел | |
= = (string) | "a"= ="b" | равенство строк | |
!= | 5! =4 | не равно | |
> | 5>4 | больше | |
>= | 5>=5 | больше или равно | |
< | a<b+2 | меньше | |
Операция/ Компаратор | Пример | Описание | Приоритет |
<= | a<=b+2 | меньше или равно | |
& | a & b | AND | |
AND | a AND b | ||
!& | 1 !& 0 | NAND | |
NAND | 1 NAND 0 | ||
$ | 1 $ 1 | XOR | |
XOR | 1 XOR 1 | ||
!$ | 1 !$1 | XNOR | |
XNOR | 1 XNOR 1 | ||
# | a # b | OR | |
OR | a OR b | ||
!# | a !# b | NOR | |
NOR | a NOR b | ||
? | (5<4) ? 3:4 | условная операция |
Приоритеты операций могут изменяться при помощи скобок.
Булевы выражения и уравнения. Булевы выражения - это операнды (числа, цепи, группы), разделенные знаками арифметических и логических операций, компараторами (операторами сравнения), сгруппированные с помощью скобок. Эти выражения используются в булевых уравнениях и операторах CASE и IF_ТНЕN.
Булево выражение может иметь один из следующих видов:
• операнд
Пример: a, b[5..1], 7, VCC
• ссылка на логическую функцию
Пример: out [15..0]=16dmux(q[3..0]);
• Префиксный унарный оператор (! или - ), примененный к булеву выражению
Пример: !с
• Два булевых выражения, разделенных бинарным оператором
Пример: d1 $ d3
• Булево выражение, заключенное в скобки
Пример: (!foo & bar)
Результат булева выражения имеет ту же ширину, что и операнды.
Булево уравнение устанавливает цепь, шину, порт и т.п. в состояние, определяемое булевым выражением. Символ ( = ) в булевом уравнении указывает, что результат булева выражения справа является источником для цепи или шины слева. В булевом уравнении слева может находиться идентификатор, имя порта или группы. Перед ним можно использовать оператор (!) инверсии. Справа в уравнении находится булево выражение, вычисляемое по правилам приоритетов (операции одного приоритета выполняются слева направо). Скобки могут изменять порядок вычислений.
Порядок следования булевых уравнений в программе не важен, логические состояния устанавливаются одновременно.
SUBDESIGN boole1
(
a0, a1, b: INPUT;
out1, out2: OUTPUT;
BEGIN
out1=a1 & !a0;
out2=out1 # b;
END;
Здесь выходам out1 и out2 присваиваются значения, определяемые булевыми выражениями, в которых участвуют имена входных и выходных портов. Используются операции И, ИЛИ.
Это же устройство можно описать по-другому, используя переменную типа NООЕ.
SUBDESIGN boole2
(
a0, al, b: INPUT;
out1, out2: OUTPUT;
)
VARIABLE
a_equals_2 : NODE;
BEGIN
a_equals_2 = a1 & !a0;
out1 = a_equals_2
out2 = a_equate_2 # b;
END;
Если имя переменной типа NООЕ используется в нескольких выражениях, то ее описание позволяет экономить ресурсы ПЛИС.
В булевых выражениях могут использоваться следующие логические операции:
Таблица 3.8.
Операция | Пример | Описание |
! NOT | !music NOT music | инверсия |
& AND | a & b a AND b | И |
!& NAND | a [3..1] !& b [5..3] a [3..1] NAND b [5..3] | И-НЕ |
Операция | Пример | Описание |
!$ XNOR | x2 !$ x4 x2 XNOR x4 | инверсия исключающего ИЛИ |
# OR | tris # tran tris OR tran | ИЛИ |
!# NOR | c [8..5] !# d [5..4] c [8..5] NOR d [5..4] | ИЛИ-НЕ |
Унарная операция NOT может применяться к одноразрядной переменной, группе переменных и к числу. При одноразрядной переменной результатом является инвертированное значение. В случае группы инвертируется каждый член группы. В случае числа инвертируется каждый разряд его двоичного представления.
Бинарные операции AND, NAND, ОR, NOR, ХОR, NXOR допускают следующие комбинации операндов:
• оба операнда одноразрядные (переменные, порты, VСС, GND);
• оба операнда являются группами - операция применяется поразрядно, поэтому операнды должны быть одинаковой разрядности;
• один оператор одноразрядный, а другой является группой - одноразрядный операнд тиражируется до группы, затем к двум группам поразрядно применяется операция;
• оба операнда числа - они представляются в двоичном формате и к группам двоичных разрядов применяется операция;
• один операнд число, а другой является одноразрядным, либо группой - число представляется группой двоичных разрядов и операция применяется к двум группам двоичных разрядов. Одноразрядный операнд тиражируется в группу, разрядность которой соответствует разрядности двоичного представления числа.
В булевых выражениях могут применяться следующие компараторы (операции сравнения):
Таблица 3.9.
Компаратор | Пример | Описание |
= = (логическое) | Bus [15..0]= =H "B800" | равно |
!= (логическое) | a1 !=a3 | не равно |
> (арифметическое) | c [ ] > d [ ] | больше |
>= (арифметическое) | fiu [ ] >= fiu [ ] | больше или равно |
< (арифметическое) | c < d+2 | меньше |
<= (арифметическое) | e <= f-2 | меньше или равно |
Результатом операции сравнения является логический ноль (GND), если условие не выполнено, и логическая единица (VСС), если условие выполнено.
Из таблицы видно, что компараторы делятся на логические и арифметические. При логическом сравнении осуществляется поразрядное сравнение операндов, а при арифметическом сравнении группа разрядов интерпретируется как двоичное число без знака.
В булевых выражениях могут применяться следующие арифметические операции:
Таблица 3.10.
Операция | Пример | Описание |
+ (унарный) | + 2 | Плюс |
• (унарный) | -f [ ] | Минус |
+ | dd [2..0] + са[2..0] | Сложение |
- | gamma [ ] – sigma [ ] | Вычитание |
Арифметические операции могут выполняться над группами и числами. Если оба операнда являются группами, то они должны иметь одинаковую разрядность. При операциях над числами они представляются в виде групп двоичных разрядов и автоматически выравниваются.
Приоритет операций в булевых выражения следующий:
Таблица 3.11.
Приоритет | Операция/ Компаратор: | Описание |
- | минус, дополнение до 2 (negative) | |
! | инверсия, логическое НЕ (NOT) | |
+ | сложение (addition) | |
- | вычитание (subtraction) | |
= = | Равно (equal to) | |
!= | не равно (not equal to) | |
< | Меньше (less than) | |
<= | меньше или равно (less than or equal to) | |
> | Больше (greater than) | |
>= | больше или равно (greater than or equal to) | |
& | И (AND) | |
!& | И-НЕ (NAND) | |
$ | ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) | |
!$ | ИНВЕРСИЯ ИСКЛЮЧАЮЩЕГО ИЛИ (XNOR) | |
# | ИЛИ (OR) | |
!# | ИЛИ-НЕ (NOR) |
Пример сложного булева уравнения:
a [ ] = ((с [ ] &-В "001101")+е [6..1] ) # (р, q, г, s, t, v);
Это выражение вычисляется в следующем порядке:
Двоичное число В"001101" дополняется до 2 и становится В"001101". Унарный (-) имеет высший приоритет.
2. Выполняется операция AND над В"001101" и группой с [ ]. Эта операция имеет второй приоритет из-за скобок.
3. Результат складывается с группой е[6..1].
4. Выполняется операция ОR над результатом и группой (р, q, г, s, t, v).
Общий результат присваивается группе а [ ]. Для правильности уравнения разрядность группы слева должна быть кратна разрядности группы справа.
Дата добавления: 2021-09-07; просмотров: 489;