Sadržaj:

Zynq sistem za poboljšanje slike: 7 koraka
Zynq sistem za poboljšanje slike: 7 koraka

Video: Zynq sistem za poboljšanje slike: 7 koraka

Video: Zynq sistem za poboljšanje slike: 7 koraka
Video: Embedded FPGA - поднимаем Linux на Zynq-7000 2024, Juli
Anonim
Zynq sistem za poboljšanje slike
Zynq sistem za poboljšanje slike
Zynq sistem za poboljšanje slike
Zynq sistem za poboljšanje slike

Kao što ste vjerojatno mogli zaključiti iz naslova, cilj ovog projekta je napraviti sistem za poboljšanje slike pomoću ZYNQ ApSOC -a. Preciznije, želimo izgraditi sistem koji može ukloniti maglu sa slika ili video zapisa. Ovaj sistem će u lošim uslovima uzeti vizuelne podatke kao ulaz, obraditi ih koristeći tehnike poboljšanja slike, a zatim ispisati rezultat.

Projekt je izgrađen i testiran na Digilent Zybo ploči, ali bi trebali raditi i drugi ZYNQ uređaji.

Ovaj projekt ćemo podijeliti na 3 dijela:

1) INPUT = Unos slike preko Etherneta sa računara/kamere

2) PROCES = Obradite sliku

3) OUTPUT = Izlažite sliku putem HDMI interfejsa

Na vrlo kontraintuitivan način počet ćemo s izlaznim dijelom projekta (to će nam usput dati bolje mogućnosti otklanjanja grešaka), nastaviti s unosom i završiti s dijelom za obradu.

Korak 1: Materijali

Materijali
Materijali

Za završetak ovog projekta trebat će vam:

HARDVER

- svaka ZYNQ ploča s HDMI -om i Ethernet -om bi trebala raditi / koristim Digilent Zybo

- USB A do micro B USB kabel

- HDMI kabl

- Ethernet kabel

- Ekran sa HDMI ulazom

SOFTVER

- Xilinx Vivado

- Xilinx SDK

Korak 2: IZLAZ - VGA kontroler, dio 1

IZLAZ - VGA kontroler, dio 1
IZLAZ - VGA kontroler, dio 1

Vizualne podatke ispisat ćemo pomoću HDMI priključka koji se nalazi na ploči. HDMI port je spojen na PL (programabilnu logiku = FPGA) stranu ZYNQ -a i za to ćemo morati dizajnirati kontroler u VHDL -u. Ako ste ikada dizajnirali VGA kontroler, bit će vam vrlo sličan. Vremena za HDMI i VGA su zapravo ista, u stvari možete nadograditi postojeći VGA kontroler da biste dobili HDMI kontroler.

Za bolje razumijevanje onoga što se zapravo događa prvo ćemo dizajnirati VGA kontroler

Želimo prikazivati u rezoluciji 1920x1080.

VGA kontroler je odgovoran za slanje podataka o pikselima (u RGB formatu) sekvencijalno, piksel po piksel na ekran. Izvan stvarne površine ekrana od 1920x1080 postoje i neka "granična" područja, naime: prednji trijem, zadnji trijem i uvlačenje. Veličina ovih područja u pikselima je standardna i specifična za svaku rezoluciju. Ova područja se NE pojavljuju na ekranu, ali su obavezna i boja piksela u ovoj oblasti mora biti crna. Valjano pitanje bi bilo zašto su potrebna ta dodatna područja. Ovo pitanje prkosi svrsi ovog uputstva, ali ako vas zanima, ohrabrio bih vas da dodatno istražite na internetu.

Ovo je dobar video koji objašnjava VGA sučelje

U našem slučaju želimo prikazati u rezoluciji 1920*1080, a ovo su vremena:

Horizontalno područje prikaza = 1920 piksela

Horizontalni prednji trijem = 88 piksela

Horizontalni zadnji trem = 148 piksela

Horizontalno povlačenje = 44 piksela

Okomito područje prikaza = 1080 piksela

Vertikalni prednji trijem = 4 piksela

Vertikalni zadnji trem = 36 piksela

Vertikalno povlačenje = 5 piksela

(Ovdje možete pronaći termine za druge rezolucije

Dakle, naša stvarna rezolucija će biti 2200 x 1125. Želimo 60 fps (sličica u sekundi), pa će naš sat piksela biti 60*2200*1125 = 148,5 MHz. Na Zybo ploči je predviđen sat od 125 Mhz. Koristit ćemo MMCM IP za generiranje takta piksela od 148,5 MHz koji nam je potreban.

Korak 3: IZLAZ - VGA kontroler, dio 2

IZLAZ - VGA kontroler, dio 2
IZLAZ - VGA kontroler, dio 2

S teorijskom podlogom iz prethodnog koraka trebali biste moći dizajnirati vlastiti VGA kontroler. Dostavit ću vam projekt Vivado koji to radi, ali savjetujem vam da barem pokušate sami to napraviti sami.

Većina VGA portova ne daje vam 8 bita po kanalu u boji po pikselu (pogledajte gornju sliku) pa ćete morati prilagoditi dizajn broju pinova po boji koju ploča pruža (ovo ipak nije problem za HDMI).

Design će obojati cijeli ekran plavo, osim gornjeg lijevog piksela koji će biti crven. Treba napomenuti da ovaj projekt koristi ograničenja za ZYBO odbor. Dakle, ako želite pokrenuti ovaj projekt na drugoj ploči, trebali biste ažurirati datoteku ograničenja i prilagoditi broj pinova po boji.

Pogledajte sliku br. 2. Zapamtite da, iako naš VGA kontroler emitira 5/6 bita po boji, ti se bitovi pretvaraju u jedan analogni signal za svaki kanal u boji (crveni, zeleni i plavi) prije prolaska kroz kabel.

Korak 4: IZLAZ - HDMI kontroler, dio 1

IZLAZ - HDMI kontroler, dio 1
IZLAZ - HDMI kontroler, dio 1

Sada kada znamo kako VGA kontroler radi i imamo radni dizajn, možemo nastaviti s HDMI kontrolerom. HDMI kontroler će zapravo koristiti sav kôd koji smo razvili u VGA kontroleru. HDMI i VGA koriste isto vrijeme i iste signale. Razlika se pojavljuje na izlaznim pinovima.

Dok VGA koristi jednu žicu za svaku boju i prenosi analogni signal preko nje, HDMI prenosi podatke digitalno po 1 bit za svaku boju i koristi diferencijalnu signalizaciju. Diferencijalna signalizacija znači da za svaki bit HDMI ima 2 pina s jednim suprotnim od drugog. Dakle, ako želimo prenijeti signal '1', prenijeli bismo '1' na žicu, a '1' negirali na drugoj žici. Ovo osigurava integritet signala i više o tome možete pročitati ovdje https://goo.gl/6CPCzB. Imamo jedan od ovih kanala za svaku boju, CRVENU, ZELENU i PLAVU i jedan za sat. Zbog specifičnosti diferencijalne signalizacije signali koje šaljemo putem hdmija moraju biti istosmjerno uravnoteženi, što znači da broj jedinica 1 i 0 moraju biti približno jednaki u određenom vremenskom periodu. Da bismo to postigli, koristit ćemo kodiranje 8b/10b. Možete saznati mnogo o tome kako funkcionira diferencijalna signalizacija i kodiranje 8b/10b iz DVI specifikacije ovdje https://goo.gl/hhh8Ge (DVI i HDMI koriste iste video signale).

Korak 5: IZLAZ - HDMI kontroler, dio 2

IZLAZ - HDMI kontroler, drugi dio
IZLAZ - HDMI kontroler, drugi dio

Dosta teorije, idemo na naš projekt. Dok smo u VGA kontroleru uspjeli sa taktom od 148,5 MHz, ovdje ćemo morati osigurati 10 puta veću frekvenciju jer želimo prenijeti 8 bitova za svaku boju i koristeći kodiranje 8b/10b koje prevodi 10 bita po pikselu i 10 *148.5MHz = 1485MHz. To je ogromna frekvencija koja se ne može dobiti na Zybo ploči. Srećom, dobili smo nekoliko trikova u rukavu. Možemo upravljati 5*148.5MHz = 742.5MHz i koristit ćemo OSERDES (serializer) IP za prijenos podataka i na rastućoj i na padajućoj ivici takta 742.5Mhz, tako da ćemo podatke zapravo prenositi na 1485MHz. Vivado će nam dati neka upozorenja o vremenu i uvijek biste mogli ići na nižu rezoluciju s manjim satom, ali budući da radi, zasad nam to ne smeta (upozorenja su povezana s činjenicom da međuspremnici sata nisu službeno podržavaju frekvencije veće od 464MHz).

Dakle, ono što trebamo učiniti je kodirati podatke iz izlaza našeg VGA kontrolera u 8b/10b formatu, a zatim ih serijalizirati kao što je gore spomenuto. Morat ćemo također dodati još jedan MMCM u projekt za generiranje takta od 742.5MHz za serializaciju.

Priložio sam ispod vhdl datoteke za koder i serializer. Najprije morate kodirati RGB kanale, a zatim ih serijski serizirati.

Primjer za crveni kanal:

TMDS_encoder_RED: TMDS_encoder

karta porta (clk148, red_channel_8bits, c_red, video_on, encoded_red_10bits);

Serialiser_RED: Serialiser10_1

karta porta (clk148, clk742, encoded_red_10bits, reset, red_serial_1bit);

"C" ulaz u TMDS_encoder je "00" za crvenu i zelenu boju i "vsync & hsync" za plavu (ovo je dio DVI specifikacije

Korak 6: Prikaz slika iz RAM -a

Prikaz slika iz RAM -a
Prikaz slika iz RAM -a

Svrha HDMI kontrolera je prikaz obrađenih slika. Sada, kada je kontroler implementiran i spreman za rad, trebali bismo razmisliti o napajanju ovog kontrolera podacima. S obzirom na to da će se mnogo procesa poboljšanja slike odvijati u PS -u (sistem za obradu = ARM procesor), a dobivene slike će se nalaziti u DDR RAM -u. Dakle, potreban nam je način da podatke iz RAM -a prebacimo na HDMI kontroler.

Da biste to postigli, potrebna su vam 3 IP -a:

1) VDMA (Video Direct Memory Memory)

2) VTC (video timer kontroler)

3) Stream to Video Out (od sada ćemo ga zvati S2VO)

S2VO će zapravo dati RGB 24BIT signal na izlaz i potrebne HSYNC i VSYNC signale. Tako da možemo izostaviti taj dio HDMI kontrolera.

Te biste IP adrese trebali dodati svom dizajnu, konfigurirati ih i uspostaviti odgovarajuće veze.

Konačno, trebali biste dobiti nešto slično gornjoj shemi.

Korak 7: OUTPUT - SDK END

IZLAZ - SDK END
IZLAZ - SDK END

Sa svim hardverom postavljenim i spremnim za rad, sada moramo izgraditi softver u PS -u. Izvozit ćemo hardver i bitstream i pokrenuti SDK.

1) Datoteka -> Izvoz -> Izvezi hardver -> Provjeri Uključi bitstream i pritisnite OK

2) Datoteka -> Pokreni SDK

U SDK -u kreirajte novi projekt aplikacije.

3) Datoteka -> Novo -> Aplikacijski projekt

4) Odaberite naziv za svoj projekt i pritisnite Dalje

5) Odaberite predložak "Hello World" i pritisnite Finish

Aplikacija u SDK -u morat će programirati VDMA. Postoje neke standardne funkcije koje se koriste da bi se to postiglo (ići ću u detalje kad budem imao vremena).

Kako bismo testirali naš dizajn, upotrijebit ćemo funkciju SDK Restore (Xilinx Tools -> Dump/Restore) da stavimo sliku u DDR RAM memoriju i prikažemo je pomoću našeg HDMI kontrolera. Sliku možete učitati gdje god želite (osim nekih malih ograničenih područja na početku memorije). Za naš primjer odabrali smo adresu 16777216 i veličinu datoteke 8294400 = 1920*1080*4 (4 kanala = RGB + alfa).

Radi !

Nastavlja se

Preporučuje se: