Методика HELLO, WORLD

Зміст Наступна

Вивчення VHDL

Методика HELLO, WORLD

Ця методика прийшла до нас із часів комп’ютерів – динозаврів. Уявіть собі програміста- початківця біля комп’ютерної консолі у вигляді телетайпу. Вводиться програма, запускається на компіляцію – через кілька хвилин реакція консолі – помилки в таких-то рядках. Знову вводитися програма – аналогічна реакція. І так далі, доки вистачить терпіння програміста. Бувало, що на цьому ґрунті в програміста розвивався комплекс неповноцінності перед тупим комп’ютером.

Тому в більшості підручників по мовам програмування пропонувалося свою першу програму написати як саму елементарну, але таку, що потребує мінімум зусиль для налагодження. Зазвичай приводився той самий приклад: програма видачі на консоль повідомлення: ” HELLO, WORLD”. А далі пропонувалося послідовно вдосконалювати і ускладнювати цю програму додаючи оператори і заміняючи одні оператори на інші.

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

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

entity hello is     --заголовок об'єкта проекту
end hello;
architecture empty of hello is --заголовок архітектури empty об'єкта hello

begin  -- початок виконавчої частини архітектури
assert 1/=1   report "Hello,world" ;  --оператор повідомлення

end hello;        --кінець архітектури і програми

Тут текст, що починається двома тире і закінчується наприкінці рядка, означає коментар. Оператор повідомлення assert призначений для перевірки умови моделювання і якщо воно помилкове – значення false – виводиться повідомлення про помилку. У цьому випадку (1/=1)= false.

Дещо про VHDL- симулятори.

Зараз будь-яка солідна САПР електроніки містить у собі VHDL-Симулятор. Але група видних міжнародних авторитетів у програмуванні на VHDL сходяться на тому, що для навчання найкраще підходить VHDL-симулятор Active HDL фірми Aldec. Окрім того, і за важливістю не найостанніше, цей симулятор допускає коментарі, повідомлення й ідентифікатори кирилицею. Зараз можна встановити на своєму комп’ютері наступні безкоштовні VHDL-симулятори:

Active HDL Student Edition фірми Aldec. Це рекомендований симулятор через його зручність. Можна сказати, що він розроблявся студентами для студентів. Його недоліки — великий об’єм останньої версії у мінімальній конфігурації (~750 МБ). Студентська версія відрізняється від професійної тим, що швидкість моделювання обмежена, число компонентів у проекті — не більше 2000, більшість опцій, які спрощують працю, відключені. Симулятор можна скачати тут після нескладної реєстрації.
ModelSim PE Student Edition фірми Mentor. За своїми властивостями цей симулятор такий самий, як симулятор фірми Aldec. Але він більше поширений у промисловості. Симулятор можна скачати тут.
VHDL Simili фірми SymphonyEDA. Це простий симулятор, який поставляється студентам безкоштовно і має невеликий об’єм (~ 10 МБ). Але при цьому його швидкість невелика та одержані графіки не зберігаються у файлах. Симулятор можна скачати тут.
ISIM фірми Xilinx, який входить у склад пакету розробки ПЛІС Xilinx Webpack. Для користування симулятором слід встановити весь пакет Webpack разом з САПР ПЛІС, але користуватись лише симулятором. Xilinx Webpack можна скачати тут або новішу версію тут.
ModelSim-Intel Starter Edition, який входить у склад САПР Quartus Prime для ПЛІС Altera-Intel. ModelSim-Intel Starter Edition можна скачати тут.
Як правило, симулятори встановлюються у комп’ютер з операційною системою Windows, Linux, іноді — MacOS.
Іншим корисним інструментом є компілятор-синтезатор, який входить у склад перелічених вище САПР ПЛІС. Він дає змогу, принаймні, перевірити, чи справді програма на VHDL записана стилем для синтезу і визначити оцінки апаратних витрат та швидкодії синтезованих пристроїв. Також іноді синтезатор використовують для дослідження того, як оператори мови відображаються у логічні елементи та тригери результуючої схеми.

Для моделювання в симуляторі Active HDL спочатку потрібно створити проект – каталог з файлами VHDL, що має назву проекту. Цю роботу полегшує вбудований помічник. Після компіляції в проекті створюється бібліотека проекту, що має назву проекту й містить всі скомпільовані об’єкти проекту. Після запуску програми на моделювання спершу виконується зв’язування об’єктів проекту і призначення початкових значень змінним і сигналам (elaboration). Потім запускається властне симуляція. І для даної програми на консоль буде видано повідомлення:

# : ERROR : Hеllo,world
# : Time: 0 ps, Iteration: 0, TOP instance.
# KERNEL: stopped at time: 100 ns
# KERNEL: Simulation has finished. There are no more test vectors to simulate.

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

Розглянемо програмування проекту пріоритетного шифратора. На вхід шифратора надходять сигнали А1, …,А7 , а на вихід видаються сигнали Y2,Y1,Y0, які кодують номер вхідного сигналу, причому в А7 – найвищий пріоритет. Тобто при надходженні лог.1 на А7 і будь-якої комбінації на інші входи код Y2,Y1,Y0=111, при надходженні лог.0 на А7 , лог.1 на А6 і будь-якої комбінації на інші входи – код Y2,Y1,Y0=110 і т.д. Об’єкт проекту виглядає як:

library std ; -- опис: стандартна бібліотека STD, яка використовується
use std.standard.all;  -- опис: використовуються всі типи з пакета STANDARD бібліотеки STD
entity PRIORITY is  -- назва об'єкта - PRIORITY
port(  --оголошення портів
A1 : in BIT;  -- вхідний порт А1 типу BIT
A2 : in BIT;
A3 : in BIT;
A4 : in BIT;
A5 : in BIT;
A6 : in BIT;
A7 : in BIT;

Y1 : out BIT;  -- вихідний порт Y1 типу BIT
Y2 : out BIT;
Y0 : out BIT  );
end PRIORITY;  -- кінець оголошення об'єкта

Враховуючи те, що бібліотека STD – стандартна, вона вбудована в усі симулятори і може бути призначена неявно. Для інших бібліотек, які використовуються при описі об’єкта, потрібно задіяти їхній опис library i use. Тут вони наведені для прикладу.

Ключове слово port відкриває опис входів-виходів (портів) об’єкта. Слово in вказує на вхід, а out – на вихід. BIT – це тип порту, що, відповідно до визначення цього типу в пакеті standard, приймає значення 0 і 1.

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

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

architecture HЕLLO of PRIORITY is  -- початок архітектури HЕLLO об'єкта PRIORITY
                                   -- декларативна частина архітектури
signal t1,t2,t3,t4,t5,t6,t7:BIT;  --оголошення сигналів, які використовуються
begin  --початок описової (поведінкової) частини архітектури
       -- Y2  Y1  Y0
       -- A7  -- 111
t1<=not A7 and A6;  -- 110
t2<=not A6 and A5   -- 101
t3<=not A5 and A4 and not t1 and not t2;  -- 100
t4<=not A4 and A3 and not t1 and not t2 and not t3;  -- 011
t5<=not A3 and A2 and not t1 and not t2 and not t3 and not t4;  -- 010
t6<=not A2 and A1 and not t1 and not t2 and not t3 and not t4 and not t5;  -- 001
Y0<= A7 or t2 or t4 or t6;
Y1<= A7 or t1 or t4 or t5;
Y2<= A7 or t1 or t2 or t3;
end HALLO; --кінець архітектури

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

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

У даній програмі всі оператори – оператори паралельного присвоювання, позначені символами " <= ", які сигналам надають значення виразу праворуч. Тут у виразах використовуються функції and, or i not. Hад операндами типу BIT визначені ще функції nand, nor, xor, xnor. А функції порівняння " = " i " /= " – повертають результат типу boolean зі значеннями true, false. Для завдання чіткого порядку виконання функцій у виразах варто використовувати дужки.

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

Для перевірки правильності проекту зазвичай використовують іспитовий стенд (testbench). Це теж пара: об’єкт – архітектура, у якій блок, що випробовується, використаний як компонент. В Active HDL є функція генерації іспитового стенду, що генерує його заготовку. Така заготовка складається з оператора включення блоку, який випробовується і набору сигналів, які підключені до блоку. Залишається тільки додати операторів для генерації вхідних сигналів і, можливо, для перевірки вихідних сигналів блоку. Іспитовий стенд для блоку PRIORITY(HЕLLO):

entity priority_tb is  --порожній об'єкт, тому що входів-виходів нeмає
end priority_tb;
architecture TB_ARCHITECTURE of priority_tb is component priority;  -- компонент, що буде випробовуватися
port( -- виглядає майже так само, як оголошення об'єкта проекту
A1 : in BIT;
A2 : in BIT;
A3 : in BIT;
A4 : in BIT;
A5 : in BIT;
A6 : in BIT;
A7 : in BIT;
Y1 : out BIT;
Y2 : out BIT;
Y0 : out BIT );
end component;  -- Сигнали усередині іспитового стенду
signal A1 : BIT:='0';  --Сигнал оголошений з початковим станом = 0.;
signal A2 : BIT:='0';  -- Початковий стан можна було б не призначати -
signal A3 : BIT:='0';  -- y бітового типу й так симулятор призначає початковий стан = 0.

signal A4 : BIT:='0';  -- В реальних проектах - сигнали типу STD_LOGIC,
signal A5 : BIT:='0';  -- їм симулятор за замовчуванням призначає початковий стан = U - " не ініціалізоване ".
signal A6 : BIT:='0';
signal A7 : BIT:='0';  -- Тому для таких сигналів бажано оголосити
signal Y1 : BIT:='0';  -- початковий стан на свій розсуд.
signal Y2 : BIT:='0';
signal Y0 : BIT:='0';
begin  -- описова частина архітектури

UUT : priority -- паралельний оператор вставки компоненту
port map (  -- поіменоване зв'язування портів і сигналів
A1 => A1, --порт А1 підключений до сигналу А1
A2 => A2,
A3 => A3,
A4 => A4,
A5 => A5,
A6 => A6,
A7 => A7,
Y1 => Y1,
Y2 => Y2,
Y0 => Y0 )  -- Оператори присвоювання сигналу генерують тестові сигнали.
A1<= not A1 after 2 ns; -- Оператор інвертує сигнал, потім чекає 2нс і знову інвертує i т.д. нескінченно.
A2<= not A2 after 4 ns;
A3<= not A3 after 6 ns;
A4<= not A4 after 8 ns;
A5<= not A5 after 10 ns;
A6<= not A6 after 12 ns;
A7<= not A7 after 14 ns;
end TB_ARCHITECTURE;

Ця програма запускається на моделювання й у вікні графіків (waveform window) можна побачити наступні графіки:

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

Отже, у даній статті розглянуті основи програмування на VHDL і отримана дієва, синтезована модель пріоритетного шифратора. Цю модель можна вдосконалювати, змінювати число й функціональність портів вводу-виводу і т.і. Отже, відповідно до методики Hеllo, World, можна сказати, що VHDL – це дуже просто.

Анатолій Сергієнко

E-mail: aser@comsys.kpi.ua