Операторы 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”

  =  Перейти к содержанию  =