Kazalo:

Zynq sistem za izboljšanje slike: 7 korakov
Zynq sistem za izboljšanje slike: 7 korakov

Video: Zynq sistem za izboljšanje slike: 7 korakov

Video: Zynq sistem za izboljšanje slike: 7 korakov
Video: Wbudowany system do segmentacji i detekcji obiektów zrealizowany na platformie Zynq SoC 2024, November
Anonim
Zynq sistem za izboljšanje slike
Zynq sistem za izboljšanje slike
Zynq sistem za izboljšanje slike
Zynq sistem za izboljšanje slike

Kot bi verjetno lahko razbrali iz naslova, je cilj tega projekta narediti sistem za izboljšanje slike z uporabo ZYNQ ApSOC. Natančneje, želimo zgraditi sistem, ki lahko počisti meglo s slik ali video posnetkov. Ta sistem bo v slabih razmerah kot vhod uporabil vizualne podatke, jih obdelal s tehnikami za izboljšanje slike in nato prikazal rezultat.

Projekt je bil izdelan in preizkušen na plošči Digilent Zybo, vendar bi morale delovati tudi druge naprave ZYNQ.

Ta projekt bomo razdelili na 3 dele:

1) INPUT = Vnos slike prek etherneta iz računalnika/kamere

2) PROCESS = Obdelajte sliko

3) OUTPUT = Oddajte sliko prek vmesnika HDMI

Na zelo kontraintuitiven način bomo začeli z izhodnim delom projekta (to nam bo na poti omogočilo boljše možnosti odpravljanja napak), nadaljevali z vnosom in končali z delom za obdelavo.

1. korak: Materiali

Materiali
Materiali

Za dokončanje tega projekta boste potrebovali:

HARDWARE

- vsaka plošča ZYNQ s HDMI in Ethernet bi morala delovati / uporabljam Digilent Zybo

- USB kabel USB A do micro B

- HDMI kabel

- Ethernetni kabel

- Zaslon z vhodom HDMI

PROGRAMSKA OPREMA

- Xilinx Vivado

- SDK za Xilinx

2. korak: IZHOD - VGA krmilnik 1. del

IZHOD - Krmilnik VGA 1. del
IZHOD - Krmilnik VGA 1. del

Svoje vizualne podatke bomo oddajali z vhodom HDMI, ki je na plošči. Vrata HDMI so priključena na stran PL (programabilna logika = FPGA) ZYNQ in zanj bomo morali oblikovati krmilnik v VHDL. Če ste kdaj oblikovali krmilnik VGA, se vam bo to zdelo zelo podobno. Časi za HDMI in VGA so dejansko enaki, pravzaprav lahko nadgradite na obstoječi krmilnik VGA, da pridobite krmilnik HDMI.

Za boljše razumevanje dogajanja bomo najprej zasnovali krmilnik VGA

Prikazati želimo ločljivost 1920x1080.

Krmilnik VGA je odgovoren za prenos podatkov o slikovnih pikah (v formatu RGB) zaporedoma, slikovno pik na zaslon. Zunaj dejanskega območja zaslona 1920x1080 je tudi nekaj "obrobnih" področij, in sicer: prednja veranda, zadnja veranda in pomik. Velikost teh področij v pikslih je standardna in specifična za vsako ločljivost. Ta območja se dejansko NE prikažejo na zaslonu, vendar so obvezna in barva slikovnih pik na tem področju mora biti črna. Veljavno vprašanje bi bilo, zakaj so potrebna ta dodatna področja. To vprašanje kljubuje namenu tega navodila, če pa vas zanima, vas spodbujam, da naredite dodatne raziskave na spletu.

To je dober video, ki pojasnjuje vmesnik VGA

V našem primeru želimo prikazati z ločljivostjo 1920*1080, in to so časovni razporedi:

Vodoravno območje prikaza = 1920 slikovnih pik

Vodoravna čelna veranda = 88 slikovnih pik

Vodoravna zadnja veranda = 148 slikovnih pik

Horizontal Retrace = 44 slikovnih pik

Navpično območje prikaza = 1080 slikovnih pik

Navpična sprednja veranda = 4 slikovne pike

Navpična zadnja veranda = 36 slikovnih pik

Navpični pomik = 5 slikovnih pik

(Tukaj najdete časovne razporeditve za druge resolucije

Torej bo naša dejanska ločljivost 2200 x 1125. Želimo 60 sličic na sekundo (sličic na sekundo), zato bo naša ura slikovnih pik 60*2200*1125 = 148,5 MHz. Na plošči Zybo je ura 125 Mhz. IP MMCM bomo uporabili za ustvarjanje 148,5 MHz ure slikovnih pik, ki jo potrebujemo.

3. korak: IZHOD - VGA krmilnik 2. del

IZHOD - VGA krmilnik 2. del
IZHOD - VGA krmilnik 2. del

S teoretičnim ozadjem iz prejšnjega koraka bi morali biti sposobni oblikovati lastni krmilnik VGA. Predložil vam bom projekt Vivado, ki to počne, vendar vam svetujem, da vsaj poskusite to narediti sami.

Večina vrat VGA ne daje 8 bitov na barvni kanal na slikovno piko (glejte sliko zgoraj), zato boste morali obliko prilagoditi številu nožic na barvo, ki jo ponuja plošča (čeprav to za HDMI ni problem).

Design bo celoten zaslon pobarval v modro, razen zgornjega levega piksla, ki bo rdeč. Treba je opozoriti, da ta projekt uporablja omejitve za odbor ZYBO. Torej, če želite ta projekt izvesti na drugi plošči, morate posodobiti datoteko omejitev in prilagoditi število zatičev na barvo.

Oglejte si sliko št. 2. Ne pozabite, da medtem ko naš krmilnik VGA oddaja 5/6 bitov na barvo, se ti bitovi pretvorijo v en analogni signal za vsak barvni kanal (rdeči, zeleni in modri), preden gredo skozi kabel.

4. korak: IZHOD - Krmilnik HDMI 1. del

IZHOD - Krmilnik HDMI 1. del
IZHOD - Krmilnik HDMI 1. del

Zdaj, ko vemo, kako deluje krmilnik VGA in imamo delujočo zasnovo, lahko nadaljujemo s krmilnikom HDMI. Krmilnik HDMI bo dejansko uporabil vso kodo, ki smo jo razvili v krmilniku VGA. HDMI in VGA uporabljata isti čas in iste signale. Razlika se pojavi na izhodnih zatičih.

Medtem ko VGA uporablja eno žico za vsako barvo in po njej oddaja analogni signal, HDMI prenaša podatke digitalno 1 bit za vsako barvo hkrati in uporablja diferencialno signalizacijo. Diferencialna signalizacija pomeni, da ima HDMI za vsak bit 2 zatiča, pri čemer je eden nasproten drugemu. Torej, če želimo oddati signal '1', bi na žici prenesli '1', na drugi žici pa '1'. To zagotavlja celovitost signala in več o tem lahko preberete tukaj https://goo.gl/6CPCzB. Za vsako barvo imamo enega od teh kanalov, RDEČEGA, ZELENEGA in MODREGA ter enega za uro. Zaradi posebnosti diferencialne signalizacije morajo biti signali, ki jih pošiljamo prek hdmija, uravnoteženi z enosmernim tokom, kar pomeni, da mora biti število 1 in 0 v določenem časovnem obdobju približno enako. Da bi to dosegli, bomo uporabili kodiranje 8b/10b. Veliko o tem, kako deluje diferencialna signalizacija in kodiranje 8b/10b, lahko izvedete iz specifikacije DVI tukaj https://goo.gl/hhh8Ge (DVI in HDMI uporabljata iste video signale).

5. korak: IZHOD - Krmilnik HDMI, 2. del

IZHOD - Krmilnik HDMI, 2. del
IZHOD - Krmilnik HDMI, 2. del

Dovolj teorije, pojdimo na naš projekt. Medtem ko smo v krmilniku VGA uspeli doseči takto 148,5 MHz, bomo tukaj morali zagotoviti 10 -kratno frekvenco, ker želimo prenašati 8 bitov za vsako barvo in uporabiti kodiranje 8b/10b, ki pomeni 10 bitov na slikovno piko in 10 *148,5 MHz = 1485 MHz. To je velika frekvenca, ki je na Zybo Boardu ni mogoče doseči. Na srečo smo v rokavu dobili nekaj trikov. Lahko upravljamo 5*148,5 MHz = 742,5 MHz in za prenos podatkov tako na naraščajočem kot na padajočem robu ure 742,5 Mhz bomo uporabili IP OSERDES (serializer), zato bomo podatke dejansko prenesli na 1485MHz. Vivado nam bo posredoval nekaj opozoril glede časovnega razporeda in vedno bi se lahko odločili za nižjo ločljivost z manjšo uro, a ker deluje, nas to zaenkrat ne moti (opozorila so povezana z dejstvom, da medpomnilniki ur niso uradno podporne frekvence višje od 464MHz).

Zato moramo podatke iz našega izhoda krmilnika VGA kodirati v formatu 8b/10b in jih nato serijalizirati, kot je omenjeno zgoraj. K projektu bomo morali dodati še en MMCM, da bomo ustvarili uro 742,5 MHz za serializacijo.

Priložil sem datoteke vhdl za kodirnik in serializator. Najprej morate kodirati kanale RGB in jih nato serijalizirati.

Primer za rdeči kanal:

TMDS_encoder_RED: TMDS_encoder

zemljevid vrat (clk148, red_channel_8bits, c_red, video_on, encoded_red_10bits);

Serialiser_RED: Serialiser10_1

zemljevid vrat (clk148, clk742, encoded_red_10bits, reset, red_serial_1bit);

Vnos "c" v kodirnik TMDS_encoder je "00" za rdečo in zeleno in "vsync & hsync" za modro (to je del specifikacije DVI

6. korak: Prikaz slik iz RAM -a

Prikaz slik iz RAM -a
Prikaz slik iz RAM -a

Namen krmilnika HDMI je prikazati obdelane slike. Zdaj, ko je krmilnik implementiran in pripravljen za uporabo, bi morali razmisliti o tem, da krmilnik hranimo s podatki. Glede na to, da bo v PS (Processing System = ARM Processor) veliko procesa izboljšanja slike, nastale slike pa bodo shranjene v RAM -u DDR. Zato potrebujemo način za prenos podatkov iz RAM -a v krmilnik HDMI.

Če želite to narediti, potrebujete 3 IP -je:

1) VDMA (Video Direct Memory Access)

2) VTC (video časovni krmilnik)

3) Stream to Video Out (odslej ga bomo imenovali S2VO)

S2VO bo dejansko izhodu dal signal RGB 24BIT in potrebne signale HSYNC in VSYNC. Tako lahko ta del krmilnika HDMI izpustimo.

Te IP -je dodajte svoji zasnovi, jih konfigurirajte in vzpostavite ustrezne povezave.

Končno bi morali dobiti nekaj, kar je podobno zgornji shemi.

7. korak: OUTPUT - SDK END

IZHOD - KONEC SDK -ja
IZHOD - KONEC SDK -ja

Ker je vsa strojna oprema nastavljena in pripravljena za uporabo, moramo zdaj v PS vgraditi programsko opremo. Izvozili bomo strojno opremo in bitni tok ter zagnali SDK.

1) Datoteka -> Izvoz -> Izvozi strojno opremo -> Preverite Vključi bitni tok in pritisnite OK

2) Datoteka -> Zaženi SDK

V SDK -ju ustvarite nov projekt aplikacije.

3) Datoteka -> Novo -> Aplikacijski projekt

4) Izberite ime za svoj projekt in pritisnite Naprej

5) Izberite predlogo "Hello World" in pritisnite Finish

Aplikacija v SDK bo morala programirati VDMA. Za to se uporabljajo nekatere standardne funkcije (ko bom imel čas, bom šel v podrobnosti).

Za preizkus naše zasnove bomo s funkcijo SDK Restore (orodja Xilinx -> Dump/Restore) sliko vstavili v pomnilnik RAM -a DDR in jo prikazali z našim krmilnikom HDMI. Sliko lahko naložite kamor koli želite (razen nekaterih majhnih omejenih področij na začetku pomnilnika). Za naš primer smo izbrali naslov 16777216 in velikost datoteke 8294400 = 1920*1080*4 (4 kanali = RGB + alfa).

Deluje !

Se nadaljuje

Priporočena: