This is an old revision of the document!
Proiectul Mini GPU isi propune sa emuleze capacitatile de procesare de date RGB ale unui accelerator grafic de baza. Scopul nu este sa fie capabil sa proceseze calcule pentru grafica 3D, ci de a genera un semnal VGA, generand imagini procedurale simple sau primite prin Wi-Fi.
Am pornit de la ideea unui YouTuber cunoscut, Ben Eater, care a facut “cea mai proasta placa video” (video aici), folosind doar circuite integrate. Mi s-a parut o idee interesanta si m-am gandit sa incerc sa fac si eu o placa video putin mai buna, folosind un microcontroller.
Consider proiectul util in scop didactic, ca unealta de a invata bazele procesarii de imagini si cum functioneaza (sau functionau :p) monitoarele.
Pentru generarea semnalelor VGA necesare vizualizarii de imagini pe un monitor compatibil VGA (rezolutie standard 640×480), voi folosi un microcontroller ESP32, montat pe o placa de dezvoltare DevKit-C-1-N8R8. Acesta va fi capabil de a citi imaginea salvata pe un card microSD, sau de a prelua o imagine transmisa prin Wi-Fi si a o salva pe card.
Microcontroller-ul citeste imaginea de pe card si o incarca in memoria PSRAM (pentru acces rapid), transmitand datele RGB corespunzatoare catre un DAC triplu, care va genera semnalele analogice RGB necesare interfetei VGA; totodata, vor fi generate si semnale auxiliare de stingere si sincronizare pe orizontala si verticala. De asemenea, imaginea poate fi si generata procedural (*SAMPLES IN PROGRESS*).
Pentru upload de imagini este deschis un server HTTP, unde se face POST cu datele binare ale imaginii in format *TO BE DECIDED*. La primirea datelor, acestea se salveaza pe card.
De asemenea, microcontroller-ul are conectat prin SPI un ecran LCD, folosit pentru preview al imaginilor si pentru a afisa date despre monitor. Datele despre monitor si modurile de afisare suportate sunt preluate folosind protocolul DDC (Display Data Channel), care comunica cu monitorul, prin I2C, pe unul din pinii de VGA.
La baza transmiterii de semnale video RGB sta un DAC triplu de viteza mare, specializat Video, cu 3 canale pentru R, G, B. Performantele DAC-ului si ale modulului ESP32 permit generarea de semnale pentru afisarea de imagini cu rezolutie de la 640×480 (VGA) in sus, in 16M culori (3x8bits).
DAC-ul are 3 registri de 10 biti pentru memorarea datelor pentru RGB. Deoarece modulul de dezvoltare nu are destui pini GPIO disponibili pentru a face interfatarea direct pe 24 biti, am folosit 3 registri externi cu rol de buffer. Astfel, ESP32 are interfata de date pe doar 8 biti, la care se adauga celelalte semnale pentru controlul sincronizarilor si altele.
Pentru alimentare, se poate utiliza un alimentator de 5V, aplicat pe conectorul micro USB. Placa de dezvoltare un stabilizator la 3.3V, care alimenteaza modulul de ESP32. Afisajul KMR este alimentat cu 3.3V direct din placa. DAC-ul si registrii functioneaza la 1.8V pentru partea digitala; de aceea, am avut nevoie de stabilizator de la 3.3V la 1.8V. Partea analogica se alimenteaza de la 3.3V din placa.
Level shifter-ul dual integrat este unidirectional si este folosit pentru semnalele de sincronizare HSYNC si VSYNC.
Pentru comunicatia pe protocolul DDC2 (intre ESP32 si monitor), am folosit doua level shiftere bidirectionale, pentru SDA si SCL, realizate cu tranzistoarele NMOS.