Изучение VHDL



         

Операции в выражениях


В VHDL выражения выполняют арифметические или логические вычис-ле-ния над одним или несколькими операндами. Выражения используются в операторах присваивания сигналу, переменной, при присваивании начального значения, как операнд в других операторах, как входной параметр вызова процедуры или функции.

Операции VHDL перечислены в таблице 1 в порядке их приоритета.

Таблица 1 - Операции VHDL.

Тип операции Символ или ключевое слово
Логические
Сравнения
Сдвига
Сложения
Унарные (знак)
Умножения
Различные
and, or, nand, nor, xor, xnor
=, /=, , >=
sll, srl, sla, sra, rol, ror
+, -, & (конкатенация)
+, -
*, /, mod, rem
**, abs, not

Логические операции имеют самый низкий приоритет. Операнды логических операций должны быть одного типа bit или boolean, или одномерного регулярного типа (векторы) из элементов типа bit или boolean. Для однозначной компиляции логических выражений необходимо использовать скобки, например:
(a or b) and C and (d or c).

Операции сравнения выполняются над операндами одинакового типа и возвращают тип boolean. Операции равенства "=" и неравенства "/=" выполняются над всеми типами. Остальные операции сравнения выполняются над перечисляемыми типами, целыми типами и одномерными регулярными типами (векторами) из элементов такого типа.

Операции сравнения выполняются над операндами одинакового типа и возвращают тип boolean.

Операции равенства "=" и неравенства "/=" выполняются над всеми типами. Остальные операции сравнения выполняются над перечисляемыми типами, целыми типами и одномерными регулярными типами (векторами) из элементов такого типа.

При сравнении перечисляемых типов элемент, стоящий в ряду правее (старший), считается бо'льшим. При сравнении векторов сравниваются пары элементов векторов, начиная с самых левых. Если пара элементов неодинакова, то вектор с более старшим элементом считается бо'льшим. Если пара элементов одинакова то рассматривается следующая пара элементов. Например, в сравнении векторов битов "0111" >="01011" результат будет true.

Операции сдвига выполняют сдвиг вектора битов на число разрядов типа integer. Например, результатом выражения ("100110" sra 3) является вектор "111100" , т.е. происходит арифметический сдвиг вправо на 3 разряда.

Операции сложения - вычитания "+", "-" предопределены для целых чисел и чисел с плавающей запятой. Операция конкатенции "&" применяется со всеми одномерными регулярными типами или с их элементами. С помощью этой операции векторы - операнды объединяются в более длинные векторы. Например, выражение "101" & '1' & "10" даст результат "101110".

Унарные операторы применяются к одиночным операндам. Оператор ми-нус инвертирует значение операнда. Операторы умножения "*", деления "/" приме-ня-ют-ся с целыми операндами и операндами с плавающей запятой. Операторы mod (модуль), rem (остаток) применяются с целыми числами. Операции абсолютного значения abs и возведения в степень "**" определены для целых чисел и чисел с плавающей запятой, причем показатель степени должен быть целым.

Для многих операций языка существуют функции с таким же обозначением. Эти функции выполняют аналогичные действия, что и операции, но над другими типами. Например, функция "+" из пакета numeric_bit библиотеки IEEE выполняет сложение векторов битов, которые кодируют целые числа. Такие функции перезагружают операции в зависимости от типа операндов.

При программировании для синтеза следует учесть, что правый операнд для операций "/", mod, rem может быть равным только степени двойки, а левый операнд операции "**" должен быть равен 2, так что эти операции будут означать сдвиг двоичного кода.

Для большинства операций найдутся эквивалентные функции с таким же названием, определеные в таких стандартных пакетах, как IEEE.std_arith, IEEE.numeric_std. Основным свойством этих функций является то, что они подставляются вместо операций (перезагружают их), если операнды имеют тип integer, а также std_logic_vector, signed, unsigned и другие типы, производные от std_ulogic.

Анатолий Сергиенко
E-mail: aser@comsys.ntu-kpi.kiev.ua


Содержание  Назад  Вперед