Indholdsfortegnelse:

Zynq Image Enhancement System: 7 trin
Zynq Image Enhancement System: 7 trin

Video: Zynq Image Enhancement System: 7 trin

Video: Zynq Image Enhancement System: 7 trin
Video: SMPTE 2018: Beyond Better Pixels: How HDR Perceptually and Emotionally Effects Storytelling 2024, Juli
Anonim
Zynq Image Enhancement System
Zynq Image Enhancement System
Zynq Image Enhancement System
Zynq Image Enhancement System

Som du sikkert kunne se ud fra titlen, er formålet med dette projekt at lave et billedforbedringssystem ved hjælp af ZYNQ ApSOC. Mere specifikt ønsker vi at bygge et system, der kan fjerne tågen fra billeder eller video. Dette system tager under dårlige forhold visuelle data som input, behandler det ved hjælp af billedforbedringsteknikker og derefter udsender resultatet.

Projektet blev bygget og testet på Digilent Zybo Board, men andre ZYNQ -enheder skulle også fungere.

Vi vil dele dette projekt op i 3 dele:

1) INPUT = Indtast billede via Ethernet fra computer/kamera

2) PROCESS = Behandl billedet

3) OUTPUT = Udsend billedet via en HDMI -grænseflade

På en meget kontraintuitiv måde vil vi begynde med projektets outputdel (dette vil give os bedre fejlfindingsmuligheder undervejs) fortsætte med input og afslutte med behandlingsdelen.

Trin 1: Materialer

Materialer
Materialer

For at fuldføre dette projekt skal du bruge:

HARDWARE

- ethvert ZYNQ -kort med HDMI og Ethernet burde fungere / jeg bruger Digilent Zybo

- USB A til micro B USB -kabel

- HDMI -kabel

- Ethernet -kabel

- Skærm med HDMI -indgang

SOFTWARE

- Xilinx Vivado

- Xilinx SDK

Trin 2: OUTPUT - VGA -controller del 1

OUTPUT - VGA -controller del 1
OUTPUT - VGA -controller del 1

Vi udsender vores visuelle data ved hjælp af HDMI -porten på kortet. HDMI -porten er forbundet til PL (Programmable Logic = FPGA) siden af ZYNQ, og vi skal designe en controller i VHDL til det. Hvis du nogensinde har designet en VGA -controller, finder du denne meget ens. Tidspunkterne for HDMI og VGA er faktisk de samme, faktisk kan du bygge på en eksisterende VGA -controller for at få en HDMI -controller.

For en bedre forståelse af, hvad der rent faktisk sker, designer vi først en VGA -controller

Vi ønsker at vise med en opløsning på 1920x1080.

VGA -controlleren er ansvarlig for at transmittere pixeldata (i RGB -format) sekventielt, pixel for pixel til displayet. Uden for det faktiske displayområde på 1920x1080 er der også nogle "grænse" -områder, nemlig: veranda, baghave og retrace. Størrelsen i pixels i disse områder er standard og specifik for hver opløsning. Disse områder vises faktisk IKKE på skærmen, men de er obligatoriske, og farven på pixels i dette område skal være sort. Et gyldigt spørgsmål ville være, hvorfor disse ekstra områder er nødvendige. Dette spørgsmål trodser formålet med denne instruerbare, men hvis du er nysgerrig, vil jeg opfordre dig til at lave yderligere research online.

Dette er en god video, der forklarer VGA -grænsefladen

I vores tilfælde vil vi gerne vise med en opløsning på 1920*1080, og disse er tidspunkterne:

Vandret displayområde = 1920 pixels

Horisontal Fron Porch = 88 pixels

Vandret baghave = 148 pixels

Horisontal Retrace = 44 pixels

Lodret displayområde = 1080 pixels

Lodret veranda = 4 pixels

Lodret baghave = 36 pixels

Lodret Retrace = 5 pixels

(Her kan du finde tidspunkter for andre opløsninger

Så vores faktiske opløsning vil være 2200 x 1125. Vi vil have 60 fps (billeder i sekundet), så vores pixelur vil være 60*2200*1125 = 148,5 MHz. På Zybo Board findes et ur på 125 Mhz. Vi vil bruge en MMCM IP til at generere det 148,5 MHz pixelur, vi har brug for.

Trin 3: OUTPUT - VGA -controller del 2

OUTPUT - VGA -controller del 2
OUTPUT - VGA -controller del 2

Med den teoretiske baggrund fra det foregående trin skulle du være i stand til at designe din egen VGA -controller. Jeg vil give dig et Vivado -projekt, der gør det, men jeg råder dig til i det mindste først at prøve at lave det på egen hånd.

De fleste VGA -porte giver dig ikke 8 bits pr. Farvekanal pr. Pixel (se billedet ovenfor), så du bliver nødt til at tilpasse designet til det antal pins pr. Farve, kortet giver (dette er dog ikke et problem for HDMI).

Designet maler hele skærmen blå, bortset fra den øverste venstre pixel, som vil være rød. Det skal bemærkes, at dette projekt bruger begrænsningerne for ZYBO Board. Så hvis du vil køre dette projekt på et andet bord, skal du opdatere begrænsningsfilen og tilpasse antallet af stifter pr. Farve.

Tag et kig på figur nr. 2. Husk, at mens vores VGA -controller sender 5/6 bits pr. Farve, bliver disse bits konverteret til et analogt signal for hver farvekanal (rød, grøn og blå), før de går gennem kablet.

Trin 4: OUTPUT - HDMI Controller Del 1

OUTPUT - HDMI Controller Del 1
OUTPUT - HDMI Controller Del 1

Nu hvor vi ved, hvordan VGA -controlleren fungerer, og vi har et fungerende design, kan vi fortsætte med HDMI -controlleren. HDMI -controlleren bruger faktisk al den kode, vi udviklede i VGA -controlleren. HDMI og VGA bruger de samme timinger og de samme signaler. Forskellen vises på udgangsstifterne.

Mens VGA bruger en ledning for hver farve og sender et analogt signal på tværs af den, sender HDMI dataene digitalt 1 bit ad gangen for hver farve og bruger differentiel signalering. Differentialsignalering betyder, at HDMI for hver bit har 2 ben med den ene det modsatte af den anden. Så hvis vi ville sende et signal '1', ville vi sende '1' på en ledning og '1' negeret på den anden ledning. Dette sikrer signalintegritet, og du kan læse mere om det her https://goo.gl/6CPCzB. Vi har en af disse kanaler for hver farve, RØD, GRØN og BLÅ og en til uret. På grund af de særlige forhold ved differential signalering skal de signaler, vi sender via hdmi, være DC -afbalanceret, hvilket betyder, at antallet af 1'er og 0'er skal være nogenlunde ens i et bestemt tidsvindue. For at opnå dette vil vi bruge 8b/10b -kodning. Du kan lære meget om, hvordan differentialesignalering og 8b/10b -kodning fungerer ud fra DVI -specifikationen her https://goo.gl/hhh8Ge (DVI og HDMI bruger de samme videosignaler).

Trin 5: OUTPUT - HDMI Controller Del 2

OUTPUT - HDMI Controller Del 2
OUTPUT - HDMI Controller Del 2

Nok teori, lad os komme til vores projekt. Mens vi i VGA -controlleren slap med et 148,5 MHz -ur, skal vi her levere 10 gange denne frekvens, fordi vi ønsker at transmittere 8 bits for hver farve og bruge 8b/10b -kodningen, der oversætter til 10 bit pr. Pixel og 10 *148,5 MHz = 1485 MHz. Det er en enorm frekvens, der ikke kan opnås på Zybo Board. Heldigvis fik vi et par tricks i ærmet. Vi kan styre 5*148,5MHz = 742,5MHz, og vi vil bruge en OSERDES (serializer) IP til at overføre data både på den stigende og faldende kant af 742,5Mhz -uret, så vi faktisk får data overført ved 1485MHz. Vivado giver os nogle advarsler om timing, og du kan altid gå efter en lavere opløsning med et mindre ur, men da det virker, har vi ikke rigtig noget imod det nu (advarslerne er relateret til det faktum, at urbufferne ikke officielt gør det understøtter frekvenser højere end 464MHz).

Så hvad vi skal gøre er at kode dataene fra vores VGA Controller output i 8b/10b format og derefter serialisere det som nævnt ovenfor. Vi bliver også nødt til at tilføje endnu en MMCM til projektet for at generere 742,5 MHz -uret til serialiseringen.

Jeg vedhæftede nedenstående vhdl -filer til encoder og serializer. Du skal først kode RGB -kanalerne og derefter serialisere dem.

Eksempel på den røde kanal:

TMDS_encoder_RED: TMDS_encoder

portkort (clk148, red_channel_8bits, c_red, video_on, encoded_red_10bits);

Serialiser_RED: Serialiser10_1

portkort (clk148, clk742, encoded_red_10bits, reset, red_serial_1bit);

"C" -indgangen til TMDS_encoder er "00" for rød og grøn og "vsync & hsync" for blå (dette er en del af DVI -specifikationen

Trin 6: Visning af billeder fra RAM

Visning af billeder fra RAM
Visning af billeder fra RAM

Formålet med HDMI -controlleren er at vise de behandlede billeder. Nu, når controlleren er implementeret og klar til at gå, bør vi overveje at fodre denne controller med data. I betragtning af at meget af billedforbedringsprocessen vil finde sted i PS (Processing System = ARM Processor), og de resulterede billeder vil ligge i DDR RAM. Så vi har brug for en måde at få dataene fra RAM til HDMI -controlleren.

For at opnå dette skal du bruge 3 IP'er:

1) VDMA (Video Direct Memory Access)

2) VTC (Video timing Controller)

3) Stream til Video Out (vi vil kalde det S2VO fra nu af)

S2VO vil faktisk levere et RGB 24BIT -signal til udgangen og de nødvendige HSYNC- og VSYNC -signaler. Så vi kan lade den del af HDMI -controlleren være ude.

Du bør tilføje disse IP'er til dit design, konfigurere dem og foretage de korrekte forbindelser.

Endelig skal du få noget, der ligner skematikken ovenfor.

Trin 7: OUTPUT - SDK END

OUTPUT - SDK END
OUTPUT - SDK END

Med al hardware installeret og klar til at gå, skal vi nu bygge softwaren i PS. Vi eksporterer hardware og bitstream og lancerer SDK.

1) File -> Export -> Export Hardware -> Check Include Bitstream, og tryk på OK

2) Fil -> Start SDK

Opret et nyt applikationsprojekt i SDK.

3) Fil -> Ny -> Applikationsprojekt

4) Vælg et navn til dit projekt, og tryk på Næste

5) Vælg skabelonen "Hej verden", og tryk på Afslut

Ansøgningen i SDK skal programmere VDMA. Der er nogle standardfunktioner, der bruges til at opnå dette (jeg vil gå i detaljer, når jeg har tid).

For at teste vores design vil vi bruge funktionen SDK Restore (Xilinx Tools -> Dump/Restore) til at sætte et billede i DDR RAM -hukommelsen og vise det ved hjælp af vores HDMI -controller. Du kan indlæse billedet hvor som helst du vil (undtagen nogle små begrænsede områder i begyndelsen af hukommelsen). I vores eksempel valgte vi adresse 16777216 og filstørrelsen 8294400 = 1920*1080*4 (4 kanaler = RGB + alfa).

Det virker !

Fortsættes

Anbefalede: