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!
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…
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.
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ý…
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!
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…
[sc:ebay item=“mini system CycloneII EP2C5T144″] [sc:ebay item=“1pc White Keyboard 5×5 25 keys“]