Методика 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, більшість опцій, які спрощують працю, відключені. Симулятор можна скачати тут після нескладної реєстрації. Для моделювання в симуляторі Active HDL спочатку потрібно створити проект – каталог з файлами VHDL, що має назву проекту. Цю роботу полегшує вбудований помічник. Після компіляції в проекті створюється бібліотека проекту, що має назву проекту й містить всі скомпільовані об’єкти проекту. Після запуску програми на моделювання спершу виконується зв’язування об’єктів проекту і призначення початкових значень змінним і сигналам (elaboration). Потім запускається властне симуляція. І для даної програми на консоль буде видано повідомлення: # : ERROR : Hеllo,world Програма на 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 – це дуже просто. Анатолій Сергієнко |