Alapvető képmegjelenítés FPGA alapokon

írta: y@g4n, 3 éve

Helló!

Sikerült egy elektrolumineszcens kijelzőt szereznem egy kiszuperált life-monitor eszközből, 320x256 pixelre és egy szín megjelenítésére képes, árnyalatokra nem.

Manuál: Planar - EL320.256

Van itthon egy Spartan-3E Starter Kit fejlesztői lapkám egy fórumtárs jóvoltából, és ezzel hajtom meg.
Egy jó darabig fogalmam nem volt hogy induljak neki, a manuálban megtalálható időzítési diagramok alapján kezdtem, ezeket akartam egy az egyben lemásolni, de sok sikertelen próbálkozás után elegem lett belőle egy időre.

Egyszer azonban beugrott, hogy egyetemi tananyag volt VGA kijelzők interfészelése, és végülis semmit sem veszíthetek ha kipróbálom a példaprogramot, ami után elsőre természetesen nem működött tökéletesen, de reményre adott okot hogy kaptam képet! Kis idő után rájöttem hogy mi a probléma, nem tetszett neki az órajel meg a horizontal/vertical porchok időzítése, és mivel ISE szimulátorában már láthatóak voltak az adott kimeneteken megjelenő hullámformák, ezeket össze tudtam hasonlítani a manuálban megtalálhatóakkal, és amikor eléggé hasonlított ahhoz, akkor természetesen működött is rendesen.

Első "normális" működés:

Itt pixelenkénti címzés már elérhető teljes mértékben.

A következő elérendő cél amit terveztem az bármilyen fajta képmegjelenítés, tekintve hogy egyelőre ez is csak proof-of-concept projekt, így a legegyszerűbb megoldást választottam, azaz sprite-okat jelenítek meg.
Az ISE BROM generátora nem akart meghajolni az akaratom előtt, így szimplán a chip fabricját használom az adatok tárolására. Kb így:

module prom_DMH(
input wire [3:0] addr,
output wire [0:31] M
);

reg [0:31] rom [0:15];
parameter data = {
32'b00000000000000011100000000000000,
32'b00000000000011001001100000000000,
32'b00000000000001100011000000000000,
32'b00000011111000111110000000000000,
32'b00000111111110000000001111100000,
32'b00001100000111100000111111111000,
32'b00011000000001110001111000011100,
32'b00000000000001110011100000001100,
32'b00000000001111111111000000011100,
32'b00000000011111111110000000111000,
32'b00000000000001110000000001110000,
32'b00011110000000111000000011100000,
32'b00000111000000111100000001100000,
32'b00000011100001111000000000100000,
32'b00000001111111110000000000000000,
32'b00000000011111000000000000000000
};

integer i;

initial
begin
for (i=0; i<16; i=i+1)
rom[i] = data[(511-32*i) -: 32];
end

assign M = rom[addr];

endmodule

Mivel a képernyő minden pixele kettő értéket vehet fel, így minden képet ha a fenti módon akarok megjeleníteni, akkor át kell alakítanom "szöveges bináris" formátumba, azaz egy text file-t hozok létre aminek a tartalma nullák és egyesek sorozata lesz.
Ezt numpy/PIL/scipy segítségével érem el, majd a kelező szöveges file sorai elé beírom a verilogban szükséges prefixet, a fenti esetben 32 bites egy sor tehát 32'b, egy másik generált kép esetén például egy sor 301 karakter hosszú, ez 301 bit, azaz 301'b-t kell a sor elejére tenni.

Ezen szöveges fileokat elhelyeztem a parameter data = { ... } -ba, majd átírtam az M, és az addr értékét, hogy címezhető legyen minden sor, az initialban a feltöltés megvalósításánál is át kell írni pár számot.

Különböző fajta képekkel különféle eredmények születtek, értelemszerűen azok lettek a legjobbak, ahol az eredeti alkotás is fekete-fehér volt, minél nagyobb kontúrral annál jobb.
Komplex, színes képeket nehezen alakít át a szkript, és nagyon fontos neki hogy mekkora a kiindulási anyag.

Eredmények:

Govinda:

Eredetije:

-----------------------------------------------------------------------------------------------------------------------------

Megumin:

Eredetije:

-----------------------------------------------------------------------------------------------------------------------------

Krishna és Arjuna

Eredetije:

-----------------------------------------------------------------------------------------------------------------------------

Krishna:

Eredetije:

-----------------------------------------------------------------------------------------------------------------------------

Narayana:

Eredetije:

-----------------------------------------------------------------------------------------------------------------------------

Kártyával:

Mivel csakis proof-of-concept, nem azzal foglalkoztam hogy mennyi erőforrást eszik egy kép megjelenítése (nagyon sokat), a fejlesztőkártyán azonban található flash és ram is, a jelenlegi to-do az ezek felhasználása hasonlóan képek megjelenítésére.