MiST

A MiST egy Altera FGPA-ra épülő hardver szinten újraprogramozható számítógép, amelynek fő célja a klasszikus 8 és 16 bites gépek újra megvalósítása FPGA áramkörön belül. Az áramkör az FPGA chipen kívül tartalmaz megfelelő mennyiségű memóriát (32 MB), és egy rendszervezérlő Atmel ARM 32 bites mikrokontrllert, amelynek feladata az FPGA programozása (inicializálása), valamint a hozzá kapcsolt I/O egységek kezelése (billentyűzet, egér, botkormányok, SD kártya).


Klikk a képre a nagyításért
A fontosabb részegységek:
  • FPGA: Altera Cyclone III (EP3C25E144)
  • SDRAM: 32MB MT48LC16M16A2, 133MHz SDRAM
  • ARM MCU: AT91SAM7S256 rendszervezérlő, felelős az FPGA indításáért (a megfelelő mag betöltéséért), az I/O és eszközkezelésért
  • SD card: szabványos SD kártya csatlakozó
  • VGA port: 3x6 bit RGB kimenet és két digitális szinkronjel kimenet
  • Audio port: stereo audio kimenet (Delta-sigma DAC konverteller meghajtva)
  • USB ports: 4 db USB Host port billentyűzet, egér, gamepad eszközök csatlakoztatásához
  • Joy ports: 2 db DB9-es csatlakozó digitális botkormányok számára
  • Midi port: szabványos midi csatlakozó


A MiST FPGA elegendően nagy ahhoz, hogy az implementálni kívánt klasszikus vagy retro számítógép teljes egészében elférjen benne (processzor és dedikált custom áramkörök), a mellette lévő 32 MB SDRAM pedig a gép operatív RAM-ját biztosítsa. Nagy színfelbontású (3x6bit) RGB és összetett videójelek generálására is képes, emellett stereo hangot ad ki.
Csatlakoztathatók hozzá modern USB eszközök, és régi digitális (mikrokapcsolós) botkormányok egyaránt.

A MiST implementációról általában

Hasonlóan a valódi hardverhez, a MiST FPGA chipen belül is ki kell alakítani a megfelelő áramköröket, a processzort, a címdekódolást, a megjelenítő és hangkeltő egységeket, valamint az operatív memóriát. A MiST alaplapon található FPGA kapacitása (a tárolt áramkör bonyolultsága, nagysága szempontjából) közepesnek mondható. Bár nem a legújabb technológia az FPGA-k között sem, azért még mindig elegendően nagy, hogy példéul egy Amiga vagy egy Atari ST összes áramköre kényelmesen elférjen benne. Ha tehát egy kisebb gép megvalósítása a cél, akkor nyugodtak lehetünk, hogy a gép "bele fog férni" a MiST-be.

Processzor

A legtöbb retro processzor, amelyek a 90-es évekig népszerűek voltak, ma már léteznek ún. FPGA Soft Core megoldásban, amelyeket le lehet tölteni az opencores.org oldalról. Van Z80, 6502, 8085, Motorola 68000, sőt még az x86-os sorozat néhány tagja is. A Soft Core CPU-k jó közelítéssel ciklusra pontosan ugyanúgy működnek, mint az eredeti fizikai proesszorok (pár eltérés azért van, de ezzel együtt lehet élni). Lévén, hogy az FPGA-n "belül" alakítjuk ki a processzorokat, ezért néhány dolog alapvetően eltérhet, de ezek megint csak olyan eltérések, amelyek kezelése teljesen természetes. Általában nincs például kétriányú adatbusz (egy chip-en belül minek is lenne), hanem a DIN és DOUT buszok elválasztva "léteznek".

Ugyancsak egyszerű, és mindennapos megoldás a Soft Core processzorok esetében a Clock Enable láb megvalósítása, amivel a CPU órajelét engedélyezzük, ezáltal a CPU lényegében ezzel a lábbal "megállítható". De sok ilyen apróság van, ami az FPGA-ra jellemző. Ami számunkra a lényeg, hogy van olyan letölthető, teljesen jól funkcionáló Z80 mag, amit tudunk használni, csak "be kell kötni".

Memória

Az FPGA-k általában tartalmaznak belső nagy sebességű RAM memóriát, de ezek mérete igen korlátozott. A MiST FGPA chipje nagyjából 64 KB statikus RAM-ot tud szolgáltatni. Ez egy hagyományos 8 bites Z80 rendszernek elég lehet, de tudni kell, hogy nem csak a megvalósított gép igényli a memóriát, hanem a MiST konvenciók alapján megvalósítandó egyéb részegységek is, mint például az On Screen Display vagy a sorfrekvencia kétszerező Scan Doubler modulok. Mindezekért a belső memória nem minden esetben elegendő.

A MiST megvalósításánál a legnagyobb kihívást általában az jelenti, hogy a rendszer SDRAM memóriát használ. Ennek a vezérlése összetettebb feladat, mint egy statikus RAM-é. Ráadásul az alkalmazott SDRAM chip sebessége 133MHz, ami alapvetően meghatározza a hozzáférési időket. Szerencsére a MiST-re már számos más gépet implementáltak, ahol ezt a problémát megoldották. Összességében elmondható, hogy a MiST alaplapon található 32 MB SDRAM memória jól használható, a random elérés sebessége kb 60-70 nsec 16 bites egységekben.
(Természetesen BURST módban az SDRAM nagyobb sebességre is képes, ám a legtöbb régi 8 bites rendszernél ez a mód nem a legjobb.)

Az én megoldásaim mindkét memóriát felhasználják, tehát az FPGA belső statikus RAM memóriáját is, és a külső (lassabb) SDRAM memóriát is. Azért persze a külső memória sem annyira lassú. A szabványos MiST SDRAM illesztőnek nyolc CPU ciklus szükséges egy RAM íráshoz vagy olvasáshoz, ha figyelembe vesszük, hogy a legmagasabb frekvencia 133MHz, akkor ebből általában következik az, hogy a CPU 133/8, azaz kb 16MHz-en tud működni. Egy Z80-as rendszer esetében ez azért még így is négyszerese a 80-as, 90-es években használt 3-4MHz órajelnek. Árnyalja a képet persze, hogy legtöbbször a számításoknak fordított irányban kell történniük, mert az a jó, ha az SDRAM frekvenciája "illeszkedik", azaz egész számú többszöröse a megvalósított hardver alapórajelének.

Hogy egy példával szemléltessem: a ZX Spectrum alapórajele 14MHz, ezzel működik az ULA. Ebből a frekcenciából áll elő a 7MHz-es pixel órajel (14/2), és a 3.5MHz-es CPU órajel (14/4). Ha egy ilyen gépet kell megvalósítanunk, logikusnak tűnik a 28, 56, vagy 112 MHz-es SDRAM frekvencia (már a 28 MHz is jó, de ha a tervező esetleg úgy gondolja, hogy a végleges CPU futhat 14MHz-en is, akkor nyilván annak nyolcszorosát választja az SDRAM számára).

Céláramkörök

A hang és kép, vagy tágabb értelembem a custom chip-ek realizáláss jelenti a valódi feladatot a tervezés során. A fentebb leírtakból talán jól látható, hogy egy Z80-as alaprendszer összerakása (CPU, ROM, RAM) egy FPGA-ban igazából nem nagy feladat, 20-30 perces munka. Ha viszont képet akarunk generálni, hangot kiadni, ráadásul úgy, hogy ez az eredeti hardverrel analóg módon működjön, nos, itt kell elkezdeni az érdemi fejlesztést.

Bizonyos áramkörök ebben a témakörben is léteznek. Az opencores.org-ról ltölthetők mindenféle megjelenítők (például nyilvános a ZX Spectrum ULA áramköre), és a fontosabb, a 80-as években divatos hangkeltő chip-es is fellelhetők. Így van AY8910 (YM2149) mag, vagy SID (bár az a mai napig nem tökéletes) is. Természetesen a megvalósítandó célhardver minden esetben fog olyan egyésget tartalmazni, ami még nincs, tehát magunknak kell kialakítanunk.

Billentyűzet, egér, joystick

A MiST alaplapon található egy 32 bites Atmel (ARM) mikrokontroller, amelynek alapvető feladata a rendszervezérlés és az I/O eszközök kezelése. Ez a mikrokontroller felelős az FPGA mag betöltéséért, vagy menet közbeni cseréjéért, valamint kezeli a csatlakoztatott billentyűzetet, egeret, botkormányokat, vagy egyéb játékvezérlőket.

Az alaplapon van két hagyományos DB9-es csatlakozó, amelyek a klasszikus digitális botkormányok használatát teszik lehetővé, illetve van 4 db USB 2.0 Host port, ezekre lehet USB eszközöket csatlakoztatni. A billentyűzeteket és az egereket a firmware jó eséllyel felismeri és képes használni azokat, játékvezérlők esetében pedig létezik egy támogatott lista. Persze ha a vezérlő nincs benne a listában, még akkor is lehet használni, de olyankor további konfigurációs lépések is szükségesek lehetnek. Fejlesztési szempontból mindezen eszközök kezelése igen egyszerű, csupán a megfelelő előre elkészített modult (user_io) kell beilleszteni a design-ba, és onnantól az eszközök használhatók.

A billentyűzet és az egér úgy jelennek meg az FPGA számára, mintha PS/2-es eszközök lennének.

Fájlrendszer

A MiST fájlrendszerét is a fent említett mikrokontroller valósítja meg, az alaplapi SD kártyát használja. Ezen az SD kártyán kell elhelyezni az FPGA makokat, a megvalósított gépek esetleges ROM fájljait, átékokat, snapshot-okat, lényegében mindent. A MiST fejlesztők számrára pár kényelmes eszköz (FPGA modul) rendelkezésre áll ahhoz, hogy bizonyos fájlokat egyszerűen és gyorsan be lehessen tölteni.

Véleményem szerint ez a része a rendszernek kicsit lehetne kidolgozottabb, mert amíg a betöltés gyors és egyszerű, addig a fájlok kiírása sokkal összetettebb feladat a fejlesztő számára. Egyébként ez a megközelítés érthető. A MiST végfelhasználói valószínűleg inkább csak be akarnak tölteni mindenféle programot (jórészt játékokat), azok száma bizonyára kevés, akik mondjuk egy basic programot menteni akarnának a SAVE parancs segítségével.

A MiST video és audio kiemenetei

Az audio kimenet egy egyszerű sztereo RC filteren keresztül vezetett digitális kimenet (két FPGA láb), melyeket egy jól irányzott delta/sigma DAC konvertellel meghajtva megfelelő minőségű analóg audio jelet kapunk. Erre nem is vesztegetnék több szót. Sokkal érdekesebb a video kimenet. A video kimenet egy 3x6 bites (tehát 2^18 szín megjelenítésre képes) analóg RGB kimenet egy VGA csatlakozón. Az, hogy ez a csatlakozó VGA (HDB15), valójában nem jelent semmit. Sem a kimenő frekvenciát, sem a jelek felhasználását nem specifikálja ennél tovább. Igazából így kellene leírni: van rajta 3 db 6 bites DAC kimenet, és két digitális kimenet.

Alapesetben ezeket az RGB színinformáció és a két szinkronjel előállítására használjuk fel, így a kimenet lehet VGA jel, de ez nem szükségszerű. Sőt, a legtöbb esetben nem is az. Amennyiben az adott szabvány feltételeit megteremtjük, ezen jelekkel meghajtható egy VGA monitor, egy TV készülék RGB bemenete (Euro Scart, RGBs), vagy előállítható akár komponens (YPbPr) vagy összetett (CVBS) videójel is. Persze mindezt az adott mag fejlesztőjének meg kell oldania. (Sajnos HDMI egyelőre még nem.)

Én magam két jeltípust favorizálok: a PAL kompatíbilis RGB jelet, amit a TV készülék fogadni képes, ha van Scart bemenete (és azon RGB bemenet), valamit a szabványpos VGA jelet, ha az előállítható, figyelembe véve a megvalósított gép időzítéseit.

A 80-as, 90-es évek mikroszámítógépei túlnyomó részben (Európában, így Magyarországon is) PAL jelet állítottak elő. Abban az időben persze ez még egy RF modulátorra került, és a gép UFH antenna jelet (is) szolgáltatott, ennek minőségéről nem is érdemes beszélni. Aki látta, tudja. Szörnyű. A kompozit video már egy fokkal jobb, de még mindig láthatjuk rajta a jó öreg interferencia hullámokat, amit a színsegédvivő frekcenvcia és felharmónikusai szuperponáltak rá a videojelre. A legjobb minőségű jel akkoriban az analóg RGB és a különálló szinkronjel volt. Ezt a fajta jelet még a mai modern LCD/LED TV készülékek is tudják fogadni általában. Mindaddig, amíg az Euro Scart csatlakozó fennmarad. Persze a jövőben ez a fajta bemenet el fog tűnni a készülékekről, de addig még talán van pár éve.

Logikus megoldás lehet a kijelzésre egy VGA monitor, ezekből rengeteg van ma, igaz használt állapotban, de mégis, sok a működő darab és viszonlag olcsón hozzá lehet jutni. A VGA hátránya viszont, hogy a VGA jel szabványa eltér a PAL-tól, tehát valamiféle konverziót kell végezni. Ez a legtöbb esetben nem is annyira egyszerű feladat. Vegyük sorra az eltéréseket úgy, hogy egy klasszikus 8 bites gép képével hasonlítom össze a VGA jelet: Hát, nem sok minden egyezik. Szerencsére a VGA sorfrekvencia éppen kétszerese a PAL sorfrekvenciának, ezért egy PAL rasztersort kis munkával át lehet alakítani VGA rasztersorrá, ha pedig a PAL jel nem interlace, akkor még jobb, mert két VGA rasztersor pont annyi idő alatt rajzolódik ki, mint egy PAL rasztersor.

A sorfrekvencia megkétszerezése bevált módszer, ezt használják a Scan Doubler áramkörök. Ha egy PAL jelet egy Scan Doubler ilyen módon átalakít, akkor a képsorok már megfelelnek a VGA szabványnak (bár a szinkron- és kiltójeleket ilyenkor is kicsit érdemes tologatni), de a megjelenítő akkor is 624 sort fog generálni, nagyjából 50Hz-es képváltással. Ha ezt a jelet egy VGA monitorra rávezetjük, akkor nemes egyszerűséggel az vagy fog működni, vagy nem. Régi katódsugaras - analóg - monitorok esetében várhatóan fog menni a dolog, LCD és LED monitoroknál viszont inkább nem. Ez végső soron azon múlik, hogy a VGA monitor tolerálja-e az eltérést. Az újabb "lapos" monitorok szigorúbbak, és az ilyen jeleket nem eszik meg.

Van akkor erre megoldás? Igazi megoldás sajnos nincs. Mert azt kellene csinálni, hogy a 624 rastersorból valahol el kellene dobni 100-at, hogy beleférjen a VGA szabványba, illetve az 50Hz frissítésből 60Hz-et kellene varázsolni. Midenféle upscaler termékek léteznek erre, több-kevesebb sikerrel megoldva a feladatot. Ha a megvalósított gép eleve olyan egyszerű, hogy az időzítések eltérése nem befolyásolja érdemben a működését, akkor lehet trükközni.

Az FPGA-ban könnyen megoldható, hogy VGA módban más rasztersorszámot használjon a hardver, mint PAL módban. De ez igencsak a célgép összetettségétől függ. Például egy C64 biztosan nem viselne el ilyen trükköt, hiszen ott az időzítések kritikusak, a rasztermegszakítás nem jöhet "hamarabb". ZX Spectrumnál is van pár erősen időzített játék és demo, ami hibásan működne, vagy mondjuk a border effektek helyett csak villogást kapnánk. De lehet, hogy egy egyszerű játék azért még gond nélkül futna 60Hz-es képfrissítéssel. Itt tehát a VGA kompatíbilis módnál sok kompromisszum és sok-sok munka szükséges, hogy elfogadható képet kapjunk.

Személyes véleményem az, hogy ha autentikus képet akarsz egy régi géppel, akkor használj Scart kábelt és Pal RGB jelet.
Itt lehet róla bővebben olvasni.

Előre elkészített MiST modulok

A korábbi részekben már hivatkoztam ezekere. A 8 bites gépek realizálásánal segítenek ezek az előre elkészített Verilog nyelven megírt modulok.
[Home] [FPGA fejlesztés]