Vyšlo v týdeníku Computerworld č. 35/93 v roce 1993
Vytištěno z adresy: http://www.earchiv.cz/a93/a335c120.php3

Three-state vs. Open Collector

V minulém vydání této rubriky jsme dospěli k tomu, že jedním z možných významů anglického termínu driver je samostatný integrovaný obvod nebo ta část integrovaného obvodu, která má na starosti generování výstupních signálů - česky budič, od toho, že "budí" výstupní signály v potřebné síle.

Jak už to ale v životě bývá, není budič jako budič: některé budiče jsou konstruovány tak, aby jejich výstupy mohly být připojeny na systémové sběrnice počítače, zatímco jiné toto neumožňují. Dokonce i ty, které tuto možnost připouští, se také mohou výrazně lišit - natolik, že jeden typ těchto budičů již přestává být pouhým zesilovačem, jehož existence je z hlediska logických funkcí zcela transparentní.

Nejprve si ale upřesněme, v čem je podstata problému: v tom, zda je možné propojit výstup jednoho budiče s výstupem jiného budiče (obecně s výstupy více budičů) a na takovéto spojené výstupy pak napojovat vstupy dalších obvodů, nebo zda možnost vzájemného propojení výstupů nepřipadá v úvahu. Právě tato vlastnost budičů je totiž rozhodující pro to, zda je možné příslušný budič připojit na systémové sběrnice, na které obvykle ústí výstupy více různých budičů.

Rozdíl mezi jednotlivými druhy budičů je samozřejmě dán tím, jakým způsobem vlastně "budí" výstupní signály. Ačkoli exaktní popis skutečného zapojení a funkce budičů by byl poněkud složitější a vyžadoval by jistý matematický aparát, pro naše potřeby vystačíme s velmi jednoduchým modelem, který přesto dosti věrně vystihuje skutečnost. Tímto modelem je tzv. odporový dělič neboli dva odpory zapojené za sebou (tzv. do série). K práci s tímto modelem pak budeme potřebovat jen ten nejelementárnější ze všech zákonů elektrotechniky - Ohmův zákon. Ten říká, že napětí vznikající na odporu je rovno součinu velikosti daného odporu a proudu, který odporem protéká. Z tohoto obecného znění Ohmova zákona si můžeme odvodit to, co pro nás bude podstatné: že při daném proudu je napětí na určitém odporu přímo úměrné velikosti tohoto odporu.

Nyní se vraťme k našemu odporovému děliči a uvědomme si jeden podstatný moment - při sériovém zapojení dvou odporů prochází každým z nich stejný proud. To lze zdůvodnit jednoduchou úvahou: v bodě, ve kterém jsou oba odpory propojeny, se nemůže žádný proud ani "ztrácet", ani "přibývat" (to si uvědomil již v minulém století pan Gustav Robert Kirchhoff a podle toho zformuloval tvrzení dnes známé jako tzv. první Kirchhoffův zákon). Dalším podstatným momentem je skutečnost, že při sériovém spojení dvou odporů se napětí na nich sčítají - tedy že výsledné napětí mezi oběma volnými konci sériového spojení odporů bude rovno součtu obou dílčích napětí.

Nyní si představme, že naše dva odpory připojíme na zdroj napájecího napětí - přesněji jeden volný konec sériového spojení odporů připojíme na kladný pól zdroje a druhý volný konec připojíme na druhý pól zdroje (který budeme pro jednoduchost označovat jako zem). Proud, který pak bude protékat oběma odpory, bude stejný (vzhledem k jejich zapojení do série). Jaké ale bude napětí na jednotlivých odporech? Podle Ohmova zákona bude toto napětí (při daném proudu) přímo úměrné velikosti příslušného odporu. Protéká-li oběma odpory stejný proud, je poměr těchto dvou dílčích napětí roven poměru velikostí obou odporů! To si dejme ještě do souvislosti s tím, že obě tato napětí se sčítají a že jejich výsledný součet musí být roven napětí napájecího zdroje. Z toho nám pak již snadno vyplyne, proč se dvěma do série zapojeným odporům říká "odporový dělič" - napětí zdroje totiž dělí přesně v tom poměru, v jakém jsou vůči sobě velikosti obou odporů.

V zájmu větší názornosti si ještě zaveďme sice nepříliš formální, zato ale velmi intuitivní terminologii: odpory tvořící odporový dělič označme jako horní a dolní, podle toho, zda je příslušný odpor připojen ke kladnému pólu napájecího zdroje (horní odpor), nebo k zemi (dolní odpor).

Poslední důležitou skutečností, kterou si musíme uvědomit, je způsob znázornění dvou logických hodnot (1, resp. 0, ano, resp. ne) pomocí napětí. V zásadě platí, že logickou hodnotu (která je diskrétní veličinou) má smysl reprezentovat pomocí napětí (které je analogovou, a tudíž spojitou veličinou) pouze tak, že jedné logické hodnotě přisoudíme celý interval možných hodnot napětí a druhé logické hodnotě jiný interval napětí (samozřejmě disjunktní). Jedním intervalem bývají hodnoty blízké nule a druhým hodnoty blízké napájecímu napětí (konkrétní hodnoty závisí na použité technologii, např. u běžných TTL obvodů a při napájecím napětí 5 V je "spodní" interval od 0 do 0,4 V a "horní" interval od 2,4 do 5 V). O napětí, které spadá do jednoho z obou disjunktních intervalů, se pak říká, že má tzv. nízkou úroveň (v angličtině: úroveň Low, zkratkou L), resp. tzv. vysokou úroveň (úroveň High, zkratkou H).

Jaká je ale korespondence mezi logickými hodnotami a oběma disjunktními intervaly napětí? Má být např. logická 1 reprezentována napětím vysoké úrovně (úrovně H), a logická 0 napětím nízké úrovně (úrovně L)? Nebo tomu má být právě naopak? Oba případy jsou možné, záleží pouze na zvolené konvenci. Té první (kdy logická 1 je reprezentována napětím úrovně H) se říká pozitivní logika a druhé (kdy log. 1 = úroveň L) negativní logika.

Po této krátké exkurzi se již můžeme vrátit zpět k našemu původnímu tématu - k tomu, jak fungují jednotlivé druhy budičů.

Výstupní budič si můžeme představit právě jako odporový dělič, který je schopen podle potřeby měnit hodnoty obou odporů zapojených do série. Oba volné konce tohoto odporového děliče jsou připojeny na napájecí zdroj a výstupní signál je vytvářen napětím mezi zemí a bodem, ve kterém je horní odpor spojen s dolním odporem. Napětí výstupního signálu je tedy shodné s napětím na dolním odporu!!

Má-li pak budič za úkol vytvořit na svém výstupu napětí úrovně H (tedy napětí vysoké úrovně blízké úrovni napájecího napětí), musí změnit dělicí poměr tak, aby na spodním odporu bylo co největší napětí (které je současně napětím výstupního signálu). Toho budič dosáhne tak, že co možná nejvíce zmenší horní odpor a co nejvíce zvětší dolní odpor.

V opačném případě, když má budič vytvářet výstupní signál úrovně L, je situace přesně opačná - musí co nejvíce zmenšit dolní odpor a co nejvíce zvětšit horní odpor. Jednoduché, ne?

Teď si ale představme, že potřebujeme vzájemně propojit výstupy dvou takovýchto budičů - například je oba chceme připojit na tutéž sběrnici. Problém nastane v okamžiku, kdy jeden z nich se bude snažit vytvořit na svém výstupu napětí vysoké úrovně (úrovně H) a druhý napětí nízké úrovně (úrovně L). Jeden z budičů tedy co nejvíce zmenší svůj horní odpor a druhý co nejvíce zmenší svůj dolní odpor. Ovšem tím, že jsme výstupy obou budičů vzájemně propojili, jsem vlastně vytvořili sériové spojení obou těchto velmi malých odporů. Tím jsme oba póly napájecího zdroje zkratovali velmi malým odporem (rovným součtu obou malých odporů), kterým začne okamžitě protékat velmi velký proud. Je pak otázkou konkrétního technického řešení, zda na tento prudký nárůst odebíraného proudu stačí včas zareagovat pojistka napájecího zdroje, nebo zda dojde k poškození některého z budičů (který na takto velký proud není dimenzován).

Výstupy takto fungujících budičů tedy nesmíme propojovat mezi sebou.

Co když to ale opravdu nezbytně potřebujeme? Pak nezbývá než zvolit poněkud jinak fungující budiče. Ty, které jsme si až dosud popisovali, se mohou nacházet vlastně jen ve dvou stavech - v jednom mají velký horní odpor a malý dolní odpor a ve druhém velký dolní odpor a malý horní odpor. Jedno řešení pak spočívá v zavedení ještě jednoho možného stavu (třetího, odsud: třístavové budiče, three-state drivers), ve kterém budou oba odpory současně velké. V tomto třetím stavu (označovaném také jako stav vysoké impedance) se pak výstup příslušného budiče chová stejně, jako kdyby byl doslova "ve vzduchu" - pokud je tento výstup spojen s výstupem jiného budiče, nemá na něj prakticky žádný vliv.

Výstupy třístavových budičů tedy můžeme mezi sebou propojovat, ale musíme přitom dbát na dodržení důležité zásady: mimo třetí stav se v každém okamžiku smí nacházet výstup nejvýše jednoho budiče! Třístavové budiče jsou za tímto účelem vybaveny vstupním řídicím signálem. V závislosti na jeho stavu se pak výstup budiče nachází buď ve třetím stavu, nebo mimo něj (a pak záleží na tom, jaká data budičem "prochází").

Existuje však ještě jedna další a velmi zajímavá možnost, jak umožnit vzájemné propojení výstupů budičů. Je založena na myšlence, že jednotlivé budiče nebudou mít každý svůj vlastní horní odpor, ale místo něj budou sdílet jediný společný odpor, který bude jejich horní odpory nahrazovat (Jinými slovy: jednotlivé budiče nebudou mít své horní odpory pevně zabudovány. Výstupy těchto budičů se vzájemně spojí, a teprve tento jejich spojený výstup se přes externí horní odpor připojí ke kladnému pólu napájecího napětí.) Této variantě se pak říká zapojení s otevřeným kolektorem (Open Collector, OC). To vychází ze skutečné realizace, kdy námi uvažované odporové děliče jsou ve skutečnosti zapojení s tranzistory a kdy chybějícímu hornímu odporu odpovídá přímé vyvedení jedné z elektrod tranzistoru (tzv. kolektoru) na výstup - proto "otevřený kolektor".

Budič s otevřeným kolektorem se tak vlastně redukuje z dvojice odporů jen na samotný dolní odpor, který se opět může nacházet jen ve dvou možných stavech - buďto je hodně malý, nebo hodně velký. Společný horní odpor (tzv. kolektorový odpor) svou hodnotu nemění - ta ovšem musí být vhodně volena mezi oběma těmito krajními hodnotami dolních odporů. Tak, aby v případě, kdy všechny dolní odpory jsou velké, byl společný horní odpor dostatečně malý a vytvářel výstupní napětí vysoké úrovně (úrovně H). Zároveň však musí být zase natolik velký, že když alespoň jeden z dolních odporů bude malý, bude výsledný dělící poměr zajišťovat dostatečně nízké výstupní napětí (tedy napětí úrovně L).

Funkci společného horního odporu lze výstižně charakterizovat také tak, že sám o sobě se snaží vytvářet výstupní napětí vysoké úrovně, ale každému jednotlivému budiči dává možnost, aby dostatečným zmenšením svého dolního odporu "stáhl" toto napětí až do nízké úrovně. Z toho lze také vysledovat, že vzájemné propojení budičů s otevřeným kolektorem plní i určitou logickou funkci: výstupní napětí má vysokou úroveň (úroveň H) pouze tehdy, pokud se všechny budiče snaží o vytvoření této úrovně (tj. pokud všechny jejich dolní odpory jsou velké). Pokud se alespoň jeden budič snaží vytvořit výstupní napětí nízké úrovně (úrovně L), eliminuje tím snahu těch budičů, které usilují o opak, a na společném výstupu skutečně bude napětí úrovně L.

Pouhým propojením výstupů budičů s otevřeným kolektorem tak můžeme dosáhnout logické funkce, která při úrovni H všech svých vstupních proměnných dává hodnotu H a ve všech ostatních případech dává hodnotu L. Je to logický součet, nebo logický součin? Odpověď záleží na tom, zda používáme pozitivní, nebo negativní logiku: v případě pozitivní logiky, kdy úroveň H odpovídá logické 1, jde o logický součin, zatímco v případě negativní logiky jde o logický součet. Pro tuto svou vlastnost bývá zapojení budičů s otevřeným kolektorem označováno v angličtině také jako wired OR (v případě použití negativní logiky), resp. wired AND (při použití pozitivní logiky). V češtině se hovoří o tzv. montážním součtu a montážním součinu, neformálně pak o "drátovém OR" či "drátovém AND".

Kdy a v jakých situací se používají třístavové budiče a kdy budiče s otevřeným kolektorem? Žádné přesné a závazné pravidlo samozřejmě neexistuje, ale obvyklá praxe je následující: třístavový budič se používá tam, kde již existuje nějaký mechanismus, který rozhoduje o tom, kdo má právo vysílat na sběrnici (tedy mechanismus, na jehož základě mohou být generovány potřebné signály pro řízení třístavových budičů). Tento případ obvykle nastává u datových a adresových sběrnic, které kontroluje procesor - pro připojení na adresovou a datovou sběrnici se tedy nejčastěji používají třístavové budiče. Naopak budiče s otevřeným kolektorem se používají tam, kde žádný řídicí mechanismus neexistuje a kde nelze předem vyloučit případ, že více zdrojů bude vysílat na sběrnici současně. To je obvykle případ nejrůznějších řídicích a stavových signálů, zahrnovaných do řídící sběrnice počítače - žádostí o přerušení, řídících signálů pro zápis či čtení z paměti apod. U těchto signálů se vesměs požaduje, aby jejich aktivní stav (např. aktivní žádost o přerušení) mohl vyvolat každý žadatel sám a nepotřeboval k tomu spolupráci ostatních potenciálních žadatelů - tomuto požadavku odpovídá nutnost logického součtu individuálních žádostí, což znamená použití negativní logiky. To je pak jeden z důvodů, proč se pro adresy a data obvykle používá pozitivní logika, ale pro nejrůznější řídicí signály negativní logika. Také další důvod pro použití negativní logiky a budičů s otevřeným kolektorem u řídicích signálů je čistě praktický: odpojíme-li z nějakého důvodu všechny vzájemně propojené budiče s otevřeným kolektorem, zůstane nám jen jejich společný horní (kolektorový) odpor a díky němu bude na příslušném vodiči řídicí sběrnice napětí úrovně H. Při použití negativní logiky to odpovídá neaktivnímu stavu příslušného řídicí signálu (tedy takovému, který nepožaduje příslušnou akci).