Innholdsfortegnelse:

Zynq Image Enhancement System: 7 trinn
Zynq Image Enhancement System: 7 trinn

Video: Zynq Image Enhancement System: 7 trinn

Video: Zynq Image Enhancement System: 7 trinn
Video: Image Processing on Zynq (FPGAs) : Part 3 Design of MAC 2024, Juli
Anonim
Zynq Image Enhancement System
Zynq Image Enhancement System
Zynq Image Enhancement System
Zynq Image Enhancement System

Som du sannsynligvis kan finne ut av tittelen, er målet med dette prosjektet å lage et bildeforbedringssystem ved hjelp av ZYNQ ApSOC. Mer spesifikt ønsker vi å bygge et system som kan fjerne tåken fra bilder eller video. Dette systemet vil ta under dårlige forhold visuelle data som inngang, behandle det ved hjelp av bildeforbedringsteknikker og deretter sende ut resultatet.

Prosjektet ble bygget og testet på Digilent Zybo Board, men andre ZYNQ -enheter burde også fungere.

Vi vil dele dette prosjektet i tre deler:

1) INPUT = Input Image via Ethernet fra datamaskin/kamera

2) PROCESS = Behandle bildet

3) OUTPUT = Send ut bildet via et HDMI -grensesnitt

På en veldig kontraintuitiv måte begynner vi med utdatadelen av prosjektet (dette vil gi oss bedre feilsøkingsmuligheter underveis) fortsette med innspill og avslutte med behandlingsdelen.

Trinn 1: Materialer

Materialer
Materialer

For å fullføre dette prosjektet trenger du:

MASKINVARE

- ethvert ZYNQ -kort med HDMI og Ethernet skal fungere / jeg bruker Digilent Zybo

- USB A til mikro B USB -kabel

- HDMI -kabel

- Ethernet -kabel

- Skjerm med HDMI -inngang

PROGRAMVARE

- Xilinx Vivado

- Xilinx SDK

Trinn 2: OUTPUT - VGA -kontroller del 1

OUTPUT - VGA -kontroller del 1
OUTPUT - VGA -kontroller del 1

Vi sender ut våre visuelle data ved hjelp av HDMI -porten på kortet. HDMI -porten er koblet til PL (Programmable Logic = FPGA) siden av ZYNQ, og vi må designe en kontroller i VHDL for den. Hvis du noen gang har designet en VGA -kontroller, vil du finne denne veldig lik. Tidspunktene for HDMI og VGA er faktisk de samme, faktisk kan du bygge på en eksisterende VGA -kontroller for å få en HDMI -kontroller.

For en bedre forståelse av hva som faktisk skjer, skal vi først designe en VGA -kontroller

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

VGA -kontrolleren er ansvarlig for å overføre pikseldataene (i RGB -format) sekvensielt, piksel for piksel til skjermen. Utenfor det faktiske visningsarealet på 1920x1080 er det også noen "grense" områder, nemlig: veranda, veranda bak og spor. Størrelsen i piksler på disse områdene er standard og spesifikk for hver oppløsning. Disse områdene vises faktisk IKKE på skjermen, men de er obligatoriske og fargen på pikslene i dette området må være svart. Et gyldig spørsmål vil være hvorfor disse ekstra områdene er nødvendige. Dette spørsmålet trosser formålet med dette instruerbare, men hvis du er nysgjerrig, vil jeg oppfordre deg til å forske videre på nettet.

Dette er en god video som forklarer VGA -grensesnittet

I vårt tilfelle vil vi vise med en oppløsning på 1920*1080, og dette er tidspunktene:

Horisontalt visningsområde = 1920 piksler

Horisontal Fron Porch = 88 piksler

Horisontal veranda på baksiden = 148 piksler

Horisontal sporing = 44 piksler

Vertikalt visningsområde = 1080 piksler

Vertikal veranda = 4 piksler

Vertikal bakside = 36 piksler

Vertikal tilbakeføring = 5 piksler

(Her kan du finne tidspunkt for andre oppløsninger

Så den faktiske oppløsningen vår vil være 2200 x 1125. Vi vil ha 60 fps (bilder per sekund), så vår pikselklokke vil være 60*2200*1125 = 148,5 MHz. På Zybo Board finnes det en klokke på 125 Mhz. Vi vil bruke en MMCM IP for å generere 148,5 MHz Pixel Clock vi trenger.

Trinn 3: OUTPUT - VGA -kontroller del 2

OUTPUT - VGA -kontroller del 2
OUTPUT - VGA -kontroller del 2

Med den teoretiske bakgrunnen fra forrige trinn, bør du kunne designe din egen VGA -kontroller. Jeg vil gi deg et Vivado -prosjekt som gjør det, men jeg råder deg til å prøve å gjøre det på egen hånd først.

De fleste VGA -porter gir deg ikke 8 bits per fargekanal per piksel (se bildet ovenfor), så du må tilpasse designet til antall pinner per farge som kortet gir (dette er imidlertid ikke et problem for HDMI).

Designet vil male hele skjermen blå, bortsett fra den øverste venstre piksel som vil være rød. Det skal bemerkes at dette prosjektet bruker begrensningene for ZYBO -styret. Så hvis du vil kjøre dette prosjektet på et annet bord, bør du oppdatere begrensningsfilen og tilpasse antall pinner per farge.

Ta en titt på figur nr. 2. Husk at mens VGA -kontrolleren sender ut 5/6 bits per farge, blir disse bitene konvertert til ett analogt signal for hver fargekanal (rød, grønn og blå) før du går gjennom kabelen.

Trinn 4: UTGANG - HDMI -kontroller Del 1

OUTPUT - HDMI -kontroller del 1
OUTPUT - HDMI -kontroller del 1

Nå som vi vet hvordan VGA -kontrolleren fungerer og vi har en fungerende design, kan vi fortsette med HDMI -kontrolleren. HDMI -kontrolleren bruker faktisk all koden vi utviklet i VGA -kontrolleren. HDMI og VGA bruker de samme timene og de samme signalene. Forskjellen vises på utgangspinnene.

Mens VGA bruker en ledning for hver farge og sender et analogt signal over den, sender HDMI dataene digitalt 1 bit om gangen for hver farge og bruker differensial signalering. Differensial signalering betyr at for hver bit har HDMI 2 pinner med den ene motsatt av den andre. Så hvis vi ønsker å sende signalet '1', sender vi '1' på en ledning og '1' negeres på den andre ledningen. Dette sikrer signalintegritet, og du kan lese mer om det her https://goo.gl/6CPCzB. Vi har en av disse kanalene for hver farge, RØD, GRØNN og BLÅ og en for klokken. På grunn av spesifikasjonene for differensial signalering må signalene vi sender via hdmi være DC -balansert, noe som betyr at antall 1 og 0 må være omtrent like i et bestemt tidsvindu. For å oppnå dette vil vi bruke 8b/10b -koding. Du kan lære mye om hvordan differensial signalering og 8b/10b -koding fungerer fra DVI -spesifikasjonen her https://goo.gl/hhh8Ge (DVI og HDMI bruker de samme videosignalene).

Trinn 5: UTGANG - HDMI -kontroller del 2

OUTPUT - HDMI -kontroller del 2
OUTPUT - HDMI -kontroller del 2

Nok teori, la oss komme til prosjektet vårt. Mens vi i VGA -kontrolleren slapp unna med en 148,5 MHz klokke, må vi her gi 10 ganger den frekvensen fordi vi ønsker å overføre 8 bits for hver farge og bruke 8b/10b -kodingen som oversetter til 10 bits per piksel og 10 *148,5 MHz = 1485 MHz. Det er en enorm frekvens som ikke kan oppnås på Zybo -styret. Heldigvis fikk vi noen triks i ermet. Vi kan administrere 5*148,5MHz = 742,5MHz, og vi vil bruke en OSERDES (serializer) IP for å overføre data både på stigende og fallende kant av 742,5Mhz -klokken, så vi vil faktisk få data overført ved 1485MHz. Vivado vil gi oss noen advarsler om timing, og du kan alltid gå for en lavere oppløsning med en mindre klokke, men siden det fungerer, har vi ikke noe imot det foreløpig (advarslene er knyttet til det faktum at klokkebufferne ikke offisielt gjør det støttefrekvenser høyere enn 464MHz).

Så det vi trenger å gjøre er å kode dataene fra VGA -kontrollerutgangen i 8b/10b -format og deretter serialisere dem som nevnt ovenfor. Vi må også legge til en annen MMCM i prosjektet for å generere 742,5 MHz -klokken for serien.

Jeg har lagt ved vhdl -filene for koderen og serialisereren. Du må først kode RGB -kanalene og deretter serialisere dem.

Eksempel på den røde kanalen:

TMDS_encoder_RED: TMDS_encoder

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

Serialiser_RED: Serialiser10_1

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

"C" -inngangen til TMDS_encoder er "00" for rødt og grønt og "vsync & hsync" for blått (dette er en del av DVI -spesifikasjonen

Trinn 6: Vise bilder fra RAM

Vise bilder fra RAM
Vise bilder fra RAM

Hensikten med HDMI -kontrolleren er å vise de behandlede bildene. Nå, med kontrolleren implementert og klar til å gå, bør vi tenke på å mate denne kontrolleren med data. Gitt at mye av bildeforbedringsprosessen vil finne sted i PS (Processing System = ARM Processor) og bildene som blir oppdaget vil ligge i DDR RAM. Så vi trenger en måte å få dataene fra RAM til HDMI -kontrolleren.

For å oppnå dette trenger du 3 IP -er:

1) VDMA (Video Direct Memory Access)

2) VTC (Video timing Controller)

3) Stream til Video Out (vi vil kalle det S2VO fra nå av)

S2VO vil faktisk gi et RGB 24BIT -signal til utgangen og de nødvendige HSYNC- og VSYNC -signalene. Så vi kan la den delen av HDMI -kontrolleren være ute.

Du bør legge til disse IP -ene i designet, konfigurere dem og lage riktige tilkoblinger.

Til slutt bør du få noe som ligner skjematisk over.

Trinn 7: OUTPUT - SDK END

UTGANG - SDK END
UTGANG - SDK END

Med all maskinvaren satt opp og klar til å gå må vi nå bygge programvaren i PS. Vi vil eksportere maskinvaren og bitstrømmen og lansere SDK.

1) Fil -> Eksporter -> Eksporter maskinvare -> Kontroller Inkluder Bitstream og trykk OK

2) Fil -> Start SDK

Opprett et nytt applikasjonsprosjekt i SDK.

3) Fil -> Ny -> Applikasjonsprosjekt

4) Velg et navn på prosjektet, og trykk på Neste

5) Velg "Hello World" -malen og trykk på Fullfør

Søknaden i SDK må programmere VDMA. Det er noen standardfunksjoner som brukes for å oppnå dette (jeg går inn på detaljer når jeg har tid).

For å teste designet vårt, bruker vi funksjonen SDK Restore (Xilinx Tools -> Dump/Restore) for å sette et bilde inn i DDR RAM -minnet og vise det ved hjelp av HDMI -kontrolleren. Du kan laste bildet hvor du vil (unntatt noen små begrensede områder i begynnelsen av minnet). For vårt eksempel valgte vi adresse 16777216 og filstørrelsen 8294400 = 1920*1080*4 (4 kanaler = RGB + alfa).

Det fungerer !

Fortsettelse følger

Anbefalt: