Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Горпенюк.doc
Скачиваний:
6
Добавлен:
22.07.2019
Размер:
159.74 Кб
Скачать

Пакети та бібліотеки

Найбільш зручним шляхом групування елементів програми згідно з їх функціональним призначенням є застосування пакетів (package). Звичайно в пакети групують певні типи даних, а також процедури та функції для обробки цих типів.Оскільки пакети редставляють собою повністю виділені програмні блоки, то їх можна розробляти незалежно від інших елементів програми і в подальшому паралельно застосовувати в багатьох entity та архітектурах. Важливим для підвищення зрозумілості програмного коду є відділення у пакетах заголовків програмних елементів від їх реалізацій. Оголошення пакету. Пакет складається з двох частин – оголошення пакету (package declaration) та тіла пакету (package body). Синтаксис оголошення пакету:

package Ідентифікатор is

Розділ_Оголошень_Пакету;

end package Ідентифікатор;

У Розділі_Оголошень_Пакету можна розміщувати визначення типів, підтипів, констант та сигналів, а також заголовки процедур та функцій. Всі ці програмні елементи будуть доступні користувачам пакету. Нижче наведено простий приклад оголошення пакету:

package Pascal_Types is

type Word is integer range 0 to 65535;

type Byte is integer range 0 to 255;

type Short is integer range -128 to 127;

end package Pascal_Types;

Пакет звичайно розміщується в окремому файлі проекту і є незалежним елементом бібліотеки. В будь-яких інших файлах проекту можливе застосування програмних елементів, описаних у пакеті, причому звертатись до цих елементів слід наступним чином:

Ім’я_бібліотеки.Ім’я_пакету.Ідентифікатор_елементу

Якщо пакет описано в поточному проекті, то Ім’я_бібліотеки

замінюється ключовим словом work. Так, для створення змінної типу

Word з попереднього прикладу за умови, що пакет і його виклик

знаходяться в одному проекті, слід скористатися оператором

variable X: work.Pascal_Types.Word;

При розміщенні в пакетах процедур чи функцій в оголошенні пакету визначаються лише їх заголовки з ідентифікаторами

підпрограм та їх інтерфейсом (переліком вхідних та вихідних

параметрів із зазначанням типів), приклад такого заголовка:

procedure min (x1, x2: in integer; res: out integer);

Повна реалізація процедур та функцій з програмним кодом

розміщується в тілі пакету.

При визначенні констант в оголошеннях пакетів також можна

одразу не вказувати їх конкретні значення, наприклад:

constant Setting_Time: Time;

В цьому випадку, як і в попередньому, повне описання константи

з її значенням розміщується в тілі пакету.

8 . Опис архітектури

Кожному ОП повинна відповідати одна чи декілька архітектур. Наприклад, одна архітектура може описувати функціонування об’єкта, а інша - його структуру

як ієрархію менш складних компонент. Спочатку зупинимось на структурному

стилі опису архітектури. Синтаксис опису:

тіло_архітектури ::=

architecture ідентифікатор_архітектури of ідентифікатор_ОП is

декларативна_частина_архітектури

begin

операторна_частина_архітектури

end [ідентифікатор_архітектури] ;

декларативна_частина_архітектури ::= { розділ_декларацій}

операторна_частина_архітектури ::= { паралельний_оператор}

розділ_декларацій::= декларація_підпрограми|тіло_підпрограми

| декларація_типу| декларація_підтипу| декларація_константи

| декларація_сигналу| декларація_псевдоніма| декларація_компонента

| специфікація_конфігурації|опис_бібліотек

паралельний_оператор::= оператор_блоку|оператор_зразка_компонента

У декларативній частині архітектури описуються об’єкти, які використовуються

для конструювання схеми. Для структурного опису найбільш важливі об’єкти -

сигнали та компоненти.

Усі частини в архітектурі можуть бути описані як блоки. Блок є внутрішнім

об’єктом з власним інтерфейсом, що пов’язаний з іншими блоками або портами

через сигнали. Блок описується за такою схемою:

оператор_блоку::= мітка_блоку: block [ ( вираз_захисту ) ]

заголовок_блоку

декларативна_частина_блоку

begin

операторна_частина_блоку

end block [мітка_блоку] ;

заголовок_блоку::= [ опис_параметрів[призначення_параметрів; ] ]

[опис_портів[призначення _портів; ] ]

призначення _параметрів::= generic map (список_призначення_параметрів)

призначення _портів::= port map (список_під’єднання_портів)

декларативна_частина_блоку::= { розділ_декларацій _блоку}

операторна_частина_блоку::= { паралельний_оператор }

© Сніжко Є.М., 2000

37

Заголовок блоку визначає інтерфейс майже так, як і для ОП. Список призначення

параметрів визначає значення сталих параметрів для блоку; список призначення

портів визначає, яким чином сигнали чи порти з’єднані з портами блоку. Будь-які

об’єкти, які можна декларувати в архітектурі, можна також записати в деклара-

тивній частині блоку. Ці об’єкти можна також використовувати в усіх вкладених

блоках, якщо тільки вони там не перевизначаються. Операторна частина блоку

містить паралельні оператори. Секція операторів блоку може містити інші блоки,

тому проект розкладається на ієрархію блоків, на нижчому рівні якої використо-

вується функціональний опис. Наприклад, розглянемо структурний опис архітек-

тури процесора, поділивши її на два блоки, що відповідають керуючій та та опе-

раційній частині:

architecture block_structure of processor is

type data_path_control is ... ;

signal internal_control : data_path_control;

begin

control_unit : block

port (clk : in bit;

bus_control : out proc_control;

bus_ready : in bit;

control : out data_path_control);

port map (clk => clock, bus_control => control, bus_ready => ready;

control => internal_control);

declarations for control_unit

begin

statements for control_unit

end block control_unit;

data_path : block

port (address : out integer;

data : inout word_32;

control : in data_path_control);

port map (address => address, data => data,

control => internal_control);

declarations for data_path

begin

statements for data_path

end block data_path;

end block_structure;

Блок керуючої частини містить порти clk, bus_control , bus_ready, які приєднані

до портів процесора, а також вихідний порт для керування операційною

частиною. Порти адреси та даних приєднані до відповідних портів процесора. При

такому описі кожен блок можна розробляти незалежно від інших, оскільки зв’язок

між ними вже визначений. Слід підкреслити, що в операторі port map символ =>

не вказує напрямок передачі інформації. Непідключені порти рекомендовано ого-

лошувати з ознакою open для усунення помилок, хоч це необов’язково.

Захищений блок містить булівський вираз захисту, який визначає спеціальний

сигнал захисту (Guard). Якщо цей сигнал є істина (True), дозволяються

© Сніжко Є.М., 2000

38

присвоєння захищених сигналів, які мають позначку guarded. В іншому випадку ,

коли сигнал Guard дорівнює False, присвоєння не відбуваються. Наприклад:

g_example: block (clk ='1')

begin

sig_n <= guarded sig_1;

end block g_example;

Цей приклад еквівалентний наступному оператору process:

process

begin

if GUARD then

sig_n <= sig_1;

end if;

wait on GUARD, sig_1;

end process;

Оскільки блок є паралельним оператором, вираз захисту складається з сиг-

налів і констант. Якщо вираз захисту містить сигнали, він обчислюється кожен раз

при їх зміні. Хоч вираз захисту нагадує список чутливості, їх функції різні. Вираз

не контролює виконання блоку. Блок містить паралельні оператори, які викону-

ються незалежно від того, чи входять вони в блок. Вираз захисту працює тільки

для захищених (guarded )сигналів . Захищені сигнали тільки тоді, якщо вони вхо-

дять до блоку з виразом захисту. В цьому випадку присвоєння

sig_1 <= guarded sig_2;

викорнується , якщо значення Guard дорівнює True. Завдяки виразу захисту один

сигнал може мати декілька джерел - виходів блоків.

Блок має два атрибути. Префіксом атрибутів може бути ім’я архітектури або

мітка оператора блоку. Атрибут B’Behavior повертає True, якщо В не містить опе-

раторів екземплярів компонентів, тобто В містить тільки функціональні операто-

ри. Атрибут B’Structure повертає True, якщо В не містить операторів присвоєння

сигналів ззовні чи всередині операторів процесів, тобто В містить тільки

структурні оператори. Існує можливість , що обидва оператори невірні для деяко-

го В, але не

можливо, щоб обидва були вірні.

Таким чином, блоки виконують 4 функції: створення локальної пам’яті для

змінних та сигналів блоку; введення області дії цих змінних і сигналів; взаємно-

однозначна заміна їх програмними одиницями - компонентами; організація

декількох джерел для одного сигналу.

Архітектура може використовувати інші об’єкти, що розроблені окремо та роз-

міщені в бібліотеках. Для цього треба описати компонент як зразок, використаний

в архітектурі. Для підключення бібліотек використовується опис специфікації.

Синтаксис декларації компонента:

декларація_компонента ::= component ідентифікатор

[ локальний_опис_параметрів ]

[локальний_опис_портів ]

end component ;

Приклади декларацій компонентів:

© Сніжко Є.М., 2000

39

component nand3

generic (Tpd : Time := 1 ns);

port (a, b, c : in logic_level;

y : out logic_level);

end component ;

component read_only_memory

generic (data_bits, addr_bits : positive);

port (en : in bit;

addr : in bit_vector(depth-1 downto 0);

data : out bit_vector(width-1 downto 0) );

end component ;

Компонент, описаний в архітектурі, повинен бути конкретизований за схемою:

оператор_зразка_компонента::=мітка_зразка: ім’я_компонента

[перелік_присвоєння_параметрів]

[перелік_підключення_портів] ;

Це вказує, що архітектура містить конкретний екземпляр компонента з фактични-

ми параметрами та приєднаними портами. Попередні компоненти можуть бути

конкретизовані таким чином:

enable_gate: nand3

port map (a => en1, b => en2, c => int_req, y => interrupt);

parameter_rom: read_only_memory

generic map (data_bits => 16, addr_bits => 8);

port map (en => rom_sel, data => param, addr => a(7 downto 0);

У першому випадку параметр не перевизначається, тобто використовується

значення за замовчуванням. У другому випадку конкретизовані розміри шин ад-

реси та даних. Також фактичний сигнал, асоційований з портом addr, є вирізкою

сигналу адреси. Це показує, що порт можна приєднати тільки до частини сигналу,

який визначається масивом бітів.

9.

Особливістю мови VHDL, як і мови паралельного програмування Ада, від

якої він походить, є спосіб розділеного задання специфікацій пакетів,

програмних модулів окремо від їхніх тіл. Ця можливість дозволяє повністю

задати специфікацію структури задачі до вирішення будь-яких дрібних деталей

її реалізації. Також ця особливість дозволяє виконувати роздільну компіляцію

програмних модулів пакетів, що дозволяє будувати великі програми або

методом згори вниз, або знизу вгору.

Проект VHDL представляє собою робочу бібліотеку з програмних

модулів і пакетів. Загальні типи даних, константи, процедури і функції

збираються в програмний пакет (package). Стандартизовані типи, процедури і

функції також зібрані в стандартні пакети. Одного разу зкомпільований пакет

не потребує подальшої компіляції при його застосуванні різними програмами.

Окрема від тіла специфікація пакета дозволяє користувачу швидко знайти опис

інтерфейсу необхідних для застосування типів, процедур і функцій.

Програмним модулем в VHDL виступає об’єкт (entity). Об’єкт

складається з специфікації даних і тіла, які відокремлені один від одного.

Специфікацію даних визначають оператор generic, який описує загальні

константи об’єкта, і оператор port, який описує вхідні і вихідні сигнали об’єкта,

а також декларації констант, сигналів, процедур і функцій, які

використовуються в об’єкті. Тіло, або специфікація дій об’єкта представляє

його архітектура (architecture). В свою чергу архітектура складається зі

специфікації архітектури і тіла архітектури, які описують її виконання.

Специфікація архітектури включає опис констант, сигналів, процедур і

функцій, а також специфікації компонентів, які застосовуються в архітектурі.

Тіло архітектури складається з компонентів, блоків і процесів, які з’єднані між

собою сигналами, описаними в специфікації архітектури і в специфікації

об’єкта. Модульність мови VHDL заключається в тому, що будь-який складний

паралельний процес може бути оформленим у вигляді об’єкта з фіксованим

ім’ям. Один і той же об’єкт може бути описаний у вигляді архітектур з різними

іменами. Ці архітектури є взаємозамінні, так як відповідають одній і тій же

специфікації об’єкта. Складний об’єкт, а саме його архітектура, може бути

описана з використанням простіших об’єктів, які входять до опису архітектури

як компоненти.