TFT pokusy s CPLD Už delší dobu se mi doma povalují dva barevné 640x480 TFT moduly. Video-paměť s řadičem pochopitelně nemají (u větších modulů nebývá nikdy), takže je potřeba je budit obdobně, jako CRT: je třeba neustále obnovovat obraz se snímkovou frekvencí cca 50-60Hz (pixel clock okolo 25MHz). Tj. datový tok přes 50MB/s. Vyřešit to s malými 8-bit MCU nelze, a s většími jsem zatím neexperimentoval, ale naštěstí se mi už nejakou dobu doma povaluje vývojová deska s hradlovým polem XILINX CoolRunner2 XL (XC2C256), která se k tomuto účelu skvěle hodí. Toto CPLD by mělo být více než dostatečné pro realizaci vlastního řadiče. 1. Bitmap ping-pong
Po jednoduchých pokusech s barevnými pruhy a spol. jsem zkusil zobrazit malý bitmap.
XC2C256 sice neumožňuje zadrátovat zrovna velký rastr, ale na pár stovek pixelů ještě jeho vnitřní
struktura stačila.
TFT modul je připojen se statickým ENABLE signálem, takže viditelná oblast modulu začíná
na pevné pozici dle datasheetu (pomocí tohoto signálu lze posouvat začátek řádků). Protože jsem potřeboval ušetřit
pár pinů na konektoru kitu, je modul připojen pouze 16-ti bity místo plných 18-ti, ale neměl by být problém to rozšířit.
Demonstrační prográmek je napsán v prostředí XILINX ISE 9.2 ve VHDL.
Vzhledem k tomu, že zkušenostmi v tomto jazyce zatím zrovna neoplývám, tak kód zřejmě nebude zdaleka optimální ani přehledný,
nicméně se zdá být plně funkční. 2. Rotozoomer
Tento prográmek generuje jeden z nejzákladnějších demo efektů: roto-zoomer. Může to sice vypadat složitě, ale ve skutečnosti je to pouze vektorová rotace souřadnicového systému, jen zapsaná iterativně: // precalculate sin/cos coefficients dsin = scale*sin(angle); dcos = scale*cos(angle); // render surface x = 0; y = 0; for(j=0;j<rows;j++) { x = xrow; y = yrow; for(i=0;i<columns;i++) { // new pixel x += dcos; y += dsin; // get source image pixel pixel=GetSourceRasterPixel(x % xsize, y % ysize); // put it on current surface position PutPixel(pixel, i, j); } // new row xrow += dsin; yrow -= dcos; } Jak je patrné ze zdrojáku, algoritmus je skutečně triviální a jediný potenciální problém na CPLD je funkce sin() a cos(). Pochopitelně nelze uložit kompletní lookup tabulku s dostatečně jemným krokem a ani interpolace, byť iterativní nebude to pravé. Zkusil jsem tedy uložit pouze jednu půvlnu ve 32 bodech a to ve formě diferencí sousedních bodů. Tím se tabulka zkrátila na 2x32x5 bitů. To už se do použitého CPLD vešlo. Tabulka zároveň obsahuje modulaci měřítka (zoomer efekt). Rotace sice není zcela plynulá, ale při vyšší rychlosti se to moc neprojeví. Protože s prostou šachovnicí to fungovalo, zkusil jsem transformovanými souřadnicemi indexovat malý bitmap. Po pár optimalizacích se to všechno vešlo:
Antialiasing tam ale asi nedostanu. :-) 3. Rotozoomer + barevný bitmap
Další a asi poslední můj pokus s tímto efektem bylo vyřadit generátor "duhy" a zkusit implementovat nějaký
mikroskopický RGB obrázek. Po úpravě utilitky na převod BMP do VHDL funkce na RGB a dostatečném ořezání barev se to kupodivu
vešlo i když už optimalizátor už musel bufferovat některé výstupy, aby od nich mohl tahat zpětnou vazbu. I přes hromadu
warningů to ale prošlo. (c) 2012, Stanislav Mašláň - Všechna práva vyhrazena.
|