Програмістська модель обчислювача VHDL

Зміст

Наступна

Вивчення VHDL

Програмістська модель обчислювача VHDL

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

Він знає, що VHDL – це мова програмування. Але в нього виникає питання, програмування чого? При програмуванні на Сі програміст повинен уявляти, що він за допомогою цієї мови описує задуманий алгоритм для його реалізації на нейманівській моделі ЕОМ, що містить, АЛП, регістрову, оперативну, дискову пам’ять і т.д., що існують певні типи даних і механізми доступу до них. Інакше кажучи, він програмує деяку програмістську модель обчислювача для реалізації певної мови. Безумовно, для успішного програмування на цій мові необхідно досконально знати програмістську модель відповідного обчислювача, тобто його архітектуру.

Складання програми VHDL означає програмування моделі обчислювача, що виконує цю програму. Тому далі розглянемо програмістську модель обчислювача для реалізації мови VHDL. Властиво, алгоритм, описаний на VHDL, являє собою деяку множину обчислювальних процесів, організованих на певній моделі обчислювача. Крім того, для розуміння реалізації VHDL у симуляторах використовується модель обчислювача з погляду розробника симуляторів. Нарешті, при синтезі логічних схем розглядається апаратна модель реалізації VHDL, тобто модель, що реалізується в НВІС або ПЛІС.

Найбільш повно програмістська модель обчислювача VHDL описана в керівництві до стандарту мови (VHDL’93. IEEE Standard VHDL Language Reference Manual або скорочено – LRM) . В ньому паралельно з описом синтаксису і семантики всіх мовних конструкцій надані пояснення їхньої реалізації в моделі обчислювача. Але, вивчаючи це керівництво, з першого разу важко осягнути основи цієї моделі. LRM припускає, що читач буде його перегортати з початку – у кінець, з кінця – у середину, із середини – уперед і т.д. кілька ітерацій, поки не виникне розуміння цілісної картини мови. Напевно, за це VHDL і не люблять, тому що така методика засвоєння мови викликає до неї відразу. З іншого боку, той, хто осягнув основи VHDL, почуває себе більш вільним у роботі з нею.

Нижче описується спрощена модель обчислювача VHDL, що містить основні особливості цієї моделі і не суперечить моделі, описуваної в LRM.

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

Структура ВПЕ складається з арифметико-логічного пристрою (АЛП), ОЗП даних (ОЗПД), ОЗП програми (ОЗПП) і певної кількості джерел (ДЖ) і приймачів (ПС) сигналів.

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

В ОЗП даних зберігаються змінні, що беруть участь в обчисленнях. Змінні мають статичні адреси, але при необхідності можна реалізувати динамічний доступ до змінних. Джерела й приймачі сигналів служать, в основному, для зв’язків ВПЕ із зовнішнім світом. При надходженні сигналу на вхід приймача сигналу він фіксує цю подію. У приймачі зберігається як поточний, так і попередній стан сигналів. При виконанні операції з ідентифікатором сигналу, як з операндом, виконується читання приймача сигналу. Після виконання оператора присвоювання сигналу джерело сигналу генерує відповідний сигнал.

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

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

Оператор wait очікує появи зовнішньої події: приходу сигналів, що задовольняють певні умови або кінець строку заданої затримки. Після появи зовнішньої події програма продовжує виконання з наступного оператора. Тільки при виконанні оператора wait у джерелах сигналів генеруються сигнали, яким у програмі було присвоєно нове значення. При досягненні останнього оператора програма переходить до свого першого оператора.

Така програма записується як один паралельний оператор, що називається процесом, а ВПЕ виконує його як обчислювальний процес.

Окремим входом-виходом ВПЕ є шина передачі глобальних (shared) змінних. Глобальна змінна може прийматися (брати участь як операнд) або передаватися з ПЕ (як результат операції присвоювання) у довільні моменти часу. У мові не передбачені механізми синхронізації передачі глобальних змінних. Тому їхнє застосування обмежене, наприклад, розсиланням загального початкового значення, роботою з файлами.

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

Верхній рівень програмістської моделі становить велика кількість ВПЕ, об’єднаних лініями зв’язку, по яких передаються сигнали. Спільними для всіх ВПЕ є консоль для зв’язку з оператором-програмістом (клавіатура і дисплей), дискова пам’ять і ОЗП глобальних змінних.

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

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

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

У більшості програм VHDL один із процесів є ведучим і задає потік збуджуючих станів сигналу для інших процесів. Наприклад, цей процес моделює генератор синхросерії. Тоді ВПЕ – генератор збуджуючого сигналу – запускає суміжні з ним ВПЕ. Ці ВПЕ запускають ВПЕ наступні за ними й т.д. Таким чином, по обчислювальній системі проходять хвилі запусків. Отже, модель обчислювача для реалізації VHDL можна трактувати як деякий хвильовий процесор зі спеціалізованою топологією.

Якщо в процесі не використані оператори wait з установленою затримкою, то цикл запуску-зупинки цього процесу виконується майже миттєво, а точніше – з дельта-затримкою. Тут дельта-затримка – зникаюче малий проміжок часу, який однаковий для всіх таких процесів.

Основним призначенням консолі є вивід повідомлень на екран, які генеруються спеціальними операторами assert і report.

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

При програмуванні необхідно враховувати наступне.

  • Всі процеси виконуються паралельно.
  • Процеси, що виконуються одночасно, утворюють фронт хвилі запусків процесів. Цей фронт пересувається з часовим кроком, що дорівнює дельта-затримці.
  • Всі паралельні оператори мови VHDL перетворюються у функціонально еквівалентні оператори процесів, тому дана обчислювальна модель підходить для довільної VHDL-програми.
  • Структура обчислювальної моделі залишається незмінною після компіляції програми, тобто після свого формування. Ця структура не залежить від сигналів і змінних, що змінюються у процесі виконання програми, тобто вона не може перебудовуватися динамічно.
  • Область дії всіх змінних (крім глобальних) обмежена рамками операторів процесу. Поза процесами змінні невидимі.
  • Порядок доступу до глобальних змінних непередбачуваний. Треба з обережністю програмувати із цими змінними. Бажано відмовлятися від їхнього використання в програмах.

Анатолій Сергієнко
E-mail: aser@comsys.kpi.ua