Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек 2 Типы VHDL_данных и их интерпретация при R...doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
287.23 Кб
Скачать

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 определяет два функционально эквивалентных пакета:

  1. NUMERIC_BIT- основан на типе BIT array types;

  2. NUMERIC_STD- основан на типе STD_LOGIC array types;

которые определяют два новых типа:

  • SIGNED;

  • UNSIGNED.

Функции, описанные в этих пакетах классифицируются следующим образом:

  1. Арифметические функции;

  2. Функции сравнения;

  3. Функции конверсии;

  4. Функции сдвига;

  5. Функции преобразования размеров;

  6. Функции определения границ;

  7. Логические функции.

Не поддерживаются при синтезе следующие операции:

  • SIGNED * UNSIGNED;

  • SIGNED * NATURAL;

  • UNSIGNED * INTEGER.