Визначені типи даних мови VHDL
<визначені типи>::=INTEGER | REAL | BIT | BOOLEAN | CHARACTER | STRING | TIME | BIT_VECTOR | SAVERITY_LEVEL | FILE_OPEN_STATUS | FILE_OPEN_KIND
Типи Integer та Real визначають числові дані – цілі та різні відповідно
Стандартними вважаються наступні діапазони: – для Integer, для Real:
Числа в проекті VHDL можуть представляти як конфігураційні параметри, так і інформацію, що обробляється. Над цими кодами визначені наступні арифметичні операції:
+, додавання або повторення
-, віднімання або інверсія
*, множення
/, ділення
mod, число за модулем
rem, залишок від ділення
abs, модуль
**, піднесення до степеня
=,/=(не дорівнює),<,<=,>=,>
В арифметичних виразах передбачаються традиційні способи визначення пріоритету операцій, включаючи дужки.
Дані типу bit.
Можуть приймати значення з множини . На них визначені логічні операції:
NOT, інверсія
OR, операція «АБО»
NOR, операція «АБО-НЕ»
AND, операція «І»
NAND, операція «І-НЕ»
XOR, нерівнозначність aka сума за модулем 2
XNOR, рівнозначність
Дані Boolean. Можуть приймати два значення: . Над даними визначені ті самі операції, що і над даними типу BIT. Різниця полягає в тому, що дані BIT використовуються для рівнів логічних сигналів, а булеві – в результаті порівняння, логічних умов. Якщо змінна select визначена як bit, то запис умовного оператора if select then – не припустимо. Треба писати if select=’1’ then.
Символьний тип Character. Об’єднує всі символи, що використовуються в ОС. Деякі компілятори допускають використання лише перших 128 символів в таблиці ASCII. В тексті програми символьна константа записується як стандартний символ, поміщений в одинарні лапки ‘a’,’b’,… Символи ‘0’.’1’ мають подвійне значення, потрібно дивитись по контексту програми якого типу вони є.
Тип TIME. Часовий тип даних. Єдиний фізичний тип, визначений в VHDL. Використовується для задавання затримок сигналів, і т.д. Часова константа:
<ціле><одиниця виміру часу>
Визначені такі одиниці виміру:
fs, – фектосекунда
ps, – піко секунда
ns, – наносекунда
us, – мікросекунда
ms, – мілісекунда
s, – секунда
Тип SEVERITY_LEVEL. Множина: . Використовується для керування компілятором або програмою моделювання. За допомогою змінних і констант цього типу в операторі VHDL ASSERT визначається дії, які треба виконати при виникненні певних умов. А дії можуть бути двох типів: просто видати повідомлення про настання події (перших 2), або перервати компіляцію (наступні 2)
Типи FILE_OPEN_STATUS та FILE_OPEN_KIND. Забезпечують можливість контрою процедур обміну між програмою моделювання і файловою системою комп’ютера.
Типи STRING та BIT_VECTOR. Це агрегатні типи, визначені як необмежений масив символів або бітів відповідно.

2010-10-04
Лекція
Типи, які можуть визначатись користувачем
<декларація типу> ::= TYPE <ім’я типу> is <визначення типу>;
<визначення типу> ::=<визначення перечислимого типу>|<визначення цілого типу>|<визначення дійного типу> | <визначення фізичного типу> | <визначення типу масиву> | <визначення типу запису>
Детальніше
<визначення перечислимого типу> ::= (перечслиме значення <<, переслими значення>>)<перечислиме значення> ::= <ідентифікатор>|<символічна константа>
Пр1. TYPE state IS (S0,S1,S2,S3)
Пр2. TYPE std_ulogic is (‘U’,’X’,’0’,’1’,’Z’,’W’,’L’,’H’,’-’); <- такий тип, а також тип, що породжується на його основі std_logic використовується для представлення сигналів у дев’ятизначній логіці. Формально ці типи не є визначеними, але їх включено в пакет std_logic_1164. Тобто треба його підключити для використання цих типів.
‘U’ – не ініціалізоване. Сигналу не присвоювалось жодне інше значення, ‘X’ – активний невизначений стан, ‘0’ – активний нуль, ‘1’ – активна одиниця, ’Z’ - відключено,’W’ – слабий невизначений стан,’L’ – слабий нуль, ’H’ – слаба одиниця, ’-’ – не важливо.
Нудь, ніц не пропустив))) Всі пари… нудь))
Числові типи даних, що визначаються користувачем вводяться для контролю сумісності даних в програмах і для точного задавання розрядності слів, що представляються в даній програмі.
Синтаксис визначення обмеженого типу
<визначення обмеженого типу> ::= [<базовий тип>] <діапазон>
<діапазон> ::= RANGE <обмеження><напрямок><обмеження> | RANGE<>
<напрямок> ::= DOWNTO|TO
Пр1. TYPE unsigned_short IS INTEGER RANGE 0 TO 255;
Пр2. TYPE my_data IS INTEGER RANGE -2**(n-1)+1 TO 2**(n-1)-1;
Пр3. TYPE input_level IS -10.0 to +10.0;
Пр4. Наступні типи ніби однакові, але використання їх зовсім інше, тому для відладки це кльово
TYPE data IS INTEGER RANGE 0 TO 15;
TYPE controls IS INTEGER RANGE 0 TO 15;
Фізичні типи, що визначені юзвером
<визначення фізичного типу> ::=
RANGE <діапазон>;
UNITS <ім’я базової одиниці>;
<<<ім’я вторинної одинці>=<значення одиниці>; >>
END UNITS [<ім’я типу>];
Пр. TYPE voltage IS RANGE –SE6 to +SE6;
UNITS uV;
mV = 1000 uV;
V = 1000 mV;
END UNITES voltage;
Масиви і записи
<визначення типу масиву> ::= ARRAY(<діапазон><<, <діапазон>>>) OF <тип елемента масиву>
Діапазон задає множину допустимих значень індексу. Число вимірів масиву формально необмежений(конструкція RANGE<>)
Пр. TYPE ram IS ARRAY(length-1 DOWNTO 0) OF INTEGER
RANGE 2**width-1 DOWNTO 0;
TYPE ram1 IS ARRAY(length-1 DOWNTO 0, width-1 DOWNTO 0) OF std_logic;
TYPE ram2 IS ARRAY(integer RANGE<>, integer RANGE<>) OF std_logic;
У всіх трьох типу оголошується матриця памяті об’ємом length слів по width розрядів в кожному слові. В першому прикладі – одномірний масив цілих. В другому і третьому – двомірний масив біт, при чому в другому конкретно задані межі зміни індексів, а в третьому – двомірний необмежений масив.
Декларування
VARIABLE ram_ins : ram;
VARIABLE ram1_ins: ram1;
VARIABLE ram2_ins: ram2(length-1 DOWNTO 0, width-1 DOWNTO 0);
Приклади декларування елементів масиву
ram2_ins(y,5) := x0; x0 – визначено як bit, а y як ціле
z <= ram_ins(Y) – Y та z – цілі.
Для одномірних масивів визначено декілька групових операцій, в яких масив розглядається як єдине ціле, це перш за все операція конкатинації стрічок (об’єднання) &.
Наприклад такі оператори a := “1001”, bc := “1101” & a; присвоюють значення сигналу 11011001
Операції зсуву визначені для одномірного масиву бітового та логічного типу BIT, BOOLEAN. Записується наступним чином: <імя масиву><символ операції зсуву><ціле>
Визначені наступні операції
sll – логічний зсув вліво, srl, - вправо.
sla, sra – арифметичний зсув
sol, sor – циклічні зсуви
Запис
Це структура даних, кожна інформаційна одиниця якої називається полем запису. Має індивідуальне ім’я і може бути індивідуального типу. Оголошується так:
<визначення типу запису> ::= RECORD <список полів запису:тип>;
<<<список полів запису:тип>>>
ENDRECORD;
Пр1.
TYPE pixel IS RECORD red, green, blue: integer RANGE 0 TO 255;
END RECORD;
Пр2.
TYPE machine IS
RECORD s:state;
x:machine_input;
y:machine_output;
END RECORD
Підтипи
Об’єкти віднесені до підтипу зберігають сумність з даними типу, з якого виділяється цей підтип. Введення підтипу дозволяє:
Визначити множину допустимих значень даних підтипу як підмножину допустимих значень базового типу
Дозволяє вводити додаткові функції перетворення, визначених тільки для даних підтипу
<декларація підтипу> ::= <ім’я підтипу> IS [<ім’я функції розв’язку>]
<ім’я базового типу чи підтипу> [<обмеження>]
SUBTYPE bit_in_word_number IS integer RANGE 31 downto 0;

2010-10-11
Лекція
PROCESS
<=
:=
<оператор процесу>::=[<мітка оператора процесу>] PROCESS [<список ініціалізаторів>] [IS] <розділ декларації>
BEGIN
<<<розділ операторів>>>
END PROCESS [<мітка процесу>]
<розділ операторів> ::= <<<послідовний оператор>>>
Послідовні оператори можуть записуватись тільки в тілі оператора процесу(хід програми). При моделюванні фрагменти алгоритму, поміщені в оператор PROCESS будуть виконуватись один за одним після настання деякої ініціюючої події, наприклад після зміни сигналу, вказаного після списку ініціалізаторів або наперед визначений час. Паралельні оператори в тілі процесу не визначені.
Послідовні оператори визначені тільки в тілі процесора, а паралельні – у всьому архітектурному тілі.
Загальні правила інтерпретації оператора процесу
Процес запускається при зміні будь-якого сигналу, вказаного у списку ініціалізаторів. Якщо список ініціалізаторів – пустий, то процес безумовно запускається при початковому запуску, а також відразу після виконання останнього оператора тіла процесу. Тому в цьому випадку тіло процесу повинно містити оператор очікування WAIT.
Всі оператори тіла процесу виконуються підряд один за одним від початку до кінця, за винятком випадків призупинення виконання оператором WAIT.
Розділ декларації визначає локальні об’єкти, що використовуються в розділі операторів
LIBRARY IEEE
USE ieee.std_logic.1164.all;
USE work.std_logic.util.all;
USE std.textio.ALL;
ENTITY two_process_example IS
END two_process_example;
ARCHITECTURE test OF two_process_example IS
SIGNAL z,x0,x1,x2:std_logic;
BEGIN
u1:PROCESS(x0,x1,x2) <– запускається при б.я. зміні одного із цих сигналів
VARIABLE y1,y2::std_logic;
BEGIN
y1:=x0 and (not x1) and x2;
y2:=x0 and (not x1) and (not x2);
z:=y1 or y2;
END PROCESS;
stimulator:PROCESS
VARIABLE i:integer:=0;
VARIABLE stim_vector:std_logic_vector(2 downto 0);
BEGIN
stim_vector:=conv_std_logic_vector(i,3);
x0<=stim_vector(0);
x1<=stim_vector(1);
x2<=stim_vector(2);
WAIT FOR 50ns;
i:=i+1;
if (i=8) then
ASSERT false REPORT “end of stimulation!”
SEVERITY NOTE;
END IF;
END PROCESS;
END test;
Програма містить в свому тілі 2 процеси. Один без ініціалізаторів виконується відразу після запуску програми. В цьому процесу I – це номер набору змінних в таблиці істинності, починаючи з 0. Далі перетвоюється в бітовий трійковий вектор і присвоюється x0,x1,x2. Далі оператор очікування на 50 наносекунд. Якщо один з сигналів – змінився, то виконується процес u1. Якщо всі набори перебрані, то видається повідомлення про кінець моделювання.
Найбільш важливі відмінності сигналів та змінних
Змінні міняють значення відразу після присвоєння, значення враховуються у всіх перетвореннях, записаних після такого присвоєння
Значення сигналу міняється не відразу після виконання присвоєння. Оператор присвоєння співставляється деякий буфер, який називають контейнером(драйвером) сигналу. Оператор присвоєння передає нове значення драйверу сигналу, і тільки після того як виконані всі перетворення, ініційовані спільною подією значення драйвера передається сигналу. Передача значення сигналу може бути ще більш затримана, якщо оператор присвоєння містить вираз затримки AFTER.
Змінна визначена тільки всередині тіла процесу. Сигнал ж – у всьому архітектурному тілі.
Змінній можна перепресвоювати значення в тілі процесу. Сигнал ж – всередині одного процесу може мати тільки один thread.

2010-10-18
Лекція
<ім’я атрибуту> ::= < ім’я об’єкту атрибуту>’<конструктор атрибуту>[(<вираз>)]
Конструктор атрибуту визначає властивість об’єкту, яка представляється в атрибуті. Обов’язковий вираз може задавати дані, необхідні для обчислення значень атрибуту.
Атрибути типів
Вид атрибуту
Значення, що обчислюється
Тип об’єкта атрибуту

T’ left
Ліва межа значень T
Будь-який скалярний

T’ right
Права межа значень T
Будь-який скалярний

T’ low
Нижня межа значень T
Числовий або фізичний

T’ high
Верхня межа значень T
Числовий або фізичний

T’ image(x)
Стрічка символів, що представляє значення x
Будь-який

T’ pos(x)
Позиція значення xв наборі значень T
Перечислимий

T’ val(N)
Значення елемента в позиції Nв наборі значень T
Перечислимий, фізичний, цілий

T’ leftof(x)
Значення в наборі значень T, записане в позиції зліва від x
Перечислимий, фізичний, цілий

T’ rightof(x)
Значення в наборі значень T, записане в позиції справа від x
Перечислимий, фізичний, цілий

T’ pred(x)
Значення в наборі значень T, на одну позицію менше за x
Перечислимий, фізичний, цілий

T’ succ(x)
Значення в наборі значень T, на одну позицію більше за x
Перечислимий, фізичний, цілий

T – ім’я типу, N – ціле, x – допоміжний вираз, тип якого збігається з типом T.
Тип усіх перерахованих атрибутів, крім image, posзбігаються з типом T.
Атрибут pos – приймає ціле значення, а image – стрічка.
Для перечислимих типів номер позиції значення відраховується від 0, присвоєння крайнього лівого значення з інкрементом номера позиції для кожного наступного значення. Для перечислимих типів справедливі наступні співвідношення:
T’ leftof = T’ pred (1)
T’ left = T’ low (2)
T’ right = T’ high (3)
T’ rightof = T’ succ (4)
Пр.
std_logic
std_logic’ low = ‘U’
std_logic’ pos(‘1’) = 3 обчислює позицію вказаного значення
std_logic’val(7) = ‘H’ обчислює значення у вказаній позиції
std_logic’ succ(‘z’)=’w’ обчислює значення на одну позицію більше
Нехай сукупність станів деякого автомату представлена типомTYPEstateis:=(50,51,52,53,54,55). Біжучий стан представлений сигналом current_state. Приклад:
PROCESS
IF current_state = state’ right THEN
current_state <= state’ left;
ELSE current_state <=state’ succ(current_state);
WAIT 100ns;
END IF;
END PROCESS;
Прога змінює стан зліва направо. А як дійде до кінця, то переходить спочатку.
Для атрибутів цілих типів номер позиції збігається з фактичним значенням допоміжного виразу, а для атрибутів фізичних типів – числом базових одиниць у значенні допоміжного виразу. Суть конструкторів leftof, pred, left, low, right, high, rightof, succдля цілих і фізичних типів залежить від напрямку: DOабо DOWNTO. Якщо оголошений прямий напрямок, то справедливе співвідношення 1-4, якщо обернений, тоді:
T’ left = T’ high, а не T’ low
T’ leftof = T’ succ
Атрибути масивів
Спрощують запис підпрограм і описи настоюваних модулів, наприклад дозволяють записувати межі обробки безвідносно до фактичного розміру масивів. Позначення:
A – ім’я типу масиву, N – порядковий номер виміру масиву,
N=1 – це круто
Тип результату завжди збігається з типом індексу
Імя атрибуту
Результат

A’ left(N)
Ліва межа діапазону індексів енної координати масиву A

A’ right(N)
Права межа

A’ low(N)
Нижня межа

A’ high(N)
Верхня межа

A’ range(N)
Діапазон індексів енної координати масиву А

A’ reverse_range(N)
Обернений діапазон індексів енної координати масиву А

A’ length(N)
Діапазон індексів енної координати масиву А

FUNCTION glue (x: arr_type) return bit_vector(7 downto 0) IS
BEGIN
RETURN (x(arr_type’ right downto arr_type’ right-3),
x(arrtype’ left+3 downto arr_type’ left));
ENDglue;
Конструктор rangeповертає не одне значення, а множину значень: від і до. Наприклад, для масиву TYPEbyteISARRAY(7 downto 0) ofbitатрибут byte’ rangeприйме значення “7 downto 0”. Обернений атрибут byte’ reverse_rangeприйме “0 to 7”, а byte’ lengthприйме “8”
Атрибути сигналів
Ім’я атрибуту
Тип атрибуту
Значення

S’ DELAYED(T)
Той, що у S
Значення S, що існувало на момент Tперед обчисленням атрибуту

S’ EVENT
BOOLEAN
Сигналізує про зміну сигналу

S’ STABLE
BOOLEAN
S’ STABLE = not S’ EVENT

S’ ACTIVE
BOOLEAN
True, якщо присвоєння сигналу виконане, але значення ще не змінене

S’ QUIET
BOOLEAN
S’ ACTIVE = not S’ QUIET

S’ LAST_EVENT
TIME
Час від моменту обчислення атрибуту до останньої перед цим зміни сигналу

S’ LAST_ACTIVE
TIME
Час від моменту обчислення атрибуту до останнього присвоєння значення сигналу

IF current_state’ event THEN <оператор>;

2010-10-25
Лекція
40 хв пропустив)
x<=’1’ AFTER 5ns; ‘o’ AFTER 20ns, ‘z’ AFTER 50ns, ‘o’ AFTER 70ns;
x<=transport ‘z’ AFTER 20ns;

після моменту нового присвоєння, але після цього проглядається проміжок часу перед новим присвоєнням. Якщо сигнал протягом цього проміжку часу містить переходи, що відрізняються від нового присвоєного, ці переходи видаляються. Тривалість цього часового проміжку вказується після слово REJECT.
Приклад. Якщо через 10нс після виконання присвоєння 1 виконана операція
x<=INTERIAL ‘Z’ after 11ns;
Оператор умови та оператор вибору
Оператор умовиIF, та виборуCASE описують сукупності дій, деякі з яких виконуються при появі певних умов в реальному пристрої, а інші при тих же умовах – не виконуються.
<оператор умови> ::=
IF<логічний вираз>THEN
<оператор><<; <оператор>>>;
<<ELSIF<логічний вираз>THEN
<оператор><<; <оператор>>>;>>
[ELSE <оператор><<; <оператор>>>;]
END IF;
aka
IF B0 THEN S0
ELSIF B1 THEN S1;
ELSIF B2 THEN S2;
ELSIF Bn THEN Sn;
ELSE Sn+1;
ENDIF
B0-Bn – логічні вирази, S0-Sn+1 – сукупності послідовних операторів
При виконанні умовного оператора послідовно обчислюється раніше згадані логічні вирази. Якщо для деякого логічного значення Biотримане значення істини, виконується послідовність операторів Siі виконання умовного оператора припиняється.
Якщо для жодного Bне отримане значення істини, виконується послідовність операторів Sn+1. Якщо при цьому конструкція не містить ключового слова ELSE, то не виконується жоден оператор. Якщо при виконанні деяких умов не передбачено ніяких дій, список операторів повинен містити пустий оператор – нуль.
Приклад:
IF Cn=’1’ THEN register := data;
ENDIF;
Процес, в якому виконується реалізація двох логічних функцій:
Q = a AND b; P = a XNOR b
example_IF:PROCESS(a,b)
BEGIN
IF a=’1’ AND b=’1’ THEN
q<=’1’; p<=’1’;
ELSIF a=’0’ AND b=’0’ THEN
q<=’0’; p<=’1’;
ELSE q<=’0’; p<=’0;
ENDIF
END PROCESS example_IF;
Оператор вибору.
<оператор вибору> ::=
CASE<ключовий вираз> IS
WHEN<варіант><<|<варіант>>><оператор><<;<оператор>>>;
<<WHEN<варіант><<|<варіант>>><оператор><<;<оператор>>>;>>
END CASE;
<варіант>>::=<константний вираз>|<діапазон>|OTHERS
Тип константного виразу або діапазону збігається з типом ключового виразу. При виконанні оператора вибору реалізується єдина послідовність вкладених операторів, а саме та, якій передує варіант, що збігається зі значенням ключового виразу в момент виконання оператора. Ключове слово OTHERSвизначає оператори, що виконуються, якщо значення ключового виразу не збігаються із жодним із вказаним варіантів. Якщо при якомусь варіанті значення ключового виразу не передбачено ніяких дій – список операторів повинен містити пустий оператор – нуль.
Приклад (той самий процес який реалізовує функції над а і б):
example_case: PROCESS(a,b)
VARIABLE d:std_logic_vector (1 downto 0);
BEGIN
d:=a&b;
CASE d IS
WHEN “11” q<=’1’; p<=’1’;
WHEN “00”q<=’0’; p<=’1’;
WHEN OTHERSq<=’0’; p<=’0’;
END CASE;
END PROCESS;
При апаратній інтерпретації операторів умови та вибору у пристрої реалізується підсхема, що виконує всі можливі альтернативи. Із цих підсхемах в конкретних умовах ініціалізується тільки одна.