İçindekiler:

WIDI - Zybo Kullanan Kablosuz HDMI (Zynq Geliştirme Kartı): 9 Adım (Resimlerle)
WIDI - Zybo Kullanan Kablosuz HDMI (Zynq Geliştirme Kartı): 9 Adım (Resimlerle)

Video: WIDI - Zybo Kullanan Kablosuz HDMI (Zynq Geliştirme Kartı): 9 Adım (Resimlerle)

Video: WIDI - Zybo Kullanan Kablosuz HDMI (Zynq Geliştirme Kartı): 9 Adım (Resimlerle)
Video: HDMI Kablosuz Görüntü Ses Aktarıcı Alacakların Dikkat Etmesi Gerekenler 2024, Kasım
Anonim
WIDI - Zybo Kullanan Kablosuz HDMI (Zynq Geliştirme Kartı)
WIDI - Zybo Kullanan Kablosuz HDMI (Zynq Geliştirme Kartı)
WIDI - Zybo Kullanan Kablosuz HDMI (Zynq Geliştirme Kartı)
WIDI - Zybo Kullanan Kablosuz HDMI (Zynq Geliştirme Kartı)

Hiç TV'nizi bir PC'ye veya dizüstü bilgisayara harici bir monitör olarak bağlayabilmeyi dilediniz, ancak tüm bu sinir bozucu kablolara sahip olmak istemediniz mi? Eğer öyleyse, bu eğitim tam size göre! Bu hedefe ulaşan bazı ürünler olsa da, bir DIY projesi çok daha tatmin edici ve potansiyel olarak daha ucuzdur.

Bu konsept, bir akış cihazı olmak yerine bir monitöre bağlanan bir HDMI kablosunun yerini alması amaçlandığından, chromecast gibi ürünlerden farklıdır.

Projemiz, California State Polytechnic University, San Luis Obispo'da Gerçek Zamanlı İşletim Sistemleri dersi için bir final projesi olarak oluşturuldu.

Projenin amacı, bir HDMI verici cihaz (PC, blu-ray, vb.) ile bir HDMI alıcı cihaz (Masaüstü Monitörü, Projektör, TV, vb.) arasında kablosuz iletişim arayüzü görevi görecek iki Digilent Zybo kartı kullanmaktır.

Bir Digilent Zybo, HDMI aracılığıyla verici cihaza, diğeri ise HDMI aracılığıyla alıcı cihaza bağlanacaktır.

Kablosuz iletişim, bir ev yönlendiricisi veya benzeri bir cihaz aracılığıyla yönlendirilmeden, verici ve alıcıya tahsis edilmiş bir kablosuz yerel alan ağı kullanılarak yapılacaktır. Bu proje için kullanılan kablosuz modül, biri ağ kurmak için bir erişim noktası, diğeri ise ağa bağlanmak için bir istemci olarak çalışan tplink wr802n nano yönlendiricidir. Her nanoyönlendirici ethernet kablosu aracılığıyla Zybo kartından birine bağlanacaktır. Bu yönlendiricilere bağlandığında, cihazlar tek bir ethernet kablosuyla bağlanmış gibi TCP üzerinden iletişim kurar (yani bağlantı kurmak için gereken tek yapılandırma istemcinin IP adresidir).

Projenin amacı 60Hz'de 1080x720 video akışını kolaylaştırmak olsa da, kablosuz ağdaki bant genişliği sınırlamaları ve göndermek için gereken verileri azaltmak için gerçek zamanlı video sıkıştırma eksikliği nedeniyle bu gerçekleştirilemedi. Bunun yerine, bu proje, HDMI verilerini amaçlandığı gibi düzgün bir şekilde yayınlamak için kare hızında ciddi kısıtlamalara sahip olduğundan, bu hedefe ulaşmak için gelecekteki geliştirmeler için bir çerçeve görevi görür.

Proje gereksinimleri:

2 adet Digilent Zybo Geliştirme Kartları (en az bir HDMI bağlantı noktasına sahip olmalıdır)

2x HDMI kabloları

2x microusb kablosu (geliştirme için Zybo'yu PC'ye bağlamak için)

2x tplink wr802n nanoyönlendiriciler (adtl. 2x microusb ve duvar prizi güç adaptörleri dahil)

2x ethernet kablosu

***Not: Bu eğitim, Vivado tasarım paketine aşina olduğunuzu ve yeni bir proje ve blok tasarımı oluşturma deneyimini varsayar.***

Adım 1: Verici için Zynq Programlanabilir Mantığı Yapılandırın

Verici için Zynq Programlanabilir Mantığı Yapılandırın
Verici için Zynq Programlanabilir Mantığı Yapılandırın
Verici için Zynq Programlanabilir Mantığı Yapılandırın
Verici için Zynq Programlanabilir Mantığı Yapılandırın
Verici için Zynq Programlanabilir Mantığı Yapılandırın
Verici için Zynq Programlanabilir Mantığı Yapılandırın

Vericinin programlanabilir mantığını geliştirmeye yönelik yaklaşımımız, biri yazma diğeri okuma için iki Video Doğrudan Bellek Erişimi (VDMA) bloğu kullanarak PC'den hdmi'den hdmi'ye geçişi gerçekleştirmekti.

Her ikisi de serbest çalışan, 3 çerçeve arabellek modu (0-1-2) için seçilir. Video çekirdeği saniyede 60 kare için optimize edildiğinden, bu, VDMA'nın her 16.67 ms'de bir yeni bir kareye şu sırayla yazacağı veya okuyacağı anlamına gelir: 0, 1, 2, 0, 1, 2, 0, 1, 2. Artık birbirleriyle senkronize olmadıklarından, her çerçeve için DDR bellek konumları iki VDMA için farklıdır. Bunun yerine, iki bellek konumu arasındaki verilerin hareketini senkronize etmek için 60 Hz için yapılandırılmış bir donanım zamanlayıcısı (TTC1) kullanılır.

Yukarıdaki resimde 3 kare, boyutları ve her birinin gerektirdiği bellek miktarı (çerçevenin sağında) gösterilmektedir. Bu bellek konumlarına yazma VDMA'sını atarsak, bu setin ötesinde, diyelim ki 0x0B000000 ile başlayarak, okunan VDMA bellek konumlarını atayabiliriz. Her kare 1280*720 pikselden oluşur ve her piksel toplam 24 bit olmak üzere 8 bit Kırmızı, Yeşil ve Mavi'den oluşur. Bu, bir çerçevenin 1280*720*3 bayttan (2.76 MB) oluştuğu anlamına gelir.

VDMA sürücü kurulumunda açıklanan zamanlayıcı IRQ'su içinde, iki VMDA bellek konumu arasında veri kopyalamayı işleyecektir. VDMA, yazılan veya okunan mevcut çerçeveye bir işaretçi sağlar. Çerçeve, yazılımda dönüştürülen belirli bir gri kodla temsil edilir. 3 çerçeveli arabellek yapılandırması için gri kod tanımları, Ek C'deki AXI VDMA Ürün Kılavuzunda bulunabilir.

Bu, yazılmakta olan bir çerçeveden okuma yapmadan belleğe yazılan içeriği kopyalamamızı sağlar.

***Kablosuz ağ üzerinden veri gönderirken okunan VDMA'nın kullanılmadığını unutmayın. Bunun tek amacı, yazma VMDA'sından bellek kopyalamanın düzgün çalıştığını doğrulamaktır. Okunan VMDA devre dışı bırakılmalıdır.***

Verici Tasarım Bloğu oluşturma adımları şunlardır:

  1. Yeni bir proje oluştururken, projeye bir chip veya board atamak iyi bir fikirdir. Bu bağlantı, Vivado dizinine yeni pano dosyalarının nasıl ekleneceğini ve doğru panoyu projenizle nasıl ilişkilendireceğinizi açıklar. İşleme Sistemi bloğunu eklerken ve donanımdan yazılıma (SDK tarafı) geçiş yaparken kullanışlı olacaktır.
  2. Aşağıdaki blokları ekleyin:

    • dvi2rgb
    • Axi4 akışına video girişi
    • Zamanlama Kontrolörü
    • video çıkışı için axi4-stream
    • rgb2dvi
    • EKSEN VDMA x2
    • AXI GPIO x2
    • Saat Sihirbazı
    • Devamlı
    • Zynq İşleme Sistemi
  3. İşleme Sistemini eklerken, üstteki yeşil renkli çubuktan "Run Block Automation"a tıklayın ve "Apply Board Preset" seçeneğinin seçili olduğundan emin olun. Diğer her şeyi varsayılan olarak bırakın.
  4. Her blok konfigürasyon penceresinin resimleri yukarıdaki resimlerde bulunabilir. Belirli bir pencere için bir resim görmüyorsanız, onu varsayılan olarak bırakın.
  5. Zynq İşleme sistemini Yapılandırmaya Başlayın:

    • PS-PL Yapılandırması AXI Güvenli Olmayan GP Master AXI'yi Etkinleştir, M AXI GP0 Arayüzünü etkinleştir
    • PS-PL Yapılandırması HP Slave AXI Arabiriminde, hem HP0 hem de HP1'i etkinleştirin
    • MIO Konfigürasyonunda G/Ç Çevre Birimleri altında ENET0'ın etkinleştirildiğinden emin olun, ardından Uygulama İşlemci Birimi, Timer0'ı etkinleştirin
    • Saat Yapılandırması PL Yapı Saatlerinde, FCLK_CLK0'ı etkinleştirin ve 100 MHz'e ayarlayın.
    • Tamam'ı tıklayın
  6. "Bağlantı Otomasyonunu Çalıştır" seçeneğine tıklamadan önce, yukarıdaki TX blok tasarım görüntüsünde görüldüğü gibi video bloklarını bağladığınızdan emin olun. Sabiti VDD olarak yeniden adlandırmak ve değeri 1 olarak ayarlamak isteyeceksiniz. Video bloklarını buna göre bağlayın.
  7. HDMI TMDS saatini ve veri pinlerini rgb2dvi ve dvi2rgb bloklarında harici yapın
  8. Çalışırken takma algılama sinyali (HPD) için bir giriş ve çıkış bağlantı noktası oluşturun ve bunları birbirine bağlayın, bunlar kısıtlamalar dosyasında tanımlanmıştır
  9. Piksel saati, kısıtlamalar dosyasında oluşturulan TMDS_Clk_p'den kurtarılır. Bu 720p çözünürlüğe göre 74.25 MHz olacaktır. Piksel saatini (dvi2rgb bloğundan) aşağıdaki pinlere bağlamak önemlidir:

    • vid_io_in_clk (eksen akış bloğuna video)
    • vid_io_out_clk (video çıkışı bloğuna eksen akışı)
    • clk (Zamanlama Denetleyicisi)
    • PixelClk (rgb2dvi)
  10. ***Not: Şu anda, piksel saati kurtarmayı etkinleştirmek için, HDMI rx ve tx konektörlerinin aktif bir kaynağa/lavaboya takılması gerekir. Bunu aşmanın bir yolu, video rx ve tx bloklarını farklı saat alanlarına ayırmaktır (başka bir deyişle, tx bloğunu beslemek için yeni bir 74.25 MHz saat oluşturun).***
  11. Daha sonra saat sihirbazını 100 MHz giriş (küresel arabellek kaynağı) ve 50 MHz'de 3 çıkış saatiniz (AXI-Lite saat), 150 MHz (AXI4-Akış saati), 200 MHz (dvi2rgb RefClk pini) olacak şekilde ayarlayın.
  12. FCLK_CLK0 işleme sistemi pinini saat sihirbazı girişine bağlayın
  13. Bu noktada, tasarım penceresinin üstündeki yeşil çubuktan "Bağlantı Otomasyonunu Çalıştır" ı tıklayın. Bunu her seferinde bir blok için yapmak ve yukarıdaki TX blok tasarım resmini takip etmek iyi bir fikirdir.
  14. Araç, AXI-Lite veri yolunu kullanan bloklar (VDMA'lar ve GPIO'lar) için ana/bağımlı ara bağlantı görevi gören AXI Ara Bağlantısını eklemeye çalışacaktır.
  15. Ayrıca, VDMA tarafından kullanılan AXI4-Stream ve Yüksek Performanslı işlemci arayüzleri için ana/bağımlı ara bağlantı görevi gören AXI SmartConnect'i de ekleyecektir (Aktarım Bellek Haritasına ve tersi).
  16. Araç ayrıca bir İşlemci Sistem Sıfırlaması ekleyecektir. Bunun yalnızca VDMA'lara, GPIO'lara ve işlemciyle ilgili bloklara bağlı olduğundan emin olun. Herhangi bir video bloğuna bağlamayın (yani dvi2rgb, zamanlama denetleyicisi, vid to stream vb.)
  17. Bağlantı otomasyonu tamamlandıktan sonra, bağlantıların TX blok tasarım görüntüsüyle eşleştiğini doğrulayın. Bahsedilmeyen fazladan bir Sistem ILA bloğu fark edeceksiniz. Bu yalnızca hata ayıklama içindir ve şimdilik gerekli değildir. 150M İşlemci Sıfırlama kullanır, dolayısıyla buna da gerek yoktur. Otobüslerde küçük yeşil "hatalar" gördüğünüz her yerde, bunun nedeni ILA'dır ve göz ardı edilebilir.
  18. Son adım, proje kaynakları ağacında blok tasarımına sağ tıklayıp "HDL Wrapper Oluştur"u seçmektir. Sarıcıya mantık eklemeyi planlıyorsanız, bu her seçildiğinde üzerine yazılacaktır.
  19. SDK tarafındaki ayrıntılar için VDMA Sürücü Kurulumu bölümüne bakın.

Saatler ve Sıfırlamalar

Herhangi bir programlanabilir mantık projesinin en önemli yönünün saat alanlarının ve sıfırlama sinyallerinin dikkatli bir şekilde değerlendirilmesi olduğunu buldum. Bunlar uygun şekilde yapılandırılmışsa, tasarımınızın işe yaraması için iyi bir şansınız olur.

Piksel Saat ve Zamanlama Kilitli

Belirli sinyallerin aktif olduğunu doğrulamak için bu sinyalleri LED'lere (saatler, resetler, kilitler vb.) bağlamak iyi bir fikirdir. Verici kartında izlemeyi yararlı bulduğum iki sinyal, piksel saati ve AXI4-Stream to video out bloğundaki "kilitli" sinyaldi; bu, size video zamanlamasının zamanlama denetleyicisi ve video kaynağı ile senkronize edildiğini söyler. veri. Sıfırlama olarak dvi2rgb bloğundaki PixelClkLocked sinyalini kullanarak piksel saatini izleyen tasarım bloğu sarmalayıcıya biraz mantık ekledim. Dosyayı hdmi_wrapper.v olarak buraya ekledim. Kısıtlamalar dosyası da buraya eklenmiştir.

Adım 2: Alıcı için Zynq Programlanabilir Mantığını Yapılandırın

Alıcı için Zynq Programlanabilir Mantığı Yapılandırın
Alıcı için Zynq Programlanabilir Mantığı Yapılandırın
Alıcı için Zynq Programlanabilir Mantığı Yapılandırın
Alıcı için Zynq Programlanabilir Mantığı Yapılandırın
Alıcı için Zynq Programlanabilir Mantığı Yapılandırma
Alıcı için Zynq Programlanabilir Mantığı Yapılandırma

Alıcı için Programlanabilir Mantık bloğu daha basittir. Eksik hdmi giriş blokları dışındaki temel fark, kurtarılmış bir piksel saatinin olmamasıdır. Bu nedenle saat sihirbazından kendimizinkini oluşturmalıyız. Bu tasarım vericiden ayrı bir projede yapılmalıdır. Bizim amaçlarımız için alıcı projesi Zybo 7Z-20 kartını, Verici ise Z7-10 kartını takip etti. Kartlardaki FPGA'lar farklıdır, bu yüzden… dikkatli olun.

Alıcı Tasarım Bloğu oluşturma adımları şunlardır:

  1. Aşağıdaki ip bloklarını tasarımınıza ekleyin:

    • Zamanlama Kontrolörü
    • AXI4-Video Çıkışına Akış
    • RGB'den DVI'ya
    • EKSEN VDMA
    • EKSEN GPIO
    • İşleme Sistemi
    • Saat Sihirbazı
    • Sabit (VDD 1'e ayarlandı)
  2. Bu blokları Verici ile yapılandırmak için aynı modeli takip edin. Yapılandırmadaki dikkate değer farklılıklar için resimler buraya dahil edilmiştir. Diğerleri Verici ile aynı kalır.
  3. Bu tasarım için VDMA'yı yalnızca okuma kanalı olarak yapılandırın. Yazma kanalını devre dışı bırakın.
  4. Saat sihirbazı aşağıdaki çıkışlar için yapılandırılmalıdır:

    • clk_out1: 75 MHz (piksel saati)
    • clk_out2: 150 MHz (akış saati)
    • clk_out3: 50 MHz (axi-lite saat)
  5. Video bloklarını RX blok tasarım görüntüsünde gösterildiği gibi bağlayın.
  6. Ardından AXI Interconnect, AXI SmartConnect ve System Reset bloklarını ekleyecek olan bağlantı otomasyonunu çalıştırın ve uygun bağlantıları yapmaya çalışın. İstenmeyen bağlantılar yapmadığından emin olmak için buraya yavaş gidin.
  7. HDMI TMDS saatini ve veri pinlerini rgb2dvi bloğunda harici yapın
  8. Bu tasarımda hot plug sinyaline gerek yok.

Adım 3: VDMA Sürücüsünü Kurun

VDMA Sürücüsünü Kur
VDMA Sürücüsünü Kur

AXI-Lite arabirimi aracılığıyla yapılandırılan farklı bloklar için kurulum, en iyi referans olarak BSP'de bulunan demo projeleri kullanılarak yapılır. Tasarım donanımını dışa aktardıktan ve SDK'yı Vivado'dan başlattıktan sonra, yeni bir kart destek paketi eklemek ve lwip202 kitaplığını BSP ayarları penceresine dahil etmek isteyeceksiniz. BSP'den system.mss dosya dosyasını açın ve blok tasarımınızda bulunan çevresel sürücüleri göreceksiniz. "Örnekleri İçe Aktar" seçeneği, bu çevre birimlerini kullanan demo projelerini içe aktarmanıza ve böylece bunları mevcut Xilinx sürücülerini kullanarak yazılımda nasıl yapılandıracağınızı göstermenize olanak tanır (ekteki resme bakın).

Bu, VDMA, Zamanlayıcı ve Kesinti ve GPIO'yu yapılandırmak için kullanılan yöntemdi. Hem gönderme hem de alma için kaynak kodu buraya dahil edilmiştir. Farklılıklar neredeyse yalnızca main.c'dedir.

***NOT: Bu öğreticinin yazıldığı sırada sistem tam olarak işlevsel olmadığından, bu bölümdeki kaynak kodu kablosuz ağ kodunu içermez. Video çekirdeği gönderme/alma projelerini ağ gönderme/alma projeleriyle birleştirmenin bir sonucu olarak birkaç hatanın ele alınması gerekir. Bu nedenle, bu eğitimde şimdilik ayrı ayrı ele alınmaktadır.***

TX Kesinti İşleyici İşlevi (IRQHandler)

Bu işlev, GPIO blokları aracılığıyla hem okuma hem de yazma VDMA'ları tarafından sağlanan gri kodları okur. Gri kodlar ondalık sayıya dönüştürülür ve mevcut çerçevenin çerçeve temel bellek konumunu seçmek için kullanılır. Kopyalanan çerçeve, VDMA tarafından yazılandan önceki çerçevedir (örneğin, VDMA çerçeve 2'ye yazıyorsa, çerçeve 1'i kopyalarız; çerçeve 0'a yazıyorsa, sarar ve çerçeve 2'den okuruz).

İşlev, kare hızını 60 Hz yerine 10 Hz'e düşürmek için yalnızca her 6. karede bir yakalar. Ağın üst sınırı 300 Mbps'dir. Saniyede 10 karede 221,2 Mbps bant genişliği gereklidir.

Bu işlevde iki satırı yorumlamak/yorumları kaldırmak, kullanıcının hata ayıklama/test amacıyla HDMI geçiş moduna geçmesine olanak tanır (kod, uygun satırları belirtmek için yorumlanır). Şu anda çerçeveyi ethernet kodu tarafından kullanılan bir hafıza konumuna kopyalar.

RX Kesinti İşleyici İşlevi (IRQHandler)

Bu işlev TX işlevine çok benzer, ancak ethernet tarafından gelen verileri yazmak için kullanılan 2 arabellek FIFO'dan kopyalar. Ethernet kodu, FIFO'nun hangi çerçevesine yazıldığını, verilerin karşı çerçeveden kopyalandığını gösterir. Veriler, yırtılmayı önlemek için VDMA tarafından okunan çerçevenin hemen arkasındaki çerçeveye kopyalanır.

Adım 4: Nanorouter Ağını Kurun

Nanoyönlendirici Ağı Kurulumu
Nanoyönlendirici Ağı Kurulumu

TPlink nano yönlendiricileri kullanarak bir ağ oluşturmak için, bunları ayrı ayrı açın ve cihazlar için varsayılan wifi SSID'sine bağlanın. Bu belirli cihaz için yapılandırma ayarları hakkında daha fazla bilgi cihazın kullanım kılavuzunda bulunabilir.

Cihazlardan birini erişim noktası olarak ayarlayın, bu ağ için birincil bağlantı görevi görecektir. Ağı adlandırdığınızdan ve adı not ettiğinizden ve DHCP'yi devre dışı bıraktığınızdan emin olun (yönlendiricinin IP adreslerini dinamik olarak yapılandırmasını istemiyoruz, verici ve alıcı Zybo kartlarının IP adreslerini tutarlı olacak şekilde kendilerinin ayarlamasını istiyoruz). Yapılandırdıktan sonra, cihazın yeniden başlatıldığından ve bu ağı kurduğundan emin olun.

Diğer cihazı istemci olarak kurun ve ilk nanoyönlendirici ile kurduğunuz ağ SSID'sine bağlandığından emin olun. Bir kez daha, istemci için DHCP'nin devre dışı bırakıldığından emin olun.

İstemci bitirip yeniden başlattıktan sonra, erişim noktası nanoyönlendiricisine bağlanmalıdır (eğer bağlanmıyorsa, cihazlardan birinin yapılandırmanızda büyük olasılıkla bir sorun vardır). Erişim noktasına bağlandıktan sonra istemci üzerindeki LED ışığının sabit yandığını fark edeceksiniz.

Erişim noktası nanoyönlendirici LED'i bu noktada büyük olasılıkla yanıp sönmeye devam edecek, sorun değil! Yanıp sönen ışık, ethernet bağlantı noktasından başka bir cihaza bağlı olmadığı anlamına gelir ve bir kez yapılandırılmış bir Zybo'ya bağlandığında, başarılı bir ağ bağlantısı olduğunu gösteren LED sabit kalır.

Artık nanoyönlendirici kurulumumuza sahip olduğumuza göre, iletişim kurmamızı sağlayacak kablosuz bir ağımız var. Önemli bir not, nanoyönlendiriciler için yapılandırma yöntemimizin (erişim noktası ve istemci olarak), ileten Zybo kartından alıcı Zybo kartına, sanki ikisi tek bir ethernet kablosuyla bağlanmış gibi iletişim kurmamıza izin vermesidir. Bu, ağ kurulumumuzu daha az zorlaştırır, çünkü alternatif muhtemelen Zybo kartlarını, amaçlanan bağlantıyla birlikte sunucuya açıkça bağlanmak üzere yapılandırmayı içerecektir.

Her iki cihaz da kurulduktan sonra, nano yönlendiriciler yapılandırılır ve WIDI ağınıza uygulanmaya hazırdır. Erişim noktası veya istemci, gönderme veya alma cihazı için çalışacağından, nano yönlendiriciler ve Zybo kartları arasında belirli bir eşleştirme yoktur.

Adım 5: Ethernet Üzerinden Veri İletimi için Zynq İşleme Sistemini Kurun

Ethernet Üzerinden Veri İletimi için Zynq İşleme Sistemini Kurun
Ethernet Üzerinden Veri İletimi için Zynq İşleme Sistemini Kurun
Ethernet Üzerinden Veri İletimi için Zynq İşleme Sistemini Kurun
Ethernet Üzerinden Veri İletimi için Zynq İşleme Sistemini Kurun

HDMI verilerini bir Zybo kartından diğerine iletmek için VDMA sürücümüze bir Ethernet protokolü eklemeliyiz. Buradaki amacımız, ağ bant genişliğimizle tutarlı olan belirli bir hızda işleme sistemindeki Ethernet çevre birimi aracılığıyla tek tek video karelerini akışa almaktır. Projemiz için bare-metal LwIP API tarafından sağlanan TCP'yi kullandık. Proje üyelerinin her ikisi de ağ araçları konusunda nispeten deneyimsiz olduğundan, bu seçim TCP ile ilgili sonuçları ve kısıtlamaları tam olarak kabul etmeden yapıldı. Bu uygulamadaki en büyük sorun, sınırlı bant genişliği ve gerçekten yüksek hacimli verileri buharlamak amacıyla tasarlanmamasıdır. Bu projede TCP'nin yerini alacak ve tbe'yi iyileştirecek alternatif çözümler daha sonra tartışılacaktır.

LwIP ile TCP'nin kısa bir açıklaması: Veriler, genellikle 1460 bayt olan tcp_mss (TCP maksimum segment boyutu) boyutundaki paketler halinde ağ üzerinden gönderilir. tcp_write çağrısı, bir işaretçi tarafından başvurulan bazı verileri alacak ve verileri tutmak ve TCP işlemleri için bir yapı sağlamak için pbuf'ları (paket arabellekleri) yapılandıracaktır. Bir seferde kuyruğa alınabilecek maksimum veri miktarı tcp_snd_buf (TCP gönderen arabellek alanı) olarak ayarlanır. Bu parametre 16 bitlik bir sayı olduğundan, 59695 baytlık bir gönderme arabelleği boyutuyla sınırlıyız (gönderme arabelleğinde gerekli bazı dolgular vardır). Veriler kuyruğa alındığında, veriyi iletmeye başlamak için tcp_output çağrılır. Bir sonraki veri segmentini göndermeden önce, önceki tüm paketlerin başarıyla iletilmiş olması zorunludur. Bu işlem recv_callback işlevi kullanılarak yapılır, çünkü bu, alıcıdan alındı görüldüğünde çağrılan işlevdir.

Vivado SDK'daki örnek projeleri kullanmak, LwIP TCP'nin nasıl çalıştığını öğrenmek için çok faydalıdır ve yeni bir projeye başlamak için iyi bir başlangıç noktasıdır.

WiDi aktarım cihazı prosedürü aşağıdaki gibidir:

  1. Çıplak LWIP sürücü işlev çağrılarını kullanarak TCP ağını başlatın.
  2. Ağ işlemleri için gerekli olan herhangi bir geri arama işlevini belirtin.
  3. IP adresine ve bağlantı noktasına bağlanarak WiDi alıcısına bağlanın (yapılandırmamız: Alıcı IP'si 192.168.0.9, bağlantı noktası 7'ye bağlanın).
  4. VDMA sürücü zamanlayıcısının süresi dolduğunda, TX ISR'yi girin.
  5. VDMA gri koduna dayalı olarak erişilecek geçerli çerçeve arabelleğini belirleyin
  6. TCP gönderme arabelleğindeki ilk veri segmentini sıraya alın
  7. Verilerin çıktısını alın ve mevcut çerçeveden ne kadar veri gönderildiğini takip etmek için yerel değişkenleri güncelleyin.
  8. Alınan geri aramaya ulaşıldığında (verici veri alımının onayını aldıktan sonra yapılan işlev çağrısı), sonraki veri bölümünü sıraya alın.
  9. Tüm çerçeve gönderilene kadar 7. ve 8. adımları tekrarlayın.
  10. Yeni bir karenin hazır olduğunu belirtmek için bir sonraki zamanlayıcı kesmesini beklemek için boş duruma dönün (4. adıma dönün).

Kart destek paketi LwIP ayarlarını yukarıdaki resimde gösterildiği gibi ayarladığınızdan emin olun. tcp_snd_buf, tcp_pueue_ooseq, mem_size, memp_n_tcp_seg dışındaki tüm değerler varsayılandır. Ayrıca, debug_options grubu için BSP parametreleri değiştirilerek ayrıntılı hata ayıklamanın yapılabileceğini unutmayın.

Adım 6: Ethernet Üzerinden Veri Alımı için Zynq İşleme Sistemini Kurun

Kablosuz alıcı görevi görecek olan Zybo geliştirme kartı, verici cihaza benzer şekilde çalışacaktır. LwIP için kart destek paketi ayarları, önceki adımdakilerle aynı olacaktır.

Cihaz, nanoyönlendiriciden video çerçeve bölümlerini içeren paketleri alacak ve video çerçeve verilerini alıcı VDMA için üçlü çerçeve arabellek alanına kopyalayacaktır. Herhangi bir verinin üzerine yazılmasını önlemek için, nanoyönlendiriciden veri toplanırken bir çift veri arabelleği (ağ arabelleği olarak anılacaktır) kullanılır, böylece önceki tam video karesi bilgisayara kopyalanırken ağ trafiği akmaya devam edebilir. VDMA arabelleği.

WiDi alıcı cihaz prosedürü, biri ethernet verilerini almak ve diğeri ağ ara belleğinden VDMA'nın üçlü çerçeve arabelleğine video karelerini kopyalamak olan iki görev gerektirir.

Ethernet alım görevi:

  1. Çıplak metal LWIP sürücü işlev çağrılarını kullanarak TCP ağını başlatın (vericinin bağlanacağı IP adresiyle kurulum, bizimki 192.168.0.9)
  2. Ağ işlemleri için gerekli olan herhangi bir geri arama işlevini belirtin.
  3. Alınan ethernet paketi üzerine, paket verilerini mevcut ağ arabelleğine kopyalayın, mevcut birikmiş verileri artırın.
  4. Paket ağ çerçeve arabelleğini dolduruyorsa, 5. ve 6. adımlara devam edin. Aksi takdirde, bu görev için 3. adıma geri dönün.
  5. VDMA üçlü çerçeve arabelleği görevinin yeni tamamlanmış ağ arabelleğinden kopyalaması gerektiğine dair sinyal.
  6. Diğer ağ arabelleğine geçin ve ethernet üzerinden veri toplamaya devam edin.
  7. Yeni ethernet paketi alınana kadar boşta (adım 3).

Ağ arabelleğini VDMA üçlü çerçeve arabelleğine kopyalayın:

  1. VDMA sürücü zamanlayıcısının süresi dolduğunda, RX ISR'yi girin.
  2. VDMA gri koduna dayalı olarak erişilecek geçerli çerçeve arabelleğini belirleyin.
  3. VDMA arabelleğine hangi ağ arabelleğinin kopyalanacağını belirleyin ve bu verileri kopyalayın

7. Adım: Zybo Kartlarınızı HDMI Kaynağına ve HDMI Yuvasına Bağlayın

Zybo Kartlarınızı HDMI Kaynağına ve HDMI Yuvasına Bağlayın
Zybo Kartlarınızı HDMI Kaynağına ve HDMI Yuvasına Bağlayın

Şimdi hem alıcı hem de verici için hdmi kablolarını bağlayın, FPGA'ları programlayın ve işleme sistemini çalıştırın. LwIP işlemindeki muazzam ek yük ve sınırlı bant genişliği nedeniyle kare hızı muhtemelen çok yavaş olacaktır. Herhangi bir sorun varsa, UART üzerinden bağlanın ve herhangi bir uyarı veya hatayı belirlemeye çalışın.

Adım 8: İyileştirme için Alternatif Fikirler

İyileştirme için Alternatif Fikirler
İyileştirme için Alternatif Fikirler

Bu proje için büyük bir sorun, wifi üzerinden göndermek için gereken veri miktarıydı. Bu bekleniyordu, ancak bunun yaratacağı etkiyi hafife aldık ve video beslemesinden ziyade ekranda daha fazla görüntü patlamasına neden olduk. Bu projeyi iyileştirmenin birkaç yolu vardır:

  • Gerçek zamanlı video sıkıştırma. Gelen video beslemesini kare kare sıkıştırmak, ağ üzerinden gönderilmesi gereken veri miktarını büyük ölçüde azaltacaktır. İdeal olarak bu, donanımda yapılabilir (ki bu kolay bir iş değildir) veya bir sıkıştırma algoritmasını çalıştırmak için diğer ARM çekirdeğini kullanarak yazılımda yapılabilir (zamanlamanın düzgün çalışmasını sağlamak için bu biraz daha fazla analiz gerektirir). Web'de bulduğumuz bazı açık kaynaklı gerçek zamanlı video sıkıştırma bileşenleri var, ancak çoğu IP'dir.
  • Ethernet akışını yazılım yerine donanımda uygulamak. Segment boyutundaki sınırlama nedeniyle vericide giden verileri kuyruğa almak için kullanılabilir alan olmaması nedeniyle bir ton ek yük vardı. Çok daha verimli bir süreç, AXI Ethernet IP'yi bir FIFO arabelleği veya DMA ile veri beslemek için kullanmaktır. Bu, LwIP TCP'den kaynaklanan ekstra bagajı azaltacak ve daha fazla veri akışına izin verecektir.

9. Adım: Erişilebilirlik

Bu WiDi projesinin ortaya çıkan ürünü, kullanıcının herhangi bir HDMI kaynağına bağlayabileceği ve ardından video beslemesini kablosuz olarak HDMI özellikli bir ekrana gönderebileceği tamamen entegre, kompakt bir cihaz çifti olmalıdır. Cihazlar, Zybo referans kartında bulunan Zynq-7000 SoC'ye sahip olacak ve TP-Link nano yönlendiricilerinde bulunan ağ donanımını içerecektir. İdeal olarak, kullanıcı, önemli teknik yeteneğe çok az ihtiyaç duyarak, hedef işletim sistemi içindeki ayrı bir konumdan iletim modülünü kontrol edebilecektir.

Güvenlik ve Bağlantı

Cihazlar ayrıca Taşıma Katmanı Güvenliği'ni (TLS) içermeli ve her ikisi de gizlilik amacıyla sınırlı otomatik bağlantı yeteneğine sahip olmalıdır. Tasarımcıların amacı, bir kablosuz arayüz üzerinden bir ekranla bağlantı kurmayı, kullanıcı adına yanlışlıkla hassas materyal yayınlamaktan kaçınmak için kasıtlı bir eylem haline getirmektir.

Mevcut Durum

Bu noktaya kadar, projenin durumu hala devam eden bir çalışmadır. Mevcut son nokta kullanıcısının bu öğreticiden yararlanabilmesi için, gömülü sistem tasarımı konusunda güçlü bir teknik anlayışa sahip olması ve birlikte çalışan programlanabilir donanım ve gömülü yazılım hakkında biraz bilgi sahibi olması gerekir.

Ağ üzerinden gönderilen veriler bu noktada şifrelenmez ve TCP/IP paketlerinin ham iletimi olduğu varsayılır.

Video çekirdek projesi hem gönderme hem de alma için başarıyla test edildi. Öte yandan, iki zybo kartı arasında kablosuz bağlantı kuruldu ve test çerçevesi verileri başarıyla gönderildi. Bununla birlikte, ağ kodunu her bir video çekirdek projesiyle birleştirmek ve gerçek video çerçevelerinin iletimini test etmek hala gereklidir.

Önerilen: