Основи мови VHDL

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Кафедра "Обчислювальна техніка"

курсова робота

На тему: Основи мови VHDL
Москва, 2009

Зміст
1.1 Введення
1.2 Ідентифікатори в мові VHDL
1.3 Об'єкти мови VHDL
1.4 Типи даних
1.5 Операції мови VHDL
1.6 Послідовні оператори
1.7 Паралельні оператори
1.8 Опис інтерфейсу пристрою
1.9 Архітектура
1.10 Особливості синтезу схем за описами мовою VHDL
Література

1.1 Введення

Мова VHDL служить для опису моделі цифрового пристрою (приладу, системи). Опис на мові VHDL визначає зовнішні зв'язки пристрої ("вид ззовні" або інтерфейс) і один або декілька "видів зсередини" (див. рис. 1.1). Вид зовні задає інтерфейс пристрою, набір сигналів, якими обмінюється з зовнішнім світом. Цей вид описує абстрактне уявлення пристрої "в цілому" і позначається англійським терміном entity, що в дослівному перекладі означає «сутність» і найбільш точно відображає зміст вистави. Однак у літературі термін «сутність» не знайшов широкого розповсюдження, для позначення зовнішнього опису об'єкта використовуються терміни «інтерфейс об'єкта», «декларативна частина» та інші. У цьому посібнику буде використовуватися термін «інтерфейс об'єкта» або просто «інтерфейс».

Рис. 1.1. Цифровий пристрій і його модель
Вид зсередини визначає функціональні можливості пристрою або його структуру. Внутрішня будова об'єкта визначає архітектура (architecture body).
Як і в мовах програмування, мова VHDL має свої правила, в тому числі правила опису імен змінних, об'єктів, типів даних та інших параметрів. Основні правила мови VHDL описані в наступних розділах.

1.2 Ідентифікатори в мові VHDL

Ідентифікатори - це послідовність літер і цифр довільної довжини. Легальними символами є прописні (A ... Z), малі (a ... z), цифри (0 ... 9), знак підкреслення. Перший символ має бути буквою, а останній символ не може бути знаком підкреслення. Малі та великі літери вважаються ідентичними, наприклад, Count, COUNT і CouNT розглядаються як один код. Знаки підкреслення не повинні слідувати один за одним. Коментарі починаються з подвійного дефісу та слідують до кінця рядка, наприклад,
- Це коментар, він продовжується до кінця рядка
- Це продовження коментаря
entity UART is end - це коментар, який слідує за декларацією інтерфейсу пристрою.
Наступні ідентифікатори зарезервовані для використання в якості ключових слів і не можуть бути використані інакше:
Abs
Access
after
alias
All
And
architecture
array
begin
Block
Body
Buffer
case
component
Configu-ration
Constant
disconnect
downto
else
Elsif
End
Entity
file
for
function
generate
Generic
guarded
if
In
inout
Is
label
library
linkage
loop
Map
mod
nand
New
next
Nor
not
null
Of
on
Open
or
others
Out
package
Port
procedure
process
Range
record
Register
rem
select
severity
signal
Subtyupe
then
to
Transport
type
Units
until
use
vriable
wait
When
while
with
Xor

1.3 Об'єкти мови VHDL

Об'єкти це область зберігання даних певного типу. Створюються об'єкти за допомогою декларації об'єкта, наприклад:
variable COUNT: INTEGER;
У результаті породжується об'єкт з ім'ям COUNT, який зберігає цілочисельну величину. Крім того, COUNT декларується як клас variable.
Об'єкти - дані можуть бути трьох класів:
- Сonstant (константа) - може зберігати окреме значення певного типу. Це значення визначається об'єкту на початку моделювання і не може змінюватися в процесі моделювання.
- Variable (змінна) - об'єкт цього класу може зберігати окреме значення певного типу, проте, в процесі моделювання йому можуть присвоюватися різні значення. Для цього використовуються вирази привласнення (variable assignment statement).
- Signal (сигнал) - об'єкт даного класу має попереднє значення, має поточне значення і набір наступних значень.
Об'єкти класу signal моделюють дротові з'єднання в схемах, у той час як змінні (variable) і константи (constant) використовуються для моделювання поведінки схеми, вони аналогічні об'єктів, що використовуються в мовах програмування C та Pascal.

Декларація констант

Декларації об'єктів (object declaration) мають на меті дати ім'я об'єкту, оголосити його тип, клас і навіть присвоїти значення. Приклади декларацій констант описані нижче:
constant RISE_TIME: TIME: = 10ns;
constant BUS_WIDTH: INTEGER: = 8:
У першому випадку оголошується об'єкт RISE_TIME, який зберігає значення типу TIME, об'єкту на початку моделювання присвоюється величина 10 наносекунд. У другому випадку оголошується, що BUS_WIDTH (ширина шини) типу INTEGER (ціле) і їй присвоєно значення 8.

Декларація змінних

Приклади декларацій об'єктів класу variable наведені нижче:
variable CTRL_STATUS: BIT_VECTOR (10 downto 0);
variable SUM: INTEGER range 0 to 100: = 10;
variable FOUND, DONE: BOOLEAN;
У першому випадку декларується мінлива CTRL_STATUS як масив з 11 елементів, причому, кожен елемент типу BIT. У другому випадку змінна SUM декларується як ціле, що лежить в діапазоні від 0 до 100, на початку моделювання змінної присвоюється значення 10. Якщо змінній на початку моделювання не задано значення, то використовується значення за замовчуванням. Їм служить саме "ліве" значення в наборі значень даного типу. Наприклад, змінна типу BOOLEAN має набір значень (FALSE, TRUE) і в третьому прикладі початкове значення змінних FOUND і DONE буде взято за замовчуванням, тобто FALSE.

Декларація сигналів

Декларації об'єктів класу signal схожі з деклараціями змінних:
signal CLOCK: BIT;
signal DATA_BUS: BIT_VECTOR (0 to 7);
signal GATE_DELAY: TIME: = 10 ns;
У першому прикладі декларується об'єкт CLOCK типу BIT, початкове значення при моделюванні буде взято за замовчуванням, тобто 0 (набір значень типу BIT: 0,1 і крайнє ліве значення 0).
Не всі об'єкти в мові VHDL створюються шляхом декларування, наприклад, вхідні / вихідні порти завжди вважаються об'єктами класу signal.

1.4 Типи даних

Кожен об'єкт в мові VHDL може зберігати значення, відносяться до певного набору. Це безліч значень декларується за допомогою оголошення типу (type declaration). Тип - це ім'я, яке зв'язується з певним набором значень і набором операцій. Деякі типи зумовлені мовою VHDL. Наприклад, BOOLEAN має набір значень FALSE, TRUE і набір операторів: and, or, nor, nand, not. У мові є можливість створювати нові типи з використанням декларацій і завдання набору операцій.
Всі можливі типи в VHDL розпадаються на чотири великі категорії:
- Scalar (скалярні),
- Composite (композитні) - вони складаються з елементів одного типу (масиви) або різного типу (записи),
- Access type (типи доступу) - забезпечують доступ до даного типу через покажчики,
- File types (тип - файл) - забезпечує доступ до об'єктів, що містить послідовності значень даного типу.
У свою чергу скалярні типи поділяються на чотири види:
-Enumeration (перераховувані тип),
-Integer (цілий тип),
-Physical (фізичний тип),
-Floating point (тип "з плаваючою комою").

Перераховувані тип

У декларації визначається набір певних користувачем значень, наприклад:
type MVL is ('U', '0 ', '1', 'Z);
type MICRO_OP is (LOAD, STORE, ADD, SUB, MUL, DIV);
MVL - перераховувані тип з упорядкованим набором значень: 'U', '0 ', '1', і 'Z'. MICRO_OP має набір значень: LOAD, STORE, ADD, SUB, MUL, DIV. Порядок запису значень в декларації визначає лексику, тобто значення праворуч завжди більше значення ліворуч: STORE <DIV is true, SUB> MUL is false. Значення в перелічуваних типах мають позиційний номер. Позиційний номер самого лівого елемента 0. Значення в перелічуваних типах ще називають enumeration literals (літерали перечислимого типу). Наприклад, у декларації:
type CAR_STATE is (STOP, SLOW, MEDIUM, FAST);
літералами є STOP, SLOW, MEDIUM, FAST і тільки вони можуть присвоюватися змінної CAR_STATE.

Цілий тип

Integer - ціле, задає тип, набір значень якого знаходиться в заданому целочисленном діапазоні, наприклад:
type INDEX is range 0 to 15;
type WORD_LENGTH is range 31 downto 0;
subtype DATA_WORD is WORD_LENGTH range 15 downto 0;
type MY_WORD is range 4 to 6;
INDEX - це змінна цілочисельного типу, набір значень якої розміщений у діапазоні цілих від 0 до 15. DATA_WORD - підтип WORLD_LENGTH в діапазоні від 15 до 0. На відміну від перелічуваних в цілочисельних типах позиційний номер дорівнює величині значення, наприклад, для значення 31 змінної WORD_LENGTH позиція дорівнює 31.

Тип "з плаваючою комою"

Тип floating point має набір значень у заданому діапазоні дійсних чисел, наприклад:
type TTL_VOLTAGE is range 1.4 to 5.5
type REAL_DATA is range 0.0 to 31.9;
Літерали типу floating point відрізняються від цілочисельних присутністю точки (.). У результаті 0 - це цілочисельний літерал, а 0.0 - це літерал типу з плаваючою комою.

Фізичний тип

Physical type зберігає значення, які представляють собою результати вимірювань фізичних величин: часу, довжини, напруги, струму тощо Значення цього типу виражаються цілими, помноженими на базову одиницю, наприклад:
type CURRENT is range 0 to 1 E9
units
nA; - (base unit) nano-ampere
uA = 1000 nA; - micro-ampere
mA = 1000 mA; - milli-ampere
Amp = 1000 mA; - ampere
end units;
subtype FILTER_CURRENT is CURRENT range 10 mA to 5 mA;
Тут CURRENT визначений як фізичний тип, який має значення в діапазоні від 0 nA до 10 ^ 9 nA. Базовою одиницею є наноампер, а всі інші є похідними. Позиційний номер значення дорівнює числу базових одиниць, представлених даними значенням, наприклад, 2 mA мають позиційний номер 2000, в той час як 100 nA займають позицію 100. Фізичний літерал записується як ціле, за яким слідує назва одиниці вимірювання (пробіл обов'язковий).

Тип "масив"

Об'єкт типу array складається з елементів одного типу. Нижче наведено приклади масивів:
type ADDRESS_WORD is array (0 to 63) of BIT;
type DATA_WORD is array (7 downto 0) of MVL;
type ROM is array (0 to 125) of DATA_WORD;
ADDRESS_WORD - однорозмірних масив з 64 елементів типу BIT. DATA_WORD - однорозмірних масив з 8 елементів типу MVL. ROM - масив з 126 елементів типу DATA_WORD, тобто в даному випадку маємо справу з масивом масивів.
Доступ до елементів масиву здійснюється за допомогою індексів, наприклад, ADDRESS_WORD (26) посилається на 27-ой елемент масиву ADDRESS_WORD.

1.5 Операції мови VHDL

У мові VHDL є операції наступних категорій:
1. Логічні операції
2. Операції відносин
3. Операції додавання / віднімання
4. Операції множення / ділення
5. Інші
Пріоритет операцій зростає від категорії 1 до категорії 5. Операції однієї категорії мають однаковий пріоритет і виконуються в послідовності: зліва направо. Дужки використовуються для зміни послідовності виконання.

Операції логічні

Існує шість логічних операцій: and, or, nand, nor, xor, not.
Операції застосовні до типів BIT, BOOLEAN, до одноро-змірних масивів BIT і BOOLEAN. При виконанні бітові значення "0" і "1" інтерпретуються як Булевського FALSE і TRUE. Результат має той самий тип, що і операнди. Операція not - унарна операція, вона має пріоритет категорії 5.

Операції відносин

У мові VHDL є наступні операції відносин:
=, / =, <, <=,>,> =
Результатом виконання будь-якої операції відносин є булеве вираз BOOLEAN. Операції рівності (=) і нерівності (/ =) припустимі з усіма типами, за винятком типу "файл". Решта чотири операції допустимі над скалярними типами (цілочисельними, перераховуваною) або над масивами дискретного типу. Коли операндами є масиви, то порівняння виконується зліва направо по одному елементу, наприклад при наступному порівнянні:
BIT_VECTOR '(0 "," 1 "," 1 ") <BIT_VECTOR' ('1 ', '0', '1 ')
отриманий результат TRUE, тому що перший елемент вектора зліва менше першого елемента вектора справа. Інший приклад, якщо декларовано тип:
type MVL is ('U', '0 ', '1', 'Z');
то результат порівняння:
MVL '(' U ') <MVL' ('Z')
буде TRUE, тому що 'U' знаходиться лівіше 'Z'.

Операції підсумовування, віднімання, конкатенації

Операції мають позначення:
+, -, &.
Операнди, що беруть участь в операціях додавання (+) і віднімання (-) повинні бути одного числового типу, результат виявляється того ж типу. Операндами в конкатенації (&) можуть бути або окремі елементи або одномірні масиви. Результат видається у вигляді масиву, наприклад при виконанні конкатенації:
"0" & ​​'1 '
утворюється масив символів "01", або ще приклад:
'C' & 'A' & 'T'
дає "CAT".

Операції множення, ділення

До цієї групи оператцій відносяться: *, /, mod, rem.
Операнди множення (*) і ділення (/) повинні бути одночасно або цілочисельного типу (integer) або типу з плаваючою комою (floating point). Результат завжди того типу, що і операнди. Операція множення може мати один операнд фізичного типу, а інший - або цілочисельного, або натурального типу. Результат видається у вигляді фізичного типу.
В операції ділення допустимо ділити об'єкт фізичного типу на цілочисельний або натуральний. Результат - завжди фізичного типу. Розподіл фізичного типу на фізичний дає цілочисельний результат.
Операції залишку (rem) і "поділу по модулю" (mod) в якості операндів можуть мати цілочисельні типи і результат - цілочисельного типу. Результат rem має знак першого операнда і визначається наступним чином:
A rem B = A - (A / B) * B
Результат mod має знак другого операнда і визначається наступним чином:
A mod B = A - B * N,
де N - деяке ціле.

Інші операції

До їх числа слід віднести: Abs, ** та інші. Операція виділення абсолютного значення (abs) сумісна з будь-яким числовим типом операнда. Операція зведення до степеня (**) операндом зліва має ціле або тип з плаваючою точкою, а в якості правого операнда (ступінь) - тільки ціле.

1.6 Послідовні оператори

До послідовним операторам (Sequential Statements) відносяться оператори присвоювання (Assignment Statements), умовні оператори if (if Statements) і case (case Statements), оператори циклу (loop - next Statements) та інші. Розглянемо деякі з операторів цього типу

Оператор присвоювання

Ці оператори діляться на оператори присвоювання змінної (позначається знаком: =) і оператори призначення сигналу (<=). В обох випадках снаала обчислюється значення виразу, що стоїть праворуч від знаку рівності, а потім отримане значення присвоюється змінної або сигналом, що стоїть ліворуч від знака. Наприклад, оператор
abar: = not a;
задає нове значення змінної abar, а саме - інверсне значення a.
Оператор
z <= not (a and b);
задає нове значення сигналу z, яке виходить праворуч від знака <=.

Оператор if

У загальному випадку if представляє собою послідовність виразів, які обумовлюють умови. В якості умов застосовні будь вираження, при обчислення яких виходить булевський величина (FALSE і TRUE).
if булевское_вираженіе then
последовательностные_выражения
[Elsif булевское_вираженіе then
последовательностные_выражения]
[Else
последовательностные_выражения]
end if;
Вираз if обчислюється шляхом перегляду умов одного за іншим, поки не буде знайдено істинне. Потім обчислюється набір послідовних виразів, пов'язаних з цією умовою. Пропозицій виду elsif у вираженні if може бути від 0 і більше. Може використовуватися і пропозиція else. Вирази if можуть вкладатися одне в інше без обмежень.
Розглянемо простий приклад.
if CTRL = '1 'then
MUX_OUT <= "10";
else
MUX_OUT <= "01";
end if;
Якщо керуючий сигнал CTRL1 дорівнює "1", то вихідний сигнал MUX_OUT приймає значення "10", інакше MUX_OUT прийме значення "01". На цьому оператор if завершується.
Розглянемо складніший приклад.
if CTRLI = '1 'then
if CTRL2 = 0 "then
MUX_OUT <= "0010";
else
MUX_OUT <= "0001";
end if;
else
if CTRL2 = 0 "then
MUX_OUT <= "1000";
else
MUX_OUT <= "0100";
end if;
end if;
Якщо керуючий сигнал CTRL1 дорівнює "1", тоді за умови (відкривається вкладене if) CTRL2 = 0 "вихідний сигнал MUX_OUT <=" 0010 ", інакше (тобто при будь-яких інших значеннях сигналу CTRL2) MUX_OUT <=" 0001 " . Тут завершується внутрішній (вкладений) оператор if. Інакше (тобто при будь-яких інших значеннях сигналу CTRL1), якщо (відкривається новий вкладений оператор if) CTRL2 = "0", тоді MUX_OUT <= "1000", інакше (тобто при будь-яких інших значеннях сигналу CTRL2) MUX_OUT <= "1000". Тут завершується внутрішній (вкладений) оператор if, а також завершується і зовнішній.

Оператор case

Оператор case має наступний формат:
case вираження is
when варіант вибору => последовательностные_выражения
when варіант вибору => последовательностные_выражения
- Довільне число варіантів вибору.
when others => последовательностные_выражения]
end case;
При обчисленні виразу case вибирається одна з гілок у відповідності зі значенням висловлювання. Вираз може мати значення типу перечислимого або типу одновимірного масиву. Розглянемо приклад:
type WEEK_DAY is (MON, TUE, WED, THU, FRI, SAT, SUN);
type DOLLARS is range 0 to 10;
variable DAY: WEEK_DAY;
variable POCKET_MONEY: DOLLARS;
case DAY is
when TUE => POCKET_MONEY: = 6; - гілка 1
when MON I WED => POCKET_MONEY: = 2; - гілка 2
when FRI to SUN => POCKET_MONEY: = 7; - гілка 3
when others => POCKET_MONEY: = 0; - гілка 4
end case;
Змінна WEEK_DAY має значення перечислимого типу (дні тижня). Змінна DOLLARS має цілочисельні значення в діапазоні від 0 до 10. Гілка 1 вибирається, коли день тижня TUE. Гілка 2 вибирається у випадку коли дні тижня MON або WED (вертикальна риса означає АБО). Гілка 3 покриває значення від FRI до SUN, тобто FRI, SAT і SUN. Гілка 4 покриває всі залишилися значення, тобто THU.

Оператор loop

Оператор loop використовується для завдання ітерації набору послідовних виразів.
[Ярлик для loop:] итерационная схема loop
последовательностные_выражения
end loop [ярлик для loop];
Існує три ітераційних схеми. Перша має форму:
for ідентифікатор in діапазон
Приклад використання схеми:
FACTORIAL: = 1;
for NUMBER in 2 to N loop
FACTORIAL: = FACTORIAL * NUMBER;
end loop;
Тіло loop виповнюється N-1 раз, при цьому ідентифікатор NUMBER в кінці кожної ітерації збільшується на 1. Мається на увазі, що ідентифікатор цілочисельного типу і значення його лежать в діапазоні від 2 до N.
Другий ітераційної схемою є наступна:
while булевскоe_вираженіе
Приклад використання схеми:
J: = 0; SUM: = 10;
WH-LOOP: while J <20 loop - loop має ярлик WH_LOOP
SUM: = SUM * 2;
J: = J +3;
end loop;
Вирази в тілі loop виконуються одне за іншим і ця послідовність повторюється, поки умова J <20 істинно.
Третьою Cхема є конструкція, в якій итерационная схема не задається і вихід з loop здійснюється з використанням виразів: exit, next або return, наприклад:
SUM: = 1; J: = 0;
L2: loop - loop має ярлик
J: = J +21;
SUM: = SUM * 10;
exit when SUM> 100;
end loop L2;
У цьому прикладі вираз exit змушує виходити з петлі L2 коли SUM стає більше 100. При відсутності прояву exit loop буде виконуватися нескінченно.

1.7 Паралельні оператори

До паралельним операторам (Concurrent Statements) оператор process, оператор паралельного виклику процедури, оператор конкретизації компонента, оператор генерації (generate) та інші. Паралельні оператори визначають паралельне поведінка схем, порядку їх виконання не залежить від їхньої появи всередині блоку.
Розглянемо коротко оператор process. У загальному вигляді він може бути записаний таким чином.
[Ім'я процесу:] [postponed] process [(список)]
розділ декларацій
begin
оператори
end process [ім'я процесу];
Ім'я процесу і ключове слово [postponed] є необов'язковими і часто відсутні. Список, що знаходиться після ключового слова process, хоча і є необов'язковим, на практиці використовується досить часто для вказівки сигналів запуску. Перед ключовим словом можуть перебувати різного роду декларації типів, констант атрибутів і т. д.
Хоча процес є паралельним оператором, він може містити послідовні оператори. Усередині процесів не мегут бути декларовані сигнали.

1.8 Опис інтерфейсу пристрою

На початку глави вже говорилося, що на моделируемое пристрій в першу чергу слід подивитися з боку ("вид ззовні") і для цього "чорного ящика" визначити інтерфейс із зовнішнім світом. Таке завдання вирішується в VHDL декларацією інтерфейсу entity. Вона задає ім'я опису, імена інтерфейсних портів, напрямок передачі, тип портів. Порт - це сигнальна лінія (шина), за допомогою якої пристрій (модель) взаємодіють з навколишнім середовищем. Наприклад, для полусумматора (рис. 1.2) декларація буде виглядати наступним чином:

Рис. 1.2. Полусумматор
entity half_adder is
port (a, b: in BIT; sum, cur: out BIT);
end half_adder;
Тут опис з ім'ям half_adder має два вхідних порту, a і b (in - означає вхідний порт), і два вихідних порту, sum і carry (out - означає вихідний порт). Тип портів визначений як BIT - означає, що сигнали на лініях портів можуть приймати значення: "0" або "1".
Іншим прикладом може послужити дешифратор, показаний на рис. 1.3.
entity dec2x4 is
port (a, b, enable: in BIT; z: out BIT_VECTOR (0 to 3));
end dec2x4;
Тут опис з ім'ям dec2x4 має три вхідних порту і чотири вихідних. Вихідні порти описані як масив. BIT_VECTOR - це одновимірний масив, діапазон задається параметром Z (0 to 3).


Рис. 1.3. Декодер 2х4
Кожен інтерфейсний порт може функціонувати у наступних режимах:
in - значення порту тільки зчитується для використання всередині моделі,
out - значення порту може тільки оновлюватися моделлю, але не зчитується,
inout - двонаправлений порт, значення прочитується і оновлюється моделлю,
buffer - буферний порт, значення прочитується і оновлюється моделлю, але джерелом сигналу може бути або буфер, або одиночний джерело.

1.9 Архітектура

Архітектура (architecture body) моделює погляд на пристрій "зсередини". Пристрій може розглядатися під різними кутами і описуватися по-різному. Воно може постати або як композиція більш простих модулів (структурний стиль моделювання), або як набір паралельно виконуваних алгоритмів (стиль dataflow), або описано як процес послідовного виконання операцій (стиль "поведінковий"), або може бути розкрито поєднанням зазначених стилів.
З одним інтерфейсом типу entity може бути пов'язано кілька архітектур. Розгляд архітектурних стилів почнемо з поведінкового (behavioral style).

Поведінковий опис

Функціонування пристрою розглядається як процес послідовного обчислення виразів, що входять до process. Поштовхом до запуску процесу є зміна (event-подія) будь-якого сигналу, з вхідних в список "сприйманих" сигналів (sensitivity list). Цей список зовні дуже схожий на список параметрів в інших мовах високого рівня. Розглянемо поведінкову модель декодера dec2х4 (рис.1.3). Декларація інтерфейсу його вже наводилася, а тепер вона буде поповнена архітектурою поведінкового типу.
entity dec2x4 is
port (a, b, enable: in BIT; z: out BIT_VECTOR (0 to 3));
end dec2x4;
architecture dec_seq of dec2x4 is
begin
process (a, b, enable)
variable abar, bbar: BIT;
begin
abar: = not a; - вираз 1
bbar: = not b; - вираз 2
If enable = '1 'then - вираз 3
z (3) <= not (a and b); - вираз 4
z (2) <= not (a and bbar); - вираз 5
z (1) <= not (abar and b); - вираз 6
z (0) <= not (abar and bbar); - вираз 7
else z <= "1111";
end if;
end process;
end dec_seq;
Архітектура має своє ім'я dec_seq. Про приналежність архітектури до опису інтерфейсу dec2х4 говорить вираз: dec_seq of dec2x4. Список сигналів, якими запускається процес, подано в дужках: process (a, b, enable). До початку процесу, якщо необхідно, декларуються змінні variable abar, bbar: BIT. Зона дії їх обмежена даним процесом (від begin до end process). Припустимо, що в момент T відбулася зміна сигналу а. Нове значення змінної abar (вираз 1) обчислюється і присвоюється без затримки - миттєво (в якості знака присвоювання в даному випадку використовується =). Без затримки будуть обчислені виразу 2 і 3.
Далі в ході процесу одне за іншим обчислюються вираження від 4 до 7, а нові значення сигналам z (0), z (1), z (2), z (3) будуть присвоєні (в якості символу оператора присвоєння використовується <=) лише через деяку, нехай навіть фіктивну (нескінченно малу), затримку D. Це суттєва відмінність процедур присвоєння для змінних і для сигналів.
Розглянемо приклад мультиплексора 4х1 (рис.1.4). Чотири вхідних сигналу A, B, C і D виводяться через один порт Z. Комутація здійснюється сигналом CTRL.


Рис. 1.4. Мультиплексор 4х1.
entity MUX is
port (A, B, C, D: in BIT; CTRL: in BIT_VECTOR (0 to 1);
Z: out BIT);
end MUX;
architecture MUX_BEHAVIOR of MUX is
begin
PMUX: process (A, B, C, D, CTRL)
variable TEMP: BIT;
begin
case CTRL is
when "00" => TEMP: = A:
when "01" => TEMP: = B;
when "10" => TEMP: = C;
when "11" => TEMP: = D;
end case;
Z <= TEMP;
end process PMUX;
end MUX_BEHAVIOR;
Архітектура отримала назву MUX_BEHAVIOR, процес має ярлик PMUX. Змінній TEMP в залежності від значення сигналу CTRL присвоюється значення одного з вхідних портів: A, коли CTRL має значення "00"; B, коли CTRL має значення "01"; A, коли CTRL має значення "10"; D, коли CTRL має значення "11".
Для опису синхросигналов зазвичай використовується атрібу EVENT. Він правдивий коли відбувається "подія" - зміна сигналу. Наприклад, поведінка D-тригера, показаного на рис.1.5, можна описати так:

Рис.1.5. D-тригер
entity dff is
port (data, clk: in BIT
q, notq: out BIT);
end dff;
architecture behav of dff is
begin
process (clk)
begin
if (clk'event and clk = '1 ') then
q <= data;
notq <= not data;
end if;
end process;
end behav;
Вираз (clk'event and clk = '1 ') задає умову: якщо сигнал clk змінюється з "0" на "1"

Потокове опис (dataflow)

Dataflow - означає потік даних. Опис в стилі dataflow використовує в архітектурі паралельно обчислювані вирази. Кількість паралельно обчислюваних виразів може бути будь-яким. Так як обчислення відбуваються паралельно, то порядок запису виразів не має значення. Поштовхом до початку обчислень є зміна будь-якого із сигналів, що входять у вирази. Розглянемо модель однорозрядного суматора, показаного на рис.1.6.

Рис.1.6. Однорозрядних суматор
entity full_adder is
port (a, b, cin: in BIT; sum, cout: out BIT);
end full_adder;
architecture full_ad_conc of full_adder is
begin
sum <= (a xor b) xor cin after 15 ns;
cout <= (a and b) or (b and cin) or (cin and a) after 10ns;
end full_ad_conc;
Для опису потоку даних тут використовуються два вирази. Завжди, коли відбуваються зміни сигналів a, b або cin, обидва вирази обчислюються і сигналами sum і cout присвоюються нові значення через 15ns і 10ns, відповідно. Знак <= оператор присвоювання. Вираз after 15ns означає затримку, внесену логікою, що реалізує обчислення виразу для sum. Якщо затримка не введена явно, то передбачається наявність нескінченно малою затримки D. Такий прийом дозволяє впорядкувати події моделі dataflow. Розглянемо схему рис. 1.7 і її модель.

Рис. 1.7. Ланцюжок інверторів
entity fast_inverter is
port (a: in BIT; z: out BIT);
end fast_inverter;
architecture delta_delay of fast_inverter is
signal b, c: BIT;
begin
z <= not c; - вираз 1
c <= not b; - вираз 2
b <= not a; - вираз 3
end delta_delay;
У виразах 1, 2 і 3, які присвоюють значення змінним z, c, b, мається на увазі затримка D. Наприклад, в момент T відбувається зміна сигналу a. Запускається процес обчислення виразу 3 і через затримку D змінної b буде присвоєно нове значення (в момент T + D). У свою чергу зміна сигналу b запустить процес обчислення виразу 2 і значення сигналу з буде оновлено в момент T +2 D. Зміна сигналу з призведе до запуску процесу обчислення виразу 1 і значення сигналу z буде змінена в момент T +3 D. Тимчасові співвідношення у схемі ілюструє рис. 1.8.

Рис. 1.8. Тимчасові співвідношення в ланцюжку інверторів.

Структурний опис.

Структурний опис інтерпретує пристрій як набір компонентів, пов'язаних між собою сигналами. Грубо кажучи - це таблиця з'єднань (netlist). Розглянемо просту схему управління (рис.1.8) і її структурну модель.

Рис. 1.9. Пристрій місцевого управління
entity ctr_lck is
port (data, mr, clk, din: in BIT; rdy, ctrla: out Bit);
end ctr_lck;
architecture str_view of ctr_lck is
component AND2 - декларується компонент AND2
port (x, y in BIT; z: out BIT);
end component;
component DFF - декларується компонент DFF
port (d, clock: in BIT; Q, NOTQ: out BIT);
end component;
component NOR2 - декларується компонент NOR2
port (a, b: in BIT; z: out BIT);
end component;
signal s1, s2: BIT;
begin
D1: DFF port map (data, clk, s1, s2); - вираз 1
A1: AND2 port map (s2, din, ctrla); - вираз 2
N1: NOR2 port map (s1, mr, rdy); - вираз 3
end str_view;
Тут декларуються три компоненти: AND2, DFF і NOR2. У тіло архітектури екземпляри компонентів вводяться за допомогою виразів 1, 2 і 3. Компоненти пов'язані між собою сигналами s1 і s2. У декларації називається ім'я компонента і його інтерфейс, що дуже схоже з декларацією інтерфейсу пристрою. Вираз для примірника компонента повинна в першу чергу дати ім'я примірнику або ярлик. Наприклад, D1 - це ярлик для примірника тригера DFF. Далі слідує список зв'язків (association list). Він встановлює зв'язок між портами компонента і портами і сигналами пристрою. Існує два варіанти зв'язку: позиційний та поіменний. У позиційному списку перший порт декларації (зліва направо) компонента відповідає першому порту примірника компонента (зліва направо), другий - другому і так далі. Саме такий варіант списку був використаний в наведеному вище прикладі. Замість цього можна було використовувати поіменний варіант списку зв'язків, наприклад, вираз 3 можна було б записати так:
N1: NOR2 port map (a => s1, b => mr, z => rdy);
Розглянемо ще приклад. На рис.1.2 була наведена схема полусумматора. Його структурну модель повинна постати як набір наступних компонентів: XOR на два входи (наприклад, 7486 або вітчизняний аналог ЛП5) і AND на два входи (наприклад, 7408 або вітчизняний аналог ЛІ1).
entity half_adder is
port (a, b: in BIT; sum, cur: out BIT);
end half_adder;
architecture h_a_str of half_adder is
component a_7486
port (a_2: in BIT;
a_3: in BIT;
a_1: out BIT);
end component;
component a_7408
port (a_2: in BIT;
a_3: in BIT;
a_1: out BIT);
end component;
begin
X1: a_7486 port map (a, b, sum);
A1: a_7408 port map (a, b, cur);
end h_a_str;
Назви компонентів і їх портів наведені такими, якими вони дані в бібліотеці фірми ALTERA - відомого виробника програмованих логічних схем.
Декларації компонентів, використані в архітектурі h_a_str полусумматора half_adder, можна упакувати в окремий файл, наприклад, maxplus2.vhd:
package maxplus2 is
component a_7486
port (a_2: in BIT;
a_3: in BIT;
a_1: out BIT);
end component;
component a_7408
port (a_2: in BIT;
a_3: in BIT;
a_1: out BIT);
end maxplus2;
Файл maxplus2 при компіляції може бути поміщений в бібліотеку, наприклад, з назвою altera. Посилання на бібліотеку дозволить не декларувати компоненти в архітектурі:
library altera;
use altera.maxplus2.all;
entity half_adder is
port (a, b: in BIT; sum, cur: out BIT);
end half_adder;
architecture h_a_str of half_adder is
begin
X1: a_7486 port map (a, b, sum);
A1: a_7408 port map (a, b, cur);
end h_a_str;

Комбіноване опис архітектури

В єдиному тілі архітектури можна комбінувати всі розглянуті вище стилі моделювання. В якості прикладу розглянемо однорозрядних повний суматор (рис.1.5).
Суматор представлений виразом 1, що створює екземпляр X1 компонента а_7486 (з бібліотеки altera.maxplus2), і задає відображення портів і сигналу сутності (суматора) на порти компонента. Це структурний стиль.
Вираз 2 - це process, поведінковий стиль, і вираз 3 - це стиль dataflow.

Ріс.1.10. Однорозрядних суматор
library altera;
use altera.maxplus2.all;
entity full_adder is
port (a, b, cin: in BIT; sum, cout: out BIT);
end full_adder;
architecture fa_mix of full_adder is
signal s1: BIT;
begin
X1: a_7486 port map (a, b, s1); - вираз 1
process (a, b, cin) - вираз 2
variable t1, t2, t3: BIT;
begin
t1: = a and b;
t2: = b and cin;
t3: = a and cin;
cout <= t1 or t2 or t3;
end process;
sum <= s1 xor cin; - вираз 3
end fa_mix;

1.10 Особливості синтезу схем за описами мовою VHDL

Між процесами моделювання (імітації поведінки схеми) синтезу схем з використанням мови VHDL є істотні відмінності. Розглянемо деякі з них.
На відміну від системи моделювання система проектування перетворює проектну інформацію в заданий формат. Серед них виділяються широко поширений формат EDIF, спеціалізовані формати різних фірм-виробників мікросхем, а також мови Verilog, VHDL та інші. Формат EDIF є своєрідним стандартом де-факто, він є в більшості сучасних систем проектування і може використовуватися для обміну інформацією. Серед спеціалізованих форматів можна виділити формат XNF фірми Xilinx, який широко використовувався в попередніх версіях САПР цієї фірми. При перетворенні вихідного модуля в проміжний текст мовою VHDL зазвичай здійснюється перетворення в структурні конструкції цієї мови, в яких використовуються схемотехнічні особливості використовуваної елементної бази.
Система моделювання звичайно використовує всі конструкції мови VHDL, в той час, як система проектування використовує не всі його можливості. Зазвичай при синтезі не підтримуються операції над типом Real (в цьому випадку при синтезі видається помилка), ігноруються ключове слово After, не підтримується також ряд інших другорядних конструкцій мови. У системах проектування атрибут event може використовуватися тільки для вказівки фронтів синхросигналов в умовних операторах, переважно в операторах if.
У сучасних системах проектування для опису схем використовується тип std_logic, який замінює тип bit. Тип std_logic має наступні значення:
· 0 - логічний нуль;
· 1 - логічна одиниця;
· U - значення не ініціалізований;
· X - невідоме значення;
· Z - високу вихідну опір;
· W - невідоме значення при слабкому джерелі сигналу;
· L - логічний нуль при слабкому джерелі сигналу;
· H - логічна одиниця при слабкому джерелі сигналу;
· '-' - Невизначене значення.

ЛІТЕРАТУРА
1. Бібіло П.М. Синтез логічних схем з використанням мови VHDL. М.: Солон-Р, 2002.
2. Суворова О. О., Шейнін Ю. Є. Проектування цифрових систем на VHDL. - СПб.: БХВ-Петербург. 2003.
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Курсова
73.2кб. | скачати


Схожі роботи:
Основи мови HTML Опис основних тегів мови початок кінець документу назва документу
VHDL - технології дослідження цифрових пристроїв
VHDL - мова опису апаратних засобів компютера
Деякі аспекти застосування УМК Моделювання цифрових систем на мові VHDL
Основи англійської мови
Основи латинської мови
Основи мистецтва мови
Основи ділової української мови
Основи програмування та алгоритмічні мови
© Усі права захищені
написати до нас