
- •Типы vhdl-данных и их интерпретация
- •1 Объявление типов
- •2 Классификация скалярных типов данных
- •3 Целочисленные типы
- •4 Вещественные типы
- •5 Физические типы
- •6 Перечислимые типы
- •7 Подтипы
- •8 Атрибуты
- •9 Массивы
- •10 Многомерные массивы
- •11 Неограниченные массивы
- •12 Атрибуты
- •13 Операции
- •14 Преобразование типов
- •15 Агрегаты
- •16 Строковые литералы
- •17 Записи
- •18 Преобразование типов данных в процессе vhdl-синтеза
- •Перечислимый тип представляется набором шин:
18 Преобразование типов данных в процессе vhdl-синтеза
В аппаратуре источниками сигналов являются входные и внутренние полюса схемы:
входы (порты);
выходы элементов (сигналы).
При этом в качестве первоисточников данных могут выступать только элементы с памятью, такие как:
порты, удерживающие значения в процессе моделирования;
триггерные элементы (flip-flop):
а) динамические (an edge-trigger device);
б) защелки (latch - a level-sensitive device)- защелка.
Поэтому все объекты и типы данных должны быть сопоставимы с этими так называемыми “Value Holders”.
Как правило, в моделируемых системах используется следующий металогический базис (МЛБ):
‘0’- логическмй нуль;
‘1’- логическая единица;
‘U’- Unknown- неизвестное состояние;
‘D’- Don’t care- неопределенное состояние;
‘Z’- high-impedance- состояние высокого импеданса.
В стандарте IEEE 1164 принят расширенный 9-значный МЛБ. Для синтеза необходима однозначная интерпретация. VHDL оставляет право за разработчиком синтезируемой системы. Однако, так как синтезируемая система работает с упрощенным МЛБ, необходим переход от расширенного к упрощенному. Это может быть осуществлено с помощью следующего атрибута:
attribute ENUM_ENCODING of STD_LOGIC:type
--‘U’,’X’,’0’,’1’,’Z’,’W’,’L’,’H’,’-’
is “U D 0 1 Z D 0 1 D”;
Наиболее просто интерпретируются типы bit, bit_vector и перечислимый тип (enumerated):
а) bit “схемный полюс” (wire)- 1 бит аппаратуры;
б) bit_vector bus;
в) enumerated buses.
Например:
type FSM_state is (RESET, S1, S2, SEND);
“00” “01””10” ”11”
Размерность аппаратных бит определяется из описания, например:
signal s: bit_vector (15 downto 0); -- 16 аппаратных бит
variable x1: bit_vector (0 to 7); -- 8 аппаратных бит
subtype st is bit_vector (32 to 63);
variable x2: st; --32 аппаратных бита
constant CON: bit_vector := “110”; -- 3 аппаратных бита
VHDL не дает информацию о б наиболее значащем разряде, но такая информация необходима при выполнении арифметических операций.
В синтезируемых системах значения типа BIT_VECTOR часто представляют беззнаковыми числами, и крайний левый бит рассматривается как наиболее значимый.
В данном примере наиболее значимыми разрядами являются S(15), x1(0), x2(32), CON(1).
Тип BIT_VECTOR может быть представлен знаковым числом. Это можно сделать путем использования переопределяющих значений в пакете, например для “+”:
function “+” (L, R: BIT_VECTOR)
return BIT_VECTOR;
Перечислимый тип представляется набором шин:
enumerated -> buses.
Например:
type FSM_state is (RESET, S1, S2, SEND);
“00” “01””10” ”11”
Типичная синтезирующая система поддерживает следующие разновидности массивов:
а) 1-D-array (одномерный массив); б) array of an array type (массив массивов);
Базовым элементом массива должен быть 1 бит. Массивы представляются упрощенным набором схемных полюсов (wire1 of flip-flops):
type Metalog is (‘0’,’1’,’Z’,’U’,’D’); type RG_set is array
(Natural range <>) of Metalog; signal s_metalog: RG_set(15 downto 0);
В поведенческом VHDL это можно было бы представить так:
signal s_metalog: array(15 downto 0, 2 downto 0);
но такая запись недопустима при синтезе!
Целые числа могут быть знаковыми (signed), или беззнаковыми (unsigned). Знаковые числа представляются дополнительным кодом числа (2’s complement form).
Если объект имеет только неотрицательные значения (non-negative values), то объект можно представлять беззнаковыми числами.
Размер bit_vector при преобразовании определяются описанием объекта данных как число бит необходимое для представления возможного диапазона целого числа.
Например:
signal A: integer range 0 to 15; -- преобразуется в bit_vector(3 downto 0);
type My_int is range –128 to +48; -- преобр-ся в bit_vector(7 downto 0);
variable x: My_int;
subtype pos is POSITIVE range 68 downto 32;
variable y: my_pos; -- преобразуется в bit_vector(6 downto 0);
Как правило используется ниспадающий диапазон (descending range).
Наиболее крайний левый разряд является наиболее значащим.
signal Smax: integer -- требует как минимум 32 бита, что очень много
S<=A+B, где A и B имеют размер 7 бит, тогда S должен иметь размер 8 бит.
Для обеспечения возможности оперирования арифметическими операциями над целыми числами, представляемыми как bit_vector вводятся два новых типа данных:
type SIGNED is array (NATURAL range<>) of BIT; type UNSIGNED is array (NATURAL range<>) of BIT;
Оба типа имеют одинаковое определение как BIT_VECTOR.
Необходимо также определить функцию конверсии между этими типами и типами integer.
function “+”(L, R: signed) return signed;
function “*”(L: signed; R: unsigned) return signed;
function “<”(L, R: signed) return BOOLEAN;
function TO_SIGNED(OPD: integer; SIZE: natural) return signed; function TO_INTEGER(OPD: unsigned) return integer;
Синтезируемая система обычно обеспечивает эти функции конверсией типов. Например, система ArchSyn поставляет пакет STD_LOGIC_ARICH. Этот пакет содержит арифметические операторы и другие утилиты функций, определенные на signed и unsigned типах.
Типы signed и unsigned базируются на элементе типа STD_LOGIC, который определяется в IEEE standard package STD_LOGIC_1164.
IEEE standard 1076.3-1997 определяет два функционально эквивалентных пакета:
NUMERIC_BIT- основан на типе BIT array types;
NUMERIC_STD- основан на типе STD_LOGIC array types;
которые определяют два новых типа:
SIGNED;
UNSIGNED.
Функции, описанные в этих пакетах классифицируются следующим образом:
Арифметические функции;
Функции сравнения;
Функции конверсии;
Функции сдвига;
Функции преобразования размеров;
Функции определения границ;
Логические функции.
Не поддерживаются при синтезе следующие операции:
SIGNED * UNSIGNED;
SIGNED * NATURAL;
UNSIGNED * INTEGER.