Inhoudsopgave:

WIDI - Draadloze HDMI met Zybo (Zynq Development Board) - Ajarnpa
WIDI - Draadloze HDMI met Zybo (Zynq Development Board) - Ajarnpa

Video: WIDI - Draadloze HDMI met Zybo (Zynq Development Board) - Ajarnpa

Video: WIDI - Draadloze HDMI met Zybo (Zynq Development Board) - Ajarnpa
Video: Meet ARTY, the $99, Artix-7 35T-based Evaluation Kit 2024, Juli-
Anonim
WIDI - Draadloze HDMI met Zybo (Zynq Development Board)
WIDI - Draadloze HDMI met Zybo (Zynq Development Board)
WIDI - Draadloze HDMI met Zybo (Zynq Development Board)
WIDI - Draadloze HDMI met Zybo (Zynq Development Board)

Heb je ooit gewenst dat je je tv als externe monitor op een pc of laptop kon aansluiten, maar wilde je niet al die vervelende snoeren in de weg hebben? Zo ja, dan is deze tutorial iets voor jou! Hoewel er enkele producten zijn die dit doel bereiken, is een doe-het-zelf-project veel bevredigender en mogelijk goedkoper.

Dit concept verschilt van producten zoals chromecast, omdat het bedoeld is om de plaats in te nemen van een HDMI-kabel die op een monitor wordt aangesloten in plaats van een streamingapparaat te zijn.

Ons project is gemaakt als een afstudeerproject voor een cursus Real Time Operating Systems aan de California State Polytechnic University, San Luis Obispo.

Het doel van het project is om twee Digilent Zybo-kaarten te gebruiken als draadloze communicatie-interface tussen een HDMI-zender (pc, blu-ray, enz.) naar een HDMI-ontvangstapparaat (Desktop Monitor, Projector, TV, enz.).

Eén Digilent Zybo wordt via HDMI aangesloten op het verzendende apparaat en de andere wordt via HDMI aangesloten op het ontvangende apparaat.

De draadloze communicatie wordt tot stand gebracht door gebruik te maken van een draadloos lokaal netwerk voor de zender en ontvanger, zonder te worden gerouteerd via een thuisrouter of ander dergelijk apparaat. De draadloze module die voor dit project wordt gebruikt, is de tplink wr802n nanorouter, waarvan er één fungeert als toegangspunt om het netwerk tot stand te brengen en de andere als client om verbinding te maken met het netwerk. Elke nanorouter wordt via een ethernetkabel aangesloten op een van beide Zybo-kaarten. Wanneer ze zijn aangesloten op deze routers, communiceren de apparaten via TCP alsof ze zijn verbonden met een enkele ethernetkabel (wat betekent dat de enige configuratie die nodig is om een verbinding tot stand te brengen het IP-adres van de client is).

Hoewel het doel van het project was om een stream van 1080x720 video @ 60Hz mogelijk te maken, was dit niet haalbaar vanwege bandbreedtebeperkingen in het draadloze netwerk en het ontbreken van realtime videocompressie om de gegevens die nodig zijn om te verzenden te verminderen. In plaats daarvan dient dit project als het raamwerk voor toekomstige ontwikkeling om dit doel te bereiken, omdat het zeer beperkte beperkingen in framesnelheid heeft om HDMI-gegevens correct te streamen zoals bedoeld.

Projectvereisten:

2x Digilent Zybo Development Boards (moet minimaal één HDMI-poort hebben)

2x HDMI-kabels

2x microusb-kabels (om Zybo op pc aan te sluiten voor ontwikkeling)

2x tplink wr802n nanorouters (inclusief extra 2x microusb en stopcontact-stroomadapters)

2x ethernetkabels

***Opmerking: deze tutorial veronderstelt bekendheid met de Vivado-ontwerpsuite en ervaring met het maken van een nieuw project en blokontwerp.***

Stap 1: Configureer Zynq programmeerbare logica voor zender

Configureer Zynq programmeerbare logica voor zender
Configureer Zynq programmeerbare logica voor zender
Configureer Zynq programmeerbare logica voor zender
Configureer Zynq programmeerbare logica voor zender
Configureer Zynq programmeerbare logica voor zender
Configureer Zynq programmeerbare logica voor zender

Onze benadering voor het ontwikkelen van de programmeerbare logica van de zender was om een hdmi-naar-hdmi-doorvoer van pc naar monitor uit te voeren met behulp van twee VDMA-blokken (Video Direct Memory Access), één voor schrijven en één voor lezen.

Beide zijn geselecteerd voor vrijlopende, 3-frame-buffermodus (0-1-2). Aangezien de videokern is geoptimaliseerd voor 60 frames per seconde, betekent dit dat de VDMA elke 16,67 ms naar een nieuw frame zal schrijven of lezen in deze volgorde: 0, 1, 2, 0, 1, 2, 0, 1, 2. De DDR-geheugenlocaties voor elk frame zijn verschillend voor de twee VDMA's omdat ze niet langer met elkaar zijn gesynchroniseerd. In plaats daarvan wordt een hardwaretimer (TTC1), geconfigureerd voor 60 Hz, gebruikt om de verplaatsing van gegevens tussen de twee geheugenlocaties te synchroniseren.

De afbeelding hierboven toont 3 frames, hun afmetingen en de hoeveelheid geheugen die elk nodig heeft (rechts van het frame). Als we de schrijf-VDMA aan deze geheugenlocaties toewijzen, kunnen we de lees-VDMA-geheugenlocaties buiten deze set toewijzen, laten we zeggen beginnend met 0x0B000000. Elk frame bestaat uit 1280*720 pixels en elke pixel bestaat uit 8 bits rood, groen en blauw voor een totaal van 24 bits. Dit betekent dat een frame uit 1280*720*3 bytes (2,76 MB) bestaat.

In de timer zal IRQ, die wordt beschreven in de VDMA-stuurprogrammaconfiguratie, het kopiëren van gegevens tussen de twee VMDA-geheugenlocaties afhandelen. De VDMA verschaft een aanwijzer naar het huidige frame waarnaar wordt geschreven of waarvan wordt gelezen. Het frame wordt weergegeven door een bepaalde grijscode, die in software wordt omgezet. De grijscodedefinities voor een configuratie met 3 frames-buffers zijn te vinden in de AXI VDMA Product Guide in bijlage C.

Dit stelt ons in staat om de inhoud die naar het geheugen wordt geschreven te kopiëren zonder te lezen van een frame waarnaar momenteel wordt geschreven.

***Merk op dat de lees-VDMA niet wordt gebruikt bij het verzenden van gegevens via het draadloze netwerk. Het is alleen bedoeld om de juiste werking van het kopieergeheugen van de schrijf-VMDA te controleren. De lees-VMDA moet uitgeschakeld zijn.***

Dit zijn de stappen om het zenderontwerpblok te maken:

  1. Bij het aanmaken van een nieuw project is het een goed idee om een chip of bord aan het project toe te wijzen. Deze link beschrijft hoe u nieuwe bordbestanden aan de Vivado-directory kunt toevoegen en het juiste bord aan uw project kunt koppelen. Het is handig bij het toevoegen van het Processing System-blok en bij de overgang van hardware naar software (SDK-kant).
  2. Voeg de volgende blokken toe:

    • dvi2rgb
    • Video in naar Axi4-stream
    • Timingcontroller:
    • axi4-stream naar video out
    • rgb2dvi
    • AXI VDMA x2
    • AXI GPIO x2
    • Klok Wizard
    • Constante
    • Zynq-verwerkingssysteem
  3. Wanneer u het verwerkingssysteem toevoegt, klikt u op "Blokautomatisering uitvoeren" in de bovenste groen gekleurde balk en zorgt u ervoor dat de optie "Bordvoorinstelling toepassen" is geselecteerd. Laat al het andere standaard.
  4. Afbeeldingen van elk blokconfiguratievenster zijn te vinden in de bovenstaande afbeeldingen. Als u geen afbeelding voor een bepaald venster ziet, laat u deze gewoon als standaard.
  5. Begin met het configureren van het Zynq Processing-systeem:

    • In PS-PL-configuratie AXI Niet-beveiligd GP Master AXI inschakelen, M AXI GP0-interface inschakelen
    • Schakel in PS-PL-configuratie HP Slave AXI-interface zowel HP0 als HP1. in
    • In MIO-configuratie Zorg ervoor dat ENET0 is ingeschakeld onder I/O-randapparatuur en vervolgens Application Processor Unit, schakel Timer0 in
    • Schakel in Clock Configuration PL Fabric Clocks FCLK_CLK0 in en stel in op 100 MHz.
    • Klik OK
  6. Voordat u op "Verbindingsautomatisering uitvoeren" klikt, moet u ervoor zorgen dat u de videoblokken aansluit zoals te zien is in de afbeelding van het TX-blokontwerp hierboven. U wilt de constante hernoemen naar VDD en de waarde instellen op 1. Sluit de videoblokken dienovereenkomstig aan.
  7. Maak de HDMI TMDS-klok en datapinnen extern op de rgb2dvi- en dvi2rgb-blokken
  8. Maak een invoer- en uitvoerpoort voor het hot-plug-detectiesignaal (HPD) en verbind deze met elkaar, deze zijn gedefinieerd in het beperkingenbestand
  9. De pixelklok wordt hersteld van de TMDS_Clk_p, die is gemaakt in het bestand met beperkingen. Dit zal 74,25 MHz zijn in overeenstemming met een resolutie van 720p. Het is belangrijk om de pixelklok (van het dvi2rgb-blok) aan te sluiten op de volgende pinnen:

    • vid_io_in_clk (vid in naar axi stream-blok)
    • vid_io_out_clk (axi stream naar vid out blok)
    • clk (timingcontroller)
    • PixelClk (rgb2dvi)
  10. ***Opmerking: om het herstel van de pixelklok te activeren, moeten de HDMI rx- en tx-connectoren momenteel worden aangesloten op een actieve bron/sink. Een manier om dit te omzeilen is om de video rx- en tx-blokken te scheiden in verschillende klokdomeinen (met andere woorden, een nieuwe 74,25 MHz-klok genereren om naar het tx-blok te voeren).***
  11. Stel vervolgens de klokwizard zo in dat u een 100 MHz-ingang (globale bufferbron) en 3 uitgangsklokken hebt @ 50 MHz (AXI-Lite-klok), 150 MHz (AXI4-Stream-klok), 200 MHz (dvi2rgb RefClk-pin).
  12. Sluit de FCLK_CLK0-verwerkingssysteempen aan op de klokwizard-ingang
  13. Klik nu op "Verbindingsautomatisering uitvoeren" in de groene balk bovenaan het ontwerpvenster. Het is een goed idee om dit voor één blok tegelijk te doen en de bovenstaande afbeelding van het TX-blokontwerp te volgen.
  14. De tool zal proberen om de AXI Interconnect toe te voegen, die fungeert als de master/slave-interconnect voor de blokken die de AXI-Lite-bus gebruiken (VDMA's en GPIO's).
  15. Het zal ook AXI SmartConnect toevoegen, dat fungeert als de master/slave-interconnect voor de AXI4-Stream en High Performance-processorinterfaces die worden gebruikt door de VDMA (Stream to Memory Map en vice versa).
  16. De tool voegt ook een Processor System Reset toe. Zorg ervoor dat deze alleen is aangesloten op de VDMA's, GPIO's en processorgerelateerde blokken. Sluit het niet aan op videoblokken (d.w.z. dvi2rgb, timingcontroller, vid om te streamen enz.)
  17. Nadat de automatisering van de verbinding is voltooid, controleert u of de verbindingen overeenkomen met die van de afbeelding van het TX-blokontwerp. U ziet een extra System ILA-blok dat niet is genoemd. Dit is alleen voor debuggen en is voorlopig niet nodig. Het gebruikt de 150M Processor Reset, dus dat is ook niet nodig. Overal waar je kleine groene "bugs" op bussen ziet, dat komt door de ILA en kan worden genegeerd.
  18. De laatste stap is om met de rechtermuisknop op het blokontwerp in de boom met projectbronnen te klikken en "HDL-wrapper maken" te selecteren. Als u van plan bent logica aan de wrapper toe te voegen, wordt deze elke keer dat deze wordt geselecteerd overschreven.
  19. Zie de sectie VDMA Driver Setup voor details over de SDK-kant.

Klokken en resets

Ik heb ontdekt dat de belangrijkste aspecten van elk programmeerbaar logisch project een zorgvuldige afweging zijn van klokdomeinen en resetsignalen. Als die goed zijn geconfigureerd, heb je een goede kans om je ontwerp te laten werken.

Pixelklok en timing vergrendeld

Om te controleren of bepaalde signalen actief zijn, is het een goed idee om deze signalen te koppelen aan LED's (klokken, resets, sloten enz.). Twee signalen die ik nuttig vond om op het zenderbord te volgen, waren de pixelklok en het "vergrendelde" signaal op het AXI4-Stream to video out-blok, dat aangeeft dat de videotiming is gesynchroniseerd met de timingcontroller en de videobron gegevens. Ik heb wat logica toegevoegd aan de ontwerpblokwikkel die de pixelklok volgt met behulp van het PixelClkLocked-signaal op het dvi2rgb-blok als reset. Ik heb het bestand hier als hdmi_wrapper.v bijgevoegd. Het bestand met beperkingen is hier ook bijgevoegd.

Stap 2: Configureer Zynq programmeerbare logica voor ontvanger

Configureer Zynq programmeerbare logica voor ontvanger
Configureer Zynq programmeerbare logica voor ontvanger
Configureer Zynq programmeerbare logica voor ontvanger
Configureer Zynq programmeerbare logica voor ontvanger
Configureer Zynq programmeerbare logica voor ontvanger
Configureer Zynq programmeerbare logica voor ontvanger

Het programmeerbare logische blok voor de ontvanger is eenvoudiger. Het belangrijkste verschil, behalve de ontbrekende HDMI-invoerblokken, is de afwezigheid van een herstelde pixelklok. Om die reden moeten we onze eigen genereren vanuit de klokwizard. Dit ontwerp moet in een apart project van de zender worden gedaan. Voor onze doeleinden volgde het ontvangerproject het Zybo 7Z-20-bord terwijl de zender het Z7-10-bord volgde. De FPGA's op de borden zijn anders, dus … wees voorzichtig.

Dit zijn de stappen om het ontvangerontwerpblok te maken:

  1. Voeg de volgende ip-blokken toe aan je ontwerp:

    • Timingcontroller:
    • AXI4-Stream naar video-uitgang
    • RGB naar DVI
    • AXI VDMA
    • AXI GPIO
    • Verwerkingssysteem
    • Klok Wizard
    • Constant (VDD ingesteld op 1)
  2. Volg hetzelfde patroon voor het configureren van deze blokken als de zender. Afbeeldingen voor de opmerkelijke verschillen in configuratie zijn hier opgenomen. De andere blijven hetzelfde als de zender.
  3. Configureer de VDMA voor dit ontwerp alleen als leeskanaal. Schakel het schrijfkanaal uit.
  4. De klokwizard moet worden geconfigureerd voor de volgende uitgangen:

    • clk_out1: 75 MHz (pixelklok)
    • clk_out2: 150 MHz (streamklok)
    • clk_out3: 50 MHz (axi-lite klok)
  5. Sluit de videoblokken aan zoals weergegeven in de afbeelding van het RX-blokontwerp.
  6. Voer vervolgens de verbindingsautomatisering uit, die de blokken AXI Interconnect, AXI SmartConnect en System Reset zal toevoegen en probeer de juiste verbindingen te maken. Ga hier langzaam heen om ervoor te zorgen dat het geen ongewenste verbindingen tot stand brengt.
  7. Maak de HDMI TMDS-klok en datapinnen extern op het rgb2dvi-blok
  8. Bij dit ontwerp is geen hot-plug-signaal nodig.

Stap 3: VDMA-stuurprogramma instellen

VDMA-stuurprogramma instellen
VDMA-stuurprogramma instellen

Het instellen van de verschillende blokken die via de AXI-Lite-interface zijn geconfigureerd, kan het beste worden gedaan met behulp van demoprojecten die bij de BSP zijn meegeleverd als referentie. Na het exporteren van de ontwerphardware en het starten van de SDK vanuit Vivado, wil je een nieuw bordondersteuningspakket toevoegen en de lwip202-bibliotheek opnemen in het BSP-instellingenvenster. Open het system.mss-bestandsbestand van de BSP en u ziet de randapparatuurstuurprogramma's die aanwezig zijn in uw blokontwerp. Met de optie "Voorbeelden importeren" kunt u demoprojecten importeren die deze randapparatuur gebruiken en u laten zien hoe u ze in software kunt configureren met behulp van de beschikbare Xilinx-stuurprogramma's (zie bijgevoegde afbeelding).

Dit was de methode die werd gebruikt voor het configureren van de VDMA, Timer & Interrupt en de GPIO. De broncode voor zowel zenden als ontvangen is hier opgenomen. De verschillen zitten bijna uitsluitend in main.c.

***OPMERKING: aangezien het systeem op het moment van schrijven van deze tutorial nog niet volledig functioneel is, bevat de broncode in dit gedeelte niet de draadloze netwerkcode. Verschillende bugs moeten worden aangepakt als gevolg van het combineren van de zend/ontvangstprojecten van de videokern met de zend/ontvangstprojecten van het netwerk. Daarom behandelt deze tutorial ze voorlopig apart.***

TX Interrupt Handler Functie (IRQHandler)

Deze functie leest de grijscodes van zowel de lees- als schrijf-VDMA's via de GPIO-blokken. De grijze codes worden geconverteerd naar decimaal en gebruikt voor het selecteren van de framebasisgeheugenlocatie van het huidige frame. Het gekopieerde frame is het vorige frame van het frame waarnaar wordt geschreven door de VDMA (bijv. als de VDMA naar frame 2 schrijft, kopiëren we frame 1; als we naar frame 0 schrijven, wikkelen we en lezen we vanaf frame 2).

De functie legt alleen elk 6e frame vast om de framesnelheid te verlagen tot 10 Hz in plaats van 60 Hz. De bovengrens van het netwerk is 300 Mbps. Bij 10 frames per seconde is een bandbreedte van 221,2 Mbps vereist.

Door in deze functie twee regels te becommentariëren/verwijderen, kan de gebruiker overschakelen naar de HDMI-passthru-modus voor foutopsporing/testdoeleinden (de code wordt becommentarieerd om de juiste regels aan te geven). Het kopieert momenteel het frame naar een geheugenlocatie die wordt gebruikt door de ethernetcode.

RX Interrupt Handler Functie (IRQHandler)

Deze functie lijkt erg op de TX-functie, maar kopieert van een 2-buffer FIFO die door het ethernet wordt gebruikt om inkomende gegevens naar te schrijven. De ethernetcode geeft aan naar welk frame van de FIFO wordt geschreven, gegevens worden gekopieerd van het tegenoverliggende frame. De gegevens worden gekopieerd naar het frame direct achter het frame dat door de VDMA wordt gelezen om scheuren te voorkomen.

Stap 4: Nanorouter-netwerk instellen

Nanorouter-netwerk instellen
Nanorouter-netwerk instellen

Om een netwerk te maken met behulp van de TPlink-nanorouters, moet u ze afzonderlijk inschakelen en verbinding maken met de standaard wifi-SSID voor de apparaten. Meer informatie over de configuratie-instellingen voor dit specifieke apparaat vindt u in de gebruikershandleiding van het apparaat.

Stel een van de apparaten in als een toegangspunt, dit zal fungeren als de primaire verbinding voor het netwerk. Zorg ervoor dat u het netwerk een naam geeft en noteer de naam, en schakel DHCP uit (we willen niet dat de router de IP-adressen dynamisch configureert, we willen dat de Zybo-kaarten van de zender en ontvanger hun IP-adressen zelf instellen zodat ze consistent zijn). Zorg er na het configureren voor dat het apparaat opnieuw opstart en dit netwerk tot stand brengt.

Stel het andere apparaat in als client en zorg ervoor dat het verbinding maakt met de netwerk-SSID die u hebt ingesteld met de eerste nanorouter. Zorg er nogmaals voor dat DHCP is uitgeschakeld voor de client.

Zodra de client klaar is en opnieuw is opgestart, zou deze verbinding moeten maken met de nanorouter van het toegangspunt (als dit niet het geval is, is er waarschijnlijk een probleem in uw configuratie van een van de apparaten). U zult merken dat het LED-lampje op de client ononderbroken brandt zodra deze verbinding heeft gemaakt met het toegangspunt.

Het lampje van de nanorouter van het toegangspunt zal op dit punt waarschijnlijk blijven knipperen, dit is goed! Het knipperende lampje betekent dat het niet is aangesloten op een ander apparaat via de ethernetpoort, en als het eenmaal is aangesloten op een geconfigureerde Zybo, blijft de LED continu branden om aan te geven dat er een succesvolle netwerkverbinding is.

Nu we onze nanorouters hebben ingesteld, hebben we een draadloos netwerk waarmee we kunnen communiceren. Een belangrijke opmerking is dat onze configuratiemethode voor de nanorouters (als toegangspunt en client) ons in staat stelt om van het verzendende Zybo-bord naar het ontvangende Zybo-bord te communiceren alsof de twee verbonden zijn met een enkele ethernetdraad. Dit maakt onze netwerkconfiguratie minder moeilijk, omdat het alternatief waarschijnlijk het configureren van de Zybo-kaarten omvat om expliciet verbinding te maken met de server, samen met de beoogde verbinding.

Zodra beide apparaten zijn ingesteld, zijn de nanorouters geconfigureerd en klaar om te worden geïmplementeerd in uw WIDI-netwerk. Er is geen specifieke koppeling tussen de nanorouters en de Zybo-kaarten, omdat het toegangspunt of de client voor het zend- of ontvangstapparaat werken.

Stap 5: Zynq-verwerkingssysteem instellen voor gegevensoverdracht via Ethernet

Zynq-verwerkingssysteem instellen voor gegevensoverdracht via Ethernet
Zynq-verwerkingssysteem instellen voor gegevensoverdracht via Ethernet
Zynq-verwerkingssysteem instellen voor gegevensoverdracht via Ethernet
Zynq-verwerkingssysteem instellen voor gegevensoverdracht via Ethernet

Om de HDMI-gegevens van het ene Zybo-bord naar het andere te verzenden, moeten we een Ethernet-protocol opnemen in onze VDMA-driver. Ons doel hier is om individuele videoframes te streamen via de Ethernet-randapparatuur in het verwerkingssysteem, met een ingestelde snelheid die consistent is met onze netwerkbandbreedte. Voor ons project hebben we TCP gebruikt dat wordt geleverd door de bare-metal LwIP API. Aangezien beide projectleden relatief onervaren zijn met netwerkhulpprogramma's, werd deze keuze gemaakt zonder de implicaties en beperkingen van TCP volledig te erkennen. Het grootste probleem met deze implementatie was de beperkte bandbreedte en het feit dat het echt niet is ontworpen om grote hoeveelheden gegevens te stomen. Alternatieve oplossingen om TCP te vervangen en te verbeteren in dit project zullen later worden besproken.

Een korte beschrijving van TCP met LwIP: Gegevens worden over het netwerk verzonden in pakketten met de grootte tcp_mss (TCP maximale segmentgrootte), die over het algemeen 1460 bytes is. Als u tcp_write aanroept, worden enkele gegevens gebruikt waarnaar wordt verwezen door een aanwijzer en worden pbufs (pakketbuffers) geconfigureerd om de gegevens vast te houden en een structuur te bieden voor de TCP-bewerkingen. De maximale hoeveelheid gegevens die tegelijk in de wachtrij kan worden geplaatst, is ingesteld als tcp_snd_buf (bufferruimte van de TCP-zender). Aangezien deze parameter een 16-bits getal is, zijn we beperkt tot een verzendbuffergrootte van 59695 bytes (er is enige vereiste opvulling in de verzendbuffer). Zodra de gegevens in de wachtrij zijn geplaatst, wordt tcp_output aangeroepen om te beginnen met het verzenden van de gegevens. Voordat het volgende gegevenssegment wordt verzonden, is het noodzakelijk dat alle voorgaande pakketten met succes zijn verzonden. Dit proces wordt gedaan met behulp van de recv_callback-functie, omdat dit de functie is die wordt aangeroepen wanneer de bevestiging door de ontvanger wordt gezien.

Het gebruik van de voorbeeldprojecten in Vivado SDK is erg handig om te leren hoe de LwIP TCP-werking werkt en is een goed startpunt voor het starten van een nieuw project.

De procedure voor het WiDi-zendapparaat is als volgt:

  1. Initialiseer het TCP-netwerk met behulp van de bare-metal LWIP-stuurprogrammafunctieaanroepen.
  2. Geef eventuele terugbelfuncties op die nodig zijn voor netwerkbewerkingen.
  3. Maak verbinding met de WiDi-ontvanger door verbinding te maken met het IP-adres en de poort (onze configuratie: IP-ontvanger is 192.168.0.9, maak verbinding met poort 7).
  4. Wanneer de timer van de VDMA-driver afloopt, voert u de TX ISR in.
  5. Bepaal de huidige framebuffer voor toegang op basis van de VDMA-grijze code
  6. Zet het eerste gegevenssegment in de TCP-verzendbuffer in de wachtrij
  7. Voer de gegevens uit en werk lokale variabelen bij om bij te houden hoeveel gegevens van het huidige frame zijn verzonden.
  8. Bij het bereiken van de ontvangen callback (functieaanroep gedaan nadat de zender een bevestiging van het ophalen van gegevens heeft ontvangen), zet u het volgende gegevenssegment in de wachtrij.
  9. Herhaal stap 7 & 8 totdat het hele frame is verzonden.
  10. Keer terug naar een inactieve toestand om te wachten op de volgende timeronderbreking om aan te geven dat een nieuw frame klaar is (Terug naar stap 4).

Zorg ervoor dat u de LwIP-instellingen van het bordondersteuningspakket instelt zoals weergegeven in de afbeelding hierboven. Alle waarden zijn standaard behalve tcp_snd_buf, tcp_pueue_ooseq, mem_size, memp_n_tcp_seg. Merk ook op dat gedetailleerde foutopsporing kan worden bereikt door de BSP-parameters voor de groep debug_options te wijzigen.

Stap 6: Zynq-verwerkingssysteem instellen voor gegevensontvangst via Ethernet

Het Zybo-ontwikkelbord dat als draadloze ontvanger zal fungeren, werkt op dezelfde manier als het verzendende apparaat. De instellingen van het bordondersteuningspakket voor LwIP zijn identiek aan die in de vorige stap.

Het apparaat neemt pakketten op die de videoframesegmenten van de nanorouter bevatten en kopieert de videoframegegevens naar de drievoudige framebufferruimte voor de ontvangende VDMA. Om te voorkomen dat gegevens worden overschreven, wordt een dubbele gegevensbuffer (we noemen dit de netwerkbuffer) gebruikt bij het verzamelen van gegevens van de nanorouter, zodat het netwerkverkeer kan blijven binnenstromen terwijl het vorige volledige videoframe wordt gekopieerd naar de VDMA-buffer.

De procedure voor het WiDi-ontvangstapparaat vereist twee taken, waarvan één het ontvangen van ethernetgegevens en het andere het kopiëren van videoframes van de netwerkbuffer naar de drievoudige framebuffer van de VDMA.

Ethernet-ontvangsttaak:

  1. Initialiseer het TCP-netwerk met behulp van de bare-metal LWIP-stuurprogrammafunctie-aanroepen (setup met IP-adres waarmee de zender verbinding zal maken, 192.168.0.9 in de onze)
  2. Geef eventuele terugbelfuncties op die nodig zijn voor netwerkbewerkingen.
  3. Kopieer na het ontvangen ethernetpakket de pakketgegevens naar de huidige netwerkbuffer, verhoog de huidige verzamelde gegevens.
  4. Als het pakket de netwerkframebuffer vult, gaat u verder met stap 5 & 6. Ga anders terug naar stap 3 van deze taak.
  5. signaal dat de VDMA triple frame buffertaak moet kopiëren van de nieuw voltooide netwerkbuffer.
  6. Schakel over naar de andere netwerkbuffer en ga verder met het verzamelen van gegevens via ethernet.
  7. Inactief totdat een nieuw ethernetpakket is ontvangen (stap 3).

Kopieer netwerkbuffer naar VDMA triple frame buffer:

  1. Wanneer de timer van de VDMA-driver afloopt, voert u de RX ISR in.
  2. Bepaal de huidige framebuffer voor toegang op basis van de VDMA-grijscode.
  3. Bepaal welke netwerkbuffer naar de VDMA-buffer wordt gekopieerd en kopieer die gegevens

Stap 7: Sluit uw Zybo-kaarten aan op de HDMI-bron en HDMI-gootsteen

Sluit uw Zybo-kaarten aan op de HDMI-bron en HDMI-gootsteen
Sluit uw Zybo-kaarten aan op de HDMI-bron en HDMI-gootsteen

Sluit nu de HDMI-kabels voor zowel de ontvanger als de zender aan, programmeer de FPGA's en voer het verwerkingssysteem uit. De framesnelheid zal waarschijnlijk erg laag zijn, vanwege de enorme overhead in de LwIP-operatie en de beperkte bandbreedte. Als er problemen zijn, maak dan verbinding via UART en probeer eventuele waarschuwingen of fouten te identificeren.

Stap 8: Alternatieve ideeën voor verbetering

Alternatieve ideeën voor verbetering
Alternatieve ideeën voor verbetering

Een groot probleem voor dit project was de hoeveelheid gegevens die nodig was om via wifi te verzenden. Dit was te verwachten, maar we onderschatten de impact die dit zou hebben en resulteerden in meer een uitbarsting van afbeeldingen op een scherm in plaats van een videofeed. Er zijn verschillende manieren om dit project te verbeteren:

  • Realtime videocompressie. Het frame voor frame comprimeren van de inkomende videofeed zou de hoeveelheid gegevens die over het netwerk moet worden verzonden aanzienlijk verminderen. Idealiter zou dit in hardware worden gedaan (wat geen gemakkelijke taak is), of het zou in software kunnen worden gedaan door de andere ARM-kern te gebruiken om compressie-algoritmen uit te voeren (dit zou wat verdere analyse nodig hebben om ervoor te zorgen dat de timing werkt). Er zijn enkele open source realtime videocompressiecomponenten die we op internet hebben gevonden, maar de meeste zijn IP.
  • Implementatie van de Ethernet-stroom in hardware in plaats van software. Er was een hoop overhead vanwege het gebrek aan beschikbare ruimte om uitgaande gegevens in de zender in de wachtrij te zetten, vanwege de beperking van de segmentgrootte. Een veel efficiënter proces is om de AXI Ethernet IP te gebruiken met een FIFO-buffer of DMA om er gegevens in te voeren. Dit zou de extra bagage van LwIP TCP verminderen en meer gegevensstroom mogelijk maken.

Stap 9: Toegankelijkheid

Het resulterende product van dit WiDi-project zou een volledig geïntegreerd, compact paar apparaten moeten zijn dat een gebruiker op elke HDMI-bron kan aansluiten en vervolgens de videofeed draadloos naar een scherm met HDMI-mogelijkheden kan laten zinken. De apparaten zouden de Zynq-7000 SoC bevatten die te vinden is op het Zybo-referentiebord en de netwerkhardware bevatten die te vinden is in de TP-Link nano-routers. In het ideale geval zou de gebruiker in staat zijn om de zendmodule te besturen vanaf een discrete locatie binnen het doelbesturingssysteem, met weinig behoefte aan aanzienlijke technische vaardigheden.

Beveiliging en connectiviteit

De apparaten moeten ook Transport Layer Security (TLS) bevatten en een beperkte mogelijkheid tot automatisch verbinden hebben, beide om privacyredenen. Het is de bedoeling van de ontwerpers om van de verbinding met een display via een draadloze interface een bewuste actie te maken namens de gebruiker om te voorkomen dat er per ongeluk gevoelig materiaal wordt uitgezonden.

Huidige status

Tot nu toe is de staat van het project nog steeds een werk in uitvoering. Om ervoor te zorgen dat de huidige eindpuntgebruiker kan profiteren van deze tutorial, moet hij of zij een sterk technisch begrip hebben van embedded systeemontwerp en enige bekendheid hebben met programmeerbare hardware en embedded software die samenwerken.

De gegevens die via het netwerk worden verzonden, zijn op dit moment niet gecodeerd en worden verondersteld een onbewerkte overdracht van TCP/IP-pakketten te zijn.

Het videokernproject is met succes getest voor zowel zenden als ontvangen. Aan de andere kant werd de draadloze verbinding tussen twee zybo-kaarten tot stand gebracht en werden testframegegevens met succes verzonden. Het is echter nog steeds nodig om de netwerkcode te combineren met elk videokernproject en de overdracht van daadwerkelijke videoframes te testen.

Aanbevolen: