FPMI-80

Tím názvem si nejsem ještě moc jistý, ale nějak tak by to mohlo být. Je to zkrátka PMI-80 ve FPGA.

Moje hraní s FPGA kity a s jazykem VHDL nemohlo zůstat bez následků. Navíc jsem tu už psal o tom, že jsem sehnal hezký bublinový displej a „vyntyč“ klávesnici. Sice původní myšlenka byla využít ATMegu a nějak to spájet, ale když mám ten levný kit

Výchozí situace byla takováto: Mám klávesnici bez popisků, tak jsem si udělal sadu popisků. 0-9 a A-F zůstanou stejné, no a ten zbytek budu moct prohodit třeba za KIM-1 nebo TEMS nebo BOB nebo – prostě tak!

IMG_20150725_132927

Na eBay jsem sehnal za levno dva displeje HP 5082-7441, což je něco jako CQYP95 nebo NSA1198, zkrátka devítimístný LED displej. Originální VQD30 není, ale i jiní nahrazují

Klávesnici jsem chtěl původně spájet do matice 3×8 plus jedno dedikované tlačítko pro RESET, ale pak jsem si řekl: Proč? Vždyť můžu nechat tu matici 5×5 a takhle to přivést do FPGA! A dokonce i bez další bižuterie, protože pull-upy mi udělá FPGA.

Jak s displejem? No, originál to řeší tranzistorovými budiči a dekodérem, já to (zase) jako to prase prostě připájel 1:1 na vývody FPGA (dá se omezit proud, co jimi teče) a budím to přímo 3.3V logikou. Poznámka pro zneklidněné čtenáře: To víte že tam jsou odpory!

Chvíli jsem si pálil prsty pájkou (mentální poznámka: Musím si přivézt svěrák!) a pak to připojil ke kitu. Je pátek, čtyři hodiny odpoledne.

První test bylo jen blikání segmenty. Já vám řeknu, ta radost, když to šlapalo…

IMG_20150725_095426

Fajn, co dál? Šel jsem si na Nostalcomp pro moudra (schéma, monitor atd.) a udělal postupně: RAMku, ROMku (napsal jsem si převodník z .bin do .mif) a CPU.

A tady začalo mé trápení. Použil jsem nějaké VHDL jádro 8080, co je mikroprogramované a malé. Perfektní, hurá, ale neseje to.

O krok dál: udělal jsem si modul ve VHDL, který má 3 vstupy: data1, data2 a adresa (8, 8 a 16 bitů) a výstup jako hexadecimální znaky na ten LED displej. Jo a podtaktoval jsem 8080 na 2Hz, abych to viděl prostým okem. Modul připojený na adresovou sběrnici, datovou sběrnici, na výstup z ROM, a jedeme. Syntéza, nahrání, sledovat čísla. Syntéza, nahrání, sledovat čísla. A furt dokola.

Nic. CPU na „test NOPem“ běží. Bohužel, běží úplně stejně i s reálnými instrukcemi.

Sedmá večer. Zkouším použít jinou 8080. Pak ještě Z80. Pak zase zpátky tu původní, zkouším laborovat s nestandardním signálem VMA, a tu náhle… Instrukce skoku vyvolá změnu adresy, jupí! Takže jádro procesoru pracuje!

Devět večer. Už to nějak proběhne, takže implementuju 8255 a spouštím… a nic!

Znovu laboruju, kolem jedenácté zjišťuju, že problém je jinde. Totiž – nevrátí se mi procesor z podprogramu a místo toho někde bloumá. Podstrkuju mu vlastní testovací kód, a zjišťuju, že nějak nefunguje zápis do RAMky, nebo čtení z RAMky. Respektive funguje buď jedno, nebo druhé.

Dobře, místo modulu RAM používám svou implementaci polem. Výsledek je furt stejný. Le frustrace!

Zapojuju do celého obvodu skvělou Alteráckou funkci System-in Probe a čtu signály. Hm, hm, je to velmi divné. Simuluju jádro toho procesoru v ModelSIM. Aha, aha… čtení je posunuto proti datasheetu o jeden takt, a v tu chvíli už je na datové sběrnici něco jiného, protože to nedrží RD… ááááá…

Jdu spát. Ještě před usnutím si říkám, že to celé zahodím a postavím to na podvozku od Granta Searla.

V sobotu v osm ráno zapínám Quartus, nahrávám Grantův Multicomp, nechávám v něm jádro Z80 a zkusím si spustit ten testovací kód. Něco je velmi, velmi blbě! Neběhá ani ten Grantův stroj. Nepomáhá nic. Ještě zkusím 6502 – a výsledek je tristní: Procesor se proměnil v šestnáctibitový čítač a čítá od nuly!

Strašný. V poledne opouštím tuhle neplodnou linii, vracím se zpátky ke včerejším experimentům a v návalu osvícení nahrazuju RAMku dvouportovou. Když není jádro procesoru schopné udržet adresu ještě ve chvíli, kdy čte, tak to musím vymyslet nějak jinak. A dvouportová s latchovanou adresovou sběrnicí pomohla. Ve 12:17 to vypadalo, že co do RAMky PUSHnu, to z ní taky POPnu!

Ve 12:25 se poprvé objevil známý nápis.
IMG_20150725_122339

Jo, je to pozpátku, ale to je nejmenší detail! Stačí obrátit pořadí pozic.

Napsal jsem modul na obsluhu matice kláves. S kmitočtem 50 kHz scannuje řádky a výsledek ukládá do pole 25 bitů. Co klávesa, to jeden bit. No a za tenhle modul jsem si napsal modul, který těch 25 vodičů přemapoval na signál Reset, na signál Int a na tři výstupní bity (multiplexované z čtyř vstupních). Připojil jsem to na virtuální 8255 a – nic!

Nepřekvapilo mě to. A tak jsem zase experimentoval s hexadecimálním displejem (klávesnice se ukázala jako naprosto perfektní, šlapala na první dobrou), 2Hz procesorem, logickou virtuální sondou, a tak, viz výše. Když jsem vyloučil různé jiné příčiny (nefunkční 8255 a tak), tak jsem šel už najisto: Bylo to tak! Jednak vznikaly úplně divné PIOCS, jednak adresa držela, ale procesor poslal IORD (tak mu PIO dalo data), ale přečetl si je až v dalším taktu (a na něj si IORD shodil, takže na sběrnici bylo zase velké nulové).

Vyhodil jsem Grantův dekodér sběrnice (kombinační) a udělal ho podle sebe, procesem a s datovým latchem, spouštěným signálem RD. Test s logickou sondou ukázal, že data drží… takže… takže…?

Nahodil jsem plnou ROM, přepnul hodiny zpátky na plný kotel, přeložil, nahrál, objevilo se „PMI -80“, já stisknul klávesu – a byl tam! Otazníček maličký…

IMG_20150725_160822

Protože si pamatuju, jak jsem psal emulátor a jaké mrzení bylo s mapováním kláves (jo, to schéma, co je na internetech, není moc dobré a občas člověk netuší, jestli je to klávesa 6, 8 nebo B), tak jsem ani nedoufal, že by to snad mohlo fungovat napoprvé.

A víte vy co? Fungovalo!

IMG_20150725_160830

Bylo 16:16, a já si vzal do pravé ruky mobil s kamerou, levou jsem naťukal první program…

Trvalo to nějakých 15 hodin, ale mám funkční VHDL repliku PMIčka. Ještě bych mohl pořešit load a save (třeba sériovým portem a přes USB do PC, ne?), ale hardware funguje. Až to trochu dočistím a vyhezkám, tak hodím zdrojáky ven…

Příspěvek byl publikován v rubrice Hardware se štítky , , , . Můžete si uložit jeho odkaz mezi své oblíbené záložky.