Tartalomjegyzék:

A Z80 számítógép újbóli megtekintése: 6 lépés
A Z80 számítógép újbóli megtekintése: 6 lépés

Videó: A Z80 számítógép újbóli megtekintése: 6 lépés

Videó: A Z80 számítógép újbóli megtekintése: 6 lépés
Videó: Z80 computer with the help of an Arduino and some logic 2024, November
Anonim
A Z80 számítógép újbóli megtekintése
A Z80 számítógép újbóli megtekintése
A Z80 számítógép újbóli megtekintése
A Z80 számítógép újbóli megtekintése

Korábban írtam egy útmutatót a Z80-alapú számítógép felépítéséről, és az áramkört a lehető legegyszerűbbre terveztem, hogy a lehető legegyszerűbben felépíthető legyen. Írtam egy kis programot is, az egyszerűség ötletével. Ez a kialakítás meglehetősen jól működött, de nem voltam teljesen elégedett vele. Azzal kezdtem, hogy átírtam egy programot, amely lehetővé tette a futás közbeni programozást. Ez lehetővé tette, hogy tesztelhessek kódrészleteket anélkül, hogy az EEPROM -nak kellene dedikálnom, ami viszont megköveteli az EEPROM újraprogramozását. Ez nem tűnt szórakoztató ötletnek számomra. Aztán gondolkodni kezdtem a memóriahelyeken. Ha egy hardvert szeretnék illeszteni (főleg IO), akkor egy kódrészlet meghaladhatja a rendszer számára rendelkezésre álló memóriaterületet. Ne feledje, hogy a tervezés csak a címbusz alsó bájtját használta, majd a magas bájt alsó bitjét választotta a ROM és a RAM terek között. Ez azt jelentette, hogy csak 253 bájt szabad területet tudtam használni. Lehet, hogy azt kérdezi, hogy miért 253 a 256 helyett. Ez azért van, mert az új kódom három bájt adatot fecskendez be az írott program végén (erről később lesz szó, mivel módosítottam, hogy működjön az új kialakításon).

n

Visszanéztem a régi sémáimat, hogy megnézzem, mi történik még. Találtam egy apró hibát a memóriaválasztó áramkörben, amelyet lefedek, ha odaérek. Az egyszerűsített változat: az összes írási kérés valójában átmenne, bár mindig RAM -ba került. Valószínűleg ezen nem érdemes aggódni, de ezúttal rendesen meg akartam csinálni. És ezzel elkezdtem új rajzot rajzolni. Az oldalhoz csatolt két kép a tényleges áramkör előtt és után látható. Annyira megtisztítottam a spagetti vezetékeket, ez nem vicces.

n

Ha követte az eredeti beadványomat, és azt tervezi, hogy ezt is követni fogja, akkor gyűlölni fog engem. Ha frissen kezded, akkor szerencséd van. Fogja meg a listában szereplő részeket (vagy azok megfelelőit), és kövesse.

Kellékek:

LM7805 - 5 voltos szabályozóZ80 - a CPU; a rendszer agyaAT28C64B - EEPROM. „Állandó” adattároló a számítógép firmware -jéhez IDT6116SA - SRAM; Felhasználói kód tárolására és /vagy általános adattárolásra használható NE555 - Rendszeróra74HC374 - Octal D -Latch /OE; bemeneti chipként használt74LS273 - Octal D -Latch /MR; kimeneti chipTLC59211 - LED -illesztőprogram -chip (használt, így a 74LS273 képes meghajtani a LED -eket, mivel önmagában nem képes az áramkimenetre) MC14572 - Ez egy „Line Driver” chip, de tökéletesnek találtam a memóriavezérlés logikájához. 4 inverterrel és egy NAND és NOR kapuval van felszerelve74LS32 - Quad OR gateCD4001 - Quad NOR gateCD4040 - 12 Stage Ripple Counter; Rajzolt, de nem megvalósított óraosztó (a rendszer lassabb órajelű működtetéséhez) 2 10K ohmos ellenállás - Az egyiket az 555 -ös időzítő áramkörben használják, ezért használjon bármilyen értéket 4 4K ohmos ellenállás - Az egyiket az 555 időzítő áramkör, ezért használjon bármit, amit szeretne. Egy másik a LED -ek meghajtására szolgál, ezért változtassa meg azt is, ha szeretné 8x330 ohmos ellenállású busz A 8 -ashoz oszlopdiagramos kijelzőt használtam (HDSP -4836) 4 Kondenzátor - kettőt az LM7805; 0,22uF és 0,1uF. Az egyik az 555 -ös időzítőre vonatkozik, ezért használja azt, amit helyesnek érez. Az utolsó a bekapcsolás visszaállítása; 100uF2 N. O. Nyomógombok - Az egyiket bemenetre használják, a másikat visszaállításra8 SPST DIP kapcsolók - Adatbevitel; Piano Key styleWire -t használtam. Sok -sok drót

n

MEGJEGYZÉS: Az MC14572 átmenő lyukú verzió elavult, de az SMD változat még mindig aktív (még a „nem új tervezéshez” állapot sem), ezért előfordulhat, hogy vásárolnia kell egy áramköri lapot, hogy lehetővé tegye a használatát. Egy második 74LS32 használható az MC14572 helyett (lásd a korábbi memóriavázlat „memóriaválasztó áramkörét”)

1. lépés: A változások gyors áttekintése + sémák

A változtatások gyors áttekintése + vázlatok
A változtatások gyors áttekintése + vázlatok

A vázlatok elolvasása: A chipbe mutató nyíl egy bemenet: Bemenet> -A chiptől elfelé mutató nyíl kimenet: Kimenet <-A buszok egy sort használnak a nyíl helyett: Busz |-

n

A zsetonok nagy részét a pontos pinoutjaikkal húzták ki. Ezekre a zsetonokra kisorsolt. A legtöbb chipen pin számok és címkék is találhatók. Kicsit nehezen olvashatók. A ceruzám kezdett unalmassá válni.

n

Az áramköri csatlakozásokat tekintve az új kialakítás elrendezése többnyire nem változik az eredetitől. Csatlakoztattam a cím magas bájtjának alsó csipkéjét a memóriákhoz, majd a felső csipesz alsó bitjét (A12) használtam a RAM/ROM kiválasztásához. Ez azt jelentette, hogy a ROM-hely 0000-00FF-ről 0000-0FFF-re nőtt. A ram hely 0100-01FF-ről 1000-1FFF-re változott. A memóriavezérlő logikát is kicseréltem a jobb tervezés érdekében, és hozzáadtam két új állapotjelző LED -t (és némi ragasztó logikát). Rajzoltam (de nem kötöttem) óraosztó áramkört. Két funkciót kellett ellátnia. A nyilvánvaló funkció az óra frekvenciájának leosztása. A másik funkció PWM (impulzusszélesség -moduláció) célokra szolgál, mivel az 555 nem generál hullámokat 50% -os terhelési ciklusokkal. Ez nem igazán számít ebben az áramkörben, de ha az órát szeretné használni néhány LED meghajtásához, akkor biztosan észre fogja venni a hatásokat (az egyik (halmaz) LED halványabb lesz, mint a másik). Az áramkör többi része lényegében változatlan.

2. lépés: CPU, memória és memóriavezérlés

CPU, memória és memóriavezérlés
CPU, memória és memóriavezérlés
CPU, memória és memóriavezérlés
CPU, memória és memóriavezérlés
CPU, memória és memóriavezérlés
CPU, memória és memóriavezérlés
CPU, memória és memóriavezérlés
CPU, memória és memóriavezérlés

Ez az a rész, ahol az előző verzióm olvasói utálnak. Az eredeti felépítésben csak úgy dobtam az alkatrészeket a táblára olyan helyen, ahol úgy tűnt, hogy nem okoznak gondot a bekötéssel. Az eredmény úgy nézett ki, mintha valaki egy tányér spagettit dobott volna rá, és olyan volt, mint a „vezetékek!” Szerettem volna egy kicsit tisztítani, ezért azzal kezdtem, hogy mindent feldaraboltam, kivéve a CPU -t, a RAM -ot és a ROM -ot. Felhúztam majdnem a teljes bemeneti áramkört, kimeneti áramkört és a ragasztó logikáját. Szinte fájt nekem, de szükség volt rá. Az összes adatkapcsolatot érintetlenül hagytam, és a címbusz alsó bájtját. Ezután a címbusz (A8-A11) következő négy bitjét a ROM chiphez kötöttem. Vigyáztam, hogy ezúttal megkerüljem a chipet, hogy könnyebb legyen felhúzni az átprogramozáshoz. A címkapcsolatokat is leugrottam a RAM chipre.

n

Ezzel félre kellett vezetnem a memóriavezérlő logikát. Az eredeti vázlatban a processzor /MREQ vonalát közvetlenül a /CE -hez kötöttem mindkét memóriachiphez, majd a /WR -t a RAM /WE -hez kötöttem. Aztán a CPU /RD és /MREQ logikusan VAGY együtt volt, valamint az A9. Lényegében úgy állították be, hogy minden memóriakérés aktiválja a RAM -ot és a ROM -ot is, de az A9 -et választották ki, hogy melyik chip /OE kerüljön kiválasztásra. Ez rendben volt, és mindez azért volt, mert a chipek inaktívak maradtak mindaddig, amíg memóriakérést nem végeztek, majd csak egy /OE aktív volt olvasási kérelem során. Ez megakadályozta az áthallást, de kínos árnyalatot vezetett be. Mivel az A9 -et csak annak meghatározására használták, hogy melyik chip ad ki adatokat, és mivel a CPU közvetlen hozzáféréssel rendelkezett a RAM /WE pin -hez, minden írási kérés át fog menni. Ez rendben volt a ROM számára, mert az írási módját gátolja a kötés /WE közvetlenül az 5V -os tápegységhez. A RAM -ot azonban az A9 -től függetlenül írják. Ez azt jelentette, hogy egy ROM -helyre írási kísérlet ugyanarra a helyre ír a RAM -térben.

n

Ennek egyik megoldása az lenne, ha a vezérlőlogikát újra huzaloznánk, hogy a CPU közvetlenül hozzáférhessen a chipek /OE és /WE csapjaihoz, majd az MREQ és az A12 segítségével válasszuk ki, melyik chip /CE hajtott. Ezzel az ötlettel mentem, de ahelyett, hogy négy NOR kaput és egy invertert használtam volna, mint az eredeti kivitelben, találtam egy kínos kis chipet, amely tökéletes volt a feladathoz. Olyan áramkört kellett létrehoznom, amely csak a chipben elérhető logikai kapukat használta, de ez elég egyszerű volt. Az A12 közvetlenül egy NAND és egy NOR kapuba táplálkozik. /A MREQ betáplálódik a NOR kapuba és a bókja a NAND kapuba. A NAND kapu a RAM meghajtására szolgál, a NOR kimenet pedig megfordul, és a ROM /CE meghajtására szolgál. Így a /MREQ értéknek alacsonynak kell lennie, mielőtt bármelyik chipet kiválasztaná, majd az A12 kiválasztja, hogy melyik kerüljön kiválasztásra. Ezzel a beállítással most minden írási kérés a ROM -ra semmit sem tesz. Energiát is megtakarít, mert mindkettő helyett csak egy chip aktív. Ami magát a logikai chipet illeti, még mindig van benne két nem használt inverter. Az egyik később megszokja, de odaérünk, ha odaérünk.

3. lépés: A rendszer állapotát jelző LED -ek

Rendszerállapot LED -ek
Rendszerállapot LED -ek
Rendszerállapot LED -ek
Rendszerállapot LED -ek

Mielőtt elkezdtem ezt a projektet, próbáltam egy interfésszel csatlakozni egy bizonyos IC -hez, de gondjaim voltak vele. Bizonytalan voltam abban, hogy mi történik, egy panelre szerelt LED -et használtam a szondázáshoz (az egyik olyan szerelvény, amelyben ellenállás van beépítve). Ezzel egy nosztalgiaötletet kaptam, amelyet ma is használnak: az állapotjelző LED -ek jelzik, hogy a memóriát olvassák -e vagy írják. A már meglévő bemeneti LED -del együtt kellett használni. A bemeneti LED csatlakoztatva volt a /WAIT jelgenerátorhoz, jelezve számunkra, hogy a rendszer vár a bemenetre (odaérek, ne aggódjon). Gondoltam, hogy hozzáadok egy LED -et az IO -írás jelzésére, de arra gondoltam, hogy a kimeneti LED -ek cseréje már kiváló jelzője ennek. Ha belegondolok, lehet, hogy még hozzáteszem. Ennek ellenére hasznosnak tartom tudni, hogy a memóriát olvassák vagy írják. Nos, mindenesetre hasznos a program hibakeresésében. Valójában sokat használtam, mint a program működését: „miért ír a memóriába? Ezt még nem szabad megtenni!”

n

Ezen LED -ek vezérléséhez a quad NOR kaput használtam. Az összes kaput használtam. Csak kettőt használtak az állapotjelek generálására, de a chip nem rendelkezik a LED -ek tényleges meghajtásához szükséges képességekkel. Képesek ennyi energiát elsüllyeszteni, ezért a másik két NOR kaput használtam inverterként, és a LED -eket csatlakoztattam. Mivel az egyik LED jelzi az olvasást, a másik pedig az írást, és az olvasási és írási kérés nem egyszerre fog bekövetkezni, megúsztam, hogy csak egy ellenállást használtam mindkét LED esetében. Ami a dekódolni kívánt jeleket illeti, ez is elég egyszerű volt. Azt akartam, hogy minden memóriaolvasási kérést jelezzenek, ezért az első NOR kapu bemenetein /MREQ és /RD volt. Az írás állapota kicsit bonyolultabb volt, de ugyanolyan egyszerű. Továbbra is a /MREQ -t használtam egyik bemenetként, de a /WR -t használva a másikhoz egy kisebb árnyalatot okoznék, amit el akartam kerülni. ÖSSZES írási kérést jelzett volna. Csak azokat akartam, amelyek valóban átmentek. Szóval hogyan tenném? Emlékszel, hogyan állítottam be a rendszert, hogy csak a RAM írható legyen? A RAM /CE -t használtam a NOR kapu másik bemeneteként. Ez azt jelenti, hogy a LED csak akkor világít, ha RAM van kiválasztva, és írási kérés történik. A LED színét tekintve a narancssárgát választottam olvasási jelzőnek (de csak sárgát találtam) és a pirosat írási jelzőnek.

4. lépés: Bemenet és kimenet

Bemenet és kimenet
Bemenet és kimenet
Bemenet és kimenet
Bemenet és kimenet
Bemenet és kimenet
Bemenet és kimenet

Az előző lépésben észrevehette, hogy a többi összetevő néhány részét már hozzáadtam a táblához. Fenntartottam a helyet, hogy véletlenül ne helyezzek vezetékeket oda, ahová egy alkatrészt akartam (így új helyet kell keresnem az említett alkatrész számára). Ön is észrevehette, hogy a bemeneti kapcsolókat a helyükön hagytam, és bekötöttem a tápcsatlakozóba. Úgy döntöttem, hogy az eredeti helyszín a tökéletes hely, és úgy döntöttem, hogy a kimeneti LED -eket a közelben (fent) helyezem el. A sáv kijelzőjétől jobbra található a bemeneti retesz. Fent van a kimeneti retesz, balra pedig a LED meghajtó. Azzal kezdtem, hogy csatlakoztatom a kijelzőt az illesztőprogramhoz, mivel ez volt a legegyszerűbb. Ezután a kapcsolókat a bemeneti retesz bemeneti oldalához kötöttem. Ezután a kimeneti retesz kimeneti oldalát csatlakoztattam a LED meghajtóhoz. Ez kellemetlen parancsnak tűnhet ezek bekötésére, de ennek oka volt. A kimeneti retesz bemenetét az adatbuszhoz kellett csatlakoztatni, valamint a bemeneti retesz kimenetét. Az ötlet az volt, hogy a bemeneti retesz kimeneteit a kimeneti retesz bemeneteihez kössem, amit meg is tettem. Ezután már csak azt a rendetlenséget kellett csatlakoztatnom az adatbuszhoz. Nem számított, hogy ezek a kapcsolatok hová lettek fizikailag, mert mindannyian elektromosan csatlakoznak. A számítógép most már majdnem kész.

5. lépés: A bemenet és a kimenet visszaállítása és befejezése

Sajnos ehhez a lépéshez nincs kép. A képekért lásd az előző lépést.

n

Lehet, hogy észrevette az előző lépés utolsó képén, hogy zöld gombot és egy másik logikai chipet telepítettem. A chip a VAGY kapu. Két kaput használnak a /WAIT jel generálására. Nos, az egyik úgy generálja a jelet, hogy OR-ing /IORQ és /RD a processzortól. A kimenet a második kapuba kerül, ahol ismét megnyomja a VAGY gombot. A gomb magasra hozza a kapu bemenetét, ezáltal a kimenetet magasra. Ezt a kimenetet a processzorok /WAIT csapok táplálják. Ha nincs lenyomva, az ellenállás alacsonyan tartja a bemenetet. Kezdetben 10K ellenállást használtam, de az LS32 valójában feszültséget adott ki a bemenetre. Az ellenállás nem ejtette elég alacsonyra, és le kellett cserélnem 1K -ra. Mindenesetre az elképzelés az, hogy amikor IO olvasási kérés történik, az első és a második VAGY kapu azt mondja a processzornak, hogy várjon. Miután beállította a bemeneti kapcsolókat a kívánt értékre, megnyomja a gombot, és ez kihozza a CPU -t a várakozási állapotból. A zöld „bemeneti” LED, ahogy azt egy korábbi lépésben megneveztem, úgy van bekötve, hogy amikor a /WAIT csap leereszkedik, kigyullad.

n

De még nem végeztünk. A bemeneti flip flopnak jelre van szüksége, hogy tudassa, mikor érvényes az adatbevitel, és ki kell adni a CPU -nak. Ez az óracsap magasan aktív. Korábban csak csatlakoztattuk a gombhoz. Ez még mindig érvényes opció, de ezúttal úgy döntöttem, hogy ugyanahhoz a kimenethez adom, mint a második VAGY kapu. Ennek az IC -nek van egy /OE csapja is, amelyet meg kell hajtani. Ha magasan tartanák, soha nem illesztene be adatokat a buszba. Ha alacsonyan tartják, az mindig a buszt vezeti. Ennek megoldásához egyszerűen egy harmadik VAGY kaput használtam. A bemenetek /IORQ és /RD, a kimenet pedig közvetlenül a retesz /OE -hez kerül.

n

A kimeneti retesznek az óracsap meghajtásához is szüksége van. Ismét aktív. Vázlatomban a /IORQ és /WR segítségével rajzoltam a negyedik VAGY kaput, közvetlenül a csapot hajtva. Ez azt jelentette, hogy az óratüskét magasan tartják, amíg írási kérést nem tesznek, majd ismét alacsonyra, majd magasra kerül. Ez valószínűleg rendben is lett volna, mert az adatbusz közvetlenül az írási kísérlet után is érvényes adatokkal rendelkezett volna, de mérnöki szempontból szeméttervezés volt. Ezt a hibát csak az utolsó képek elkészítése után vettem észre, de felszakítottam ezt a kapcsolatot, majd a memóriavezérlő logikából tápláltam a VAGY kapu kimenetét az egyik használaton kívüli inverterbe, majd csatlakoztattam a kimenetet az óra érintkezőjéhez. A vázlatot is kijavítottam, és találtam egy másik hibát. Én is kijavítottam.

n

Miután mindez végre elkészült, nagyon kevés feladatom volt: a visszaállítási áramkör. Hozzáadtam egy gombot a táblához, és 10K ellenállást használtam az egyik oldal magasan tartásához. A másik oldal közvetlenül a földre kerül. A magasan tartott oldal a /RESET kimenet, amely minden chiphez jutott a /RESET tűvel (a CPU és a kimeneti retesz). A bekapcsolás visszaállításához kondenzátort adtam a /RESET kimenethez. Az elképzelés szerint a nagy értékű ellenállás miatt a viszonylag nagy kondenzátor lassan töltődne, és a /RESET érintkezőket alacsonyan tartaná bizonyos ideig (a CPU -nak négy órajelre van szüksége). Valószínűleg már sejteni lehet ennek az áramkörnek a negatív oldalát. Ez ugyanaz a negatív, mint az előző verzió, mert ugyanaz az áramkör. A gomb megnyomásakor a kondenzátor lényegében rövidre záródik a gombon keresztül. Ez rossz a sapkának és a gombnak is, ezért ha egy kicsit állandóbbá szeretné tenni az építményt, akkor érdemes újratervezni. Egy másik 555 időzítőre gondoltam, amely monostabil módban van beállítva. De ezzel a számítógép áramköre most befejeződött. Hurrá. Most programozni kell.

6. lépés: Programozás

Ennek programozása rémálom volt. Építettem egy Arduino EEPROM programozót. Nem sikerült. Építettem egy másikat valaki más tervezése és kódolása alapján. Még mindig nem működött. Visszatértem a jól bevált módszerhez, amikor kézzel állítom be manuálisan a címeket és az adatbájtokat. Ezt valahogy elrontottam. Újra megpróbáltam, és még mindig rosszul értettem. Ismét visszamentem, és rájöttem, hogy egyetlen bájt le van tiltva, ezért kijavítottam, és végül sikerült, hála Istennek.

n

Ami a tényleges programot illeti, úgy tűnik, hogy rendkívül bonyolult és nehéz követni, de nem az. Elég egyszerű, sőt. A fele számok másolása. A másik fele a 16 bites matematika, a feltételes ugrások és még több szám másolása között oszlik meg. Tehát hadd menjek át rajta, és mondjam el, hogyan működik.

n

Az inicializálás csak néhány regiszterértéket állít be a program számára. A programhurok kicsit bonyolultabb, de nem sok. Először is elfogadja a bemenetet a 00 -as porton lévő A regiszterbe. Ezután az E regiszter a memóriába íródik. Az első két cikluson az E regiszter tartalmaz ócska adatokat, ezért megpróbáljuk azokat az utolsó két bájtba írni a ROM -térbe, mert valójában nem íródik le; ekkor a címmutató (IY) növekszik. A D -ben tárolt érték ezután E -be kerül, hogy a következőt írjuk. A -t ezután betöltjük a D -be, és L -t, E -t pedig a H. -ba. Az összehasonlított első értéket a B és C regiszterek tárolják. A B és C egyetlen 16 bites regiszterként, BC. Ha az értékek megegyeznek, akkor a program egyenesen a RAM -területre ugrik, ahol feltételezik, hogy a felhasználói kód tartózkodik. Ha a BC kódja nem egyezik, akkor a HL újratöltődik a D és E kezdeti értékeivel, és újra összehasonlítja az SP értékkel, ugyanúgy, mint a BC -vel. Ha ez egyezés, akkor ugyanaz az eredmény, de három extra bájt íródik a memóriába. A bájtok olyan kódok, amelyek hatására a CPU a program legelején ugrik vissza (szoftver -visszaállítás). Ha azonban a második összehasonlítás nem egyezés, akkor a program arra a pontra megy, ahol lekér egy értéket a felhasználótól.

n

LD SP, EDBFH; exe kód (ugrás hozzáadása)

n

LD IY, FFEH; kezdeti memóriamutató a kód tárolásához

n

LD BC, EDC3H; exe kód (nincs ciklus)

n

hurok; assembler direktíva, így nem kell tudnunk, hogy ez a rész hol található a memóriában

n

IN, (00H); programadatok beszerzése

n

LD (IY+00H), E; E tartalmazza a tárolni kívánt kódot

n

INC IY; lépjen a következő memóriahelyre

n

LD E, D; ld D E -be

n

LD D, A; ld A -ból D -be

n

LD H, E; ld E a H -ba

n

LD L, D; ld D L -be

n

VAGY A; hordozási zászló visszaállítása

n

SBC HL, BC; 0 -t ad vissza, ha a 2 -es exe kódot adta meg

n

JP Z, 1000H; ha igen, ugorjon a programra és futtassa azt

n

LD H, E; ellenkező esetben frissítse ezeket a megfelelő értékekre

n

LD L, D.

n

VAGY A; az első kivonásnál előfordulhat, hogy a hordozási zászló be van állítva. Tisztítsa meg

n

SBC HL, SP; 0 -t ad vissza, ha az exe kódot 1 adta meg

n

JP NZ, hurok; ha nem, ismételje meg a folyamatot (kezdve az érték beszerzésével)

n

LD (IY+00H), C3H; ellenkező esetben adjon meg egy ugrókódot a felhasználói program végén

n

LD (IY+01H), 00H; ugrás alapvetően szoftver -visszaállításként működik

n

LD (IY+02H), 00H; ez egy teljes visszaállítás arra az esetre, ha a regisztereket módosítják

n

JP 1000H; ugorjon és futtassa a felhasználói programot

Ajánlott: