TFT pokusy s CPLD

[eng]

   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.

XILINX CoolRunner2 XL kit XILINX CoolRunner2 XL kit + Sharp's LQ064V3DG01 TFT (640x480x18-bit)

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.
   Schéma připojení TFT k CPLD je velmi prosté, vše je spojeno přímo ve 3V3 logice. Jen jsem měl problémy s chybovostí přenosu, protože displej nějak špatně snášel vysokou strmost hran z CPLD. Projevovalo se to vysazováním synchronizace v závislosti na právě zobrazovaných datech a náhodnými chybami v obraze. Pull-up rezistory nijak nepomohly, zemí je v káblíku sedm, což se zdálo dost, tak jsem zkusil 100R tlumící odpory v sérii se všemi signály a výpadky synchronizace i náhodné pixely zcela zmizely. Hodnota odporů ale pochopitelně závisí na kapacitě kabelu (v mém případě plochý káblík 1.27mm, 10cm délka).

Schéma zepojení

   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.
   CPLD je kvůli snažšímu časování taktováno na dvounásobném taktu (50MHz). Díky tomu lze posouvat fázi hrany pixel-clock signálu vůči interní logice po cca 90°, takže není problém zajistit splnění časování dle datasheetu.

Bitmap test Bitmap test Bitmap test

   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í.
   Zdrojový obrázek je realizován jako funkce "std_logic pixels(integer col, integer row)". K jejímu vygenerování jsem si napsal jednoduchou utilitku, která je součástí přiloženého zipu. Tato utilitka umí převést 24-bit černobílý BMP obrázek do VHDL modulu, který pak lze includovat k projektu. Velikost obrázků není nijak omezená, ale použité CPLD neskousne více, než cca 1000 pixelů (záleží na složitosti obrázku).

Zdrojáky ke stažení: CoolRunner2_TFT_test.zip (1522kB).



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í.

Rotozoomer Rotozoomer Rotozoomer

   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:

Rotozoomer + bitmap Rotozoomer + bitmap Rotozoomer + bitmap

   Antialiasing tam ale asi nedostanu. :-)

Zdrojáky ke stažení: CoolRunner2_TFT_roto.zip (1622kB).


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.

Zdrojáky ke stažení: CoolRunner2_TFT_roto_color.zip (1715kB).

Rotozoomer + RGB bitmap


(c) 2012, Stanislav Mašláň - Všechna práva vyhrazena.

Last update: 15.5.2012 Up