Digitális technikáról mindenkinek

A digitális technika már most is életünk integráns része és a jövőben még inkább azzá fog válni. Egyszer majd talán ezen technológia segítségével hozhatunk létre emberi szintű mesterséges intelligenciát (http://lf.estontorise.hu/archives/374), vagy akár új valóságot építhetünk általa (http://lf.estontorise.hu/archives/305). Ha úgy tetszik, isteni hatalom rejlik benne, miközben a dolgok legmélyén végtelenül egyszerű szabályok működnek. Ebben a bejegyzésben megpróbálok rávilágítani erre. Megmutatni, hogy hogyan épülhetnek fel ezek a bonyolult (bizonyos szempontból már most is intelligens) rendszerek hihetetlenül egyszerű komponensekből. Mindezt úgy, hogy bárki megértse.

Elsőként talán azt érdemes tisztázni, hogy mit csinál egy számítógép (vagy még szűkebben a mikroprocesszor)? A válasz igazából nagyon egyszerű. Számol. Ezt persze a matematikainál kicsit tágabb értelemben kell kezelni. Tud összeadni, szorozni, stb., de e mellett képes számokat mozgatni memória cellák között, vagy éppen egy cella tartalmától függően dönteni, hogy milyen további műveleteket végezzen. A lényeg mindebből, hogy a számítógép olyan izé, amibe számok mennek be, és amiből számok jönnek ki. Ez mind szép és jó, de mikor nyomkodom a mobiltelefonomat (ami ugye maga is egy számítógép), nem találkozok számokkal. Húzgálom az ujjamat az érintőkijelzőn, aminek hatására valami történik. Hol vannak itt a számok? Valójában a világon minden számokká alakítható. Elég ha csak a fizikára gondolunk. A fizikusok pont ezt csinálják, számok segítségével írják le a világot. Persze egy okostelefon a fizikainál sokkal absztraktabb szinten látja a környezetét. Vegyük például az érintőkijelzőt. Ha megérintem a kijelzőt, az érintés helye leírható két koordinátával. Az, hogy hol érintettük meg, a telefon számára csupán két szám. A kijelző már egy picit bonyolultabb. Ha valaki nézegette már nagyon közelről a TV-jét, láthatta, hogy sok kis pontból áll össze a kép. Ezek a pontok rendre hármas csoportokba szerveződnek, ahol a csoport elemei piros, zöld, kék komponensek. Ebből a 3 komponensből minden szín kikeverhető. A komponensek fényereje határozza meg pontosan, mi lesz a szín. A fényerő megadható egy számmal, így 3 szám leír egy képpontot. Egy kép tehát háromszor annyi számmal leírható, ahány pontot tartalmaz. Ugyanígy leírható számmal a hang, így a mikrofon (és az azt kiegészítő elektronika) hangot alakít számokká, míg a hangszóró fordítva, számokat alakít hanggá. Láthatjuk tehát, hogy a világon minden számokká alakítható. Ilyen módon tehát minden számítógép (ide értve az emberi agyat is) felfogható egy olyan fekete doboznak, amibe számok mennek be, és amiből számok jönnek ki. Ezt a fekete dobozt fogjuk kicsit jobban kifejteni a továbbiakban.

A digitális technikában minden lefedhető 2 fajta fekete dobozzal. Az egyik a kombinációs hálózat, a másik a sorrendi hálózat. Itt rögtön érdemes tisztázni, hogy itt mit jelent a "hálózat". Eddig számítógépről, meg processzorról beszéltem. A hálózat ennél általánosabb fogalom. Dióhéjban annyi a lényeg, hogy míg a processzor egy általános célú végrehajtó egység, aminek megmondhatjuk, hogy mit csináljon (programozható), addig a hálózat valamilyen speciális céláramkör. Tehát a processzor is hálózat, de hálózat például egy sima összeadó áramkör is, vagy egy egyszerű számláló, ami semmi másra nem képes, csak számolni, hogy hányszor nyomtunk meg egy gombot. Ez utóbbiak egyszerű hálózatok, míg egy processzor ezekhez képest rendkívül bonyolult. A lényeg, hogy bármilyen digitális technikával felépített számokból számokká alakító fekete doboz besorolható a fenti két kategória közül az egyikbe. A kombinációs hálózat tulajdonképpen egy táblázat, ami megmondja, hogy adott bemenetre mi a kimenet. Olyan mint ha 2 oszlopban felírnánk bal oldalra, hogy mik mennek be, jobb oldalra pedig, hogy milyen esetben mi jön ki. A sorrendi hálózat annyiban bonyolultabb, hogy annak van "emlékezete" (belső állapota). Hogy ezt megértsük, képzeljünk el egy számláló áramkört. Egy bemenete van, amire egy gombot kötünk, míg a kimenete egy szám, ami ugye azt jelzi, hogy hányszor nyomtuk meg a gombot. A bemenet ugye csak 1 meg 0 lehet (benyomtuk/nem nyomtuk be a gombot), a kimenetnek viszont mindig növekednie kell. Hogy tudjuk erre felírni az előbb említett 2 oszlopos táblázatot? Sehogy. Be kell vezetnünk még egy oszlopot az állapotnak. Így már felírható a táblázat. Ha megnyomták a gombot, és 0-nál tartunk, akkor a kimenet 1, ha megnyomták a gombot, és 1-nél tartunk, a kimenet 2, és így tovább. Az állapot tehát itt az, hogy éppen hol tart a számolás. Persze az állapot lehet sokkal bonyolultabb is. Egy processzor állapotát például nagyon sok tényező írja le. A gyakorlatban nem is tudnánk hozzá leírni egy ilyen 3 oszlopos táblázatot, mert iszonyat hosszú, és bonyolult lenne, de elméletileg létezik hozzá ilyen. Sorrendi hálózattal minden digitális áramkör elkészíthető. Ha egyszer képesek leszünk emberi szintű mesterséges intelligenciát alkotni digitális alapon, akkor arra is ráhúzható lesz ez a séma. A sorrendi hálózat tehát az univerzális fekete doboz. A sorrendi hálózatok viszont visszavezethetőek a kombinációs hálózatokra. Egy sorrendi hálózatot kiválthatunk egy olyan kombinációs hálózattal, aminek 2 kimenete van. Az egyik simán a kimenet, a másik pedig az állapot amibe került. Ezt a kimenetet kell visszavezetni a bemenetre, ahol ugye így a bemenet a sima bemenet lesz, és a rendszer jelenlegi állapota. Ebbe a vissza hurokba be szoktak még rakni egy memóriát, ami megőrzi az állapotot. Tehát ha az előbbi számlálós példát nézzük, úgy fog kinézni a bemenet, hogy kezdetben ha megnyomjuk a gombot, bemegy az 1-es (nyomott gomb), és a 0 állapot. A kimenet az 1-es lesz (ennyiszer nyomták meg), és egy 1-es, ami a következő állapot. A következő körben bemegy az 1-es (nyomott gomb), és az 1-es állapot. A kimenet 2-es lesz (ennyiszer nyomták meg), és egy 2-es. Folytathatnánk a sort a végtelenségig. A sorrendi hálózat tehát visszavezethető egy olyan kombinációs hálózatra, aminek a kimenetének egy része vissza van csatolva a bemenetére. Ezzel az egyszerű architektúrával pedig minden digitális áramkör megvalósítható. A mobiltelefonunk processzora, a notebook digitális alkatrészei, vagy akár egyszer majd a minket is túlszárnyaló mesterséges intelligencia, mind mind visszavezethető a sorrendi hálózatokra, amik pedig kombinációs hálózatokra. Ez utóbbiak pedig valójában nem mások, mint végeláthatatlan hosszú táblázatok. De hogy épülnek fel ezek a gyakorlatban?

A számítógépek mind a bemenő, mind a kimenő számokat 1-esek és 0-lák formájában kezelik. Nagyon leegyszerűsítve az 1-est az reprezentálja, hogy ott van áram, 0 esetén pedig nincs. Egy ilyen 0/1-et bit-nek hívunk. Úgy lesznek ebből számok, hogy fogunk belőle egy csomagot (mondjuk 8 db-ot, amit byte-nak neveztek el), és minden kombinációhoz hozzárendelünk egy értéket. 8 bit (1 byte) esetén 256 db (0-255-ig a számok) értéket tudunk hozzárendelni egy csomaghoz. Több csomagot összerakva sokkal nagyobb az értékkészlet, tehát sokkal nagyobb számokat, vagy akár tört számokat is ábrázolhatunk. Nem akarok nagyon mélyen belemenni, akit érdekel, utánaolvashat a Wikipedia-n (https://hu.wikipedia.org/wiki/Kettes_sz%C3%A1mrendszer). A lényeg, hogy kicsit finomodott a fekete dobozunk. Itt tartunk most: 1-esek és 0-lák mennek be az egyik oldalon és jönnek ki a másikon, belül pedig egy sorrendi hálózat dolgozik, ami egy visszacsatolt kombinációs hálózat. Ez utóbbi pedig nem más, mint egy táblázat, ami megmondja, hogy ha bemegy valami az egyik oldalon, minek kell kijönnie a másikon.

Most jutottunk el oda, hogy beszélhetünk a kombinációs hálózatról. Eddig erre egy táblázatként hivatkoztam, hogy tudjuk hová tenni fejben, de azért nem ennyire egyszerű a dolog. Az a baj, hogy már egy egyszerű digitális áramkörnél is olyan nagy lenne ez a táblázat, hogy nem bírnánk felírni. Vegyünk csak egy olyan áramkört, ami 16 bites számokat tud összeadni. Egy ilyenhez 73014444032 sorra lenne szükség. Egy ilyen áramkör hihetetlenül primitív egy processzorhoz képest. Még csak megtippelni sem tudnám, hogy mekkora szám jönne ki egy processzor esetén. Digitális áramköröket tehát nem így építünk. E helyett építünk egy primitív modult, és abból rakunk össze nagyobbakat. Építünk például egy 1 bites összeadót, aztán sorba rakunk belőle 16-ot. A legalsó szinten persze ugyanúgy táblázatok maradnak, de már kezelhetőek. Egy egy bites összeadó például 4 sor. Van neki 2 bemenete (ez a 2 bit, amit összeadunk), 1 kimenete, és egy átvitel, ami a következő összeadóba megy. Ugyanezt csináljuk mi is, mikor papíron összeadunk. Összeadjuk az utolsó 2 számjegyet. Általában már a fejünkben van minden számjegy kombináció összege, nem szoktuk az ujjunkon számolni. Leírjuk a számjegyet (kimenet), ha pedig a szám 10-nél nagyobb, akkor leírjuk a 2. számjegyet (kimenet), és a következő művelethez megjegyezzük, hogy 1-et hozzá kell adni (átvitel). Az összeadó tehát azért 4 sor, mert a 2 bemenetnek 4 kombinációja lehet. Minden bemenethez tartozik egy kimenet és egy átvitel. Ezeket tetszőleges hosszan egymás után tudjuk pakolni, ahogyan papíron is össze tudunk adni tetszőlegesen nagy 2 számot. Ehhez hasonlóan épül fel a digitális rendszerekben minden modul. A processzort egymással összekötött modulok alkotják, azokat kisebb modulok, azokat még kisebb modulok, azokat még kisebbek, azokat még kisebbek, stb. és a végén a legkisebb modulok már nem tovább oszthatóak. Ezeket hívjuk logikai kapuknak.

A logikai kapu az elemi digitális művelet megfelelője, és elég mindössze 3 fajta logikai kapu (valójában 1 is elég, de erről majd később) ahhoz, hogy bármilyen kombinációs hálózatot felépítsünk. Ez a 3 logikai művelet a NEM, az ÉS és a VAGY. A NEM a bemenete ellentétét adja. Tehát 0 esetén 1-et, 1 esetén 0-t. Az ÉS kimenete akkor lesz 1, ha minden bemenete 1, különben 0 (ha A ÉS B 1, akkor 1, különben 0). A VAGY kimenete pedig akkor 1, ha bármelyik bemenete 1 (ha A VAGY B 1, akkor 1, különben 0). De hogy lehet ebből kis kombinációs hálózatokat, kis modulokat építeni, amikből végül összeáll egy processzor? Ez igazából nem túl bonyolult. Vegyük az előbbi 1 bites összeadót, aminek van 2 bemenete, és 2 kimenete. Válasszuk külön a kimeneteket. Így kettő pici hálózatra van szükségünk, ami a 2 bemenet alapján kiszámolja az 1 kimenetet. Írjuk fel ezekre a 2 kis 4 soros táblázatot. Nézzük meg, hogy hol lesz a kimenet 1-es. A továbbiakban csak ezekkel a sorokkal foglalkozunk. Minden sorhoz készítsünk egy kis hálózatot, ami egy ÉS kapuból áll, és a bemenetén ahol 0 van, oda rakjunk egy NEM kaput. Tehát ha a sorban mondjuk 01 van, akkor (NEM A) ÉS B lesz a hozzá tartozó kifejezés. Az ÉS művelet miatt ez akkor, és csakis akkor lesz 1, ha a 01 kombináció meg be. Minden más esetben 0. Ha megcsináltuk minden olyan bemenetre ezt a kis hálózatot, ahol a kimenet 1, akkor kössük össze őket egy VAGY kapuval. Ennek ugye az lesz az eredménye, hogy ha bármelyik ÉS hálózat 1-es eredményt ad, a végén 1 fog kijönni, különben 0. És voila, megvan amit akartunk. A hálózatunk csak azokra a bemenetekre ad 1-est, amikhez a táblázatban 1-es tartozik, minden más esetben 0-t, tehát pont a táblázatnak megfelelően működik. Ezt a leírást egyébként diszjunktív normálformának nevezik, mert ÉS műveletek (konjunkciók) vannak VAGY művelettel (diszjunkció) összekötve. Ezeket aztán lehet optimalizálgatni, mindenféle trükköt alkalmazni a jobbá tételükre, de ne bonyolítsuk. Annyi a lényeg, hogy ebből a 3 műveletből bármilyen kombinációs hálózat, bármilyen 2 oszlopos binárisból binárisra képző táblázat megvalósítható. Van azonban még egy ezeknél is egyedibb művelet, a NEMÉS. Ez egy ÉS művelet annyi csavarral, hogy ennek 0 a kimenete, ha minden bemenete 1, különben 1-es. Tehát pont az ÉS művelet fordítottja. Ebből minden művelet összerakható. NEM A = A NEMÉS A. A ÉS B = NEM (A NEMÉS B). A VAGY B = (NEM A) NEMÉS (NEM B). Ezen szabályok miatt egész egyszerűen összerakható a fenti diszjunktív normálformának megfelelő hálózat, hisz a VAGY művelethez pont az ÉS műveletek ellentéte kell, amit a NEMÉS előállít. Tehát ha NEMÉS-eket kötünk össze NEMÉS-el, az pont olyan mint ÉS-eket VAGY-al összekötni. Nem baj, ha kicsit homályos a dolog, annyit kell ebből megértenünk, hogy ilyen NEMÉS kapukból minden kombinációs hálózat, így minden digitális áramkör összerakható. Ezzel egész szépen letisztult a fekete dobozunk: a bemenetek és kimenetek 0-lák és 1-esek. Belül egy sorrendi hálózat dolgozik, ami egy visszacsatolt kombinációs hálózat. A hálózat összekapcsolt modulokból áll, amik összekapcsolt modulokból állnak, amik további modulokból, stb. végül a legalsó szinten összekapcsolt logikai kapuk végzik a műveleteket. Ebből is igazából elég 1 fajta, a NEMÉS (angolul NAND). Ilyen NAND kapuk megfelelően összekötött hálózatából tetszőleges bonyolult digitális áramkör összerakható. Itt egy pillanat erejéig felhívnám a figyelmet az emberi aggyal való hasonlóságra, ahol ugyancsak primitív egységek (neuronok) bonyolult hálózata működik. Csakhogy egy neuron jóval bonyolultabb mint egy NAND kapu és maga a kapcsolatrendszer is sokkal komplexebb. Látva, hogy primitív NAND kapukból milyen komplex rendszerek összerakhatóak, nem is tűnik annyira hihetetlennek, hogy az emberi agy sem több neuronok kusza hálózatánál, és hogy ez a hálózat mindenféle misztikus lélek nélkül létrehozhatja az emberi tudatot. De térjünk vissza a logikai kapukhoz. Miből épülnek fel ezek? Van még lejjebb valami?

A digitális áramkörök legalapvetőbb alkotóeleme a tranzisztor. Ez az a legkisebb építő elem, amiből aztán a kapuk felépülnek. A tranzisztor tulajdonképpen egy kapcsoló, amit árammal lehet kapcsolni. Két fajtája van. Az egyik bekapcsol áram hatására, a másik pedig ki. Ebből aztán könnyen kapukat építhetünk. A NEM kapu ugye simán a második fajta kapcsoló, ami áram hatására kikapcsol. A kapcsolót áramra kötjük, majd ha a bemenetén 1-es jön, kikapcsol, így a kimenetén nem lesz áram (0), ha 0 jön, bekapcsol, és áram lesz a kimenetén (1). Az ÉS kapu sorba kötött, áramra bekapcsoló kapcsolók összessége. Egy ilyenen ugye csak akkor tud áthaladni az áram, ha minden kapcsoló zárva (minden bemenet 1-es), ha csak egy bemenet is 0, a kimeneten nem lesz áram (0 lesz a kimenet). A VAGY kapu ehhez hasonló, csak ott párhuzamosan vannak kötve a kapcsolók, így ott elég ha egy kapcsoló zárva van. A fentiekből persze összerakható a NEMÉS kapu is (egy NEM-ből és egy ÉS-ből), így VAGY kapura nincs is szükség. A tényleges megvalósítás kicsit bonyolultabb (pl. párban dolgoznak a tranzisztorok, hogy gyorsabb legyen a működés), de az elv ennyire egyszerű. Egymással összekötött piciny kapcsolók (tranzisztorok) sokasága építi fel a világ összes digitális áramkörét.

Ezzel végére is értünk a kis digitális technika kurzusunknak. Nagyon nehéz egy ilyen rövid bejegyzésben olyan terjedelmes témát tárgyalni, mint a digitális technika, de remélem ennek ellenére sikerült elérni a célomat. Megmutatni, hogy ez az egész nem is annyira bonyolult, és rávilágítani arra, hogy végtelenül egyszerű dolgokból (ez esetben kapcsolókból) hihetetlenül bonyolult dolgok (szuperszámítógépek, és talán egyszer emberi szintet meghaladó mesterséges intelligencia) jöhetnek létre.