INHOUDSOPGAWE:

Zynq -beeldverbeteringstelsel: 7 stappe
Zynq -beeldverbeteringstelsel: 7 stappe

Video: Zynq -beeldverbeteringstelsel: 7 stappe

Video: Zynq -beeldverbeteringstelsel: 7 stappe
Video: Zynq 7 – PS project: Hello World and Memory test without Programmable Logic 2024, Julie
Anonim
Zynq -beeldverbeteringstelsel
Zynq -beeldverbeteringstelsel
Zynq beeldverbeteringstelsel
Zynq beeldverbeteringstelsel

Soos u waarskynlik uit die titel kan agterkom, is die doel van hierdie projek om 'n beeldverbeteringstelsel te maak met behulp van die ZYNQ ApSOC. Meer spesifiek, ons wil 'n stelsel bou wat die mis uit beelde of video kan verwyder. Hierdie stelsel sal visuele data as slegte omstandighede as invoer neem, dit verwerk met behulp van beeldverbeteringstegnieke en dan die resultaat lewer.

Die projek is op die Digilent Zybo -bord gebou en getoets, maar ander ZYNQ -toestelle behoort ook te werk.

Ons verdeel hierdie projek in 3 dele:

1) INVOER = Voer beeld in via Ethernet vanaf rekenaar/kamera

2) PROSES = Verwerk die prent

3) UITGANG = Laai die beeld af via 'n HDMI -koppelvlak

Op 'n baie teen -intuïtiewe manier begin ons met die uitvoer -gedeelte van die projek (dit gee ons beter ontfoutingsmoontlikhede); gaan voort met die insette en eindig met die verwerkingsdeel.

Stap 1: materiaal

Materiaal
Materiaal

Om hierdie projek te voltooi, benodig u:

HARDWARE

- enige ZYNQ -bord met HDMI en Ethernet behoort te werk / ek gebruik die Digilent Zybo

- USB A tot mikro B USB kabel

- HDMI -kabel

- Ethernet -kabel

- Vertoon met HDMI -ingang

SAGTEWARE

- Xilinx Vivado

- Xilinx SDK

Stap 2: UITGANG - VGA -beheerder Deel 1

UITGANG - VGA -beheerder Deel 1
UITGANG - VGA -beheerder Deel 1

Ons sal ons visuele data uitvoer met behulp van die HDMI -poort op die bord. Die HDMI -poort is gekoppel aan die PL (Programmable Logic = FPGA) kant van die ZYNQ en ons sal daarvoor 'n kontroleerder in VHDL moet ontwerp. As u ooit 'n VGA -kontroleerder ontwerp het, sal u dit baie soortgelyk vind. Die tydsberekening vir HDMI en VGA is eintlik dieselfde; u kan in werklikheid op 'n bestaande VGA -beheerder bou om 'n HDMI -beheerder te kry.

Vir 'n beter begrip van wat werklik gebeur, sal ons eers 'n VGA -kontroleerder ontwerp

Ons wil vertoon met 'n resolusie van 1920x1080.

Die VGA -beheerder is verantwoordelik om die pixeldata (in RGB -formaat) opeenvolgend, pixel vir pixel, na die skerm te stuur. Buite die werklike vertoonarea van 1920x1080 is daar ook 'n paar "grens" -gebiede, naamlik: voorstoep, agterstoep en agterplaas. Die grootte in pixels van hierdie gebiede is standaard en spesifiek vir elke resolusie. Hierdie gebiede verskyn NIE eintlik op die skerm nie, maar dit is verpligtend en die kleur van die pixels in hierdie gebied moet swart wees. 'N Geldige vraag sou wees waarom hierdie ekstra areas benodig word. Hierdie vraag weerspreek die doel van hierdie instruksies, maar as u nuuskierig is, wil ek u aanmoedig om verdere navorsing aanlyn te doen.

Dit is 'n goeie video wat die VGA -koppelvlak verduidelik

In ons geval wil ons dit met 'n resolusie van 1920*1080 vertoon, en dit is die tydsberekening:

Horisontale vertoonarea = 1920 pixels

Horisontale Fron Porch = 88 pixels

Horisontale agterstoep = 148 pixels

Horisontale herhaling = 44 pixels

Vertikale vertoonarea = 1080 pixels

Vertikale voorstoep = 4 pixels

Vertikale agterstoep = 36 pixels

Vertikale herhaling = 5 pixels

(Hier vind u tydsberekeninge vir ander resolusies

Ons werklike resolusie is dus 2200 x 1125. Ons wil 60 fps (rame per sekonde) hê, dus sal ons pixelklok 60*2200*1125 = 148,5 MHz wees. 'N Klok van 125 Mhz word op die Zybo -bord voorsien. Ons sal 'n MMCM IP gebruik om die 148,5 MHz pixelklok wat ons benodig, te genereer.

Stap 3: UITGANG - VGA -beheerder Deel 2

UITGANG - VGA -beheerder Deel 2
UITGANG - VGA -beheerder Deel 2

Met die teoretiese agtergrond van die vorige stap, behoort u in staat te wees om u eie VGA -beheerder te ontwerp. Ek sal u 'n Vivado -projek voorsien wat dit doen, maar ek raai u aan om dit eers op u eie te probeer doen.

Die meeste VGA -poorte gee u nie 8 bisse per kleurkanaal per pixel nie (sien prent hierbo), dus moet u die ontwerp aanpas by die aantal penne per kleur wat die bord bied (dit is egter nie 'n probleem vir die HDMI nie).

Die ontwerp sal die hele skerm blou verf, behalwe die pixel links bo, wat rooi sal wees. Daar moet op gelet word dat hierdie projek die beperkings van die ZYBO -raad gebruik. As u hierdie projek op 'n ander bord wil uitvoer, moet u die beperkingslêer opdateer en die aantal penne per kleur aanpas.

Kyk na figuur nr. 2. Onthou dat terwyl ons VGA -kontroleerder 5/6 bisse per kleur uitvoer, die bisse omskep word in een analoog sein vir elke kleurkanaal (rooi, groen en blou) voordat hulle deur die kabel gaan.

Stap 4: UITGANG - HDMI -beheerder Deel 1

UITGANG - HDMI -beheerder Deel 1
UITGANG - HDMI -beheerder Deel 1

Noudat ons weet hoe die VGA -beheerder werk en ons 'n werkende ontwerp het, kan ons voortgaan met die HDMI -beheerder. Die HDMI -beheerder gebruik eintlik al die kode wat ons in die VGA -beheerder ontwikkel het. Die HDMI en VGA gebruik dieselfde tydsberekeninge en dieselfde seine. Die verskil verskyn op die buitepennetjies.

Terwyl VGA een draad vir elke kleur gebruik en 'n analoog sein daaroor stuur, stuur HDMI die data digitaal 1 bis op 'n slag vir elke kleur en gebruik differensiële sein. Differensiële sein beteken dat die HDMI vir elke bietjie 2 penne het met die een die teenoorgestelde van die ander. As ons dus 'n sein '1' wil stuur, stuur ons '1' op 'n draad en '1' ontken op die ander draad. Dit verseker seinintegriteit en u kan hier meer lees https://goo.gl/6CPCzB. Ons het een van hierdie kanale vir elke kleur, ROOI, GROEN en BLOU en een vir die klok. As gevolg van die besonderhede van differensiële sein moet die seine wat ons via hdmi stuur, gelyk gebalanseerd wees, wat beteken dat die aantal 1's en 0's in 'n sekere tydsperiode ongeveer gelyk moet wees. Om dit te bereik, gebruik ons 8b/10b kodering. U kan baie leer oor hoe differensiële sein en 8b/10b -kodering werk uit die DVI -spesifikasie hier https://goo.gl/hhh8Ge (DVI en HDMI gebruik dieselfde videosignale).

Stap 5: UITGANG - HDMI -beheerder Deel 2

UITGANG - HDMI -beheerder Deel 2
UITGANG - HDMI -beheerder Deel 2

Genoeg teorie, laat ons by ons projek uitkom. Terwyl ons in die VGA -kontroleerder met 'n 148,5 MHz -horlosie weggekom het, moet ons hier 10 keer die frekwensie verskaf, want ons wil 8 bisse vir elke kleur oordra en die 8b/10b -kodering gebruik wat vertaal word na 10 bis per pixel en 10 *148,5 MHz = 1485 MHz. Dit is 'n groot frekwensie wat nie op die Zybo -raad verkry kan word nie. Gelukkig het ons 'n paar truuks in ons mou gekry. Ons kan 5*148.5MHz = 742.5MHz bestuur en ons sal 'n OSERDES (serializer) IP gebruik om data op die stygende en dalende rand van die 742.5Mhz -horlosie oor te dra, sodat ons eintlik data op 1485MHz sal stuur. Vivado gee ons 'n paar tydswaarskuwings, en u kan altyd 'n laer resolusie met 'n kleiner horlosie gebruik, maar aangesien dit werk, gee ons dit nie regtig om nie (die waarskuwings hou verband met die feit dat die klokbuffers nie amptelik amptelik is nie) ondersteun frekwensies hoër as 464MHz).

Wat ons dus moet doen, is om die data van ons VGA Controller -uitvoer in 8b/10b -formaat te kodeer en dit dan in volgorde te stel soos hierbo genoem. Ons sal ook nog 'n MMCM by die projek moet voeg om die 742.5MHz -klok vir die serialisering te genereer.

Ek het die vhdl -lêers vir die encoder en serializer aangeheg. U moet eers die RGB -kanale kodeer en dit dan in volgorde stel.

Voorbeeld vir die rooi kanaal:

TMDS_encoder_RED: TMDS_encoder

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

Serialiser_RED: Serialiser10_1

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

Die "c" -invoer na die TMDS_encoder is "00" vir rooi en groen en "vsync & hsync" vir blou (dit is deel van die DVI -spesifikasie

Stap 6: Vertoon beelde vanuit RAM

Vertoon beelde uit RAM
Vertoon beelde uit RAM

Die doel van die HDMI -beheerder is om die verwerkte beelde te vertoon. As die beheerder geïmplementeer en gereed is, moet ons daaraan dink om hierdie beheerder met data te voed. Aangesien 'n groot deel van die beeldverbeteringsproses in die PS (Processing System = ARM Processor) sal plaasvind en die beelde in die DDR RAM sal voorkom. Ons benodig dus 'n manier om die data van die RAM na die HDMI -beheerder te kry.

Om dit te bereik, benodig u 3 IP's:

1) VDMA (Video Direct Memory Access)

2) VTC (Video timing Controller)

3) Stroom na video -uit (ons sal dit voortaan S2VO noem)

S2VO bied eintlik 'n RGB 24BIT -sein aan die uitset en die benodigde HSYNC- en VSYNC -seine. Ons kan die deel van die HDMI -beheerder dus uitlaat.

U moet hierdie IP's by u ontwerp voeg, dit konfigureer en die regte verbindings maak.

Uiteindelik moet u iets kry wat ooreenstem met die skema hierbo.

Stap 7: UITPUT - EINDE van SDK

UITPUT - SDK EINDE
UITPUT - SDK EINDE

Met al die hardeware opgestel en gereed om te begin, moet ons nou die sagteware in die PS bou. Ons sal die hardeware en die bitstroom uitvoer en die SDK begin.

1) Lêer -> Uitvoer -> Uitvoer hardeware -> Kontroleer sluit Bitstream in en druk OK

2) Lêer -> Begin SDK

Skep 'n nuwe toepassingsprojek in die SDK.

3) Lêer -> Nuut -> Toepassingsprojek

4) Kies 'n naam vir u projek en druk op Volgende

5) Kies die sjabloon "Hello World" en druk op Voltooi

Die toepassing in die SDK sal die VDMA moet programmeer. Daar is 'n paar standaardfunksies wat gebruik word om dit te bereik (ek sal in besonderhede ingaan wanneer ek tyd het).

Om ons ontwerp te toets, gebruik ons die funksie SDK Restore (Xilinx Tools -> Dump/Restore) om 'n beeld in die DDR RAM -geheue te plaas en dit met ons HDMI -beheerder te vertoon. U kan die prent op enige plek laai (behalwe 'n paar beperkte gebiede aan die begin van die geheue). Vir ons voorbeeld het ons adres 16777216 gekies en die lêergrootte 8294400 = 1920*1080*4 (4 kanale = RGB + alfa).

Dit werk !

Vervolg

Aanbeveel: