Sisukord:
2025 Autor: John Day | [email protected]. Viimati modifitseeritud: 2025-01-13 06:57
Varem olen koostanud juhendi, kuidas Z80-põhist arvutit ehitada, ja kujundasin vooluringi võimalikult lihtsaks, et seda saaks võimalikult lihtsalt ehitada. Kirjutasin ka väikese programmi, kasutades sama lihtsuse ideed. See disain töötas üsna hästi, kuid ma ei olnud sellega rahul. Alustasin selle programmi ümberkirjutamisega, mis võimaldas seda käitusajal programmeerida. See võimaldas mul testida kooditükke, ilma et peaksin seda EEPROMile pühendama, mis omakorda nõuaks minult EEPROMi ümberprogrammeerimist. See ei tundunud mulle lõbus mõte. Siis hakkasin mõtlema mäluruumidele. Kui sooviksin liidestada riistvara (peamiselt IO), võib kooditükk potentsiaalselt ületada süsteemile mäluruumi. Pidage meeles, et disain kasutas ainult aadressibussi alumist baiti ja seejärel kasutati ROM -i ja RAM -i ruumide vahel valimiseks kõrge baidi alumist bitti. See tähendas, et mul oli kasutada ainult 253 baiti ruumi. Võib -olla küsite, miks 253 asemel 256. Selle põhjuseks on asjaolu, et minu uus kood sisestab kirjaliku programmi lõppedes kolm baiti andmeid (seda käsitletakse hiljem, kuna muutsin seda uue kujundusega töötamiseks).
n
Läksin tagasi oma vanade skeemide juurde, et näha, mis veel toimub. Leidsin mälu valimisahelas väikese vea, mille katan kohale jõudes. Lihtsustatud versioon: kõik kirjutamistaotlused läheksid tegelikult läbi, kuigi see pandi alati RAM -i. See ei olnud ilmselt midagi, mille pärast muretseda, kuid tahtsin seekord seda korralikult teha. Ja sellega hakkasin joonistama uut skeemi. Sellele lehele lisatud kaks pilti on enne ja pärast tegelikku vooluringi. Puhastasin nii palju spagetti juhtmeid, see pole naljakas.
n
Kui te järgisite minu esialgset avaldust ja kavatsete seda järgida, siis hakkate mind vihkama. Kui alustate värskelt, on teil õnne. Võtke lihtsalt nimekirja osad (või nende ekvivalent) ja järgige.
Tarvikud:
LM7805 - 5 -voldine regulaatorZ80 - protsessor; süsteemi ajudAT28C64B - EEPROM. Arvuti püsivara jaoks kasutatav püsiv andmesalvestus IDT6116SA - SRAM; kasutatakse kasutajakoodi ja /või üldise andmesalvestuse salvestamiseks kasutatakse sisendkiibina74LS273 - Octal D -Latch koos /MR; TLC59211 - LED -draiveri kiip (kasutatakse nii, et 74LS273 suudab juhtida LED -e, kuna see üksi ei suuda praegust väljundit kasutada) MC14572 - see on „Line Driver” kiip, kuid leidsin, et see sobib ideaalselt mälukontrolli loogika jaoks. Sellel on 4 inverterit ning sisseehitatud NAND- ja NOR -värav74LS32 - Quad OR gate - CD4001 - Quad NOR gateCD4040 - 12 Stage Ripple Counter; Joonistatud, kuid teostamata kellajagur (süsteemi töötamiseks aeglasematel kellaaegadel) 2 10K oomi takistit - ühte kasutatakse taimeriahelas 555, seega kasutage selle jaoks mis tahes väärtust 4 1K oomi takistit 555 taimeriahelat, nii et kasutage seda, mida soovite. LED -ide juhtimiseks kasutatakse teist, nii et muutke ka seda, kui soovite 8 jaoks kasutasin tulpdiagrammi (HDSP -4836) 4 Kondensaatorit - kahte kasutatakse LM7805; 0,22 uF ja 0,1 uF. Üks neist on mõeldud 555 taimerile, seega kasutage seda, mis teile tundub õige. Viimane on sisselülitamise lähtestamiseks; 100uF2 N. O. Nupud - ühte kasutatakse sisendiks, teist lähtestamiseks8 SPST DIP -lülitit - andmete sisestamine; Ma kasutasin Piano Key styleWire'i. Palju ja palju traati
n
MÄRKUS. MC14572 läbivavaga versioon on vananenud, kuid SMD versioon on endiselt aktiivne (isegi mitte "mitte uue disaini jaoks"), seega peate võib -olla ostma trükkplaadi, et seda kasutada. MC14572 asemel saab kasutada teist 74LS32 (vaadake eelmise ible'i skemaatilist skeemi “mälu valimise ahel”)
1. samm: muudatuste ja skeemide kiire ülevaade
Skeemide lugemine: kiibile suunatud nool on sisend: sisend>-kiibist eemale suunatud nool on väljund: väljund <-bussid kasutavad noole asemel joont: siin |-
n
Enamik žetoone on joonistatud nende täpsete pinoutidega. Nendele kiipidele on joonistatud väike suplus. Enamikul kiipidel on ka tihvtide numbrid ja sildid. Neid võib olla natuke raske lugeda. Mu pliiats muutus igavaks.
n
Vooluahelate ühenduste osas on uue kujunduse paigutus esialgsest enamasti muutumatu. Ühendasin mäluga aadressi kõrge baidi alumise nibi ja kasutasin siis ülemise nibble'i madalat bitti (A12) RAM/ROM valimiseks. See tähendas, et ROM-i maht läks vahemikku 0000-00FF kuni 0000-0FFF. Ram-ruum läks vahemikku 0100-01FF kuni 1000-1FFF. Vahetasin ka mälukontrolli loogika parema disaini vastu ja lisasin kaks uut oleku LED -i (ja natuke liimiloogikat). Olen joonistanud (kuid ei juhtinud) kellajaguri ahelat. See pidi täitma kahte funktsiooni. Ilmselge ülesanne on jagada taktsagedus alla. Teine funktsioon on PWM (impulsi laiuse modulatsiooni) eesmärkidel, kuna 555 ei tekita 50% töötsüklitega laineid. Selles vooluringis pole sellel tegelikult tähtsust, kuid kui soovite mõne LED -i juhtimiseks kella kasutada, märkate kindlasti efekte (üks (komplekt) LED -id on tuhmimad kui teised). Kogu ülejäänud vooluring on sisuliselt muutumatu.
Samm: protsessor, mälu ja mälu juhtimine
See on osa, kus mu eelmise versiooni lugejad vihkavad mind. Esialgses konstruktsioonis viskasin osad lihtsalt tahvlile paika, kus nad nägid välja, et need tekitaksid juhtmestikuga ühendamisel vähe probleeme. Tulemus nägi välja nii, nagu oleks keegi selle peale taldriku spagette visanud ja oleks nagu “juhtmed!” Tahtsin seda natuke puhastada, nii et alustasin kõike, välja arvatud protsessor, RAM ja ROM, lahti rebimist. Tõmbasin peaaegu kogu sisendahela, väljundahela ja liimiloogika üles. Mul oli peaaegu valus seda teha, kuid see oli vajalik. Jätsin kõik andmeühendused puutumata ja aadressibussi alumise baidi. Seejärel ühendasin aadressibussi (A8-A11) järgmised neli bitti ROM-kiibiga. Hoolitsesin selle eest, et käiksin seekord kiibist ringi, et oleks lihtsam ümberprogrammeerimiseks üles tõusta. Samuti hüppasin aadressiühendused alla RAM -kiibile.
n
Sellega pidin ma nüüd mälu juhtimise loogika ühendama. Algses skeemis ühendasin protsessori /MREQ liini otse /CE -ga mõlema mälukiibiga, seejärel ühendasin /WR -i RAM -i /WE -ga. Siis olid mul CPU /RD ja /MREQ loogiliselt VÕI koos, samuti A9. Põhimõtteliselt oli see seadistatud nii, et kõik mälupäringud aktiveerisid nii RAM -i kui ka ROM -i, kuid A9 -d kasutati, et valida, milline kiipidest /OE -st valiti. See oli korras ja kõik sellepärast, et kiibid jääksid kuni mälutaotluse esitamiseni passiivseks ja siis oleks lugemistaotluse ajal aktiivne ainult üks /OE. See väldis ülejooksmist, kuid tõi kaasa ebamugava nüansi. Kuna A9 -d kasutati ainult selleks, et teha kindlaks, milline kiip andmeid väljastab, ja kuna protsessoril oli otsene juurdepääs RAM -i /WE -tihvtile, läbiksid kõik kirjutamistaotlused. See oli ROM -i jaoks okei, kuna selle kirjutusrežiimi pärsib sidumine /WE otse 5V toiteallikaga. RAM -ile kirjutatakse aga olenemata A9 -st. See tähendas, et ROM -i ruumi kirjutamise katse kirjutaks RAM -i samasse kohta.
n
Üks lahendus selleks oleks juhtimisloogika ümberjuhtimine, nii et protsessoril oleks otsene juurdepääs kiipide /OE ja /WE tihvtidele ning seejärel MREQ ja A12 abil, milliste kiipide /CE juhiti. Ma läksin selle ideega, kuid selle asemel, et kasutada nelja NOR -väravat ja inverterit, nagu originaalkujundus, leidsin ühe ebamugava väikese kiibi, mis sobis ülesande täitmiseks ideaalselt. Pidin looma vooluringi, mis kasutas ainult kiibis saadaolevaid loogikaväravaid, kuid see oli piisavalt lihtne. A12 söödetakse otse NAND -väravasse ja NOR -väravasse. /MREQ sisestatakse NOR väravasse ja selle kompliment NAND väravasse. NAND -i väravat kasutatakse RAM -i juhtimiseks /CE jaoks ja NOR -väljundit pööratakse ümber ja kasutatakse ROM /CE -i juhtimiseks. See teeb nii, et /MREQ peab enne mistahes kiibi valimist olema madal ja seejärel valib A12, milline neist valitakse. Selle seadistusega ei tee nüüd kõik ROM -ile kirjutamise taotlused midagi. See säästab ka energiat, sest mõlema asemel on aktiivne ainult üks kiip. Loogikakiibi enda osas on meil veel kaks kasutamata inverterit sees. Üks harjub hiljem, kuid jõuame kohale jõudes.
3. samm: süsteemi oleku LED -id
Enne selle projektiga alustamist proovisin liidestada teatud IC -ga, kuid mul oli sellega probleeme. Kuna ma polnud kindel, mis toimub, kasutasin ma sondeerimiseks paneelikinnituse LED -i (üks neist sõlmedest, millel on sisseehitatud takisti). See andis mulle nostalgiaidee, mida kasutatakse tänaseni: oleku LED -id näitasid, kas mälu loetakse või kuhu kirjutatakse. Seda tuli kasutada koos sisend -LED -iga, mis mul juba oli. Sisend -LED ühendati signaaligeneraatoriga /WAIT, et näidata meile, et süsteem ootab sisendit (ma jõuan sinna, ärge muretsege). Kaalusin IO kirjutamise näitamiseks LED -i lisamist, kuid arvasin, et väljund -LED -ide vahetamine oleks juba selle suurepärane näitaja. Sellele mõeldes võin selle veel lisada. Sellegipoolest on minu arvates kasulik teada, kas mälu loetakse või kirjutatakse. Noh, see on igal juhul kasulik programmi silumiseks. Kasutasin seda tõsiselt, kui proovisin oma programmi tööle panna: „miks see mällu kirjutab? Seda ei peaks veel tegema!"
n
Nende valgusdioodide juhtimiseks kasutasin quad NOR väravat. Kasutasin kõiki väravaid. Olekusignaalide genereerimiseks kasutati ainult kahte, kuid kiibil pole LED -ide tegelikuks juhtimiseks toitevõimalusi. Nad on võimelised nii palju energiat uputama, nii et ma kasutasin inverterina kahte ülejäänud NOR -väravat ja ühendasin LED -id kui sellised. Kuna ühte LED -i kasutatakse näitade ja teist kirjutamiseks ning lugemis- ja kirjutamistaotlust ei esitata samal ajal, suutsin mõlema LED -i jaoks kasutada ainult ühte takistit. Mis puudutab signaale, mida mul oli vaja dekodeerida, siis oli see ka piisavalt lihtne. Tahtsin, et kõik mälu lugemise taotlused oleksid näidatud, nii et esimese NOR -värava sisenditel olid /MREQ ja /RD. Kirjutamise olek oli pisut keerulisem, kuid sama lihtne. Kasutasin endiselt /MREQ -i ühe sisendina, kuid /WR -i kasutamine teisena tekitaks väikese nüansi, mida soovisin vältida. See oleks näidanud KÕIK kirjutamissoovid. Tahtsin ainult neid, mis tegelikult läbi läksid. Kuidas ma seda siis teeksin? Mäletate, kuidas ma olen süsteemi seadistanud nii, et ainult RAM -i saab kirjutada? Kasutasin RAM -e /CE -d teise sisendina NOR -i väravasse. See tähendab, et LED süttib ainult siis, kui RAM on valitud ja kirjutamistaotlus esitatakse. LED -värvi osas valisin lugemisnäidikuks oranži (aga leidsin ainult kollased) ja punase kirjutusnäidikuna.
4. samm: sisend ja väljund
Eelmises etapis võisite märgata, et lisasin tahvlile juba mõned ülejäänud komponendid. Ma reserveerisin ruumi, et ma juhuslikult ei paigutaks juhtmeid sinna, kuhu komponenti soovisin (seega peaksin selle komponendi jaoks uue asukoha leidma). Võib -olla märkasite ka, et jätsin sisendlülitid paika ja ühendasin toitekaabliga. Otsustasin, et esialgne asukoht on ideaalne koht, ja otsustasin paigutada väljund -LED -id lähedale (ülal). Ribakuva paremal on sisendriiv. Selle kohal on väljundriiv ja sellest vasakul on LED -draiver. Alustasin ekraani ühendamisega draiveriga, kuna seda oli kõige lihtsam teha. Seejärel ühendasin lülitid sisendriivi sisendpoolega. Järgmisena ühendasin väljundriivi väljundkülje LED -draiveriga. See võib tunduda ebamugav korraldus neid juhtmeid ühendada, kuid sellel oli põhjus. Väljundriivi sisend pidi olema ühendatud nii andmesiiniga kui ka sisendriivi väljund. Idee oli ühendada sisendriivi väljundid väljundriivi sisenditega, mida ma ka tegin. Siis ei jäänud mul muud üle, kui see jama andmesiini külge ühendada. Pole tähtis, kuhu need ühendused füüsiliselt läksid, sest kõik oleksid elektriliselt ühendatud. Arvuti on nüüd peaaegu valmis.
Samm: sisendi ja väljundi lähtestamine ja viimistlemine
Kahjuks pole selle sammu jaoks pilte. Piltide vaatamiseks vaadake eelmist sammu.
n
Võib -olla märkasite eelmise sammu viimasel pildil, et mul oli roheline nupp ja teine loogikakiip installitud. Kiip on VÕI värav. Signaali /WAIT genereerimiseks kasutatakse kahte väravat. Üks genereerib signaali protsessori OR-ing /IORQ ja /RD abil. Väljund sisestatakse teise väravasse, kus see saab uuesti nupule VÕI. Nupp viib värava sisendi kõrgele, tõstes seega väljundi kõrgele. See väljund suunatakse protsessorile /OOTAMISTIPTI. Kuigi seda ei vajutata, hoiab takisti sisendit madalal. Algselt kasutasin 10K takistit, kuid LS32 pani sisendisse tegelikult pinge välja. Takisti ei lasknud seda piisavalt madalale ja pidin selle asendama 1K -ga. Igatahes on mõte selles, et kui esitatakse IO lugemisnõue, käsib esimene ja teine VÕI värav protsessoril oodata. Kui olete seadistanud sisendlülitid soovitud olekusse, vajutate nuppu ja see toob protsessori ooterežiimist välja. Roheline sisend -LED, nagu ma seda varasemas etapis nimetasin, on juhtmega ühendatud, nii et kui /WAIT pin läheb madalaks, süttib see.
n
Kuid me pole veel valmis. Sisendi klapp vajab signaali, et anda teada, kui andmesisestus on kehtiv ja see tuleks protsessorile edastada. See kellanupp on aktiivne kõrgel. Enne ühendasime selle lihtsalt nupuga. See on endiselt kehtiv valik, kuid seekord valisin selle samale väljundile kui teine VÕI värav. Sellel IC -l on ka /OE tihvt, mida tuleb juhtida. Kui seda hoitaks kõrgel, ei sisestaks see kunagi andmeid siinile. Kui seda madalal hoida, oleks see alati bussi juhtimine. Selle parandamiseks kasutasin lihtsalt kolmandat VÕI väravat. Sisendid on /IORQ ja /RD ning väljund läheb otse riivi /OE -le.
n
Väljundi riiv vajab ka kellatapi juhtimist. Jällegi on see aktiivne kõrgel tasemel. Oma skeemil joonistasin neljanda VÕI värava otse, kasutades tihvti, kasutades /IORQ ja /WR. See tähendas, et kella nööpnõela hoiti kõrgel, kuni kirjutamisnõue esitati, seejärel langeb see uuesti madalale ja kõrgele. See oleks ilmselt olnud hea, sest andmesiinil oleks kohe pärast kirjutamiskatset selle kohta veel kehtivaid andmeid, kuid inseneri seisukohast oli see prügikujundus. Ma märkasin seda viga alles pärast seda, kui olin teinud viimased pildid, kuid rebisin selle ühenduse katki ja seejärel sisestasin VÕI värava väljundi mälukontrolli loogikast ühte kasutamata inverterisse, seejärel ühendasin selle väljundi kellatahvliga. Parandasin ka skeemi ja leidsin veel ühe vea, mille olin teinud. Parandasin ka.
n
Kui see kõik oli lõpuks tehtud, oli mul teha väga väike töö: lähtestusahel. Lisasin tahvlile nupu ja kasutasin 10K takistit, et hoida ühte külge kõrgel. Teine pool läheb otse maapinnale. Kõrgelt hoitud külg on /RESET väljund, mis läks igale kiibile /RESET tihvtiga (protsessor ja väljundi riiv). Sisselülitamise taastamiseks lisasin /RESET väljundile kondensaatori. Idee on selles, et suure väärtusega takisti paneks suhteliselt suure kondensaatori aeglaselt laadima ja hoiaks /RESET kontakte teatud aja tsüklite jooksul madalal (protsessor vajab nelja taktsüklit). Tõenäoliselt võite juba arvata, mis on selle vooluahela negatiivne külg. See on sama negatiivne kui eelmine versioon, kuna see on sama ahel. Nupu vajutamisel on kondensaator nupu kaudu sisuliselt lühis. See on halb nii korgi kui ka nupu jaoks, nii et kui soovite oma ehitist veidi püsivamaks muuta, võiksite selle ümber kujundada. Mõtlesin veel ühele 555 taimerile, mis on seadistatud monostabiilsesse režiimi. Kuid sellega on arvuti ahel nüüd lõppenud. Jaaa. Nüüd vajab see programmeerimist.
6. samm: programmeerimine
Selle asja programmeerimine oli õudusunenägu. Ehitasin Arduino EEPROM programmeerija. See ei toiminud. Ehitasin teise, kellegi teise kavandi ja kodeeringu põhjal. Ikka ei töötanud. Pöördusin tagasi tõestatud meetodi juurde, millega käsitsi aadresse ja andmebaite käsitsi seadistada. Millegipärast ajasin selle sassi. Proovisin uuesti ja sain ikka valesti aru. Läksin veel tagasi ja avastasin, et see oli ühe baidi võrra välja lülitatud, nii et parandasin selle ja tänu Jumalale see lõpuks töötas.
n
Mis puutub tegelikku programmi, siis tundub, et see on väga keeruline ja seda on raske järgida, kuid see pole nii. See on üsna lihtne, tegelikult. Pool sellest on numbrite kopeerimine. Teine pool on jagatud 16-bitise matemaatika, tinglike hüpete ja veel rohkemate numbrite kopeerimise vahel. Nii et las ma vaatan selle läbi ja räägin teile, kuidas see toimib.
n
Initsialiseerimine määrab programmi jaoks mõned registriväärtused. Programmi tsükkel on natuke keerulisem, kuid mitte palju. Esiteks võtab see vastu sisendi A registrisse pordis 00. Seejärel kirjutatakse E register mällu. Kahel esimesel silmusel sisaldab E register rämpsandmeid, nii et proovime need kirjutada kahe viimase baidi ROM -ruumi, kuna seda tegelikult ei kirjutata; siis suurendatakse aadressi osutit (IY). Seejärel teisaldatakse D -sse salvestatud väärtus E -sse, et see järgmisena kirjutada. Seejärel laaditakse A A -sse ja L ning E kopeeritakse H. Esimene võrreldav väärtus salvestatakse registritesse B ja C. B ja C käsitletakse ühe 16-bitise registrina, BC. Kui väärtused on samad, hüppab programm otse RAM -i ruumi, kus eeldatakse, et asub kasutajakood. Kui BC -s olev kood ei ühti, laaditakse HL uuesti D ja E algväärtustega ning võrreldakse uuesti SP väärtusega samamoodi, nagu seda võrreldi BC -ga. Kui see on vaste, on sellel sama tulemus, kuid mällu kirjutatakse kolm täiendavat baiti. Baidid on kood, mille tõttu protsessor hüppab tagasi oma programmi algusesse (tarkvara lähtestamine). Kui aga teine võrdlus ei olnud vaste, pöördub programm sinna, kust kasutajalt väärtuse võtab.
n
LD SP, EDBFH; exe kood (lisab hüppe)
n
LD IY, FFEH; esialgne mälu osuti koodi salvestamiseks
n
LD BC, EDC3H; exe kood (silmus puudub)
n
silmus; koguja direktiiv, et me ei peaks teadma, kus see osa mälus asub
n
IN A (00H); saada programmi andmeid
n
LD (IY+00H), E; E sisaldab salvestatavat koodi
n
INC IY; liikuda järgmisse mälukohta
n
LD E, D; ld D sisse E
n
LD D, A; ld A -st D -sse
n
LD H, E; ld E sisse H
n
LDL, D; ld D sisse L
n
VÕI A; lähtesta kandmislipp
n
SBC HL, BC; tagastab 0, kui sisestati exe -kood 2
n
JP Z, 1000H; kui jah, siis minge programmi juurde ja käivitage see
n
LD H, E; muidu värskendage need õigetele väärtustele
n
LDL, D.
n
VÕI A; esimene lahutamine võis määrata kandmislipu. Tee see selgeks
n
SBC HL, SP; tagastab 0, kui sisestati exe -kood 1
n
JP NZ, silmus; kui ei, siis korrake protsessi (alustades väärtuse hankimisega)
n
LD (IY+00H), C3H; muidu sisestage hüpikkood kasutajaprogrammi lõppu
n
LD (IY+01H), 00H; hüpik toimib põhimõtteliselt tarkvara lähtestamisena
n
LD (IY+02H), 00H; see on täielik lähtestamine juhuks, kui registreid muudetakse
n
JP 1000H; hüpata ja käivitada kasutajaprogramm