Операторы VHDL можно разбить на группы:
2.6.1 Логические операторы
Логические операторы VHDL приведены в таблице. Применение этих операторов определено для операндов типа bit, boolean, bit_vector, std_logic_vector.
Таблица. Логические операторы языка VHDL
Оператор |
Название |
Пример |
and |
И |
c <= a and b; |
nand |
И-НЕ |
c <= a nand b; |
or |
ИЛИ |
c <= a or b; |
nor |
ИЛИ-НЕ |
c <= a nor b; |
xor |
ИСКЛЮЧАЮЩЕЕ ИЛИ |
c <= a xor b; |
xnor |
ИСКЛЮЧАЩЕЕ ИЛИ-НЕ |
c <= a xnor b; |
not |
НЕ |
c <= not a; |
Для справки можно привести таблицы истинности для логических операторов
Таблица. Таблицы истинности для побитных операций
A |
B |
И |
ИЛИ |
ИСКЛЮЧАЮЩЕЕ ИЛИ |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
В таблице не приведены варианты для инверсных операторов – И-НЕ, ИЛИ-НЕ, ИСКЛЮЧАЮЩЕЕ ИЛИ-НЕ. Их значения противоположны (инверсны) результатам выполнения «прямых» операций, т.е. получаются заменой значений 0 на 1 и наоборот.
Логические операторы, применяемые к массивам (std_logic_vector – это массив сигналов типа std_logic), выполняются побитно над каждым из разрядов, при этом тип и размер операндов должны совпадать. Результатом является массив того же типа и размера.
2.6.2 Операторы отношения
Операторы отношения в VHDL приведены в таблице
Таблица. Операторы отношения языка VHDL
Оператор |
Название |
Пример |
< |
Меньше |
a < b |
> |
Больше |
a > b |
<= |
Меньше или равно |
a <= b |
>= |
Больше или равно |
a >= b |
= |
Равно |
a = b |
/= |
Не равно |
a /= b |
Операндами могут служить большинство типов VHDL. Результатом является значение типа boolean.
2.6.3 Арифметические операторы
Арифметические операторы приведены в таблице. Допускается смешивать типы, например, для сигнала x, определенного как std_logic_vector, допустимо писать x<= x + 1;
Таблица. Арифметические операторы языка VHDL
Оператор |
Название |
Пример |
+ |
Сложение |
2 + 2 = 4 |
- |
Вычитание |
3 – 1 = 2 |
* |
Умножение |
2 * 3 = 6 |
/ |
Деление |
5 / 2 = 2 |
% |
Остаток |
5 % 2 = 1 |
** |
Возведение в степень |
2**3 = 8 |
- |
Унарный минус (смена знака) |
-(1) = -1 |
2.6.4 Операторы сдвига
Операторы сдвига являются аналогами подобных операторов, используемых в языках программирования. Они позволяют записывать манипуляции с шинами, заключающиеся в сдвиге их значений на один или несколько разрядов.
Существуют следующие операторы сдвига:
srl - логический сдвиг вправо;
sll - логический сдвиг влево;
sra - арифметический сдвиг вправо;
sla - арифметический сдвиг влево;
ror – логическое вращение вправо;
rol – логическое вращение влево.
Все операторы имеют два операнда – сдвигаемая шина и число разрядов, на которые производится сдвиг. Например:
q = ashr 2;
это сдвиг шины a на 2 разряда вправо.
При операциях вращения «теряемый» бит помещается с противоположного конца разрядной сетки числа.
Отличием логического и арифметического сдвигов является поведение старшего разряда. Дело в том, что операции сдвига являются удобным способом умножения и деления на целые степени двойки – 2, 4, 8, 16 и т.д. Действительно, рассматривая двоичное число 0001, нетрудно убедиться, что его сдвиг влево на 1 разряд даст число 0010 (т.е. 210), далее 0100 (410), 1000 (810). Рассмотрим теперь представление чисел в дополнительной двоичной арифметике:
010 -110 = -110 → 000000002 – 000000012 = 111111112 = 25510
-1 -1 = -2 → 111111112 – 000000012 = 111111102 = 25410
Можно предположить, что операция деления -2/2 с помощью сдвига на один разряд вправо должна давать правильный результат. Если воспользоваться логическим сдвигом, при котором в освобождающиеся разряды помещается 0, то 11111110 srl 1 даст в результате 011111112, что соответствует десятичному числу 127. С точки зрения беззнаковой арифметики этот результат является правильным, т.к. 254/2 = 127. Однако при трактовке числа 111111102 как числа -2 в дополнительной двоичной арифметике результат некорректен.
Для решения этой проблемы используется операция арифметического сдвига вправо, который отличается тем, что старший разряд сдвигаемого числа сохраняется. В этом случае оказывается, что 11111110 sra 1 = 11111111, т.е. -2/2 = -1.
2.6.5 Операторы сцепления
Оператор сцепления (конкатенации) & служит для получения числа большей разрядности, составленного из операндов. Например:
a, b : std_logic_vector(3 downto 0);
q :std_logic_vector(7 downto 0);
a<= “0011”;
b<= “1100”
q<= a&b; -- результатом q будет “0011_1100”