Turinys:

WIDI - belaidis HDMI naudojant „Zybo“(„Zynq Development Board“): 9 žingsniai (su paveikslėliais)
WIDI - belaidis HDMI naudojant „Zybo“(„Zynq Development Board“): 9 žingsniai (su paveikslėliais)

Video: WIDI - belaidis HDMI naudojant „Zybo“(„Zynq Development Board“): 9 žingsniai (su paveikslėliais)

Video: WIDI - belaidis HDMI naudojant „Zybo“(„Zynq Development Board“): 9 žingsniai (su paveikslėliais)
Video: #392 ОБЗОР Подключаем телефон к телевизору, MiraScreen, MiraCast, AirPlay, MHL кабель, USB кабель 2024, Liepa
Anonim
WIDI - belaidis HDMI naudojant „Zybo“(„Zynq Development Board“)
WIDI - belaidis HDMI naudojant „Zybo“(„Zynq Development Board“)
WIDI - belaidis HDMI naudojant „Zybo“(„Zynq Development Board“)
WIDI - belaidis HDMI naudojant „Zybo“(„Zynq Development Board“)

Ar kada nors norėjote, kad galėtumėte prijungti televizorių prie kompiuterio ar nešiojamojo kompiuterio kaip išorinį monitorių, bet nenorėjote, kad visi šie erzinantys laidai netrukdytų? Jei taip, ši pamoka kaip tik jums! Nors yra keletas produktų, kurie pasiekia šį tikslą, „pasidaryk pats“projektas yra daug labiau patenkintas ir galbūt pigesnis.

Ši koncepcija skiriasi nuo tokių produktų kaip „chromecast“, nes ji skirta pakeisti HDMI laidą, jungiantį prie monitoriaus, o ne srautinio perdavimo įrenginį.

Mūsų projektas buvo sukurtas kaip galutinis projektas realiojo laiko operacinių sistemų kursui Kalifornijos valstijos politechnikos universitete, San Luis Obispo.

Projekto tikslas yra panaudoti dvi „Digilent Zybo“plokštes, kad jos veiktų kaip belaidžio ryšio sąsaja tarp HDMI siųstuvo įrenginio (kompiuterio, „Blu-ray“ir kt.) Iki HDMI priėmimo įrenginio (stalinio kompiuterio monitoriaus, projektoriaus, televizoriaus ir kt.).

Vienas „Digilent Zybo“bus prijungtas per HDMI prie perdavimo įrenginio, o kitas - per HDMI prie priimančiojo.

Belaidis ryšys bus vykdomas naudojant belaidį vietinį tinklą, skirtą siųstuvui ir imtuvui, be nukreipimo per namų maršrutizatorių ar kitą tokį įrenginį. Šiam projektui naudojamas belaidis modulis yra „tplink wr802n“nanorouteris, iš kurio vienas veikia kaip prieigos taškas tinklui sukurti, o kitas - kaip klientas prisijungti prie tinklo. Kiekvienas nanorouteris bus prijungtas eterneto kabeliu prie bet kurios „Zybo“plokštės. Prisijungę prie šių maršrutizatorių, įrenginiai bendraus per TCP taip, lyg būtų prijungti vienu Ethernet kabeliu (tai reiškia, kad vienintelė konfigūracija, reikalinga ryšiui užmegzti, yra kliento IP adresas).

Nors projekto tikslas buvo palengvinti 1080x720 vaizdo įrašų srautą esant 60 Hz dažniui, to pasiekti nepavyko dėl belaidžio tinklo pralaidumo apribojimų ir vaizdo įrašo suspaudimo realiuoju laiku, kad būtų sumažintas reikalingas duomenų siuntimas. Vietoj to, šis projektas yra pagrindas tolesniam vystymuisi siekiant šio tikslo, nes jis labai apribojo kadrų dažnio apribojimus tinkamai perduoti HDMI duomenis, kaip numatyta.

Projekto reikalavimai:

2x „Digilent Zybo“kūrimo plokštės (turi turėti bent vieną HDMI prievadą)

2x HDMI kabeliai

2x „microusb“kabeliai (norint prijungti „Zybo“prie kompiuterio kūrimui)

2x „tplink wr802n“nanorouteriai (įskaitant adtl. 2x microusb ir sieninio lizdo maitinimo adapterius)

2x eterneto kabeliai

*** Pastaba: šioje pamokoje prisiimta pažintis su „Vivado“dizaino rinkiniu ir patirtis kuriant naują projektą ir blokų dizainą. ***

1 veiksmas: sukonfigūruokite „Zynq“programuojamą siųstuvo logiką

Konfigūruokite „Zynq“programuojamą siųstuvo logiką
Konfigūruokite „Zynq“programuojamą siųstuvo logiką
Konfigūruokite „Zynq“programuojamą siųstuvo logiką
Konfigūruokite „Zynq“programuojamą siųstuvo logiką
Konfigūruokite „Zynq“programuojamą siųstuvo logiką
Konfigūruokite „Zynq“programuojamą siųstuvo logiką

Mūsų požiūris į programuojamos siųstuvo logikos kūrimą buvo atlikti „hdmi-hdmi“perdavimą iš kompiuterio į monitorių, naudojant du vaizdo tiesioginės atminties prieigos (VDMA) blokus, vieną rašymui ir kitą skaitymui.

Abu pasirinkti laisvai veikiantys 3 kadrų buferio režimai (0-1-2). Kadangi vaizdo šerdis yra optimizuota 60 kadrų per sekundę, tai reiškia, kad VDMA kas 16,67 ms rašys arba skaitys į naują kadrą tokia tvarka: 0, 1, 2, 0, 1, 2, 0, 1, 2. Kiekvieno kadro DDR atminties vietos skiriasi dviem VDMA, nes jos nebėra sinchronizuojamos viena su kita. Vietoj to, aparatūros laikmatis (TTC1), sukonfigūruotas 60 Hz, naudojamas sinchronizuoti duomenų judėjimą tarp dviejų atminties vietų.

Aukščiau esančiame paveikslėlyje rodomi 3 kadrai, jų matmenys ir kiekvienam reikalingas atminties kiekis (kadro dešinėje). Jei šioms atminties vietoms priskiriame rašymo VDMA, tada skaitymo VDMA atminties vietas galime priskirti už šio rinkinio ribų, tarkime, pradedant nuo 0x0B000000. Kiekvieną kadrą sudaro 1280*720 pikselių, o kiekvieną pikselį - 8 bitai raudonos, žalios ir mėlynos, iš viso 24 bitai. Tai reiškia, kad rėmelį sudaro 1280*720*3 baitai (2,76 MB).

Laikmačio IRQ, aprašyto VDMA tvarkyklės sąrankoje, viduje bus galima kopijuoti duomenis tarp dviejų VMDA atminties vietų. VDMA suteikia žymeklį dabartiniam kadrui, į kurį rašoma arba skaitomas. Rėmelį vaizduoja tam tikras pilkas kodas, kuris konvertuojamas programine įranga. Pilko kodo apibrėžimus 3 kadrų buferio konfigūracijai rasite A priedo C priedo AXI VDMA vadove.

Tai leidžia mums nukopijuoti rašomą turinį į atmintį, neskaitant iš rėmo, į kurį šiuo metu rašoma.

*** Atminkite, kad nuskaitytas VDMA nenaudojamas siunčiant duomenis belaidžiu tinklu. Vienintelis tikslas yra patikrinti, ar tinkamai veikia atminties kopijavimas iš rašymo VMDA. Skaitymo VMDA turėtų būti išjungta. ***

Štai žingsniai kuriant siųstuvo dizaino bloką:

  1. Kuriant naują projektą, gera idėja projektui priskirti mikroschemą ar plokštę. Šioje nuorodoje aprašoma, kaip pridėti naujų lentos failų prie „Vivado“katalogo ir susieti tinkamą lentą su savo projektu. Tai pravers pridėjus apdorojimo sistemos bloką ir pereinant iš aparatinės įrangos į programinę įrangą (SDK pusėje).
  2. Pridėkite šiuos blokus:

    • dvi2rgb
    • Vaizdo įrašas į „Axi4“srautą
    • Laiko valdiklis
    • axi4-stream į vid
    • rgb2dvi
    • AXI VDMA x2
    • AXI GPIO x2
    • Laikrodžio vedlys
    • Pastovus
    • „Zynq“apdorojimo sistema
  3. Pridėdami apdorojimo sistemą, viršutinėje žalios spalvos juostoje spustelėkite „Vykdyti blokavimo automatizavimą“ir įsitikinkite, kad pasirinkta parinktis „Taikyti iš anksto nustatytą lentą“. Visa kita palikite numatytąją.
  4. Kiekvieno bloko konfigūracijos lango vaizdus rasite aukščiau esančiuose paveikslėliuose. Jei nematote konkretaus lango vaizdo, tiesiog palikite jį kaip numatytąjį.
  5. Pradėkite konfigūruoti „Zynq“apdorojimo sistemą:

    • PS-PL konfigūracijoje „AXI Non Secure Enable GP Master AXI“įgalinkite „M AXI GP0“sąsają
    • PS-PL konfigūracijoje „HP Slave AXI Interface“įgalinkite HP0 ir HP1
    • Naudodami MIO konfigūraciją Įsitikinkite, kad ENET0 įjungtas naudojant įvesties/išvesties įrenginius, tada taikomųjų programų procesorius, įjunkite laikmatį0
    • „Clock Configuration PL Fabric Clocks“įjunkite FCLK_CLK0 ir nustatykite 100 MHz.
    • Spustelėkite Gerai
  6. Prieš spustelėdami „Vykdyti ryšio automatizavimą“, būtinai prijunkite vaizdo blokus, kaip parodyta aukščiau esančiame TX bloko dizaino paveikslėlyje. Jūs norite pervadinti konstantą į VDD ir nustatyti vertę į 1. Atitinkamai prijunkite vaizdo blokus.
  7. Padarykite HDMI TMDS laikrodį ir duomenų kaiščius išorinius rgb2dvi ir dvi2rgb blokuose
  8. Sukurkite karšto kištuko aptikimo signalo (HPD) įvesties ir išvesties prievadą ir sujunkite juos, jie yra apibrėžti apribojimų faile
  9. Pikselių laikrodis atkuriamas iš TMDS_Clk_p, kuris sukurtas apribojimų faile. Tai bus 74,25 MHz pagal 720p skiriamąją gebą. Svarbu prijungti pikselių laikrodį (iš dvi2rgb bloko) prie šių kaiščių:

    • vid_io_in_clk (vid in to axi stream block)
    • vid_io_out_clk („axi“srautas į vidinį bloką)
    • clk (laiko valdiklis)
    • „PixelClk“(„rgb2dvi“)
  10. *** Pastaba: Šiuo metu, norint suaktyvinti pikselių laikrodžio atkūrimą, HDMI rx ir tx jungtys turi būti prijungtos prie aktyvaus šaltinio/kriauklės. Vienas iš būdų tai padaryti yra atskirti vaizdo rx ir tx blokus į skirtingus laikrodžio domenus (kitaip tariant, sugeneruoti naują 74,25 MHz laikrodį, kurį reikia perduoti tx blokui). ***
  11. Toliau nustatykite laikrodžio vedlį, kad turėtumėte 100 MHz įvestį (pasaulinis buferinis šaltinis) ir 3 išėjimo laikrodžius po 50 MHz („AXI-Lite“laikrodis), 150 MHz („AXI4-Stream“laikrodis), 200 MHz (dvi2rgb „RefClk“kaištis).
  12. Prijunkite FCLK_CLK0 apdorojimo sistemos kaištį prie laikrodžio vedlio įvesties
  13. Šiuo metu dizaino lango viršuje esančioje žalioje juostoje spustelėkite „Vykdyti ryšio automatizavimą“. Patartina tai padaryti vienu bloku vienu metu ir sekti aukščiau pateiktą TX bloko dizaino vaizdą.
  14. Įrankis bandys pridėti AXI jungtį, kuri veikia kaip pagrindinis/pavaldus sujungimas blokams, kurie naudoja AXI-Lite magistralę (VDMA ir GPIO).
  15. Taip pat bus pridėtas „AXI SmartConnect“, kuris veikia kaip pagrindinis/pavaldus ryšys „AXI4-Stream“ir didelio našumo procesorių sąsajoms, naudojamoms VDMA („Stream to Memory Map“ir atvirkščiai).
  16. Įrankis taip pat pridės procesoriaus sistemos atstatymą. Įsitikinkite, kad tai prijungta tik prie VDMA, GPIO ir su procesoriais susijusių blokų. Nejunkite jo prie jokių vaizdo blokų (pvz., Dvi2rgb, laiko valdiklio, vaizdo srauto ir pan.)
  17. Kai ryšio automatizavimas bus baigtas, patikrinkite, ar jungtys atitinka TX bloko dizaino vaizdą. Jūs pastebėsite papildomą sistemos ILA bloką, kuris nebuvo paminėtas. Tai skirta tik derinimui ir kol kas nereikalinga. Jis naudoja 150M procesoriaus atstatymą, todėl to taip pat nereikia. Visur, kur autobusuose matote mažas žalias „klaidas“, tai yra dėl ILA ir į jas galima nekreipti dėmesio.
  18. Paskutinis žingsnis - dešiniuoju pelės mygtuku spustelėkite bloko dizainą projekto šaltinių medyje ir pasirinkite „Sukurti HDL apvyniojimą“. Jei planuojate įvynioti logiką, ji bus perrašyta kiekvieną kartą pasirinkus.
  19. Išsamesnės informacijos SDK pusėje rasite skyriuje VDMA tvarkyklės sąranka.

Laikrodžiai ir atstatymai

Radau, kad svarbiausi bet kokio programuojamo loginio projekto aspektai yra kruopštus laikrodžio domenų ir atstatymo signalų svarstymas. Jei jie tinkamai sukonfigūruoti, turite gerą rezultatą, kad jūsų dizainas veiktų.

„Pixel“laikrodis ir laikas užrakinti

Norint patikrinti, ar tam tikri signalai yra aktyvūs, patartina šiuos signalus susieti su šviesos diodais (laikrodžiai, atstatymai, užraktai ir kt.). Du signalai, kuriuos man buvo naudinga sekti siųstuvo plokštėje, buvo pikselių laikrodis ir „užrakintas“signalas „AXI4-Stream to video out“bloke, kuris nurodo, kad vaizdo įrašo laikas buvo sinchronizuotas su laiko valdikliu ir vaizdo šaltiniu duomenis. Aš pridėjau šiek tiek logikos prie dizaino bloko įvyniojimo, kuris seka pikselių laikrodį, naudodamas „PixelClkLocked“signalą dvi2rgb bloke kaip atstatymą. Čia pridėjau failą kaip hdmi_wrapper.v. Čia taip pat pridedamas apribojimų failas.

2 veiksmas: sukonfigūruokite „Zynq“programuojamą imtuvo logiką

Konfigūruokite „Zynq“programuojamą imtuvo logiką
Konfigūruokite „Zynq“programuojamą imtuvo logiką
Konfigūruokite „Zynq“programuojamą imtuvo logiką
Konfigūruokite „Zynq“programuojamą imtuvo logiką
Konfigūruokite „Zynq“programuojamą imtuvo logiką
Konfigūruokite „Zynq“programuojamą imtuvo logiką

Imtuvo programuojamas logikos blokas yra paprastesnis. Pagrindinis skirtumas, išskyrus trūkstamus hdmi įvesties blokus, yra atkurto pikselių laikrodžio nebuvimas. Dėl šios priežasties iš laikrodžio vedlio turime sukurti savo. Šis dizainas turėtų būti atliekamas atskirame projekte nuo siųstuvo. Mūsų tikslais imtuvo projektas sekė „Zybo 7Z-20“plokštę, o siųstuvas-Z7-10 plokštę. FPGA plokštėse yra skirtingi, todėl … būkite atsargūs.

Štai imtuvo dizaino bloko kūrimo veiksmai:

  1. Prie savo dizaino pridėkite šiuos „ip“blokus:

    • Laiko valdiklis
    • „AXI4-Stream“į vaizdo išvestį
    • RGB į DVI
    • AXI VDMA
    • AXI GPIO
    • Apdorojimo sistema
    • Laikrodžio vedlys
    • Pastovus (VDD nustatytas į 1)
  2. Šių blokų konfigūravimui naudokite tą patį modelį, kaip ir siųstuvas. Čia buvo pateikti vaizdai dėl pastebimų konfigūracijos skirtumų. Kiti lieka tokie patys kaip ir siųstuvas.
  3. Konfigūruokite šio dizaino VDMA kaip tik skaitymo kanalą. Išjunkite rašymo kanalą.
  4. Laikrodžio vedlys turi būti sukonfigūruotas šiems išėjimams:

    • clk_out1: 75 MHz (pikselių laikrodis)
    • clk_out2: 150 MHz (srauto laikrodis)
    • clk_out3: 50 MHz („axi-lite“laikrodis)
  5. Prijunkite vaizdo blokus, kaip parodyta RX bloko dizaino paveikslėlyje.
  6. Tada paleiskite ryšio automatizavimą, kuris pridės „AXI Interconnect“, „AXI SmartConnect“ir „System Reset“blokus ir bandys užmegzti tinkamus ryšius. Lėtai eikite čia, kad įsitikintumėte, jog jis neatlieka nepageidaujamų ryšių.
  7. Padarykite HDMI TMDS laikrodį ir duomenų kaiščius išorinius ant rgb2dvi bloko
  8. Šiam dizainui nereikia karšto kištuko signalo.

3 veiksmas: nustatykite VDMA tvarkyklę

Nustatykite VDMA tvarkyklę
Nustatykite VDMA tvarkyklę

Skirtingų blokų, sukonfigūruotų naudojant „AXI-Lite“sąsają, sąranką geriausia atlikti naudojant demonstracinius projektus, įtrauktus į BSP. Eksportavę projektavimo aparatūrą ir paleidę SDK iš „Vivado“, norėsite pridėti naują plokštės palaikymo paketą ir įtraukti „lwip202“biblioteką į BSP nustatymų langą. Atidarykite failo system.mss failą iš BSP ir pamatysite išorines tvarkykles, pateiktas jūsų bloko konstrukcijoje. Parinktis „Importuoti pavyzdžius“leidžia importuoti demonstracinius projektus, kuriuose naudojami šie išoriniai įrenginiai, ir parodyti, kaip juos sukonfigūruoti programinėje įrangoje naudojant turimas „Xilinx“tvarkykles (žr. Pridėtą paveikslėlį).

Tokiu būdu buvo sukonfigūruotas VDMA, laikmatis ir pertraukimas bei GPIO. Čia įtrauktas tiek perdavimo, tiek gavimo šaltinio kodas. Skirtumai beveik išimtinai yra pagrindiniai.c.

*** PASTABA: Kadangi rašant šią pamoką sistema neveikia visiškai, šio skyriaus šaltinio kodas neapima belaidžio tinklo kodo. Sujungus pagrindinio vaizdo perdavimo/priėmimo projektus su tinklo perdavimo/priėmimo projektais, reikia pašalinti keletą klaidų. Todėl šioje pamokoje jie kol kas traktuojami atskirai. ***

TX pertraukimo tvarkyklės funkcija (IRQHandler)

Ši funkcija nuskaito pilkus kodus, kuriuos suteikia skaitymo ir rašymo VDMA per GPIO blokus. Pilki kodai konvertuojami į dešimtainius ir naudojami dabartinio kadro pagrindo atminties vietai pasirinkti. Nukopijuotas kadras yra ankstesnis kadras, į kurį buvo rašoma VDMA (pvz., Jei VDMA rašo į 2 kadrą, nukopijuojame 1 kadrą; jei rašome į 0 kadrą, apvyniojame ir skaitome iš 2 kadro).

Ši funkcija užfiksuoja tik kiekvieną 6 kadrą, kad sumažintų kadrų dažnį iki 10 Hz, o ne 60 Hz. Viršutinė tinklo riba yra 300 Mbps. Esant 10 kadrų per sekundę, reikalingas 221,2 Mbps pralaidumas.

Komentuodami/atšaukdami dvi šios funkcijos eilutes, vartotojas galės perjungti į HDMI passthru režimą derinimo/bandymo tikslais (kodas komentuojamas, nurodant atitinkamas eilutes). Šiuo metu jis nukopijuoja kadrą į atminties vietą, naudojamą eterneto kodu.

RX pertraukimo tvarkyklės funkcija (IRQHandler)

Ši funkcija yra labai panaši į TX funkciją, tačiau ji nukopijuojama iš 2 buferinio FIFO, kurį eternetas naudoja gaunamiems duomenims rašyti. Eterneto kodas nurodo, į kurį kadrą rašomas FIFO, duomenys nukopijuojami iš priešingo kadro. Duomenys nukopijuojami į rėmelį tiesiai už to, kurį skaito VDMA, kad būtų išvengta plyšimo.

4 veiksmas: nustatykite „Nanorouter“tinklą

Nustatykite „Nanorouter“tinklą
Nustatykite „Nanorouter“tinklą

Norėdami sukurti tinklą naudodami „TPlink“nanorouterius, įjunkite juos atskirai ir prisijunkite prie numatytojo įrenginių „Wi -Fi“SSID. Daugiau informacijos apie šio konkretaus įrenginio konfigūracijos nustatymus rasite įrenginio vartotojo vadove.

Nustatykite vieną iš įrenginių kaip prieigos tašką, jis veiks kaip pagrindinis tinklo ryšys. Būtinai pavadinkite tinklą ir užsirašykite jo pavadinimą bei išjunkite DHCP (nenorime, kad maršrutizatorius dinamiškai sukonfigūruotų IP adresus, norime, kad „Zybo“tansmiterio ir imtuvo plokštės pačios nustatytų savo IP adresus, kad jie būtų nuoseklūs). Po konfigūravimo įsitikinkite, kad įrenginys iš naujo paleidžiamas ir sukuriamas šis tinklas.

Nustatykite kitą įrenginį kaip klientą ir įsitikinkite, kad jis prisijungia prie tinklo SSID, kurį nustatėte naudodami pirmąjį nanorouterį. Dar kartą įsitikinkite, kad klientui išjungtas DHCP.

Baigęs ir iš naujo paleidęs klientą, jis turėtų prisijungti prie prieigos taško nanorouterio (jei ne, greičiausiai kyla problemų dėl vieno iš įrenginių konfigūracijos). Pastebėsite, kad prijungus prie prieigos taško kliento šviesos diodas bus pastovus.

Tikėtina, kad šiuo metu prieigos taško nanorouterio šviesos diodas ir toliau mirksės, tai gerai! Mirksinti lemputė reiškia, kad jis nėra prijungtas prie kito įrenginio iš jo eterneto prievado, o kai jis bus prijungtas prie sukonfigūruoto „Zybo“, šviesos diodas išliks pastovus, rodantis sėkmingą tinklo ryšį.

Dabar, kai jau turime nano maršrutizatorių sąranką, turime belaidį tinklą, kuris leis mums bendrauti. Svarbi pastaba yra ta, kad mūsų konfigūravimo metodas, skirtas nanorouteriams (kaip prieigos taškui ir klientui), leidžia mums bendrauti iš perduodančios „Zybo“plokštės į priimančią „Zybo“plokštę taip, lyg jie būtų sujungti vienu eterneto laidu. Tai apsunkina mūsų tinklo sąranką, nes alternatyva greičiausiai apimtų „Zybo“plokščių sukonfigūravimą, kad būtų galima tiesiogiai prisijungti prie serverio kartu su numatytu ryšiu.

Kai abu įrenginiai yra sukonfigūruoti, nanorouteriai yra sukonfigūruoti ir paruošti įdiegti į jūsų WIDI tinklą. Tarp nanorouterių ir „Zybo“plokščių nėra specialaus suporavimo, nes prieigos taškas arba klientas veiks perdavimo arba priėmimo įrenginyje.

5 veiksmas: nustatykite „Zynq“apdorojimo sistemą duomenų perdavimui per eternetą

Nustatykite „Zynq“apdorojimo sistemą duomenų perdavimui per eternetą
Nustatykite „Zynq“apdorojimo sistemą duomenų perdavimui per eternetą
Nustatykite „Zynq“apdorojimo sistemą duomenų perdavimui per eternetą
Nustatykite „Zynq“apdorojimo sistemą duomenų perdavimui per eternetą

Norėdami perduoti HDMI duomenis iš vienos „Zybo“plokštės į kitą, prie mūsų VDMA tvarkyklės turime įtraukti „Ethernet“protokolą. Mūsų tikslas yra transliuoti atskirus vaizdo kadrus per eterneto eternetą apdorojimo sistemoje, nustatytu greičiu, atitinkančiu mūsų tinklo pralaidumą. Savo projektui mes panaudojome TCP, pateiktą be metalo LwIP API. Kadangi abu projekto nariai yra palyginti nepatyrę tinklo paslaugų, šis pasirinkimas buvo padarytas visiškai nepripažįstant su TCP susijusių pasekmių ir apribojimų. Pagrindinė šio diegimo problema buvo ribotas pralaidumas ir tai, kad jis tikrai nėra skirtas didelio kiekio duomenų garavimui. Alternatyvūs sprendimai, kaip pakeisti TCP ir pagerinti tbe šiame projekte, bus aptarti vėliau.

Trumpas TCP su LwIP aprašymas: duomenys siunčiami per tinklą tcp_mss dydžio paketais (maksimalus TCP segmento dydis), kuris paprastai yra 1460 baitų. Skambinus „tcp_write“, reikės kai kurių rodyklės nurodytų duomenų ir sukonfigūruosime pbufs (paketų buferius), kad jie laikytų duomenis ir suteiktų TCP operacijų struktūrą. Maksimalus duomenų kiekis, kurį vienu metu galima įtraukti į eilę, yra nustatytas kaip tcp_snd_buf (TCP siuntėjo buferinė erdvė). Kadangi šis parametras yra 16 bitų skaičius, mes apsiribojame 59695 baitų siuntimo buferio dydžiu (siuntimo buferyje yra tam tikras reikalingas užpildymas). Kai duomenys bus įrašyti į eilę, „tcp_output“bus paragintas pradėti duomenų perdavimą. Prieš siunčiant kitą duomenų segmentą, būtina, kad visi ankstesni paketai būtų sėkmingai perduoti. Šis procesas atliekamas naudojant funkciją recv_callback, nes ši funkcija iškviečiama, kai imtuvas mato patvirtinimą.

Naudojant pavyzdinius projektus „Vivado SDK“labai naudinga norint sužinoti, kaip veikia „LwIP TCP“, ir tai yra geras atspirties taškas pradedant naują projektą.

„WiDi“perdavimo įrenginio procedūra yra tokia:

  1. Inicijuokite TCP tinklą naudodami tik metalo LWIP tvarkyklės funkcijos iškvietimus.
  2. Nurodykite visas atgalinio ryšio funkcijas, būtinas tinklo operacijoms.
  3. Prisijunkite prie „WiDi“imtuvo prisijungdami prie jo IP adreso ir prievado (mūsų konfigūracija: imtuvo IP yra 192.168.0.9, prijunkite prie 7 prievado).
  4. Pasibaigus VDMA tvarkyklės laikmačiui, įveskite TX ISR.
  5. Pagal VDMA pilką kodą nustatykite dabartinį kadro buferį, kurį norite pasiekti
  6. Eilės tvarka nustatykite pirmąjį duomenų segmentą TCP siuntimo buferyje
  7. Išveskite duomenis ir atnaujinkite vietinius kintamuosius, kad galėtumėte stebėti, kiek duomenų buvo išsiųsta iš dabartinio kadro.
  8. Pasiekę gautą atgalinį skambutį (funkcinis skambutis, padarytas po to, kai siųstuvas gauna patvirtinimą apie duomenų gavimą), eikite į eilę prie kito duomenų segmento.
  9. Kartokite 7 ir 8 veiksmus, kol bus išsiųstas visas kadras.
  10. Grįžkite į tuščiosios eigos būseną ir palaukite, kol kitas laikmačio pertraukimas parodys, kad naujas kadras paruoštas (grįžkite į 4 veiksmą).

Būtinai nustatykite plokštės palaikymo paketo LwIP nustatymus, kaip parodyta aukščiau esančiame paveikslėlyje. Visos vertės yra numatytosios, išskyrus tcp_snd_buf, tcp_pueue_ooseq, mem_size, memp_n_tcp_seg. Taip pat atkreipkite dėmesį, kad išsamų derinimą galima pasiekti pakeitus debug_options grupės BSP parametrus.

6 veiksmas: nustatykite „Zynq“apdorojimo sistemą duomenų priėmimui per eternetą

„Zybo“kūrimo plokštė, veikianti kaip belaidis imtuvas, veiks panašiai kaip ir perduodantis įrenginys. LwIP plokštės palaikymo paketo nustatymai bus identiški ankstesnio veiksmo nustatymams.

Įrenginys iš nanorouterio paims paketus, kuriuose yra vaizdo kadro segmentai, ir nukopijuos vaizdo kadro duomenis į trigubo kadro buferio erdvę priimančiai VDMA. Siekiant išvengti bet kokių duomenų perrašymo, renkant duomenis iš nanorouterio naudojamas dvigubas duomenų buferis (mes vadiname tinklo buferiu), kad tinklo srautas galėtų tęsti srautinį perdavimą, kol ankstesnis visas vaizdo kadras yra nukopijuojamas į VDMA buferis.

„WiDi“priėmimo įrenginio procedūrai atlikti reikia dviejų užduočių, iš kurių viena yra eterneto duomenų priėmimas, o kita - vaizdo įrašų kadrų kopijavimas iš tinklo buferio į VDMA trigubo kadro buferį.

Ethernet priėmimo užduotis:

  1. Inicijuokite TCP tinklą naudodami tik metalo LWIP tvarkyklės funkcijos iškvietimus (sąranka su IP adresu, prie kurio bus prijungtas siųstuvas, mūsų 192.168.0.9)
  2. Nurodykite visas atgalinio ryšio funkcijas, būtinas tinklo operacijoms.
  3. Gavę eterneto paketą, nukopijuokite paketinius duomenis į dabartinį tinklo buferį, padidinkite sukauptus duomenis.
  4. Jei paketas užpildo tinklo kadrų buferį, tęskite 5 ir 6 veiksmus. Priešingu atveju grįžkite prie 3 veiksmo nuo šios užduoties.
  5. signalas, kad VDMA trigubo kadro buferio užduotis turėtų nukopijuoti iš naujai užbaigto tinklo buferio.
  6. Perjunkite į kitą tinklo buferį ir toliau rinkite duomenis per eternetą.
  7. Nenaudokite, kol gausite naują „Ethernet“paketą (3 veiksmas).

Kopijuoti tinklo buferį į VDMA trigubo kadro buferį:

  1. Pasibaigus VDMA tvarkyklės laikmačiui, įveskite RX ISR.
  2. Pagal VDMA pilką kodą nustatykite dabartinį kadro buferį, kurį norite pasiekti.
  3. Nustatykite, kuris tinklo buferis bus nukopijuotas į VDMA buferį, ir nukopijuokite tuos duomenis

7 veiksmas: prijunkite „Zybo“plokštes prie HDMI šaltinio ir HDMI kriauklės

Prijunkite „Zybo“plokštes prie HDMI šaltinio ir HDMI kriauklės
Prijunkite „Zybo“plokštes prie HDMI šaltinio ir HDMI kriauklės

Dabar prijunkite imtuvo ir siųstuvo hdmi laidus, užprogramuokite FPGA ir paleiskite apdorojimo sistemą. Kadrų dažnis greičiausiai bus labai lėtas dėl didžiulių pridėtinių išlaidų LwIP veikloje ir riboto pralaidumo. Jei kyla kokių nors problemų, prisijunkite per UART ir pabandykite nustatyti visus įspėjimus ar klaidas.

8 žingsnis: alternatyvios tobulinimo idėjos

Alternatyvios tobulinimo idėjos
Alternatyvios tobulinimo idėjos

Didelė šio projekto problema buvo duomenų, reikalingų siųsti per „Wi -Fi“, kiekis. Tai buvo tikimasi, tačiau mes neįvertinome to poveikio ir dėl to ekrane atsirado daugiau vaizdų, o ne vaizdo įrašų. Yra keletas būdų, kaip pagerinti šį projektą:

  • Vaizdo įrašo suspaudimas realiuoju laiku. Suglaudinus gaunamo vaizdo įrašo sklaidos kanalą po kadro, labai sumažėtų duomenų, kuriuos reikia siųsti per tinklą, kiekis. Idealiu atveju tai būtų padaryta aparatinėje įrangoje (o tai nėra lengva užduotis) arba tai būtų galima padaryti programinėje įrangoje, naudojant kitą ARM branduolį, kad būtų vykdomi suspaudimo algoritmai (tam reikia atlikti papildomą analizę, kad būtų užtikrintas laikas). Yra keletas atviro kodo vaizdo suspaudimo komponentų, kuriuos radome žiniatinklyje, tačiau dauguma jų yra IP.
  • „Ethernet“srauto diegimas aparatinėje, o ne programinėje įrangoje. Dėl segmento dydžio apribojimo buvo daug pridėtinių išlaidų, nes trūko vietos siųstuvo eilėje siunčiamiems duomenims. Daug efektyvesnis procesas yra naudoti AXI Ethernet IP su FIFO buferiu arba DMA duomenims įvesti. Tai sumažintų papildomą bagažą iš LwIP TCP ir leistų daugiau duomenų srauto.

9 veiksmas: prieinamumas

Gautas šio „WiDi“projekto produktas turėtų būti visiškai integruota, kompaktiška įrenginių pora, kurią vartotojas galėtų prijungti prie bet kurio HDMI šaltinio, o tada belaidžiu būdu perkelti vaizdo įrašą į ekraną su HDMI galimybe. Įrenginiuose būtų „Zynq-7000 SoC“, esantis „Zybo“informacinėje lentoje, ir tinklo aparatūra, esanti „TP-Link“nano-maršrutizatoriuose. Idealiu atveju vartotojas galėtų valdyti perdavimo modulį iš atskiros tikslinės operacinės sistemos vietos, be didelių techninių galimybių.

Sauga ir ryšys

Įrenginiuose taip pat turėtų būti įdiegtas transporto sluoksnio saugumas (TLS) ir ribotos automatinio prisijungimo galimybės tiek privatumo tikslais. Dizaineriai siekia, kad ryšys su ekranu per belaidę sąsają būtų sąmoningas veiksmas vartotojo vardu, kad būtų išvengta klaidingos jautrios medžiagos transliacijos.

Dabartinė būsena

Iki šiol projekto būklė vis dar yra nebaigta. Kad dabartinis galinio taško vartotojas galėtų pasinaudoti šia pamoka, jis turi gerai išmanyti įterptųjų sistemų dizainą ir būti susipažinęs su programuojama aparatine įranga ir įterpta programine įranga, veikiančia kartu.

Tinklu siunčiami duomenys šiuo metu nėra užšifruoti ir manoma, kad jie yra neapdorotas TCP/IP paketų perdavimas.

Pagrindinis vaizdo įrašo projektas buvo sėkmingai išbandytas tiek perduodant, tiek gaunant. Kita vertus, buvo sukurtas belaidis ryšys tarp dviejų „zybo“plokščių ir sėkmingai išsiųsti bandomojo kadro duomenys. Tačiau vis tiek būtina sujungti tinklo kodą su kiekvienu vaizdo įrašo pagrindiniu projektu ir patikrinti faktinių vaizdo įrašų kadrų perdavimą.

Rekomenduojamas: