Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція 18.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.17 Mб
Скачать

5. Кодування станів автомата

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

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

1. складності комбінаційної схеми (КС), що реалізують функції збудження і виходів;

2. можливості збереження працездатності схеми при відмовах окремих її елементів (відмовостійкості);

3. надійності роботи в умовах можливих неузгодженостей тактів елементарних автоматах (ЕА).

Вибір ЕА.

Складність КС автомата залежить від того, які типи ЕА використовуються в автоматі, так як для різних ЕА потрібні різні функції збудження. Оптимальний вибір ЕА пов'язаний з перебором великого числа варіантів схем. Завдання ускладнюється тим, що в загальному випадку вибір ЕА слід поєднувати з вибором кодів станів.

Наближене рішення задачі вибору ЕА можна проводити на основі локального незалежного підбору типів окремих ЕА з числа перебраних.

Переглянувши ЕАi для i = 0 … k -1, виберемо набір ЕА.

Розглядаючи ЕАi потрібно для кожного типу ЕАi: D, T, JK, і т.д. отримати функції збудження і вибрати тип ЕА, що вимагає найбільш просту КС. Оцінка складності КС може виходити по різному в залежності від використовуваних ЛЕ. Можна будувати прототип КС, використовуючи прості прийоми синтезу; можна оцінювати за кількістю кон'юнкцій в ДНФ; можна оцінювати за кількістю змінних і т.п.

Слід зазначити, що на практиці вибір з l типів ЕА часто пов'язаний з доцільністю використання одного типу всіх k ЕА. При цьому перебір скоротиться з k - l до l варіантів. У деяких випадках вибір типів ЕА обумовлюється міркуваннями, не пов'язаними зі складністю КС автомата, наприклад, з порівняльними характеристиками окремих типів ЕА: надійність, споживана потужність і т.д.

В синтаксисі мови Verilog передбачені наступні оператори, виконання яких здійснюється паралельно:

assign;

always;

Таким чином, якщо в програмі для опису модуля використовується декілька операторів assign і always, всі вони будуть виконуватися одночасно.

Роботу логічного пристрою, описаного за допомогою мов HDL, можна перевірити двома способами: або на персональному комп'ютері (моделювання), або безпосередньою реалізацією в мікросхемі. Процес синтезу набагато складніший за моделювання, оскільки передбачає, крім компіляції коду, ще й синтез логічної схеми (тобто реалізацію пристрою за допомогою доступних компонентів ПЛІС і трасування провідників в обраній мікросхемі). Тому результат застосування деяких конструкцій мови Verilog при моделюванні та синтезі відрізняється! Не всі оператори мови Verilog є синтезуючими!

Оператор assign використовується для безперервного присвоєння сигналу змінної типу wire і має наступний синтаксис:

assign var = expression;

Дія оператора трактується так: при зміні виразу expression (наприклад, змінилося значення змінної, що входить до expression) обчислюється нове значення виразу і результат присвоюється змінній var. У лівій частині виразу змінна може бути тільки типу wire, а в правій частині - можлива комбінація змінних wire, reg, integer. Всі оператори assign в модулі виконуються паралельно.

Оператор always - це один з основних, ефективних операторів мови Verilog. Він дозволяє задати постійне виконання послідовності команд. Зазначена послідовність може виконуватися або циклічно (у нескінченному циклі), або тільки після появи певної події. Синтаксис цього оператора:

always @ (... events ... )

begin

...

// послідовність операторів (виконується послідовно, один за одним)

...

end

Даний оператор застосовується тоді, коли виникає необхідність послідовного виконання команд. Для цього, після ключового слова always, іде послідовність операторів, вкладених в блок begin / end. Всі команди, розташовані всередині такого блоку, виконуються послідовно, а самі оператори always - паралельно. За відсутності блока begin / end - дія оператора always поширюється тільки на один наступний за ним оператор. Якщо в операторі always відсутня конструкція @(... events ...), то послідовність команд, розташованих між begin і end, виконується в нескінченному циклі.

Для задавання умови, необхідної для запуску блоку always, використовується конструкція @(... events ...). У цьому випадку, всередині круглих дужок вказується список умов (подій), котрі спричинюватимуть виконання оператора always. Умовою може бути поява позитивного або негативного фронту, зміна значення сигналу і т. д. Позитивний фронт вказується ключовим словом posedge, негативний фронт - negedge. Після ключових слів posedge і negedge слідує назва сигналу. Якщо необхідною умовою є будь-яка зміна сигналу - в дужках просто вказується ім'я контрольованого сигналу.

Важливе зауваження! Усередині оператора always не можна використовувати змінні типу wire (тобто всі змінні, яким присвоюється значення усередині даного оператора, повинні бути типу reg). Інакше це призведе до помилок компіляції. Усередині оператора always неможливий виклик іншого модуля. Всі оператори always виконуються паралельно.