Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lekz9_record.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
3 Мб
Скачать
☆

2. Синтаксис Объявление и Определения составного типа данных record

Как говорилось во введении, тип запись (record type) позволяет объявлять составные объекты, чьи элементы могут иметь различные типы. Другими словами, запись это образование, в структуре которого содержатся много элементов (полей), причем каждый из них может иметь свой тип.

Все элементы в записи объявляются с индивидуальными названиями (идентификаторами) вместе с индикацией (указанием) подтипа элемента. Для того, чтобы конструктор мог использовать в программе объект типа запись ((signal, variable, constant) он предварительно должен быть объявлен и определен. Пользовательское объявление объекта типа запись является двухступенчатым. Сначала объявляется требуемая форма (вид) нужного типа (Record Type), а затем с этим нужным типом объявляется требуемый программный объект.

Конструкция (синтаксис) объявления Record Type в общем случае может иметь такой вид:

Simplified Syntax:

type record_type_name is record

    element_name : element type;

    element_name : element type;

    . . .

  end record record_type_name;

Эту общую конструкцию записи Record Type целесообразно проиллюстрировать очень показательным примером.

type RegName is (AX, BX, CX, DX); -- объявление перечисления

--содержит мнемонические имена

-- регистров процессора ПК

type Operation is record -- объявление типа Operation

-- видом record

    Mnemonic : String (1 to 10); -- поле Mnemonic типа String

    Kod_Oper : Bit_Vector(3 downto 0); -- поле Kod_Oper типа

-- Bit_Vector

    Op1, Op2, Res : RegName; -- поля Op1, Op2, Res имеют

-- раннее объявленный тип RegName

end record; -- конец объявления record type

В приведенном сравнительном примере Тип record, описывает информацию из списка команд процессора ПК. В объявленном типе record с именем Operation содержится пять элементов (полей). Первое поле с именем Mnemonic представляет собой символьную строку. Второе поле с именем Kod_Oper имеет тип Bit_Vector(3 downto 0);. Остальные три поля имеют тип RegName; и представляют собой два операнда и адрес, соответственно. Обратите внимание, что последний три элемента (поля) объявлены вместе, поскольку они имеют тот же самый тип. Такое объявление является правомочным, т.к., согласно правилам языка VHDL , если два или больше элемента объявления имеют тот же самый подтип, то они могут быть объявлены вместе и разделены запятыми.

Важно помнить, что в конструкции объявления record названия (имена) элементов в каждой записи должны быть различны. (Однако, то же самое имя элемента, можно использовать в других объявления record).

Как видно из сравнительного анализа объявление типа record содержит в своей структуре объявления элементов.

Значение программного объекта (signal, variable, constant) типа " record " – также представляет собой составное значение, содержащее в своем составе значения его элементов, которые стоят в том же порядке, что и в объявлении их родительского типа.

Назначение значения программного объекту типа "запись", т.е. определение объекта типа "запись", может быть реализовано или через агрегат (аggregate) или через индивидуальные назначения на элементы.

Если определение объекта типа "запись" реализуется посредством aggregate, то можно использовать в конструкции агрегата или позиционную (positional ) или именованную ассоциацию ( named association). (Смотри пример 5).

Example 7

-- type declarations are given in Example 5

variable Instr1, Instr2: Operation;

. . .

Instr1:= ("ADD AX, BX", "0001", AX, BX, AX); --позицион. Ассоциация

Instr2:= ("ADD AX, BX", "0010", others => BX);-- именов. ассоциация

Обратите внимание, что программные объекты Instr1, Instr2 имеют тип Operation.

Назначения на переменные с именами Instr1 и Instr2 выполняются посредством агрегатов. Variable Instr1 значения назначаются посредством позиционной ассоциации. Variable Instr2 значения назначаются посредством гибридной ассоциации. Обратите внимание на способ, которым выбор others использовался в втором случае (он должен быть всегда последним в конструкции агрегата).

Следует помнить, что Если принимается позиционная ассоциация, то значения элементов в агрегате перечислены в том же порядке, как они записаны в объявлении записи. Если в конструкции aggregate используется именованная ассоциация и выбор вида others, то он должен представлять, по крайней мере, значение одного элемента. Если имеются два или больше элементов, назначаемые выбором others, то все эти элементы должны иметь тот же самый тип.

Когда используется индивидуальное назначение на элементы программного объекта (signal, variable, constant) типа " record " то, тогда каждый идентификатор элемента, вызываемый, для назначение, через имя объекта запись, сопровождается точкой и именем элемента (Смотри пример 6).

Примеры:

Example 6

-- type declarations are given in Example 1

variable Instr3 : Operation;

. . .

Instr3.Mnemonic := "MUL AX, BX";

Instr3.Op1 := AX;

В этом примере выполняются прямые назначения на индивидуальные элементы объекта записи. Обратите внимание на способ, которым вызывается элемент для назначения ему значения : имя записи . имя элемента.

Важные примечания:

  • Линейные записи (то есть запись, где элементы имеют не составной тип) - вообще synthesizable.

  • Файлы не позволяются как элементы записей.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]