MiST TVC

Sorrendben ez volt a harmadik magyar gép, amit elkezdtem FPGA-n imeplemenálni a Primo és a HT1080Z után. Hardveres szempontból is ez tekinthető a legösszetettebb feladatnak, hiszen a TVC az előző két géphez képest sokkal bonyolultabb volt, mind az alaprendszer, mind a megjelenítő áramkör tekintetében. Persze ma már elég "gyerekesnek" tűnnek a gép képességei, de saját korában a hardver igenis fejlettnek számított. Ráadásul úgy, hogy nem taralmazott igazán céláramköröket, a Z80 CPU és a Motorola 6845 CRTC video address generátor áramkörök kivételével minden egyéb funkciót hagyományos TTL áramkörök (a 74LS sorozat tegjai) valósítottak meg.

Csak röviden a TVC alapvető paraméterei: - 3 grafikus mód felbontás és színek száma szerint (Horiz x Vert x Colors): 512x240x2, 256x240x4 és 128x240x16 - 64K RAM és 16K videó ram, valamint 16K+4K Basic+OS ROM. A memóriát 16K-s lapozással lehetett elérni - programozható hanggenerátor (TTL számláló) - 6845 CRTC áramkör a videocímek és a szikronjelek előállításához - Composite video és analog RGB (+SYNC) kimenet - Beépített botkormány és két külső botkormány csatlakozó - 4 kártyahely különböző bővítések számára. Két bővítőegység készült a géphez: Floppy illesztő és RS232-es soros interface kártya

Logikai szempontból több főbb modulra lehet bontani a TVC-t, ezeket saját szempontok szerint - az FPGA-ban történő megvalósítás logikáját követve - határoztam meg. Természetesen a dokumentáció és a kapcsolási rajzok is sokat segítettek, napokat töltöttem el a tanulmányozásukkal, az egész TVC rendszer megismerésével. A főbb modulok tehát a következők:
A megvalósításnál mások munkáját is felhasználtam, így a két legfontosabb egység, a Z80 és a 6845 CRTC idegen forrásból származik. A többi egységet magam fejlesztettem ki a kapcsolási rajzok és leírások alapján. Az órajeleket az FPGA belső órajel generátora állítja elő, ebből több is van egyébként, de a lényege, hogy egy bemenő órajelből a DCM és PLL modulok segítségével az FPGA több más órajelet elő tud állítani. Az eredeti TVC-ben a fő órajel 25MHz volt, ennek osztásával álltak elő az alacsonyabb frekvenciák, nevezetesen

- 12.5MHz a pixelórajel 512 pixeles vízszintes felbontás esetében,
- 6.25MHz a pixelórajel 256 pixeles vízszintes felbontás esetében,
- 3.125MHz a pixelórajel 128 pixeles vízszintes felbontás esetében, illetve ez a CPU órajele is,
- 1.5625MHz a "karakter" órajel a CTRC számára, lényegében 8, 4, vagy 2 pixelnek megfelelő ütem felbontástól függően.


Mivel a MiST-ben az operatív tár SDRAM, és annak magasabb frekvencia kell, az én megoldásomban ezért az alapórajel 100MHz, ezt használom, az SDRAM órajelének, illetve ebből állnak elő a fenti frekvenciák megfelelő osztás után. Figyelembe véve, hogy a MiST SDRAM modulnak 8 ciklus kell egy memóriaművelethez, ezekből a számokból következik, hogy a CPU maximális frekvenciája 12.5MHz lehet. Ebben azért van egy kis tartalék így, ha esetleg az órajelet módosítani akarnánk a végső megoldásban.

Megjelenítő

A TVC megjelenítője valójában egy egyszerű shift regiszter volt. A CRTC áramkör előállította a videócímet, amit a megjelenítőnek ki kellett olvasni a videomemóriából. Az eredeti hadrveren a kettős elérés (CPU vs. megjelenítő) kiszolgálására az ún. clock strecthing technikát használták. Ez elég bonyolult, a hardver leírás részletesen taglalja, lényege, hogy ha a CPU és a megjelenítő ugyanakkor akarja elérni a videomemóriát, akkor a megjelenítőnek elsőbbséget kell biztosítani, mégpedig úgy, hogy a Z80 órajelének bizonyos részeit (adott órajel pulzusokat) el kell nyújtani, ezáltal a CPU nem veszi észre, hogy éppen megállították. (A ZX Spectrum ULA áramköre is hasonló megoldást alkalmazott egyébként.) Szerencsére az FPGA-ban erre már nincs szükség. Hasonlóan az előző Primo és HT1080 megoldásokhoz, a videomemóriát az FPGA belső statikus ramjra szolgáltatja, mivel ez dual-port elérést biztosít, a clock stretching-re nincs szükség.

A shift regiszter feltöltése és léptetése mindhárom grafkus módban ugyanaz, uyganakkor a kiolvasás módja, és a falhasznált bitek száma (per pixel) különbözik.
- Kétszínű üzemmódban egy bájt az elvárt, megszokott módon 8 pixelt tartalmaz B7-B6-B5-B4-B3-B2-B1-B0 sorrendben. Az 1 jelenti az írás, a 0 pedig a háttér színét. A bitpárok nem színinformációt tartalmaznak, hanem indexként mutatnak egy kétszínű palettára.
- Négyszínű módban két bit kell egy pixelhez, ebben az esetben az alábbi formában 1C0-2C0-3C0-4C0-1C1-2C1-3C1-4C1. Vagyis az első pixel értéke a 7. és a 3. bit párosa, a másodiké a 6. és 2. bit párosa, és így tovább. A bitpárok nem színinformációt tartalmaznak, hanem indexként mutatnak egy négy elemű színpalettára.
- Tizenhat színű üzemmódban ehy bájt két pixelt tartalamaz, direkt színinformációt az alábbi formában: 1I-2I-1G-2G-1R-2G-1B-2B. Tehát a 16 színű IGRB információt a bitek közvetlenül szolgáltatják.

A fenti megoldás és bitszervezés lehetővé tette, hogy a hardver egyetlen shift regisztert használjon és multiplexerekkel kinyerhető volt a megfelelő szín. Ugyanakkor - véleményem szerint - ez a bitszervezés eléggé menehezítette a fejleszők munkáját, hiszen mind a pixelek, mind nagyobb grafikus objektumok kirajzolása elég összetett feladat volt.
Kissé engem is meglepett, hogy az FPGA megvalósítás (leszámítva a fejlesztői kanyarokat) tulajdojnképpen egyszerűre sikeredett. Nem tagadom, el voltam vele, de amikor végül működni kezdett, egy meglehetősen egyszerű modul kerekedett ki belőle.

A megvalósított mag egyelőre nem támogatja a VGA kompatíbilis kijelzőt, csak a PAL kompatíbilis RGB+Sync mód működik Euro Scart csatlakozón keresztül. A VGA megvalósításánál az a gond, hogy a TVC 240 rasztersort használ, szabványos 640x480-as VGA módban ezért az alsó és a felső keret teljesen eltűnne (240x2=480). Ezzel persze együtt lehet élni, csak elég bután nézne ki. Lehene még használni 800x600-as SVGA módot is, de annak az időzítése teljesen más (nyilván). Még nem döntöttem el, hogy melyik lesz megvalósítva, de valószínű, hogy a TVC esetében ezért két FPGA mag lesz, egy PAL compatíbilis és egy VGA módban dolgozó másik.

Hangkeltés

A hangkeltő áramkör két frekvenciaosztóból épül fel, egy prpgramozható számláncból, amely 12 biten 4046-os osztást tesz lehetővé, illetve egy fix 16-os osztóból. A hanggenerátor órajele 3.125MHz. Az áramkör képes megszakítást generálni, amikor a számlánc a számolás végére ér. A kimenet jelszintjét egy 4 bites DAC szolgáltatja. Mindezeket FPGA-ban megoldani nem volt igazi kihívás (bár elsőre ez sem ment, végülis a 12 bites számláló az valójában 13 bites, hiszen van egy carry bit is). A végső audio jel előállítását egy delta-sigma DAC végzi, igazodva a MiST hardver 1 bites audio kimenetéhez (a TVC esetében mono audio-t generálunk, a jobb- és bal csatornán ugyanaz a hang megy ki).

Memória lapozás

A hardver ismertető ezt a témakört is kimerítően tárgyalja, így a lapozó (Pager) modul összeállítása szinte csak logikai egyenletekre korlátozódik. Kissé bonyolítja a helyzetet, hogy a MiST megvalósításban a TVC ROM is a RAM-ban foglal helyet (az erre szolgáló data_io modul betölti a ROM tartalmát induláskor az SD kártyáról) , de a Pager működését ez nem befolyásolja, mert a ROM és a RAM között magasabb helyiértékű bitek váltásával kapcsolok át, lényegében a ROM a fizikai memóriában 64K felett helyezkedik el, de ezt a TVC nem veszi észre. Tekintve, hogy a MiST-en van 32MB RAM, igazán elfér minden a RAM-ban.

Billentyűzet

A PS/2 billentyűzet illesztésére már volt megoldásom és tapasztalatom a korábbi megvalósítások alapján (Spectrum, Primo). A MiST egyébként USB billentyűzetet használ, de a rendszervezérlő ARM mikrokontroller PS/2 interface-t és scan kódokat használ. Az eredeti PS/2 soros illesztőt valamelyik Digilent példaprogramból vettem, a kódok dekódolását és TVC formátumra átalakítását én oldottam meg. Néhány billentyűt kénytelen voltam funkcióbillentyűkre tenni, és a speciális PC billentyűket is felhasználni (Home, End, Page Up, Page Down), hogy az összes TVC billentyű elérhető legyen. További két funkcióbillentyű segítségével az Y és Z betűket lehet felcserélni, illetve a két joy portot is meg lehet fordítani.

Programbetöltés

A már meglévő TVC emulátorok forráskódjaiból sikerült kiderítenem a .CAS formátumú fájlok betöltésének módját. Valójában igen egyszerű, csak lineárisan be kell másolni a bájtokat a .CAS-ból, bár van egy 144 bájtos header, amit át kell lépni. A MiST On Screen Display (OSD) és a data_io modulok erre szabványos megoldást biztosítanak, így ezek alkalmazásával a betöltést sikerült megoldanom. Ez sem volt egyszerű menet, mert az SDRAM az időzítésekre elég kényes, de pár tucat próbálkozás után megtaláltam a megfelelő kombinációt. Egyetlen kényelmetlen vonzata van a megoldásnak, a .CAS betöltése után még a run parancsot ki kell adni, hogy a program elinduljon.

Képek:
Pár kép esetében jobb szélen látszik a fejlesztéshez Windows 7 pc képe


A CRTC első tesztképe, mutatja a karakter sorokat és oszlopokat


A TVC boot képernyője és a MiST OSD


A Basic bejelentkező képe a hideg reset és programbetöltés után (és pár törölköző a háttérben, uszodában voltunk)


A MiST OSD kijelzője


A MiST OSD kijelzője, TVC .CAS programok listája


A pack man (pac-man) program menüképe


A pack man (pac-man) program játék közben


Downloads:
TVC.RBF - Euro Scart (RGB)
TVC.ROM
TVC.RBF - VGA

Köszönet:
Linkek és referenciák:

[Home | FPGA fejlesztés]