Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Приложение 1. Некоторые дополнительные замечания о записях

Читайте также:
  1. Адаптивное руководство. заключительные замечания
  2. Ая основа – Хаджури назвал некоторые действия посланника Аллаха ошибкой, и сказал, что посланник Аллаха ошибся в средствах призыва.
  3. Без трещин и царапин, некоторые вообще не проигрывались, некоторые – по паре-тройке раз
  4. В характеристике других квалифицирующих признаков имеются некоторые отличия от квалифицирующих признаков убийства.
  5. ВВОДНЫЕ ЗАМЕЧАНИЯ
  6. Вводные замечания
  7. Вводные замечания

Вводные замечания

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

Примеры VHDL проектов на базе данных типа данных record

Вводные замечания

Как известно, язык VHDL поддерживает работу с такими 4-мя типами данных:

· Скалярные типы (scalar types) (в структуре этих типов содержится всегда один единственный элемент базового типа с соответствующим ему значением);

· Составные типы (composite types) (в структуре этих типов всегда содержится определенное множество элементов, каждому из которых соответствует значение базового или другого составного типа);

· Типы доступа (access types) (обеспечивают доступ к объектам других типов посредством указателей (через их адреса);

· Файловые типы (files) (обеспечивают доступ к файлам ОС, которые содержат последовательность значений определенного базового типа).

 

В этой лекции мы уточним некоторые положения языка VHDL касающиеся составных типов (composite types) данных.

Руководство пользователя по языку VHDL так формулирует понятие о составном типе данных:

Объект составного типа – это совокупность (множество) других объектов, называемых элементами. Элементы могут иметь любой скалярный (scalar) тип или другой составной (composite) тип. Объектам составного типа запрещено содержать в своей структуре элементы файлового (file) типа.

В языке VHDL выделяют два подкласса composite types: array types и record types, т.е. подтип массив (array type) и подтип запись (record types).

 

Различие между объектами типов arrays и records состоит в том, что все элементы объекта типа массив должны иметь в своей структуре один и тот же тип, в то время как объекта типа запись могутиметь в своей структуре элементы разного типа.

Например, каждый элемент массива может быть значением напряжения. С другой стороны, каждый элемент record может иметь различный тип (Voltage1, current1, resistance1,Voltage2,&ldots;).

Второе важное отличие объекта типа массив от объекта типа запись состоит втом, чтообращение (вызов, доступ) к каждому элементу массива реализуется через имя (идентификатор) массива, порядковый номер индекса и значения индекса в массиве. Обращение (вызов, доступ) к элементам объектов типа запись (элементы объектов типа запись часто называют полями) реализуется через общее имя (идентификатор) записи и индивидуальные имена (идентификаторы) полей (вместе с именем всей записи). Эти два конструктивные образования отделяются друг от друга точкой. (Обратите внимание: элементы записей обозначаются именами вместо индексов). Другими словами конструкция обращения к элементу массива и элементу записи совершенно разные. Так обращение (вызов, доступ) к элементу объекта типа запись реализуется через конструкцию вида: record_name.element_name

в то время как обращение (вызов, доступ) к элементу объекта типа массив реализуется через конструкцию вида: array_ name(value Index1,..., value IndexN). Третье важное отличие объекта типа массив от объекта типа запись состоитвтом, что они имеют разные конструкции своих объявлений. Предварительно покажем отличие конструкций объявлений объекта типа массив от объекта типа запись на примере: Пример 1. type T_MonthlyIncome is array (1 to 12) of Integer; -- объявление массива Пример 2. type T_PersonalData is record -- объявление записи FirstName: String (1 to 6); -- объявление элемента записи LastName: String (1 to 10); -- объявление элемента записи IDNumber: String (1 to 5); -- объявление элемента записи Incomes: T_MonthlyIncome; -- объявление элемента записи TaxPaid: Boolean; -- объявление элемента записи end record; -- конецобъявления записи

 

Два примера выше иллюстрируют объявлений двух подклассов составного типа. Первый объявляет одномерный массив, содержащий 12 элементов целочисленных значений, в то время как второй объявляет запись с пятью полями (элементами). Первые четыре поля в объявлении записи имеют составные типы, в то время как самый последний имеет скалярный тип.

 

Имея в своем распоряжение объявление типа запись (record), конструкторпосредством него может вводить в проект объявления программных величин вида Signal,Variable, Constant. В примере 3 иллюстрируется эта возможность.

 

Пример 3.

Signal Year97Inc: T_MonthlyIncome; Signal SomeEmployee: T_PersonalData;

 

В примере 3 объявлены два сигнала. Сигнал (Signal Year97Inc) объявлен типом примера 1, т.е. как массив типа T_MonthlyIncome. Сигнал (Signal SomeEmployee) объявлен типом примера 2, т.е. как запись типа T_PersonalData.

Пример 4. Year97Inc(12) <= 5500; SomeEmployee.FirstName <= "Gordon";

 

В примере 4 иллюстрируются способы обращение к элементам массива и к элементам записи для назначения этим элементам значений. Обратите внимание на способы обращения к элементам составных типов: в случае массивов (через значение индекса), в то время как в записи через имя поля (с предшествующей точкой).

 

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

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

 

 

Синтаксис Объявление и Определения составного типа данных 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.

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

 



Примеры VHDL проектов на базе данных типа record

Пример 3.1

library IEEE;

use IEEE.STD_LOGIC_1164.all;

Library Work;

use Work.rec_package1.all;

 

entity rec is

port(A: in my_rec;

B: out yo_rec);

end rec;

 

architecture rec_ar of rec is

begin

proc0: process(A)

begin

if A.my_bit = '0' and A.my_int /= 2 then

B.yo_bit <= '1';

B.yo_char <= 'H';

B.yo_int <= 5;

elsif A.my_bit = '1' and A.my_int = 2 then

B.yo_bit <= '0';

B.yo_char <= 'S';

B.yo_int <= 3;

end if;

end process;

end rec_ar; Рис.3.1

Этот проект (проект Рис.3.1) иллюстрирует возможность использования объектов типа запись в качестве входных и выходных портов и вариант инициализации значений элементов записи. Возможность использования объектов типа запись в качестве входных и выходных портов может быть достигнута, если объявление типа record разместить в пакете. Поэтому в заголовке проекта имеется объявление об использовании библиотеки (Library Work;) и пакета use Work.rec_package1.all;

Определение пакета rec_package1 показано на Рис.3.2.

package rec_package1 is

type my_rec is record

my_bit: bit;

my_char: character;

my_int: integer range 0 to 15;

end record;

 

type yo_rec is record

yo_bit: bit;

yo_char: character;

yo_int: integer range 0 to 15;

end record;

end rec_package1; Рис.3.2

Т.к. в проекте рис.3.1. порты имеют составной тип, то возникает вопрос: «Как промоделировать работу такого проекта?» Такой вопрос возникает вследствие того, что САПР Active HDL 5.1 ДО Stimulators позволяет создавать стимулирующие воздействия только для скалярных портов и портов вида одномерный массив. Для разрешения проблем моделирования проектов с сложными комплексными портами следует использовать возможности Active HDL 5.1 по автоматическому созданию из описания исследуемого проекта испытательного стенда (TestBench). Испытательный стенд (TestBench) конструктору помогает создавать позволяет специальный Мастер Испытательного Стенда (Test Bench Wizard). Для вызова ДО Test Bench Wizard, после того как проверяемый проект успешно откомпилирован, следует щелкнуть в ДО Design Browser ПКМ по файлу с проектом и из появившегося локального меню выбрать команду!!!!!!!!!!!!. Этой командой будет открыто 1-е ДО Мастер Испытательного Стенда. Заполняя боксы в ДО нужной информацией нажимайте кнопку Next. На конечной стадии Test Bench Wizard создаст VHDL шаблон испытательного стенда.

Для исследуемого нами проекта (entity rec) VHDL шаблон имеет вид Рис.3.3. В этом шаблоне следует дописать только строки с требуемыми стимулирующими воздействиями (эти строки на Рис.3.3 прокомментированы словом пользователь)

library IEEE;

use work.rec_package1.all;

use ieee.std_logic_1164.all;

 

entity rec_tb is

end rec_tb;

 

architecture TB_ARCHITECTURE of rec_tb is

-- Component declaration of the tested unit

component rec

port(

A: in my_rec;

B: out yo_rec);

end component;

 

-- Stimulus signals - signals mapped to the input and inout ports of

--tested entity

signal A: my_rec;

Observed signals - signals mapped to the output ports of tested

--entity

signal B: yo_rec;

 

-- Add your code here...

 

begin

 

-- Unit Under Test port map

UUT: rec

port map (

A => A,

B => B

);

-- Add your stimulus here...

A.my_bit <= '0', '1' after 50 ns, '0' after 100 ns; -- пользователь

A.my_int <= 12, 2 after 50 ns, 9 after 100 ns; -- пользователь

end TB_ARCHITECTURE;

 

configuration TESTBENCH_FOR_rec of rec_tb is

for TB_ARCHITECTURE

for UUT: rec

use entity work.rec(rec_ar);

end for;

end for;

end TESTBENCH_FOR_rec;

Рис.3.3

После введения пользовательских строк с требуемыми стимулирующими воздействиями сохраните проект испытательного стенда в файле(например, в файле rec_tb.vhd) и откомпилируйте его. После успешной компиляции файла испытательного стенда вызовите редактор временных диаграмм. При активной закладке Structure ДО Design Browser перетащите сигналы в зону имен сигналов редактора временных диаграмм. Запустите процесс моделирования.

Результаты моделирования работы проекта rec.vhd посредством испытательного стенда (rec_tb.vhd) показаны на Рис.3.4. Результаты моделирования сохранены в файле rec_test.awf.

Рис.3.4

Общая структура проекта, когда для моделирования использовался испытательный стенд, показана на рис.3.5и рис.3.6.

 

рис.3.5

Рис.3.6

 

Приложение 1. Некоторые дополнительные замечания о записях

Записи, как и массивы, принадлежат к составным типам. Однако они имеют два различия: элементы записи могут иметь различные типы, и они обозначаются именами вместо индексов. Имена элементов всегда пишутся без круглых скобок и отделяются от общего имени записи точкой. Ссылка на элемент записи имеет следующий вид:

record_name.element_name

 

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

Не каждая запись может быть синтезирована, но большинство САПР способны справиться с записями, состоящими из типов bit, bit_vector, boolean и integer.

 


!!!!!!!!!!!!!!!!!!!!!!!! Добавить в описание конечкых!!!!!!!!!!!!!!!!!!!!!!!!!!!


Дата добавления: 2015-10-23; просмотров: 65 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Http://www.abcde.com/Fllea/New/abcdefg.zip| V1: Понятие логистики. Сущность и свойства логистической системы

mybiblioteka.su - 2015-2024 год. (0.037 сек.)