Cubik: #2 – Z80

Kuten edellisistä postauksista on selvinnyt, niin suorittimena on Zilogin Z80, jonka dokumentaatio löytyy tästä. Suosittelen selaamaan läpi, vaikka aionkin ottaa tässä esille pääpiirteet.

z80

Parhaimman yleiskatsauksen saa varmasti katsomalle pinnijärjestystä, joka löytyy sivulta 5.

Z80 Pinout

A0-A15: 16-bittinen osoiteväylä.
D0-D7: 8-bittinen dataväylä.
CLK: Kellopulssi.

RESET: Resetoi suorittimen. Pakollinen käynnistyksen yhteydessä.
INT (Interrupt Request)0-taso generoi keskeytyksen.
NMI (Nonmaskable Interrupt):  Sama, kun INT, mutta ei maskattava. Siirtyy aina osoitteeseen 0066h.

MREQ: Suoritin haluaa lukea/kirjoittaa muistiin.
IORQ: Suoritin haluaa lukea/kirjoittaa IO-laitteeseen.
RD: Lukuoperaatio.
WR: Kirjoitusoperaatio.
M1: Suorituksessa on M1-sykli. Yhdesä MREQ kanssa meinaa seuraavan käskyn hakemista muistista ja IORQ:n kanssa keskeytysvektorin pyytämistä IO-laitteelta.
WAIT: Pysäyttää suorittimen.
BUSACK: Suorittimen MREQ, IORQ, WR, RD, sekä osoite- ja datapinnit ovat high impendance -tilassa. Eli esim. DMA on pyytänyt osoite- ja dataväylän käyttöön.

On hyvä huomata, että viiva nimen päällä tarkoittaa, että kyseinen tila on 0-tasolla aktiivinen.

Jotta Z80 saadaan heräämään henkiin, niin sille tarvitaan kellosignaali.  Pulssin pitää olla kanttiaaltoa 50% suhteella. Kiteen avulla voidaan tuottaa kanttiaaltoa esim. seuraavalla kytkennällä.

clock

 

Lopputuloksena on yllä oleva kellosignaali. Tällä hetkellä taajuutena on 4 MHz. Tämän lisäksi on myös hyvä olla debugtarkoitukseen 1-5 Hz kello. Tämä onnistuu helposti esim. 555-ajastimella tai vaikkapa mikrokontrollerilla.

Z80:sen ulostulojen virtakestoksi on ilmoitettu 2 mA. Joten ulostuloja on hyvä bufferoida. Kontrollipinneistä tarvitsee myös muodostaa yhdisteitä (kuten IO luku jne.). Joten kontrolliulostulojen bufferointi hoituu suurimmaksi osaksi suoraan kombinaatioita muodostaessa. Koska ulostulojen 0-taso merkkaa aktiivista, niin AND-operaatio hoituu nyt OR-porteilla.

cpu-control
Kombinaatioulostulot ovat myös aktiivisia, kun 0. Sisäänpäin menevät tulot eivät voi leijua, vaan ne pitää vetää ylös. Jotkin Zilogin IO-piirit haluavat suoraan MREQ-signaalin, joten sen takia se on erikseen vielä bufferoitu. BUSACK-signaalista tulemme tarvitsemaan negaatiota. Syy selviää kohta. Tarkkasilmäisimmät huomasivat, että tuossa ei ole muistin lukemista indikoivaa signaalia. Tämä sen takia, että sitä ei tarvita. Sillä silloin kuin muisti ei ole kirjoitustilassa, niin se on lukutilassa.

Osoite- ja dataväylä on syytä myös bufferoida, mutta nämä ulostulot pitää myös saada high impendace -tilaan, kun BUSACK on aktiivinen. Pitää myös huomioida, että dataväylä on kaksisuuntainen. Onneksi tähän tilanteeseen löytyy juuri oikeat piirit. 74LS244 on kahdeksan porttinen tri-state bufferi ja 74LS245 on vastaava, mutta kaksisuuntaisena.

buffer

address-2 copy

Osoiteväylän bufferointi voidaan toteuttaa yllä olevalla tavalla. Huomiokaan, että kyseinen BUSACK signaali tulee nyt NOT-portin läpi (ks. yllä). Kun BUSACK on normaalisti 1 (eli ei aktiivinen), niin sen negaatio on silloin luonnollisesti 0 ja 74244:set ovat päällä.

databuss

Vastaavasti dataväylän bufferointi. Tässä vaiheessa suorittimen vaatimat elektroniikat alkaa olemaan kasassa. Vielä kuitenkin tarvitaan resetointipiiri, joka käynnistyksen yhteydessä resetoi suorittimen. Sillä manuaalisesti napin painaminen olisi ärsyttävää.

reset

Kyseinen kytkentä on otettu suoraa Build Your Own Z80 Computer -kirjasta, joka on muuten oiva tietolähde. Vaikka noin puolet tavoista tehdä asioita on vähän vanhentuneita. Toiminta perustuu kuitenkin siihen, että kondensaattori on alkutilanteensa varaukseton ja pitää reset-linjan 0-tasossa. Lopulta kun kondensaattori on latautunut, niin reset kytkeytyy 1-tasoon. Kytkennässä on aktiivinen 1 ja aktiivinen 0 linjat erikseen, kun piirien resetointi vaihtelee.

Lopputulosta voi testata esim. vetämällä koko dataväylän maihin ja resetoimalla suorittimen. 00h vastaa NOP (No operation) käskyä jolloin osoiteväylän pitäisi kasvaa yhdellä aina per operaatio. Seuraavaksi pitäisi lisätä muisti, että jotain oikeaa voisi jo tehdä.

Posted in Cubik | Tagged , , , | Leave a comment

Cubik: #1 – Back to basics

Ensiksi todettakoon, että en ole vielä aivan varma kuinka paljon tulen asioita avaamaan. Pyritään siihen, että keskimääräinen lukija pystyy ymmärtämään asioista suurimman osan, mutta samalla ei tylsisty. Toiseksi pitäisikö tätä viedä eteenpäin top-down vai bottom-up näkökulmasta. Tällä hetkellä top-down tuntuu paremmin istuvammalta tähän, mutta kaikki oikeudet muutoksiin pidätetään tietenkin :3.

Ennen kun voidaan puhua softasta, meillä pitää olla rauta. Perinteisesti rauta on voitu jakaa kolmeen osaan.

1: Suoritin (CPU)
Kaiken laskennan takana on suoritin. Suorittimen tärkeimmät osat ovat ohjainyksikkö (Control unit) ja laskentayksikkö (Arithmetic logic unit). CU kirjaimellisesti ohjailee dataa suorittimen sisällä ja ALU osaa suorittaa yksinkertaista laskentaa.

Cubikin CPU tulee olemaan Zilogin valmista Z80 8-bittinen suoritin, joka oli aikoinaan erittäin suosittu.  TI on mm. käyttänyt tätä pitkään graafisissa laskimissaan. Z80:ssa on 8-bittinen data väylä, 16-bittinen muistiväylä ja uusimmat  versiot tukevat kellopulssia 20 MHz:n asti. Vaikka dataväylä on vain 8-bittinen, niin sisäisesti Z80 osaa käsitellä 16-bittisiä lukuja.

2: Muisti (RAM)
Vaikka CPU pystyy sisäisissä rekistereissään pitämään muutamaa lukua tallessa, niin se tarvitsee kaverikseen jonkinlaisen muistin, josta voidaan lukea suoritettavaa ohjelmaa ja säilöä ohjelman vaatima data. Muistiväylä Z80:ssa on 16 bittinen eli pystymme osoittamaan 2^16 = 65 536 eri muistiosoitteeseen. Kerralla voimme siis osoittaa vain 64 kB muistialueeseen. Samasta syystä vuosituhannen vaihteessa tavalliset PC:t tukivat vai 4 GB ramia. Koska 32-bittisellä muistiväylällä se oli maksimi. Tätä rajaa voimme kuitenkin näennäisesti kasvattaa.

Yleinen tapa on muistin sivuttaminen. Analogiana voidaan pitää, että voimme kerralla lukea kirjasta vain yhtä aukeamaa, mutta sivua kääntämällä saamme lisää luettavaa, mutta edelleen pystymme yhdellä kertaa lukemaan vain yhtä aukeamaa.  Tästä voi kuitenkin kirjoittaa oman postauksen, joten sivuutetaan se nyt toistaiseksi. Tällä hetkellä suunnitelmissa on sisällyttää Cubikkiin 512kB – 4MB muistia.

Koska käynnistyessään suoritin alkaa suorittamaan ohjelmaa muistiosoitteesta 0000 ja virran katkaisu on saanut RAMin unohtamaan sisältönsä, niin tarvitsemme pienen pysyvän muistiblokin. Tämä palanen tulee sisältämään alustus- ja käyttöjärjestelmän latausrutiinit. Eli tavallisessa PC:ssä tätä on kutsuttu BIOS:ksi. Tämän hetkinen suunnitelma sisältää 8kB EEPROM:in. Samaan muistiin olisi myös tarkoitus sijoittaa C:n standardikirjasto, jotta lopulta voidaan siirtyä ohjelmoimaan C:tä.

3: Oheislaitteet (IO)
Erästä Aallon proffaa lainaten tietokone, joka ei tee IO:ta ei ole kovin mielenkiintoinen. Eli jollain tavalla käyttäjän pitäisi pystyä vaikuttamaan koneen toimintaan. Virallisen dokumentaation mukaan Z80:sen IO-osoiteavaruus on 8 bittinen, mutta oikeasti kuitenkin kaikki osoiteväylän 16 bittiä on käytössä.

Tarvitsemme logiikan, joka osaa tämän 8 bittisen osoitteen perusteella valita oikean IO-laitteen. Yleensä IO:lle juttelu on asynkroonista. Jotta suorittimen ei tarvitse koko ajan pollata IO-laitteiden tilaa, niin käytetään keskeytyksiä. Eli IO-laite kertoo CPU:lle, että nyt olisi asiaa.

Z80:ssa on kaksi keskeytyssignaalia, yksi maskattava ja yksi ei maskattava. Maskattavat keskeytykset voidaan kytkeä ohjelmallisesti pois päältä. Z80 tukee kolmea erilaista keskeytystilaa, mutta tässä tullaan käyttämään vain niistä kaikista tehokkainta, missä jokaiselle IO-laitteelle voidaan määrittää oma keskeytyksen käsittelijä. Tästäkin saa kokonaan oman postauksen.

Seuraavat oheislaitteet ovat välttämättömiä:

  • Reaaliaikakello (RTC), keskeyttämään suoritinta tasasin väliajoin, jotta voidaan esim. toteuttaa moniajo. Pitää myös huolen päivämäärästä ja kellon ajasta.
  • VGA ulostulo näytölle. Vähintäänkin kunnollinen tekstimode ja ehkä alkeellinen grafiikkatila.
  • PS/2 liitäntä näppäimistölle.
  • Sarjaportti.
  • CF-muistikortinlukija, CF-muistikortti on käytännössä IDE (PATA) väylällä toimiva flash-muisti.

Näistä jokaisesta saa myös oman postauksen aikaiseksi.

4: Kello
Kaikki edellä mainittu toimii, jos ja vain jos kaikki on tahdistettu. Tärkein tahdistettava osio on tietenkin suoritin, joka tekee asioita vain, kun kellopulssi käskee. Tämän lisäksi pitää mm. huomioida että muisteilla ja IO-laitteilla on jonkinlainen access time aina. 

5: Reset
Z80 pitää erikseen resetoida, kun siihen on kytketty virrat. Muuten suorittimen alkuarvot ovat vähintäänkin mielenkiintoiset. Eli käynnistyksen yhteydessä täytyy pitää huolta, että kaikki laitteet tulee nollattua. Tämä hoituu generoimalla reset-pulssi.

Cubik - Block Diagram

 

Lopulta meillä pitäisi olla jotain tämän näköistä. Edellä mainitut asiat ovat suuntaa antavia ja tarkemmat speksit moutoutuu kyseisiä blokkeja tehdessä. Jolloin myös asiaa tarkemmin niiden sielun elämästä.

Rakenteesta pitäisi myös koittaa saada mahdollisimman modulaarinen. Sillä mitä luultavammin asioita voi tehdä aina paremmin, jolloin yhden palasen parantaminen onnistuu paljon helpommin. Kuvastakin on selkeästi erotettavissa kolme eri kokonaisuutta: CPU, muisti ja IO. Piirilevyjen teettämisen näkökulmasta tämä on myös parempi tapa. Sillä pienet kiinalaiset tekevät mieluummin pienempiä levyjä.

Posted in Cubik | Tagged , , , , , , , | Leave a comment

Cubik: #0 – Oma tietokone

Ajatus täysin itse rakennetusta koneesta on pyörinyt aina silloin tällöin päässä ja lopulta kipinä oli tarpeeksi suuri. Enkä nyt tarkoita, että kasataanpa normi PC. Tarkoitus on rakentaa 80-luvun hengessä 8-bittinen mikrotietokone. Tästä voi esim. katsoa osviittaa. Asiasta on tullut jo jonkun verran keskusteltua ja yleisin kyssäri on ollut, että miksi. Siksi koska voi. Siksi että se on projektina mahtava. Miksi? Koska onhan se ihan fantastista suunnitella mm. CPU:n toiminta, muistin mappaus, IO-laitteet ja keskeytyksien toiminta alusta asti itse.

Seuraavaksi yleisin kyssäri/toteamus on ollut, että miksi et vain osta Raspia. Jos ostan, niin mitä sitten? Lyön virrat päällle ja SD-kortin sisään. Tarkoitus ei nyt vain ole tämä. Tarkoitus ei ole edes lopulta saada mitään “oikeasti” käyttökelpoista aikaan. Kaikki nyt varmasti ymmärtävät sen, että tuon aikainen rauta, nyt on vain wanhaa. Juju piileekin siinä tekemisessä. Sillä tässä matka on tärkeämpi kuin itse päämäärä.

Enkä myöskään tarkoita, että otetaan joku Arduino ja koodataan sille jokin pilipali käyttis. Vaikka näinkin asian voisi hoitaa, niin matka jäisi lyhyeksi ja tylsäksi. Siis tehdään koko paketti erilliskomponenteista ja koitetaan saada lopputuloksesta jotain samaa, mitä ihmiset mieltävät nykypäivänä sanan tietokone tarkoittavan.

Miksi sitten wanhaa, kun voisi tehdä esim. ARM-pohjaisen ratkaisun, jolla oikeasti tekisi jo jotain. Niitä vain ei ole tehty harrastusprotoilua varten. Paitsi, että näitäkin on nähty. Tehdään nyt kuitenkin asiat vähän helpommiksi näin alkuun.

Tällaisellä metapostauksella alustetaan tämä. Toivotaan myös, että kalenteri antaa edes vähän myöden tämän projektin suhteen.

Posted in Cubik | Tagged , , , , | Leave a comment

Kaiverrus elektrolyysin avulla

Puukkoa varten piti saada terään kaiverrus aikaiseksi. Asianhan olisi voinut tehdä monella tapaa mm. taonnan aikana huitaista leima, syövyttää hapolla, kaivertaa dremilillä tai miksi ei  sovelleta kemiaa.

Elektrolyysissä sähkövirran avulla saadaan aikaan pakotettu hapetuspelkistysreaktio. Elektrolyysiä käytettään mm. metallien pinnoittamiseen ja kemialliseen pilkkomiseen.

Elektrolyysikenno koostuu kahdesta elektrodista, jotka on kytketty tasavirtalähteeseen. Virtalähde saa aikaiseksi elektronien siirtymisen elektrodilta toiselle. Siirron seurauksena toiselle elektrodille jää elektroniylimäärä ja toiselle elektronivajaus. Suolasulatteen positiiviset ionit hakeutuvat katodille, jossa ne pelkistyvät. Sulatteen negatiiviset ionit hakeutuvat anodille, jossa ne hapettuvat.

Yksinkertaisuudessaan tarvitaan tasavirtalähde, kaiverrettava kappale ja suolavettä. Tässä tapauksessa seuraaville yhdisteille/ioneille voi tapahtua hapetuspelkistysreaktio.

Screen Shot 2015-02-13 at 23.00.33

Katodilla voi tapahtua seuraavat pelkistysreaktiot.

Screen Shot 2015-02-13 at 23.00.52

Ja näistä tapahtuu veden pelkistyminen. Sillä sen vaatima energia on pienempi. Anodilla taas vastaavat reaktiot ovat.

Screen Shot 2015-02-13 at 23.00.58

Joista tapahtuu veden hapettuminen. Kuitenkin näiden kahden reaktion energiat ovat sen verran lähellä toisiaan, että oikeasti sekä happi- ja kloorikaasua muodostuu. Huomataan myös, että vähimmäisjännite mitä tarvitaan reaktion aikaan saamiseksi on on 2,06 volttia. Tämä on kuitenkin vain teoreettinen arvo ja todellisuudessa tarvitaan enemmän.

Anodiksi kytketään kaiverrettava kappale ja katodiksi olisi syytä valita samaa metallia, mikäli halutaan välttyä pieniltä ongelmilta. Itse tyydyin ihan johtimen kupariin.

Jotta jotain järkevää saadaan kaiverrettua, tarvitaan jonkinlainen sapluuna. Köyhän miehen ratkaisu on käyttää esim. kynsilakkaa ja raapustaa haluttu kuvio pois. Itse avasin Illustratorin ja vinyylileikkurilla leikkelin halutut sapluunat.

IMG_0711Lopulta päästää itse asiaan. Jännitelähteeltä ei hirveästi vaadita. Kunhan on tasajännite. Hätätapauksessa 9V-paristokin käy. Nopeus on suoraan verrannollinen piirin läpi kulkevaan virtaa. Kun resistanssi pysyy lähes vakiona, virtaa saadaan kasvatettua jännitettä nostamalla.

IMG_0718

Pumpulipuikko osoittautui sopivaksi tähän. Kannattaa myös huomioida tuuletus. Sillä reaktiossa muodostuu vety-, happi- ja kloorikaasuja.

IMG_0720

Lopputuloksena saadaan erittäin siistiä ja tarkkaa jälkeä. Ainakaan oman käden vakaus ei tähän riittäisi. Piirin resistanssi näytti pyörivän siinä 100 ohmin hujakoilla ja 0,2 A virralla riitti 10-20 sekunnin ‘kaiverrus’. Lopulta tuli myös merkattua omat työkalut. Lisää aiheesta voi etsiä googlella.

Posted in Jotain aivan muuta | Tagged , , | Leave a comment

Puukko

Tällä kertaa homma eksyi kauas bittien nypläämisestä. Sillä eräs yö tuli YouTubea selailtua ja törmättyä puukon tekemiseen. Viimeksi tehnyt yläasteella puukon valmiista terästä ja homma eskaloitui lopulta siihen, että koko terä tuli taottua. Asiaa sen enempää pohtimatta ilmoittauduin kurssille, kun taonnasta ollut mitään kokemusta.

Teräkset ovat nykyään niin tasalaatuisia, että  taonnalla ei saavuteta enää muuta hyötyä, kun hippusen verran materiaalin säästöä. Itse taotussa terässä on silti kuitenkin oma hohtonsa.

Valitettavasti taontaprosessista ei kuvia ole. Johtuen ihan siitä, että puhelin oli jossain ihan muualla, kun taskussa. Silmälasitkin kannattaa jättää pois. Sillä linssien pinnoitteet eivät tykkää korkeista lämpötiloista.

Taottu terä

Terän alkuna oli palanen (~8 cm) hopeaterästä. Jos joku on kiinnostunut taonnan eri vaiheista, niin en keksi pyörää uudestaan. Lopputuloksena on jo etäisesti terää muistuttava kapistus.

Muotoon hiottu

Terä suunnilleen lopulliseen muotoonsa hiottu. Tällä hetkellä ruotoa on ihan turhan paljon. Sillä en halua niitata sitä kahvan päähän kiinni.

IMG_0773

Vaivalla venytetystä ruodosta on enää jäljellä muisto. Eipä se haittaa. Seuraavaksi alkaa ikävin osuus. Kahvan ja terän väliin tarvitaan hela.

IMG_0774

Helamateriaaliksi tuli uushopea. Muutaman tunnin viilailun jälkeen aletaan olemaan jo lähellä. Lopputuloksen pitäisi olla sellainen, että yhtään päivän valoa ei saisi paistaa helan ja terän välistä. Muuten terä saattaa katketa helposti.

Karkaistu teräTerä pitää myös karkaista ja päästö hehkuttaa. Lopputuloksena pitäisi nyt olla terä, jolla pystyy veistämään alkuperäisestä hopeateräksestä ohutta viilua. Jos näin ei ole, niin karkaisu on epäonnistunut ja homma uusiksi.

IMG_0781

Karkaisun jälkeen voidaan siirtyä terän loppukäsittelyyn. Hiomapaperia ja vettä. Toinen aikaa vievä vaihe.

IMG_0784

Alustavan kiillotuksen jälkeen se näyttää jo hyvältä. Taonta pinta antaa myös oman yksilöllisen silauksensa.

IMG_0795

Terän tekemisen jälkeen puun työstäminen tuntuu leppoisalta ja vaivattomalta puuhalta. Kahvan materiaaliksi valikoitui Amboynapuu ja visvakoivu.

IMG_0796

Lopullinen muoto on melkein saavutettu ja puukko alkaa istumaan omaan käteen varsin mainiosti.

IMG_0797

Öljyämisen jälkeen puun kuviointi ja väri herää ihan toisen lailla eloon. Lopputulos miellyttää ainakin omaa silmää.

Lesta

Jotta terä ei tuhoa tuppea, niin se tarvitsee tupen sisälle lestan suojaamaan nahkaa. Lestan teossa on se hauskuus, että siinä voi apuna käyttää juuri syntynyttä puukkoa.

IMG_0830

Koska halusin etusormille tehdä kahvaan syvennyksen, niin se aiheuttaa omat ongelmansa tupen ompelussa. Nahka kun kutistuu kuivuessaan, niin kyseinen kohta piti täyttää jollain. Muuten puukko jämähtäisi tupen kuivuessa tupen sisään.

Tuppi

Tupen ompelussa on tärkeintä saada kaikki löysä nahka manklattua pois, jotta tupesta saadaan riittävän tiukka. Tärkeää on myös jättää kahvan paksuin kohta muutaman sentin tupen sisään. Jos kaikki onnistuu, niin puukko loksahtaa tuppeen ja eikä se sieltä omin päin lähde pois. Tuppi ommellaan aivan normaalisti satulasepän ompelella. Eli molemmilta puolilta samaan aikaan läpi, solmu ja kiristys. Solmu estää jo ommellun osan löystymisen.

IMG_0858

Loppusilauksena nimikirjaimet terään. Kaiverrus tuli tehtyä käyttäen hyväksi elektrolyysiä. Mahtavaa olla teorian ja käytännön risteyskohdassa.

IMG_0842

Tein itse, en säästänyt.

 

Posted in Jotain aivan muuta | Leave a comment