Урок 9

урок

Урок 9. Як проектувати схеми з шинними структурами

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

При використанні шинної структури необхідно мати угоду про те, кому можна передавати дані на шину. Зрозуміло, що в кожний момент часу передавати дані може тільки один пристрій, а інші (або один з них) можуть приймати. Ми не стосуватимемося питань безконфліктного керування шиною, припускаючи, що вони вирішені.

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

Деякі пристрої, наприклад центральний процесор, диск або оперативна пам'ять, можуть в один момент часу бути джерелом даних (передавачем), а в інші моменти - їх приймачем. Отже, шина даних та вентилі, що працюють на неї, повинні бути двоспрямованими.

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

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

Створимо VHDL-список ланцюгів та подивимося, які сигнали оголошені у нашій схемі. У розділі SIGNALS ми побачимо лише один рядок:

SIGNAL A: std_logic_vector (3 DOWNTO 0);

Вміст даного рядка означає, що сигнал A оголошений як чотирирозрядний одновимірний масив з меншим діапазоном (3 DOWNTO 0). Елементи масиву A(3), A(2), A(1) та A(0) відповідають окремим сигналам шини з назвами A[3], A[2], A[1] та A[0]. Ці сигнали діють на провідниках A3, A2, A1 і A0, «захованих» у шині.

У тому, що це справді так, легко переконатися, надіславши нашу схему на моделювання. Відкриємо у програмі OrCAD Simulate діалогову панель Interactive Stimulus і натисніть на кнопціBrowse…. На панелі Browse Signals (у нижньому вікні) ви виявите п'ять сигналів – шинний сигнал A та чотири одиночні сигнали A[3], A[2], A[1] та A[0]. Поки що це все, що є у нашій схемі.

Мал.1. Проста схема з шинною структурою

Проте чи немає помилки у цьому, що провідник A0 не стикається з шиною A[3..0]? Відповідь на це питання найнадійніше отримати експериментом. Промоделюємо схему, описавши як зовнішній вплив лише шинний сигнал A. Сигнал A[0], що діє безпосередньо на провіднику A0, програмувати не будемо! Тим не менш, результатимоделювання показують, що інвертор отримав потрібний сигнал (рис.2) - його вихід перемикається.

шини

Мал.2. Результати моделювання інвертора, що отримує вхідний сигнал з шиниA[3..0]

На рис.3 крім вже розглянутого варіанта показано ще два інші способи «підключення» провідника до шини. Взяте в лапки слово «підключення» свідчить, що ніякі маніпуляції з графічними образами провідника і шини (рис.3,бів) насправді створюють електричного контакту.

Мал.3. Можливі варіанти «підключення» провідника до шини

На рис.3,бу точці їх дотику навіть стоїть junction-з'єднувач. Потягніть за провідник і ви побачите, що він не відривається від шини. Створюється повна ілюзія, що є фізично. Однак це не так. Подивіться на провідник CLOCK. Графічно він теж пов'язаний із шиною, але такого провідника в ній точно немає, а отже, не може бути й електричного зв'язку.

Ми вже знаємо, що шина – це сукупність складових її провідників. Так ось, провідники дозволяється безпосередньо «заводити» в шину, як це показано на рис.3,б. Але краще використовувати для цього спеціальні графічні об'єкти, звані входами в шину (Bus Entry).

Вони викликаються командоюPlace/Bus Entry(Shift+E) або клацанням на піктограмі, показаній поруч.

І справа навіть не в тому, що креслення набуває більш привабливого вигляду (рис.3,в). Входи в шину допускають контакт між собою без утворення електричного контакту, тоді як провідники в подібній ситуації зливаються в один ланцюг, створюючи додаткові проблеми при їх розміщенні. На рис.3,бRESі CLOCK це не два різних ланцюги, а один ланцюг із двома аліасними іменами RES і CLOCK.

Розглянемо серйозніший приклад з використанням шин для передачі даних від одного об'єкта до іншого. На рис.4 цих цілей використовується лічильник 74193 і регістр 74194 з бібліотеки ttl. olb. Передачу даних із виходів лічильника на входи паралельного завантаження регістру здійснимо за допомогою шини bus_Q[3:0], а початкове завантаження лічильника зробимо, використовуючи чотирирозрядну шину bus_D[3..0].

КомандоюPlace/Bus(Shift+B) проведемо дві шини, щоб вони не торкалися жодного контакту. Названу команду можна також ініціалізувати, клацнувши по іконці з панелі інструментів Tool Palette, показаної праворуч. Надамо шинам імена bus_D[3..0] і bus_Q[3:0]. Це робиться так само, як і для звичайних провідників (командоюPlace/Net Alias…). Різниця полягає лише в тому, що в імені шини має бути вказаний діапазон, що визначає її розрядність (ширину шини) та список провідників, що входять до неї.

провідники

Мал.4. Шинна організація обміну даними

При малюванні шин з великою кількістю провідників (наприклад, 16- або 32-розрядних шин) можна прискорити процес їх створення, якщо скористатися послугами командиEdit/Repeat Place(абоEdit/Repeat Copy). Ці команди "висять" на гарячій клавіші F4, і тому виконуються дуже швидко.

Покладіть перший вхід у шину на схемі та натисніть клавішу Esc. Створений об'єкт має зберегти виділення. А тепер натисніть F4 стільки разів, яка розрядність шини. Так само ви можете розміщувати і провідники шини. Легко і швидко, чи не так?

Озброївшись отриманими знаннями, проведемо від шини bus_D[3..0] до входів паралельного завантаження лічильника провідники bus_D0, bus_D1, bus_D2 та bus_D3. Вонивиходять із шини і тому мають називатися так само, як і провідники, що становлять шину. Аналогічним прийомом підведемо до другої шини провідники bus_Q0, bus_Q1, bus_Q2 і bus_Q3, потім в іншому місці (з правого боку) виведемо їх із шини і з'єднаємо з входами паралельного завантаження регістру (рис.4).

Виходи регістру також зберемо в шину bus_Y[3-0]. Ймовірно, ви звернули увагу, що, задаючи ширину шини, ми використовували різні роздільники: bus_D[3..0], bus_Q[3:0] і bus_Y[3-0]. Це робилося з єдиною метою – познайомитись із можливими форматами опису шинних імен.

шини
Збережемо свій проект у файлі bus. opj і промоделюємо його (рис.5), акцентуючи увагу передачі сигналів по шинам bus_D[3..0], bus_Q[3:0] і bus_Y[3-0]. Інші режими роботи лічильника та регістру, наприклад, рахунок і зсув, в даному експерименті не розглядаються.

Мал.5. Результати моделювання шинної структури

Ми бачимо (рис.5), що перед початком роботи обидва вузли встановлюються в нуль. Це відбувається на позначці 100ns, коли на вхід R подається високий рівень (положення візирної лінійки). Потім з появою низького рівня на вході LOAD у лічильник завантажуються дані з шини bus_D (положення першого маркера, 500ns). І, нарешті, фронтом сигналу CLOCK поточний вміст лічильника (код 8) передається в регістр (становище другого маркера, 700ns).

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

Найперша операція, яку треба виконати після того, як намальована шина – визначити їй шинне ім'я. Воно задається у форматі:

Перша частина імені basename несе значеннєве навантаження, друга - [x..y] визначає її діапазон. Діапазон або ширина шини – це числопровідників у ній. Його легко підрахувати за формулою: x - y + 1 (для спадного діапазону).

Між базовим іменем та діапазоном можна включити один або кілька пробілів. Редактор OrCAD Capture ігнорує їх та сприймає такі модифікації як одне ім'я. Наприклад, шинні імена:

Data[7..0] (пробілу немає)

Data [7:0] (один пробіл)

DATA [7-0] (два пробіли)

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

Не рекомендується також проставляти незначні нулі зліва при заданні меж діапазону, наприклад Data[00..16]. І зовсім неприпустимо вказувати незначні нулі в іменах членів шини. Наприклад, буде помилкою, якщо замість імені Data6 ви вкажіть ім'я Data06. САПР OrCAD сприймає їх як різні імена.

Діапазон шини може бути меншим [7..0] або зростаючим [0..7]. Однак у будь-якому разі старшим буде крайній лівий розряд. Ми вже знаємо, що як роздільник меж діапазону використовується двокрапка «:», дефіс «-» або дві точки, що йдуть підряд «..».

Діапазон визначає не тільки ширину шини, а й імена всіх провідників та сигналів, включених до неї. Вони називаються членами (members) шини. Ім'я члена шини утворюється додаванням до базового імені числа, що входить у діапазон шини. Наприклад, шина Data [0..7] містить такі провідники Data0, Data1, …, Data7 та діючі ними сигнали: Data[0], Data[1], …, Data[7].

Особливо ефективним є застосування шин у схемах з ієрархічними блоками (рис.6). У таких блоках допускається оголошувати як одиночні контакти (Scalar), а й звані многоразрядные (шинні) контакти (Bus). Їх імена описуються в тих жеугоди, як і імена шин.

урок

Мал.6. Пряме підключення шин до ієрархічних блоків

До багаторозрядних контактів шина підключається так само просто, як до одиночного контакту провідник. Імена шин та ієрархічних контактів можуть збігатися (вхідна шина на рис.6) або відрізнятися (вихідна шина там же). Можуть навіть не збігатися діапазони. Наприклад, до контакту A[1..0] дозволяється підключити шину B[7..0]. Щоправда, у разі треба пам'ятати, що передача сигналів з шини на багаторозрядний контакт здійснюватиметься позиційним (порозрядним) способом:

Закінчуючи розмову про шинні контакти, зауважимо, що вони працюватимуть лише з VHDL-форматом списку ланцюгів. Жодний інший формат їх не розуміє.

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

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

Створення компонентів, що мають виходи з трьома станами, є дуже актуальним для схем з шинною організацією. Тому ми розглянемо цей процес докладніше. Припустимо, нам потрібно спроектувати тристабільний буфер, вихід якого Q переводиться в Z-стан низьким рівнем на вході E.

Відкриємо бібліотеку my_lib. olb та створимо графічне зображення цього елемента (показано праворуч). Назвемо його TBUF1 і напишемо йому VHDL-модель (рис.7).

use ieee. std_logic_1164.all;

entity TBUF1 is

port (D, E: in std_logic; Q: out std_logic);