Смекни!
smekni.com

VHDL - мова опису апаратних засобів комп'ютера (стр. 2 из 3)

2.3.1.6 Бітові рядки

Описують послідовність бітів:

<бітовий_рядок>::=<основа>“<значення>”

<основа>::=В|О|Х відповідно для двійкових, вісімкових та шістнадцяткових значень.

<значення>::=<число>

2.3.2 Типи даних та об’єкти

VHDL надає велику кількість головних типів (скалярних типів) та засоби для утворення складених типів. Скалярні типи включають числові, фізичні величини та перелічувальні типи. Є також велика кількість наперед визначених стандартних типів.

Складені типи включають масиви та записи. VHDL також має тип покажчика (access) та файловий тип (files).

Визначення типу проводиться директивою TYPE:

TYPE<ідентифікатор> IS <опис_типу>;

2.3.2.1 Цілочисельні типи

Це типи, для яких задається діапазон значень:

TYPE <ідентифікатор> IS RANGE <значення_від> TO|DOWNTO <значення_до>;

Максимальний діапазон від -2147483647 до +2147483647 визначений як тип integer.

2.3.2.2 Типи фізичних величин

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

TYPE <ідентифікатор> IS RANGE <значення_від> TO|DOWNTO <значення_до>

UNITS

<базова_одиниця_виміру>;

{<похідна_одиниця>;}

END UNITS;


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

2.3.2.3 Тип з рухомою крапкою

Цей тип є дискретним наближенням до множини чисел з рухомою крапкою у вказаному інтервалі. Точність наближення не вказується в стандарті VHDL, але вона має бути хоча б 1E-6. VHDL має наперед визначений тип real в діапазоні від -1Е-38 до +1Е38.

Опис типу з рухомою крапкою такий самий як і опис цілочисельного типу.

2.3.2.4 Перелічувальні типи

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

TYPE <ідентифікатор_перелічувального_типу> IS ({<ідентифікатор>|<символ>,});

VHDL має кілька наперед визначених перелічувальних типів:

TYPE severity_level IS (note, warning, error, failure);

TYPE boolean IS (false, true);

TYPE bit is (’0’,’1’);

TYPE character IS (... koi-7...);

Символи ‘0’ та ‘1’ є одночасно членами типів bit та character. VHDL сам визначає тип ‘0’ та ‘1’ в залежності від контексту, де вони використовуються.

2.3.2.5 Масиви

Масив у мові VHDL - це набір індексованих елементів одного типу. Масиви можуть бути одновимірні (з одним індексом) та багатовимірні (з багатьма індексами). Масиви також можуть бути обмеженими та необмеженими.

Декларування типу масив:

TYPE <ідентифікатор_масиву> IS ARRAY <межі_для_індексів> | RANGE <> OF <тип>;

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

2.3.2.6 Записи

Запис є набором іменованих елементів однакового або різних типів:

TYPE <ідентифікатор_запису> IS RECORD <елемент>{,<елемент>} END RECORD;

При посиланні на поля ім’я запису та ім‘я поля відокремлюються крапкою.

2.3.2.7 Підтипи

Підтипи використовуються для декларування ідентифікатора як підмножини деякого базового типу:

SUBTYPE <новий_тип> IS <базовий_тип><межі>;

VHDL має два наперед визначених підтипи:


SUBTYPE natural IS integer RANGE 0 TO <max>;

SUBTYPE positive IS integer RANGE 1 TO <max>;

2.3.2.8 Об’єкти

Об’єкт - це спеціальний тип в VHDL. Є три класи об’єктів: константи, змінні та сигнали.

Константа - це об’єкт, що ініціалізується вказаним значенням в момент створення. Далі це значення не змінюється.

CONSTANT <ідентифікатор>:<тип>[:=<значення>];

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

Змінна - це об’єкт, значення якого може змінюватись після його створення.

VARIABLE <ідентифікатор>:<тип>[:=<значення>];

Якщо присвоюване значення відсутнє при декларації змінної, то змінна набуває значення за замовчуванням.

2.3.3 Вирази та оператори

Вирази в VHDL, як і в більшості мов програмування, включають імена об’єктів, літералів, оператори, виклики функцій та операції з дужками.

VHDL має наступні оператори (в порядку зменшення приоритету):

** ABS NOT

* / MOD REM

+(sign) -(sign)

+ - &

= /= < <= > >=

AND OR NAND NOR XOR

Логічні оператори AND, OR, NAND, NOR, XOR і NOT працюють над значеннями типу bit або boolean, а також одновимірний масив з елементів вказаних типів. Для операндів-масивів операція виконується над відповідними елементами масивів.

Розмірність вхідних та вихідного масивів однакова. AND, OR, NAND використовують свій другий операнд, якщо перший операнд не визначає результату. Так AND і NAND використовує другий операнд, якщо перший дорівнює true (‘1’), а OR та NOR використовує другий операнд, якщо перший дорівнює false (‘0’).

Операції порівняння =, /=, <, <=, > та >= повинні мати два оператори однакового типу. Тип результату порівняння завжди boolean. Оператори еквівалентності (= та /=) можуть мати операнди будь-якого типу. Два складених типи вважаються однаковими, якщо однаковими є усі відповідні елементи. Решта операторів порівняння вимагають, щоб їх операнди були скалярного типу або одновимірного масиву.

Знакові оператори (+ та -), а також оператори додавання (+) та віднімання (-) опрацьовують числові операнди.

Оператор конкатенації (&) опрацьовує одновимірні масиви та дає результат - масив, що складається з елементів першого, за яким слідують елементи другого. Він може також під’єднати один новий елемент до масиву або два незалежних елементи об’єднати в масив. Найчастіше цей оператор використовується з рядками.

Оператори множення (*) та ділення (/) працюють над цілими числами, числами з рухомою крапкою та з типами фізичних величин. Операції ділення без остачі (MOD) та остача від ділення (REM) працюють лише з цілими.

Операція абсолютного значення (ABS) працює лише з числовими типами.

Піднесення до степеню (**) може мати цілочисельний або тип з рухомою крапкою першого операнду та цілочисельній тип другого операнду. Від’ємний другий операнд дозволяється лише за умови, коли перший операнд є число з рухомою крапкою.

2.3.4 Конструкції

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

2.3.4.1 Присвоєння значень змінним

Змінна набуває нового значення за допомогою конструкції присвоєння:

<ім’я_об’єкту> | <агрегат> := <вираз>;

Об’єкт та вираз повинні бути однакового типу.

Алгоритм виконання такого присвоєння наступний: спочатку обраховуються значення елементів агрегату та значення виразу, а далі відбувається присвоєння значення виразу агрегату.

2.3.4.2. Умовна конструкція if

Дозволяє виконання інструкцій в залежності від виконання умов.

IF <умова> THEN

<послідовність_конструкцій>

{ ELSE IF <умова> THEN <послідовність_конструкцій> }

[ ELSE <послідовність_конструкцій>]

END IF;


Умовою є вираз, що дає результат типу boolean.

2.3.4.3 Умовна конструкція case

Дозволяє виконати послідовність конструкцій в одній з гілок.

CASE <вираз> IS

{ WHEN <вибір> { |<вибір> } | OTHERS =>

<послідовність_конструкцій>

}

END CASE;

<Вираз> та <вибір> мають бути виразами дискретного типу або одновимірними масивами символів.

Всі значення <вибір> мають буті різними. OTHERS повинна включатись як остання альтернатива. Якщо результат виразу - масив, то <вибір> має бути рядком або бітовим рядком.

2.3.4.4 Конструкція циклу loop

VHDL має базову конструкцію LOOP, яка може бути у формі WHILE чи у формі FOR. Це дві, так звані, ітераційні схеми.

[<мітка>:]

[<схема_while>|<схема_for>] LOOP

[<послідовність_конструкцій>];

[NEXT [<мітка>] [WHEN <умова>];

[EXIT [<мітка>] [WHEN <умова>];

END LOOP [<мітка>];

Якщо ітераційна схема пропущена, то отримаємо нескінчний цикл.

Ітераційна схема WHILE тестує умову, що обчислюється перед кожною ітерацією.

Ітераційна схема FOR вводить змінну циклу, яка приймає послідовні значення у вказаних межах. У тілі циклу ця змінна розглядається як костанта (їй не можна присвоювати значення). Після закінчення циклу значення цієї змінної не існує.

2.3.4.5 Порожня конструкція

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

2.3.4.6 Конструкція підтвердження

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

ASSERT <умова>

[REPORT <вираз>]

[SEVERITY <вираз>];

Якщо присутній REPORT, результат виразу повинен бути рядковим. Це буде повідомлення, якщо умова є хибною. Якщо REPORT відсутній, то повідомлення за замовчуванням буде “Assertion violation”. Якщо присутній SEVERITY, вираз повинен мати тип severity_level; якщо його нема, то значення за замовчуванням є error. Симулятор може закінчити своє виконання, якщо умова не виконалась і значення SEVERITY є більшим за якесь порогове значення, величина якого залежить від реалізації. Як правило, величина порогового значення регулюється користувачем.

2.3.5 Підпрограми та пакети

Як і інші мови програмування, VHDL підтрімує підпрограми у формі процедур та функцій. VHDL також підтримує пакети для групування декларувань та об’єктів в окремі модулі. Пакети також забезпечують деяку абстракцію даних та приховування певних блоків інформації.