Описують послідовність бітів:
<бітовий_рядок>::=<основа>“<значення>”
<основа>::=В|О|Х відповідно для двійкових, вісімкових та шістнадцяткових значень.
<значення>::=<число>
VHDL надає велику кількість головних типів (скалярних типів) та засоби для утворення складених типів. Скалярні типи включають числові, фізичні величини та перелічувальні типи. Є також велика кількість наперед визначених стандартних типів.
Складені типи включають масиви та записи. VHDL також має тип покажчика (access) та файловий тип (files).
Визначення типу проводиться директивою TYPE:
TYPE<ідентифікатор> IS <опис_типу>;
Це типи, для яких задається діапазон значень:
TYPE <ідентифікатор> IS RANGE <значення_від> TO|DOWNTO <значення_до>;
Максимальний діапазон від -2147483647 до +2147483647 визначений як тип integer.
Це числові типи, які описують якусь фізичну величину, таку як маса, довжина, час, напруга тощо. Опис такого типу дуже схожий на опис цілочисельного типу, в якому задаються базові одиниці, що утворюються множенням коефіцієнту на базові одиниці.
TYPE <ідентифікатор> IS RANGE <значення_від> TO|DOWNTO <значення_до>
UNITS
<базова_одиниця_виміру>;
{<похідна_одиниця>;}
END UNITS;
Важливим наперед визначеним типом в VHDL є час. Він використовується при описі затримок часу, що є необхідним для процесу симуляцій.
Цей тип є дискретним наближенням до множини чисел з рухомою крапкою у вказаному інтервалі. Точність наближення не вказується в стандарті VHDL, але вона має бути хоча б 1E-6. VHDL має наперед визначений тип real в діапазоні від -1Е-38 до +1Е38.
Опис типу з рухомою крапкою такий самий як і опис цілочисельного типу.
Перелічувальний тип - це впорядкований набір ідентифікаторів або символів. В межах цього набору ідентифікатори та символи повинні відрізнятись:
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’ в залежності від контексту, де вони використовуються.
Масив у мові VHDL - це набір індексованих елементів одного типу. Масиви можуть бути одновимірні (з одним індексом) та багатовимірні (з багатьма індексами). Масиви також можуть бути обмеженими та необмеженими.
Декларування типу масив:
TYPE <ідентифікатор_масиву> IS ARRAY <межі_для_індексів> | RANGE <> OF <тип>;
Індекси для посилання на елементи масиву вказуються в круглих дужках.
Запис є набором іменованих елементів однакового або різних типів:
TYPE <ідентифікатор_запису> IS RECORD <елемент>{,<елемент>} END RECORD;
При посиланні на поля ім’я запису та ім‘я поля відокремлюються крапкою.
Підтипи використовуються для декларування ідентифікатора як підмножини деякого базового типу:
SUBTYPE <новий_тип> IS <базовий_тип><межі>;
VHDL має два наперед визначених підтипи:
SUBTYPE natural IS integer RANGE 0 TO <max>;
SUBTYPE positive IS integer RANGE 1 TO <max>;
Об’єкт - це спеціальний тип в VHDL. Є три класи об’єктів: константи, змінні та сигнали.
Константа - це об’єкт, що ініціалізується вказаним значенням в момент створення. Далі це значення не змінюється.
CONSTANT <ідентифікатор>:<тип>[:=<значення>];
Константи без присвоєного їм значення використовуються при декларуванні пакетів. Це значення буде присвоюватись у відповідному тілі пакета.
Змінна - це об’єкт, значення якого може змінюватись після його створення.
VARIABLE <ідентифікатор>:<тип>[:=<значення>];
Якщо присвоюване значення відсутнє при декларації змінної, то змінна набуває значення за замовчуванням.
Вирази в 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) працює лише з числовими типами.
Піднесення до степеню (**) може мати цілочисельний або тип з рухомою крапкою першого операнду та цілочисельній тип другого операнду. Від’ємний другий операнд дозволяється лише за умови, коли перший операнд є число з рухомою крапкою.
Мова VHDL містить спеціальні конструкції, які дозволяють змінювати стан об’єктів та контролювати потік виконання моделі.
Змінна набуває нового значення за допомогою конструкції присвоєння:
<ім’я_об’єкту> | <агрегат> := <вираз>;
Об’єкт та вираз повинні бути однакового типу.
Алгоритм виконання такого присвоєння наступний: спочатку обраховуються значення елементів агрегату та значення виразу, а далі відбувається присвоєння значення виразу агрегату.
Дозволяє виконання інструкцій в залежності від виконання умов.
IF <умова> THEN
<послідовність_конструкцій>
{ ELSE IF <умова> THEN <послідовність_конструкцій> }
[ ELSE <послідовність_конструкцій>]
END IF;
Умовою є вираз, що дає результат типу boolean.
Дозволяє виконати послідовність конструкцій в одній з гілок.
CASE <вираз> IS
{ WHEN <вибір> { |<вибір> } | OTHERS =>
<послідовність_конструкцій>
}
END CASE;
<Вираз> та <вибір> мають бути виразами дискретного типу або одновимірними масивами символів.
Всі значення <вибір> мають буті різними. OTHERS повинна включатись як остання альтернатива. Якщо результат виразу - масив, то <вибір> має бути рядком або бітовим рядком.
VHDL має базову конструкцію LOOP, яка може бути у формі WHILE чи у формі FOR. Це дві, так звані, ітераційні схеми.
[<мітка>:]
[<схема_while>|<схема_for>] LOOP
[<послідовність_конструкцій>];
[NEXT [<мітка>] [WHEN <умова>];
[EXIT [<мітка>] [WHEN <умова>];
END LOOP [<мітка>];
Якщо ітераційна схема пропущена, то отримаємо нескінчний цикл.
Ітераційна схема WHILE тестує умову, що обчислюється перед кожною ітерацією.
Ітераційна схема FOR вводить змінну циклу, яка приймає послідовні значення у вказаних межах. У тілі циклу ця змінна розглядається як костанта (їй не можна присвоювати значення). Після закінчення циклу значення цієї змінної не існує.
Не виконує ніяких дій. Використовується лише у випадках, коли необхідно явно вказати, що ніяка дія не виконується. Найчастіше застосовується в конструкції CASE у гілці, при виборі якої не віконується жодна дія.
Конструкція підтвердження використовується для перевірки певних умов і для видачі певного повідомлення в разі, коли ці умови заборонені.
ASSERT <умова>
[REPORT <вираз>]
[SEVERITY <вираз>];
Якщо присутній REPORT, результат виразу повинен бути рядковим. Це буде повідомлення, якщо умова є хибною. Якщо REPORT відсутній, то повідомлення за замовчуванням буде “Assertion violation”. Якщо присутній SEVERITY, вираз повинен мати тип severity_level; якщо його нема, то значення за замовчуванням є error. Симулятор може закінчити своє виконання, якщо умова не виконалась і значення SEVERITY є більшим за якесь порогове значення, величина якого залежить від реалізації. Як правило, величина порогового значення регулюється користувачем.
Як і інші мови програмування, VHDL підтрімує підпрограми у формі процедур та функцій. VHDL також підтримує пакети для групування декларувань та об’єктів в окремі модулі. Пакети також забезпечують деяку абстракцію даних та приховування певних блоків інформації.