Методика 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. Окрім того, і за важливістю не найостанніше, цей симулятор допускає коментарі, повідомлення й ідентифікатори кирилицею. Його безкоштовну версію для навчання можна одержати на сайті www.aldec.com , а літературу про нього російською мовою – на сайті www.aldec.com.ua.

Для моделювання в симуляторі 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