Alpha: Koncepce počítače s procesorem 8080/8085

Připravuju pokračování své knihy Hradla, volty, jednočipy. Tentokrát se budu zabývat konstrukcí osmibitových počítačů. Kniha by měla vyjít v roce 2019 opět v Edici CZ.NIC.

Když jsem přemýšlel o tom, jak knihu pojmout, bylo mi jasné, že suchý výklad nebude stačit. Tedy, on by stačil, ale já nejsem zrovna příznivcem teoretických učebnic bez přesahu do praxe. Bylo mi tedy jasné, že nějakou konstrukci chci.

Ano, můžu vzít nějaký reálný osmibit a ukazovat na něm, jak se věci mají, možná čtenáře i ponouknout ke stavbě repliky, ale touto cestou se mi moc jít nechtělo. Říkám si, že na vlastní konstrukci, která bude tak jednoduchá, jak jen to lze, půjde ilustrovat požadované věci mnohem líp.

Zvolil jsem tedy cestu konstrukce naprosto jednoduchých počítačů, které mají splňovat několik bodů:

  1. Budou používat součástky, které se dají běžně koupit.
  2.  Nebudou se ortodoxně držet konstrukcí z 80. let – tedy když chci použít paměť, použiju moderní, třeba 128x8bit statickou RAM, což je jeden čip, a nebudu konstruovat zapojení z osmi čipů dynamické RAM a dalších tří IO kolem dokola.
  3. Budou v duchu starých osmibitových časů, tedy jednoduché periferie – klávesnice, displej, reproduktor – a minimální softwarové vybavení.
  4. Bude jednoduché psát pro ně software.
  5. Klidně vynechám samotný starý procesor a potřebné funkce si naemuluju v moderním jednočipu. Nebo použiju jednočip místo periferií. No stress.

Takže jsem sednul a připravil několik konstrukcí, které jsou vhodné i pro začátečníky a na kterých se dají vysvětlit principy stavby systémů s osmibitovými mikroprocesory.

Teď vám nabízím první konstrukci a jako ukázku postupně vydám několik zkrácených kapitol z rukopisu. A pokud se chcete předzásobit, tak se mrkněte na seznam součástek pro stavbu.

Koncepce počítače s procesorem 8080/8085

K tomu, abyste si postavili počítač, není potřeba nic moc extra. Stačí vám jen nepájivé kontaktní pole, propojovací vodiče, napájecí zařízení a pár součástek: procesor, paměť a nějaké periferie.

Ovšem budu upřímný: v případě procesoru 8080 to tak moc neplatí. Tedy ne že by to nešlo, samozřejmě že to jde, ale problém je v tom, že procesor 8080 vyžaduje tři napájecí napětí a také nějaké podpůrné obvody.

Z různých technologických důvodů nemá procesor 8080 na čipu integrované některé důležité součásti, především řízení sběrnice a generování hodinových pulsů. Slouží k tomu dvojice externích obvodů 8224 a 8228, a ačkoli je možné se bez nich obejít a postavit si vlastní alternativy, tak takový postup nedoporučuju.

Obvod 8224 slouží ke generování hodinového kmitočtu, ve správné fázi a se správnými poměry period, a k tomu synchronizuje RESET a některé další signály. Obvod bere připojený kmitočet a dělí ho devíti. To je pak pracovní kmitočet procesoru. Pokud má připojený generátor frekvenci 18 MHz, bude 8080 pracovat na frekvenci 2 MHz.

Obvod 8228 generuje z takzvaného stavového slova, které procesor posílá po datové sběrnici, a několika řídicích signálů plné řídicí signály /MEMR, /MEMW, /IOR a /IOW. Navíc dokáže fungovat jako jednoduchý řadič přerušení – má pouze jednu úroveň a při vzniku požadavku pošle na sběrnici instrukci RST 7 (tedy skok na adresu 0038h, jak si povíme později).

Teprve až tato svatá trojice, jak se těmto třem obvodům někdy přezdívá, tvoří samotný „mikroprocesor 8080“.

V tom nejjednodušším systému, kde není zapotřebí řešit přerušení ani pozastavování činnosti či přebírání sběrnice, stačí nepoužité vstupy HOLD a INT připojit na log. 0, vstup RDYIN na log. 1 a výstupy INTE, WAIT, HLDA a INTA ignorovat. Celý procesor pak komunikuje se zbytkem systému pomocí čtyř řídicích signálů /MEMR, /MEMW, /IOR a /IOW, které říkají, že procesor chce číst z paměti (MEMory Read), zapisovat do paměti (MEMory Write), popřípadě číst nebo zapisovat z/do vstupně-výstupních obvodů (Input/Output Read, Input/Output Write).

Vlastní počítač? Jak by mohl vypadat?

Ačkoli byl 8080 široce používaná „klasika“, pro novou konstrukci bych ho nedoporučil – minimálně kvůli třem napájecím napětím. Sáhl bych po lehce rychlejším a vylepšeném procesoru 8085, respektive jeho CMOS verzi 80C85 (vyrábělo hned několik výrobců). Procesor 8085 si vystačí s pouhým jedním napájecím napětím (standardních +5 voltů) a nepotřebuje speciální obvody pro generování hodin (stačí mu obyčejný hodinový puls, nebo dokonce jen připojit krystal s kondenzátory). Navíc má dva vývody pro sériový vstup a výstup a celkem pět přerušovacích vstupů – kromě INTR ještě vstup TRAP (nemaskovatelné přerušení) a tři vstupy RST (RST5.5, RST6.5 a RST7.5).

Ani 8085 nedokáže pracovat úplně bez vnějších obvodů: návrháři totiž kvůli nutnosti vejít se do pouzdra se 40 vývody sáhli k takzvanému multiplexovanému adresování. Procesor má vyvedených osm vyšších bitů adresy (A8-A15) a nižších 8 bitů se vede po datové sběrnici (vývody AD0-AD7). Adresu posílá procesor nadvakrát. K řízení slouží signál ALE (Address Latch Enable). Pokud je v log. 1, znamená to, že procesor posílá po AD0-AD7 dolních 8 bitů adresy. Pokud je v log. 0, fungují tyto vývody jako datová sběrnice.

Návrhář systému proto musí zajistit vnější obvod (osmibitový latch), který se postará o to, aby zachytil spodních 8 bitů adresy. Typicky lze použít třeba obvod 74573 (starší konstrukce používaly např. dva obvody 7475).

Vývody 8085

Vnitřní struktura 8085

Na první pohled se od 8080A moc neliší – i 8085 má sadu registrů B, C, D, E, H, L, akumulátor A, Stack pointer SP, programový čítač PC, ALU, řídicí obvody, řadič… Navíc proti 8080 je rozšířena část řízení přerušení (o vstupy RST a TRAP), část sériového výstupu (SID, SOD) a zabudovaný generátor hodin.

Dole je vidět zmíněné rozdělení adresní sběrnice na dvě části – samostatných 8 horních bitů A15-A8, a multiplex pro spodních 8 bitů adresy / 8 bitů dat (AD7-AD0).

Řídicí signály mají následující funkce:

Signál Funkce
A8-A15 (výstup, třístavový) Horní část adresy. Během stavů HOLD, HALT a při RESETu je ve stavu vysoké impedance
AD0-AD7 (vstup/výstup, třístavový) Nižších osm bitů adresy, popřípadě satová sběrnice
ALE (výstup) Address Latch Enable. Oznamuje, že na vývodech AD0-AD7 je nižší část adresy (1). Pokud je 0, znamená to, že AD0-AD7 funguje jako datová sběrnice
S0, S1 (výstupy) Stavová informace. Spolu se signálem IO/M říká, jestli procesor čte instrukci, jestli čte / zapisuje data do paměti, jestli komunikuje s periferií, jestli obsluhuje přerušení nebo že je zastaven. V jednoduchých konstrukcích se nepoužívají.
IO/M (výstup) Oznamuje, jestli procesor hodlá komunikovat s pamětí (0), nebo s periferiemi (1)
/RD (výstup, třístavový) Pokud je 0, procesor čte data z vnějšího zařízení (paměti, portu). Vnější zařízení musí požadovaná data poslat na datovou sběrnici.
/WR (výstup, třístavový) Pokud je 0, procesor chce zapsat data, co poslal na datovou sběrnici, do portu nebo do paměti.
READY (vstup) V dobách, kdy paměti a periferie byly pomalejší než procesor, mohly poslat během cyklu čtení nebo zápisu signál „počkej, než budou data připravena“. Slouží k tomu právě vstup READY. Pokud je 1, procesor jede na plný výkon. Pokud je 0, procesor po nastavení signálu /RD či /WR počká, dokud nebude READY zase 1, pak teprve pokračuje dál. My ho klidně připojíme na 1 a budeme věřit, že moderní paměti jsou dost rychlé…
HOLD (vstup) Normálně 0. Pokud je nastaven na 1, procesor dokončí nejnutnější operaci (cyklus čtení nebo zápisu) a odpojí svoji datovou sběrnici, adresní sběrnici a signály /RD, /WR a IO/M. Odpojením mám na mysli přepnutí do stavu Z (vysoké impedance). Jakmile je procesor odpojen, potvrdí, že je vše hotovo, signálem HLDA. Jednoduché systémy tento signál nepoužívají, můžete jej připojit na log. 0
HLDA (výstup) Za normálního provozu 0. Pokud byl dán požadavek HOLD, tak se po dokončení nezbytných operacáí a odpojení sběrnic tento signál nastaví do log. 1.
INTR (vstup) Interrupt request, tedy Požadavek na přerušení. Procesor testuje stav tohoto signálu na konci každé instrukce a také ve stavu HALT (po instrukci HLT) a HOLD. Pokud je 0, nic se neděje, pokud je 1, začne proces obsluhy přerušení. Procesor přečte z datové sběrnice hodnotu a považuje ji za instrukci, kterou vykoná. Nejčastěji se posílají jednobytové instrukce RST, ale je možné poslat i tříbytovou instrukci CALL. O poslání instrukce se musí postarat vnější obvody, takzvané řadiče přerušení. Programem je možné zakázat vyvolání přerušení tímto signálem.
/INTA (výstup) Interrupt Acknowledge. Po příchodu požadavku přerušení INTR použije procesor výstup /INTA k načtení výše zmíněné instrukce (namísto signálu /RD)
RST5.5, RST 6.5, RST 7.5 (vstupy) Přímé vstupy přerušení. Fungují podobně jako signál INTR, ale nevyžadují celý ten opruz s načítáním instrukce pomocí /INTA. Místo toho si samy interně zařídí skok na patřičná místa. Stejně jako INTR dokážou „probudit“ procesor ze stavu HALT a HOLD. Programátor může tyto signály ignorovat pomocí speciální instrukce („maskování přerušení“)
TRAP (vstup) TRAP je podobný signálům RST x.5 s tím rozdílem, že toto přerušení nemůže programátor zamaskovat.
/RESET IN (vstup, Schmitt KO) Vstup nulování. Po startu systému nebo při havárii by měly vnější obvody tento signál, který je normálně v log. 1, přepnout do log. 0. Tím započne interní proces inicializace: procesor odpojí sběrnice, nastaví programový čítač na adresu 0000h, ukončí všechny případné čekací cykly a začne pracovat „od začátku“. Tento vstup je vybavený Schmittovým klopným obvodem, to znamená, že je možné k němu připojit přímo oblíbený obvod s rezistorem a kondenzátorem, který se postará o RESET při zapnutí napájecího napětí.
RESET OUT (výstup) Indikuje, že je procesor ve stavu RESET. Tento signál je synchronizovaný s hodinami a můžete ho použít jako systémový RESET pro zbytek systému.
X1, X2 (vstupy) Slouží k připojení hodinového krystalu. Jeho frekvence je interně vydělena dvěmi a výsledek dává systémový takt. Vstup X1 může být použit i jako vstup hodinového signálu z externího obvodu.
CLK (výstup) Systémové hodiny. Jejich frekvence je poloviční proti frekvenci na vstupu X1 (tedy třeba proti frekvenci připojeného krystalu)
SID (vstup) Sériový vstup. Hodnota na tomto vývodu je načtena do nejvyššího bitu akumulátoru pomocí instrukce RIM.
SOD (výstup) Sériový výstup. Hodnota na tomto vývodu je nastavena nebo nulována pomocí instrukce SIM.
Vcc Napájecí napětí. Nominálně 5 voltů, u CMOS verze může být někde mezi 3V a 6V.
GND Zem

V datasheetu (je jich spousta různých od různých výrobců, já bych doporučil datasheet od OKI, jejich čip nesl název MSM80C85AH) najdete i velmi důležitý graf, který ukazuje průběhy signálů na sběrnici. Podívejme se na něj spolu:

První řádek ukazuje hodinový signál. M1 je první strojový cyklus, T1 až T4 jsou jeho hodinové takty. Při vyzvedávání instrukce tedy procesor řídí výstupy takto:

  • T1: Nastaví horní část adresy instrukce na výstupy A8-A15, dolní část na výstupy AD0-AD7, a zároveň aktivuje signál ALE (Address Latch Enable). Tento signál řídí už zmíněný buffer mimo procesor, jehož úkolem je zapamatovat si právě spodní část adresy. Zároveň nastavuje signál IO/M do hodnoty 0, tedy „komunikace s pamětí“. Signály /RD a /WR jsou neaktivní, stavové signály nás nemusí zajímat. Se sestupnou hranou hodin v čase T1 se deaktivuje signál ALE a dolní část adresy zůstává zachycena v bufferu.
  • T2: Procesor přepíná signály AD0-AD7 na vstup dat a aktivuje signál /RD, což informuje okolní systém, že procesor hodlá číst (/RD) z paměti (IO/M je v log. 0). Paměť je připojena ke sběrnici a vybrána adresa.
  • T3: S náběžnou hranou hodin přečte procesor stav na datové sběrnici a začne jej vyhodnocovat coby instrukci. Poté deaktivuje signál /RD, takže se paměť může opět odpojit.
  • T4: Procesor dekóduje instrukci.

Dejme tomu, že instrukce potřebuje jeden osmibitový parametr. Ten je uložen, jak bývá zvykem, na následující adrese. Následuje tedy strojový cyklus M2, během něhož jsou čtena data z paměti. Když se podíváte zase na schéma, vidíte, že je téměř totožný s cyklem M1, až na to, že trvá pouhé tři takty – odpadá „dekódovací“ takt.

Přerušení

Pokud v systému nastane nějaká událost, která vyžaduje, aby se jí procesor bezodkladně věnoval (propukne požár, uživatel stiskne tlačítko, přijdou nová data, …), vyvolá takzvané přerušení. U 8085 k tomu slouží hned tři mechanismy.

První je identický jako u procesoru 8080 – vnější zařízení nastaví signál INTR, procesor si přečte z řadiče přerušení jednu instrukci a vykoná ji. Nepřekvapivě jde o instrukce skoku do podprogramu (pro programátory, zvyklé na vyšší jazyky: něco jako vyvolání handleru, volání funkce atd.) O správné poslání instrukce se musí postarat vnější obvody, většinou specializované obvody, nazývané řadiče přerušení.

U 8080 šlo tuto složitost zjednodušit pomocí obvodu 8228 – připojením jednoho z vývodů (INTA) přes rezistor 1K k napětí 12 voltů se z tohoto obvodu stal jednoduchý „řadič přerušení“, který po příchodu požadavku na přerušení poslal na sběrnici hodnotu FFh, což je hodnota, kterou si procesor dekóduje jako instrukci RST 7. (RST 7 uloží aktuální adresu na zásobník a udělá odskok na adresu 0038h, ale o tom víc později). 8085 tuto vymoženost nemá, takže buď použijete řadič přerušení, nebo si vystačíte s interními vstupy RSTx a TRAP.

Druhý způsob je použití vstupů RSTx. Jejich funkce je podobná té, co jsem popisoval u obvodu 8228 o odstavec výš – vygenerují si skokovou instrukci samy. Ono to není tak úplně doslova, protože mechanismus je lehce jiný, ale princip je stejný.

Vstupy RST 5.5 a RST 6.5 (asi klidně můžeme říkat pět a půl a šest a půl) jsou, podobně jako vstup INTR, pravidelně kontrolovány, a jsou-li ve stavu 1, procesor vyvolá přerušení.

Vstup RST 7.5 má, na rozdíl od předchozích, zabudovaný vnitřní klopný obvod, který reaguje na vzestupnou hranu. Výhoda je, že stačí jen krátký signál a procesor si jej inteně „podrží“ až do doby, kdy testuje přerušovací vstupy.

Třetí způsob je signál TRAP. Všechny předchozí způsoby přerušení může programátor zablokovat, „zamaskovat“ pomocí instrukce DI (Disable Interrupt) a povolit pomocí EI (Enable Interrupt). Pokud jsou přerušení zakázána (DI), procesor signály INTR a RST ignoruje. TRAP je výjimka, tento signál vyvolá přerušení i tehdy, když jsou zakázána. Proto se mu také říká nemaskovatelné přerušení.

Co se stane, když přijde naráz víc požadavků na přerušení? Procesor má zabudovaný jednoduchý mechanismus priorit, viz následující tabulka, a vykoná obslužnou rutinu pro požadavek s nejvyšší prioritou.

Signál Priorita Adresa, kde je uložena obslužná rutina Vyvoláno pomocí…
TRAP Nejvyšší (1) 0024h Vzestupná hrana nebo log. 1 během testování
RST 7.5 2 003Ch Vzestupná hrana (pozdržená)
RST 6.5 3 0034h Log. 1 během testování
RST 5.5 4 002Ch Log. 1 během testování
INTR Nejnižší (5) Podle poslané instrukce Log. 1 během testování

K dalšímu čtení

http://saundby.com/electronics/8085/

http://www.nostalcomp.cz/cvicny8080.php

Zapojení procesoru 8085

Takto bude vypadat srdce celého počítače. Dovolte jen pár poznámek:

V roli adresového bufferu je obvod IC2 typu 74573 (ať už ve verzi HC, HCT nebo ALS). Funkčně je shodný s obvodem 74373, až na jeden rozdíl: 373 má vývody přeházené, 573 má hezky všechny vstupy na jedné straně pouzdra a výstupy na druhé. Hodinový vstup je připojen na vývod ALE, povolovací vstup OE jsem připojil natvrdo k zemi. Mohl bych ho připojit na vývod HLDA a zajistit tak odpojení adresní sběrnice ve stavu HOLD, ale tento stav nebude náš počítač používat.

Nebudeme používat ani HOLD, ani READY, ani přerušení, proto jsou tyto vstupy připojeny na neutrální úroveň (READY je 1 – stále připraveno, HOLD a přerušení na 0). Z výstupů jsem nepoužil stavové S0, S1, výstup RESET OUT, a logicky ani HLDA a INTA. Stejně tak nezapojené zůstalo i sériové rozhraní – vstup SID je připojen k zemi, výstup SOD je volný. Můžete si k němu připojit LEDku přes rezistor a zkoušet si třeba bliknout…

Vlevo od procesoru jsou dva obvody. Níž je generátor hodinových pulsů s krystalem a dvěma kondenzátory. Krystal jsem zvolil o frekvenci 3,6864 MHz. Proč? Proč ne 4 nebo, cojávím, 27?

Zaprvé – frekvence nesmí být nižší než 1 MHz. Píšou to v datasheetu. Zadruhé – neměla by být vyšší než 10 MHz. To tam taky píšou. Ideální je někde okolo 4 MHz, protože procesor pak běží na příjemně pomalé frekvenci okolo 2 MHz, tedy zhruba tak, jak běžela originální 8080A.

Proč ale 3,6864 MHz? No protože pak bude procesor běžet na frekvenci 1,8432 MHz, tedy na poloviční.

Dobře, ale proč ne třeba 4 MHz?

No protože 1843200 Hz / 96 = 19200 a 1843200 Hz / 192 = 9600. Už svítá? Správně, 19200 a 9600 jsou standardní frekvence pro sériovou komunikaci. Z frekvence 1,8432 MHz je odvodíme bez problémů pomocí dělení celým číslem. Kdybychom chtěli tyto frekvence získat třeba z 4 MHz, museli bychom hodiny dělit koeficientem např. 208,3333 nebo 416,6666, a v přenosu by byly chyby. Takže tady raději oželím trochu výkonu, když vím, že mi to usnadní další zapojování.

A poslední věc: kondenzátory u krystalu! Jsou důležité k tomu, aby krystal kmital na správné frekvenci. Jejich kapacitu můžete buď spočítat, nebo vyčíst z datasheetu. Já z datasheetu vyčetl 56 pF, což se mi tedy zdálo jako obrovská kapacita. Nasadil jsem 33 pF, a i to bylo moc. Nakonec jsem nechal jen jeden kondenzátor 33 pF u vstupu X2. Pak se ukázalo, že 56 pF bylo z datasheetu CMOS verze a já měl použitou NMOS, kde se doporučují při těchto frekvencích kapacity okolo 7 pF.

Nad generátorem hodin je obvod pro /RESET. Pomocí kondenzátoru k zemi a rezistoru k napájecímu napětí je po zapnutí napájení na vstupu /RESET IN logická 0, dokud se kondenzátor pomalu nenabije. Vhodný poměr odporu a kapacity si můžete buď spočítat, nebo experimentálně vyzkoušet. Myslím, že rezistorem 10K a kondenzátorem 10M nic nezkazíte. Dejte systému trochu času na start, protože po zapnutí napájení ještě chvíli napětí kolísá. Díky tomuto triku je v tu dobu procesor stále ve stavu RESET, a když nastartuje, je napětí už ustálené.

Ještě víc vlevo je tlačítko, které připojuje vstup na zem. Je to magické tlačítko RESET, které náš počítač přivede k rozumu, pokud se náhodou někdy zapomene a skončí třeba v nekonečné smyčce. Díky kondenzátoru jsou odfiltrované i zákmity…

Procesor tedy máme pořešený. S okolním světem komunikuje pomocí adresní sběrnice, datové sběrnice, signálů IO/M, /RD, /WR a hodinového signálu CLK. To je opravdu všechno, víc není pro jednoduchý počítač potřeba.

Příspěvek byl publikován v rubrice Hardware se štítky , . Můžete si uložit jeho odkaz mezi své oblíbené záložky.