Miféle processzor ez? Szuper primitív? - Remek! Kettőt kérek belőle..

Akiknek a korábbi írásaim ellenére nem sikerült fogást találniuk a processzorokon, a cpu-k belvilágának megismerése nem járt számukra eredménnyel, azok most újra megpróbálhatják az áhított tudást megszerezni. Ráadásul, ezúttal egy szépen kimunkált, nagyon ingyenes, nagyon vizuális és nagyon open source, JS engine-es, HTML felületű, interaktív segédeszköz (egy emulátor) is támogatja őket a céljuk elérésében (gitHub letöltési link alább).
Még egy jó hír,

maga a processzor, amit bemutatok, nem csak egy virtuális, a valóságban hírből sem létező valami, hanem egy ténylegesen megépíthető, sőt, az elmúlt 17-18 évben már számtalan példányban meg is épített CPU. Olyan CPU, aminek még a megvalósítása is egy habkönnyű kaland, szó szerint: gyerekjáték. De erről majd később.     

Ugye emlékszünk? A közelmúltban bemutatott "Why Not" ASM & VM virtuális processzora mindössze 256 byte memória felett volt képes diszponálni. Nem csoda, hiszen egy nyolc bites címbusz csupán ennyit tesz lehetővé. Nyilván akadtak, akik ezt a memóriamennyiséget automatikusan az "unusable", tehát "használhatatlan" kategóriába száműzték. Ez a processzor, amiről alább szó lesz, annak a 256 byte memóriának is mindössze tizenhatod részét, azaz, pontosan 16 byte-ot képes csak megcímezni. Tehát, olvasni, kezelni. De, hogy még jobban sokkoljam a kedves érdeklődőt, ez a 16 byte-nyi memória is csupán ROM, azaz, olyan memória, amit írni nem képes a processzor, csakis olvasni.

Hadd sokkoljak még egy kicsit. 
A processzor, amiről szó van, négy bites szervezésű. Az utasításkészlete is négy bites, tehát ennek a tizenhat byte-nak is mindössze a felét képes olvasni úgy, mint programot, mint végrehajtható kódot. A 16 byte ROM másik fele nem is lehet egyéb, csak literál.  A CPU egyébként valóban alaposan megszolgálta a primitív jelzőt, hisz' lényegében mindössze nyolc TTL tokból áll (plusz némi törmelék) és az utasításainak száma is csak hat (6). ADD, MOV, OUT, IN, JNC és a JMP.

Ezek, az IN/OUT-ot leszámítva, egy kis adat mozgatás (MOV), szemernyi ADD (összeadás) és némi ugrabugrálás (JNC, JMP).
Talán vannak, akik emlékeznek arra, amit mondtam korábban. Mi a dolga egy processzornak? Az összeadás. Ha ezt tudja egy cpu, akkor mindent tud, pontosabban, mindent ki tud számolni. Hát, ez a CPU, összeadni egész' biztosan tud. Egyebet nem is nagyon. Na de majd kiderül, hogy mire is  jó egy ilyen szerkezet.

block

A processzor blokk diagramját nézve, elénk tárul a működése is. Ha feszültség alá helyezzük, akkor az utasítás számláló (program counter) beáll a 0000 értékre. Ez azt jelenti, hogy a ROM (ami a programot tartalmazza) a 0000 címen lévő, nyolc bites rekesz adatát szolgáltatja. Ez két részből tevődik össze. A felső négy bit a végrehajtanó utasítás, az alsó négy bit (ilyen 4 bites csoport neve a nibble) pedig a hozzá tartozó adat.
Tehát, a 0000 rekesz tartalma megjelenik az opcode és az immediate data sineken. Az adat be is érkezik az ADDER-be, ami egy négy bites összeadó.
Az opkód pedig egy úgynevezett dekóder logikán halad keresztül, ami meghatározza, hogy mégis, mi történjen.
Ha például MOV az utasítás, akkor, attól függ hova lesz az adat mozgatva. Vagy az A vagy a B regiszter lesz megszólítva (itt látszik is, hogy MOV-ból miért nem elég egy (van olyan proci, amelyikben 21 MOV is van)).  Az OUT utasítás a kimeneti regiszterre értelmezhető,  ugrás (JMP) esetén pedig a program számláló (más néven utasítás számláló)  lesz "megszólítva", de JNC féle ugrás esetén ebbe a folyamatba már beleköhög a C flag (carry) állapota (on/off) is.

 

allin

 
   

Akiben a mikro-USB csatlakozó láttán felcsillant a reménysugár, azzal közölnöm kell, hogy nagyon elkapkodta a dolgot. Nincs ott semmiféle programozhatóság, nincs az   interaktivitásnak még a csírája sem, egyedül egy tápellátás lett megvalósítva az USB csatlakozón keresztül, semmi több.
 

Az emulátor? Egy merő cukiság!
 

Nem csak izlésesen van kivitelezve, de hasznosan is  (letöltési link alább).

Az emulátort egy tetszőleges könyvtárba kicsomagolva, ott az index.html-t elindítva, a böngető már működteti is.

A vezetékezés egy része, a könnyebb megértést segítendő, kikapcsolható. Így az órajel és a reset vezetékek egy (pontosabban két) csapásra eltüntethetők. De még a bemeneti port vezetékei is egy klikkel felszámolhatók. Jópofa kis extra a fáradhatatlanul ketyegő analóg óra a bal felső sarokban.

Az órajel alapban egy (1) Hz, de aki nem szeret poroszkálni, az választhatja a szédítő tempót, a tíz Hz-es sebességet is. Egyébként, manuálisan is léptethető a program végrehajtás.
A regiszterek tartalma minden egyes lépésben lekövethető (bal alsó sarok).  Az A és B regiszterek vagy a program (más néven utasítás) számláló regiszter (IP) értéke, de még a carry flag is. A be és kimenet alul, középen található.
A gépecske default tartalmaz két programot, de emellett saját izlés, igény, szándék szerint reprogramozható. Hát kezdjük is el. 
 

emu

A legfelső ROM rekeszbe tegyünk egy ADD utasítást. A mellette levő a célregisztert jelöli ki. Ez lehet A vagy B. A harmadik a négy bites számot tartalmazza, amit hozzá kivánunk adni az A regiszter tartalmához.  Legyen ez most öt (5).
A következő ROM rekeszbe szintén ADD utasítás kerüljön, A regiszter maradjon az A de a hozzáadandó legyen mondjuk hét (7).
Ezt követően az eggyel alábbi ROM rekeszbe már a MOV utasítás kerüljön. Az utasítás első paramétere legyen B (ez a célregiszter) és a forrásregiszter legyen az A.
Ez az utasítás, így paraméterezve azt jelenti, hogy az A regiszter tartalmát mozgassa a processzor a B regiszterbe.
Az utolsó utasításunk az OUT lesz. Ennek paramétere a B regiszter. Más regiszter tartalmát nem is lenne képes a processzor megjeleníteni, mert eleve így van tervezve.

Manuálisan futtassuk le a programunkat. Ez négy klikk lesz a MANUAL feliratú gombon.  
A fenti négy sor kód eredménye a kimeneti porton leolvasható, igaz, csak bináris formában, de hát, profik vagyunk, értjük a processzorok szavát, nagyon jó lesz nekünk az az eredmény bináris formában is.  

Mit is látunk?
A négy LED-ből a két baloldali pirosan világít.

 8   4  2   1
[1][1][0][0]

Ez azt jelenti hogy a 8 és a 4 helyiértékén levő ledek tartalmazzák az eredményt. Ha a 8-at és a 4-et összeadom, akkor az eredmény 12.  Tehát, a processzor nem, hogy működik, de még csak nem is hibázik!

Emu download:  https://github.com/wuxx/TD4-4BIT-CPU

                                                                (Folyt. köv.)
 

---

Videók a megépített gépről, működés közben:

https://www.youtube.com/watch?v=_Ztb2PwnVPc

https://www.youtube.com/watch?v=xpYmSvVX9yI

https://www.youtube.com/watch?v=UTqUWfqB1-0

ROM tábla helyett ["valódi" ROM ic]:

https://www.youtube.com/watch?v=tKO3O2UY_7s

https://www.youtube.com/watch?v=YF192hJwmTs

 

---

Korábbi [témába vágó] blog posztjaim:

Hogyan írjunk Interpretert (I-V)

https://hup.hu/node/174463  (I. rész)
https://hup.hu/node/174511  (II. a Graph It)
https://hup.hu/node/174517  (III. Inter)
https://hup.hu/node/174536  (IV. Inter++)
https://hup.hu/node/174553  (V. Változók)

Virtuális gép, assembler, távirati stílusban (I-VI)

https://hup.hu/node/174303  (I. a VM)
https://hup.hu/node/174327  (II. a dolgok veleje)
https://hup.hu/node/174344  (III. az assembler)
https://hup.hu/node/174357  (IV. a processzor)
https://hup.hu/node/174358  (V. bővítések)
https://hup.hu/node/174377  (VI. Why not?)

BrainHack (Brainf*ck interpreter)  

https://hup.hu/node/174591

Hozzászólások

Lassan csak megtaláljuk a legegyszerűbb, még használhatót.
  - akár TTL IC-kből egy délután alatt összerakhatót
  - akár valami legkisebb CPLD-be implementálhatót

Lassan csak megtaláljuk a legegyszerűbb, még használhatót.

Ez, az általam ismertek között is egy régi darab. Amúgy, 2003-as keltezésű a kiadvány, amiben publikálta a szerző a kapcsolást. Meg is szerettem volna építeni, csak a kínai beszerzési forrásokról, a körülményességük, lassúságuk okán leszoktam, a hestore pedig híján volt a 74283-nak, a négy bites összeadónak, ami ennek a dolognak a központi eleme. 

Egyébként, ezt is megcsinálták CPLD-be ágyazva. 
Amúgy, ez a lekevesebb komponensből megvalósítható, mivel 8 db IC elég hozzá. A többi már nem a CPU, hanem a reset áramkör, az órajel forrás és a ROM címdekódere. 
De vannak módosulatai, akad amelyik RAM-ot tartalmaz a kapcsoló-mátrix alapú ROM helyett, van olyan, amelyik meg van púpozva perifériákkal is, stb. 

Legyél te is hülye, muja állat, támogasd a tolvaj dakotákat.

Tudnád légyszi linkelni a blogokban az előző postokat? Nem olvastam mindet (őszintén: egyiket se, de alapvetően, hosszú távon érdekel), így számomra egyszerűbb lenne ha vissza tudnék klikkelgetni az elejére és el tudnám olvasni logikus sorrendben.

Ha nem nagy vesződség, akkor megköszönném..!

Megjegyzés: nem láttam a képen, hogy hol történik a PC növelése utasításonként, de aztán a google segített: a 74161 nem egy négybites RAM, hanem egy számláló, tehát órajelre inkrementálja a PC-t

Így van.  Ráadásul preSETtable számláló (a jumpok miatt).

A google-re sem lett volna szükség, ha elindítottad volna az emulátort. Szép, szebb mint a képen, látványos is működés közben, nagyon megéri.

Az egész gépecske, a lényegét tekintve négy ilyen szinkron számlálóból, egy négy bites összeadóból és két szelektorból áll, na meg, egy flip-flop a carry-nek. 

Az A és B regiszterek, a kimeneti port és az IP regiszter  (leánykori nevén Program counter) mind egy-egy számláló.

Legyél te is hülye, muja állat, támogasd a tolvaj dakotákat.