Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛО САПР / VHDL.PDF
Скачиваний:
43
Добавлен:
17.04.2013
Размер:
5.27 Mб
Скачать

Data Types

strained array type definition from the previous “Unconstrained Array” section.

Table 3-1 Array Index Attributes

Attribute Expression

Value

MY_VECTOR’left

5

MY_VECTOR’right

-5

MY_VECTOR’high

5

MY_VECTOR’low

5

MY_VECTOR’length

11

MY_VECTOR’range

(5 down to -5)

MY_VECTOR’reverse_range

(-5 to 5)

The following example shows the use of array attributes in a function that ORs together all elements of a given bit vector (declared in the example of an unconstrained array type definition in the previous section) and returns that value.

function OR_ALL (X: in BIT_VECTOR) return BIT is variable OR_BIT: BIT;

begin

OR_BIT := ’0’;

for I in X’range loop OR_BIT := OR_BIT or X(I);

end loop;

return OR_BIT; end;

Note: This function works for a bit vector of any size.

Record Types

A record is a set of named fields of various types, unlike an array, which is composed of identical anonymous entries. A record’s field can be any previously defined type, including another record type.

The following example shows a record type declaration (BYTE_AND_IX), three signals of that type, and some assignments.

constant LEN: INTEGER := 8;

subtype BYTE_VEC is BIT_VECTOR(LEN-1 downto 0);

VHDL Reference Guide

3-9

VHDL Reference Guide

type BYTE_AND_IX is record

BYTE: BYTE_VEC;

IX: INTEGER range 0 to LEN; end record;

signal X, Y, Z: BYTE_AND_IX;

signal DATA: BYTE_VEC; signal NUM: INTEGER;

. . .

X.BYTE <= "11110000";

X.IX <= 2;

DATA <= Y.BYTE;

NUM <= Y.IX;

Z <= X;

As shown in the above example, you can read values from or assign values to records in two ways.

By individual field name

X.BYTE <= DATA;

X.IX <= LEN;

From another record object of the same type

Z <= X;

The individual fields of a record type object are accessed by the object name, a period, and a field name; X.BYTE or X.IX. To access an element of the BYTE field’s array, use the array notation X.BYTE(2).

Record Aggregates

Record aggregates (constants) have the same syntax as array aggregates (see the “Aggregates” section of the “Expressions” chapter). They can appear anywhere records appear.

The following line illustrates a named record aggregate in a description.

X <= (BYTE => "11110000", IX => 2);

The following line illustrates a positional record aggregate in a description.

X <= ("11110000", 2);

3-10

Xilinx Development System

Data Types

You can use the others construct in a named or positional record aggregate, just as you can in an array aggregate (see the “Aggregates” section of the “Expressions” chapter).

You can mix named and positional aggregates in a description, with the positional items listed first.

You cannot have a named item that refers to a field covered in the positional aggregate. The following four examples illustrate this caveat.

The following example shows a simple record type.

type rec is record

a:integer;

b:integer;

c:integer;

d:integer;

e:integer; end record

end

The following example shows a named aggregate for the previous example.

(a => 1, b => 2, c => 0, d => 3, e => 0)

In a named aggregate, the items can appear in any order as shown in the following example.

(1, 2, d => 3, others => 0)

The previous example is equivalent to the second example or the following example of positional aggregate.

(1, 2, 0, 3, 0)

You can supply a set of choices in a description of a record aggregate, but a choice cannot be a range. See the following two examples.

The following example shows a record aggregate equivalent to the next example after it.

(b => 2, c => 2, d => 2, a => 1, e => 3)

The following example shows a record aggregate with a set of choices.

(b | c | d => 2, a => 1, e =>3)

VHDL Reference Guide

3-11

Соседние файлы в папке ЛО САПР