Лабораторна робота № 2. Моделювання Блоку Регістрів засобами Active-vhdl
МЕТА РОБОТИ: Навчитися проектувати та моделювати нескладні пристрої з допомогою пакету Aldec Active-VHDL.
Теоретичні відомості
VHDL є мовою опису реальних об’єктів та процесів, що протікають в цих об’єктах. Для такого типу описів VHDL містить ряд спеціалізованих конструкцій. Опис об’єкта в VHDL починається з визначення зв’язків між об’єктом та зовнішнім середовищем. Повний перелік таких зв’язків називається інтерфейсом.
Синтаксис опису інтерфейсу об’єктів:
entity identifier is
port (port_interface_list);
entity_declarative_item1;
entity_declarative_item2;
…
entity_declarative_item;
end entity identifier;
де identifier – ім’я об’єкта;
port_interface_list – інтерфейс об’єкта;
entity_declarative_items – необов’язковий список об’явлень, що може містити описання констант, типів, сигналів (більш детально буде розглянуто нижче); port_interface_list містить повний перелік всіх портів (вхідних та вихідних сигналів) об’єкта з означенням їх типу та напряму (вхідний, вихідний, двонаправлений).
Синтаксис опису портів:
(identifier1: mode type : = expression1;
identifier2: mode type : = expression2;
…);
де identifier1, identifier2 – імена портів; mode – параметр, що вказує на напрям порту і може приймати одне з трьох значень: in – вхідний, out – вихідний та inout – двонаправлений; type – тип порту; expression – початкове значення порту.
Після опису інтерфейсу об’єкта необхідно описати його архітектуру. Архітектурою називається внутрішня структура об’єкта, що визначає його поведінку. Саме архітектура визначає, яким чином вхідні порти об’єкта поєднуються з вихідними. Синтаксис архітектури:
architecture identifier of entity_name is
Block_Declarative_Item;
begin
Concurrent_Statements
end architecture identifier;
де identifier – ім’я архітектури; entity_name – ім’я об’єкта, поведінку якого описує дана архітектура;
Block_Declarative_Item – список елементів програми, що будуть доступні в межах архітектури; в цьому розділі можна оголошувати константи, типи, компоненти та сигнали.
Поведінка об’єкта описується всередині архітектури за допомогою конкурентних (паралельних) операторів (Concurrent_Statements). В послідовних мовах програмування, таких як Pascal та С++, поняття паралельних операторів відсутнє. Ці оператори призначаються для реалізації паралельних процесів і виконуються одночасно. До паралельних операторів належать процеси (process), компоненти та деякі інші.
Сигнали використовуються для зв’язків між різними об’єктами (entity) та процесами, що протікають в цих об’єктах. Фізично сигнал можна представити у вигляді лінії зв’язку, яка поєднує об’єкти або структурні складові всередині об’єктів. Крім того, така лінія зв’язку може нескінченно довго зберігати подане на неї значення сигналу.
Синтаксис оголошення сигналу має вигляд
signal Ідентифікатор:
Тип_Сигналу := Початкове_Значення;
де Ідентифікатор – ім’я сигналу, яке сформоване за правилами формування ідентифікаторів;
Тип_Сигналу – може задаватися будь-яким типом чи підтипом;
Початкове_Значення – значення сигналу в момент часу 0 с. Якщо початкове значення не задається явно, то в такому випадку сигнал набуває крайнього лівого значення підтипу Тип_Сигналу.
Оператори оголошення сигналів можуть розміщуватися в розділі оголошень архітектури: тоді кожний з цих сигналів буде доступний всім процесам поточної архітектури. Крім того, сигнал можна оголосити в розділі оголошень entity: в цьому випадку сигнал буде доступний всім введеним архітектурам даного об’єкта.
Одним з ключових елементів мови VHDL є процес (process). Процес є конкурентним оператором, тому поміщається в розділ Concurrent_Statements архітектури.
Синтаксис процесу має вигляд
Мітка_Процесу: process (Список_Чутливості) is
Розділ_Оголошень;
begin
Послідовні_Оператори;
end process Мітка_Процесу;
У наведеному прикладі позначено:
• Мітка_Процесу – сформований за правилами ідентифікатор процесу;
Розділ_Оголошень – розділ, в якому можна оголосити локальні (доступні лише в поточному процесі) константи, змінні, підтипи, а також підпрограми (процедури та функції);
• Список_Чутливості – список сигналів, при виникненні подій на яких (зміна сигналу) здійсниться запуск процесу. Список чутливості може бути відсутнім, але в цьому випадку обов’язкова присутність у процесі хоча б одного оператора wait (розглядається нижче);
• Послідовні_Оператори – оператори, що виконуються (на відміну від конкурентних) послідовно один за одним. До послідовних операторів належать
умовний оператор
оператор вибору
циклічні оператори
оператор присвоювання
оператор пересилання значення сигналу
та інші.
Для аналогії зазначимо, що всі оператори таких мов, як Pascal та С++ є послідовними.
Завдання на лабораторну роботу
Розробити HDL-модель Блоку регістрової пам’яті (БР). Провести моделювання проектованого пристрою.
Проектований БР – це запам’ятовуючий пристрій із 16 комірок, розміром 4 біт кожна. БР призначений для використання в операційному пристрої універсального комп’ютера.
Дані записуються до БР із входу DataIn при надходженні сигналу Write та висхідному фронті тактового імпульсу на вході Clk. Читання даних із регістру (видача на вихід DataOut) відбувається постійно. Регістр , з якого здійснюється читання/запис визначається адресою, що подана на вхід Addr. При надходженні сигналу Reset, вміст усіх регістрів анулюється, при цьому сигнали на інших входах БР ігноруються.
Послідовність виконання роботи
Увійти в систему Active-VHDL.
Щоб розпочати роботу з програмою, стартуємо "C:\Program Files\Aldec\Active-HDL 7.2SE\BIN\avhdl.exe" або іконку «Active-HDL 7.2SE»
В діалогових вікнах при запуску програми:
обираємо «Create new workspace » - створити нову робочу область, та вводимо її ім’я, наприклад «myworkspace1» та місце розташування4;
обираємо «Create an Empty Design» - створити новий проект;
закладку «Property page» залишаємо без змін;
у вікні «new design wizard» - помічник із створення нового проекту - вводимо назву проекту та місце розташування
Створити файл із описом інтерфейсу пристрою (блоку регістрів)
В головному вікні програми вибираємо меню “File”-“New”-“VHDL Source”
В діалогових вікнах створення нового об’єкту вказуємо:
ім’я файлу (source file name)
ім’я інтерфейсу пристрою (entity)
В діалоговому вікні «Ports» - інтерфейс пристрою створюємо наступні входи та виходи:
Ознайомитись із отриманим кодом.
Додати на початку файлу оператор підключення бібліотеки
library IEEE;
use IEEE.std_logic_1164.all;
USE IEEE.std_logic_arith.ALL;
USE IEEE.std_logic_unsigned.ALL;
В розділі опису Архітектури пристрою (architecture) перед оператором begin
Додати декларацію сигналу – вмісту одного регістру:
Signal regs: std_logic_vector (3 DOWNTO 0);
Після оператора begin реалізувати передачу вмісту регістру на вихідний порт пристрою:
DataOut <= regs;
Та запису даних з вхідного порту до регістру за сигналом “write” та надходженням зростаючого фронту тактового імпульсу на вході clk, використовуючи послідовний оператор PROCESS(список чутливості)
PROCESS(clk)
BEGIN
if(clk'event and clk ='1') then
if write='1' Then regs<= DataIn;
end if;
end if;
END PROCESS;
Компілювати та відлагодити проект (Меню Compile) Промоделювати запис даних до регістру, використовуючи часову діаграму:
Меню File-new –waveform
Меню Waveform – Add Signals – додаємо доступні сигнали до часової діаграми
Меню Waveform – – stimulators – задаємо значення сигналів на вході, використовуючи тип “clock” – для сигналу clk, “formula” – для сигналу write, “counter” або “value” для сигналу datain.
Меню Simulation – Initialize
Меню Simulation – Run Until
Меню Simulation – Stop
В розділі опису Архітектури пристрою (architecture) до оператора begin
Додати декларацію нового типу даних – масиву з 16 елементів, розрядністю 4 біт кожен:
TYPE MEM16x4 IS ARRAY (0 to 15) OF std_logic_vector (3 DOWNTO 0);
Змінити декларацію сигналу – вмісту одного регістру на блок з 16 регістрів:
Signal regs: MEM16x4;
Для доступу до конкретного елементу з масиву регістрів використовуємо індекс масиву, наприклад regs(count). Для перетворення вхідної адреси до цілочисельного типу використати функцію CONV_INTEGER(), наприклад:
DataOut <= regs(CONV_INTEGER(Addr));
Промоделювати запис даних до регістру, використовуючи часову діаграму. Записати в регістр №(порядковий номер студента в групі) дане (порядковий номер іншого студента в групі).
розширити список чутливості процесу сигналом початкового скидання “reset”
Реалізувати онулення вмісту всіх регістрів при надходженні сигналу “reset”, використовуючи оператор циклу:
if reset='1' Then
L1: for count in 0 to 15 loop
regs(count) <= "0000";
end loop L1;
Забезпечити пріоритетет сигналу “reset” над іншими сигналами із списку чутливості процесу, використовуючи конструкцію if …. Elsif …. Then …..
Промоделювати початкове скидання блоку регістрів, запис даних до регістру, використовуючи часову діаграму. Записати в регістр №(порядковий номер студента в групі) дане (порядковий номер іншого студента в групі). Продемонструвати вміст усіх регістрів після запису в один з них.
Скласти звіт з виконання лабораторної роботи обсягом 2-3 сторінки друкованого тексту та захистити його. Зміст повинен містити кінцевий HDL код проектованого пристрою.