Cuprins:

Sistem de îmbunătățire a imaginii Zynq: 7 pași
Sistem de îmbunătățire a imaginii Zynq: 7 pași

Video: Sistem de îmbunătățire a imaginii Zynq: 7 pași

Video: Sistem de îmbunătățire a imaginii Zynq: 7 pași
Video: M. Isărescu: “Concilierea ajută la îmbunătățirea imaginii băncilor“ 2024, Iulie
Anonim
Sistem de îmbunătățire a imaginii Zynq
Sistem de îmbunătățire a imaginii Zynq
Sistem de îmbunătățire a imaginii Zynq
Sistem de îmbunătățire a imaginii Zynq

După cum probabil ați putea distinge din titlu, scopul acestui proiect este de a crea un sistem de îmbunătățire a imaginii folosind ZYNQ ApSOC. Mai precis, dorim să construim un sistem care să elimine ceața din imagini sau videoclipuri. Acest sistem va prelua în condiții proaste date vizuale ca intrare, le va prelucra folosind tehnici de îmbunătățire a imaginii și apoi va genera rezultatul.

Proiectul a fost construit și testat pe placa Digilent Zybo, dar ar trebui să funcționeze și alte dispozitive ZYNQ.

Vom împărți acest proiect în 3 părți:

1) INPUT = Intrare imagine prin Ethernet de la computer / cameră

2) PROCESARE = Procesați imaginea

3) OUTPUT = Ieșire imagine printr-o interfață HDMI

Într-un mod foarte contraintuitiv, vom începe cu partea de ieșire a proiectului (acest lucru ne va oferi posibilități mai bune de depanare pe parcurs) vom continua cu intrarea și vom termina cu partea de procesare.

Pasul 1: Materiale

Materiale
Materiale

Pentru a finaliza acest proiect, veți avea nevoie de:

HARDWARE

- orice placă ZYNQ cu HDMI și Ethernet ar trebui să funcționeze / folosesc Digilent Zybo

- Cablu USB de la A la micro B

- Cablu HDMI

- Cablu Ethernet

- Afișaj cu intrare HDMI

SOFTWARE

- Xilinx Vivado

- SDK Xilinx

Pasul 2: IEȘIRE - Partea 1 a controlerului VGA

IEȘIRE - Controler VGA Partea 1
IEȘIRE - Controler VGA Partea 1

Vom scoate datele noastre vizuale folosind portul HDMI prezent pe placă. Portul HDMI este conectat la partea PL (Logică programabilă = FPGA) a ZYNQ și va trebui să proiectăm un controler în VHDL pentru acesta. Dacă ați proiectat vreodată un controler VGA, veți găsi acest lucru foarte similar. Momentele pentru HDMI și VGA sunt de fapt aceleași, de fapt puteți construi pe un controler VGA existent pentru a obține un controler HDMI.

Pentru o mai bună înțelegere a ceea ce se întâmplă de fapt, vom proiecta mai întâi un controler VGA

Vrem să afișăm la o rezoluție de 1920x1080.

Controlerul VGA este responsabil pentru transmiterea secvențială a pixelilor (în format RGB), pixel cu pixel pe afișaj. În afara zonei reale de afișare de 1920x1080 există, de asemenea, unele zone „de margine”, și anume: pridvor, pridvor din spate și retracere. Dimensiunea în pixeli a acestor zone este standard și specifică fiecărei rezoluții. Aceste zone NU apar de fapt pe ecran, dar sunt obligatorii, iar culoarea pixelilor din această zonă trebuie să fie neagră. O întrebare validă ar fi de ce sunt necesare aceste zone suplimentare. Această întrebare sfidează scopul acestui instructiv, dar dacă sunteți curioși, v-aș încuraja să faceți mai multe cercetări online.

Acesta este un videoclip bun care explică interfața VGA

În cazul nostru, dorim afișarea la o rezoluție de 1920 * 1080, iar acestea sunt momentele:

Zona de afișare orizontală = 1920 pixeli

Pridvor orizontal Fron = 88 pixeli

Pridvor orizontal = 148 pixeli

Retrase orizontale = 44 pixeli

Zona de afișare verticală = 1080 pixeli

Verandă frontală verticală = 4 pixeli

Verandă verticală din spate = 36 pixeli

Retragere verticală = 5 pixeli

(Aici puteți găsi calendarele pentru alte rezoluții

Deci, rezoluția noastră reală va fi de 2200 x 1125. Vrem 60 fps (cadre pe secundă), deci ceasul nostru de pixeli va fi de 60 * 2200 * 1125 = 148,5 MHz. Pe placa Zybo este prevăzut un ceas de 125 Mhz. Vom folosi un IP MMCM pentru a genera ceasul de pixel de 148,5 MHz de care avem nevoie.

Pasul 3: IEȘIRE - Partea 2 a controlerului VGA

IEȘIRE - Controler VGA Partea 2
IEȘIRE - Controler VGA Partea 2

Cu fundalul teoretic din pasul anterior, ar trebui să puteți proiecta propriul controler VGA. Vă voi oferi un proiect Vivado care face asta, dar vă sfătuiesc să încercați cel puțin mai întâi să îl realizați singur.

Majoritatea porturilor VGA nu vă oferă 8 biți pe canal de culoare pe pixel (a se vedea imaginea de mai sus), așa că va trebui să adaptați designul la numărul de pini pe culoare pe care îi oferă placa (aceasta nu este o problemă pentru HDMI).

Designul va vopsi întregul ecran în albastru, cu excepția pixelului din stânga sus, care va fi roșu. Trebuie remarcat faptul că acest proiect folosește constrângerile pentru consiliul ZYBO. Deci, dacă doriți să rulați acest proiect pe o altă placă, ar trebui să actualizați fișierul de constrângeri și să adaptați numărul de pini pe culoare.

Aruncați o privire la figura nr. 2. Rețineți că, în timp ce controlerul nostru VGA produce 5/6 biți pe culoare, acei biți sunt convertiți într-un semnal analogic pentru fiecare canal de culoare (roșu, verde și albastru) înainte de a trece prin cablu.

Pasul 4: IEȘIRE - Partea 1 a controlerului HDMI

IEȘIRE - Controler HDMI Partea 1
IEȘIRE - Controler HDMI Partea 1

Acum, că știm cum funcționează controlerul VGA și avem un design funcțional, putem continua cu controlerul HDMI. Controlerul HDMI va folosi de fapt tot codul pe care l-am dezvoltat în controlerul VGA. HDMI și VGA utilizează aceleași sincronizări și aceleași semnale. Diferența apare pe pinii de ieșire.

În timp ce VGA folosește câte un fir pentru fiecare culoare și transmite un semnal analog peste el, HDMI transmite datele digital 1 bit la un moment dat pentru fiecare culoare și utilizează semnalizarea diferențială. Semnalizarea diferențială înseamnă că pentru fiecare bit HDMI are 2 pini cu unul opus celuilalt. Deci, dacă am dori să transmitem un semnal „1”, am transmite „1” pe un fir și „1” negat pe celălalt fir. Acest lucru asigură integritatea semnalului și puteți citi mai multe despre el aici https://goo.gl/6CPCzB. Avem unul dintre aceste canale pentru fiecare culoare, RED, VERDE și ALBASTRU și unul pentru ceas. Datorită specificului semnalizării diferențiale, semnalele pe care le trimitem prin HDMI trebuie să fie echilibrate în curent continuu, ceea ce înseamnă că numărul de 1 și 0 trebuie să fie aproximativ egal într-o anumită fereastră de timp. Pentru a realiza acest lucru, vom folosi codificarea 8b / 10b. Puteți afla multe despre modul în care funcționează semnalizarea diferențială și codificarea 8b / 10b din specificația DVI aici https://goo.gl/hhh8Ge (DVI și HDMI utilizează aceleași semnale video).

Pasul 5: IEȘIRE - Partea 2 a controlerului HDMI

IEȘIRE - Controler HDMI Partea 2
IEȘIRE - Controler HDMI Partea 2

Teorie suficientă, să ajungem la proiectul nostru. În timp ce în controlerul VGA am scăpat cu un ceas de 148,5 MHz, aici va trebui să furnizăm de 10 ori frecvența respectivă, deoarece vrem să transmitem 8 biți pentru fiecare culoare și folosind codarea 8b / 10b care se traduce la 10 biți pe pixel și 10 * 148,5 MHz = 1485 MHz. Aceasta este o frecvență uriașă care nu poate fi obținută pe placa Zybo. Din fericire am primit câteva trucuri în mânecă. Putem gestiona 5 * 148,5MHz = 742,5MHz și vom folosi un IP OSERDES (serializator) pentru a transmite date atât pe marginea ascendentă cât și pe cea descendentă a ceasului de 742,5Mhz, deci vom obține de fapt date transmise la 1485MHz. Vivado ne va oferi câteva avertismente de sincronizare și puteți alege întotdeauna o rezoluție mai mică cu un ceas mai mic, dar din moment ce funcționează, nu ne deranjează deocamdată (avertismentele sunt legate de faptul că tampoanele de ceas nu oficial suport frecvențe mai mari de 464MHz).

Deci, ceea ce trebuie să facem este să codificăm datele din ieșirea controlerului nostru VGA în format 8b / 10b și apoi să le serializăm așa cum s-a menționat mai sus. De asemenea, va trebui să adăugăm un alt MMCM la proiect pentru a genera ceasul de 742,5 MHz pentru serializare.

Am atașat mai jos fișierele vhdl pentru codificator și serializator. Mai întâi trebuie să codificați canalele RGB și apoi să le serializați.

Exemplu pentru canalul roșu:

TMDS_encoder_RED: TMDS_encoder

harta porturilor (clk148, red_channel_8bits, c_red, video_on, encoded_red_10bits);

Serialiser_RED: Serialiser10_1

harta porturilor (clk148, clk742, encoded_red_10bits, reset, red_serial_1bit);

Intrarea „c” în codificatorul TMDS este „00” pentru roșu și verde și „vsync & hsync” pentru albastru (aceasta face parte din specificația DVI

Pasul 6: Afișarea imaginilor din RAM

Afișarea imaginilor din memoria RAM
Afișarea imaginilor din memoria RAM

Scopul controlerului HDMI este de a afișa imaginile procesate. Acum, cu controlerul implementat și gata de plecare, ar trebui să ne gândim să alimentăm acest controler cu date. Având în vedere că o mare parte a procesului de îmbunătățire a imaginii va avea loc în PS (Processing System = ARM Processor), iar imaginile rezultate vor locui în memoria RAM DDR. Deci, avem nevoie de o modalitate de a obține datele de la RAM la controlerul HDMI.

Pentru a realiza acest lucru, veți avea nevoie de 3 adrese IP:

1) VDMA (Video Direct Memory Access)

2) VTC (controler de sincronizare video)

3) Transmitere în flux video (vom numi S2VO de acum înainte)

S2VO va furniza de fapt un semnal RGB 24BIT la ieșire și semnalele HSYNC și VSYNC necesare. Deci, putem lăsa acea parte a controlerului HDMI.

Ar trebui să adăugați aceste adrese IP la proiectarea dvs., să le configurați și să faceți conexiunile adecvate.

În cele din urmă, ar trebui să obțineți ceva asemănător schemei de mai sus.

Pasul 7: OUTPUT - SDK END

IEȘIRE - SFÂRȘIT SDK
IEȘIRE - SFÂRȘIT SDK

Cu tot hardware-ul configurat și gata de pornire, acum trebuie să construim software-ul în PS. Vom exporta hardware-ul și fluxul de biți și vom lansa SDK-ul.

1) Fișier -> Export -> Export hardware -> Bifați Include Bitstream și apăsați OK

2) Fișier -> Lansați SDK

În SDK creați un nou proiect de aplicație.

3) Fișier -> Nou -> Proiect de aplicație

4) Alegeți un nume pentru proiectul dvs. și apăsați Următorul

5) Selectați șablonul „Hello World” și apăsați Finalizare

Aplicația din SDK va trebui să programeze VDMA. Există câteva funcții standard utilizate pentru a realiza acest lucru (voi intra în detalii când voi avea timp).

Pentru a testa designul nostru, vom utiliza caracteristica SDK Restore (Instrumente Xilinx -> Dump / Restore) pentru a introduce o imagine în memoria RAM DDR și a o afișa folosind controlerul nostru HDMI. Puteți încărca imaginea oriunde doriți (cu excepția unor zone restrânse mici de la începutul memoriei). Pentru exemplul nostru am ales adresa 16777216 și dimensiunea fișierului 8294400 = 1920 * 1080 * 4 (4 canale = RGB + alfa).

Functioneaza !

Va urma

Recomandat: