İçindekiler:

Zynq Görüntü Geliştirme Sistemi: 7 Adım
Zynq Görüntü Geliştirme Sistemi: 7 Adım

Video: Zynq Görüntü Geliştirme Sistemi: 7 Adım

Video: Zynq Görüntü Geliştirme Sistemi: 7 Adım
Video: ZYNQ SoC HW/SW TASARIMI Ders2: ZYNQ SoC Mimarisi Tanıtımı | PS - PL | CPU - FPGA 2024, Temmuz
Anonim
Zynq Görüntü Geliştirme Sistemi
Zynq Görüntü Geliştirme Sistemi
Zynq Görüntü Geliştirme Sistemi
Zynq Görüntü Geliştirme Sistemi

Adından da anlaşılacağı gibi, bu projenin amacı ZYNQ ApSOC kullanarak bir Görüntü İyileştirme Sistemi yapmaktır. Daha spesifik olarak, görüntülerden veya videolardan sisi temizleyebilecek bir sistem kurmak istiyoruz. Bu sistem, kötü koşullarda görsel verileri girdi olarak alacak, görüntü iyileştirme tekniklerini kullanarak işleyecek ve ardından sonucu çıkaracaktır.

Proje Digilent Zybo Board üzerinde inşa edilmiş ve test edilmiştir ancak diğer ZYNQ cihazları da çalışmalıdır.

Bu projeyi 3 bölüme ayıracağız:

1) GİRİŞ = Bilgisayardan/Kameradan Ethernet üzerinden Giriş Görüntüsü

2) SÜREÇ = Görüntüyü İşleyin

3) ÇIKIŞ = Görüntünün bir HDMI arabirimi aracılığıyla çıkışı

Sezgilere aykırı bir şekilde, projenin çıktı kısmıyla başlayacağız (bu bize yol boyunca daha iyi hata ayıklama olanakları sağlayacaktır) girdi ile devam edecek ve işleme kısmı ile bitireceğiz.

Adım 1: Malzemeler

Malzemeler
Malzemeler

Bu projeyi tamamlamak için ihtiyacınız olacak:

DONANIM

- HDMI ve Ethernet'li herhangi bir ZYNQ Kartı çalışmalı / Digilent Zybo kullanıyorum

- USB A'dan mikro B'ye USB kablosu

- HDMI kablosu

- Ethernet kablosu

- HDMI girişli ekran

YAZILIM

- Xilinx Vivado

-Xilinx SDK'sı

2. Adım: ÇIKIŞ - VGA Denetleyici Bölüm 1

ÇIKIŞ - VGA Denetleyici Bölüm 1
ÇIKIŞ - VGA Denetleyici Bölüm 1

Kartta bulunan HDMI bağlantı noktasını kullanarak görsel verilerimizi çıkaracağız. HDMI bağlantı noktası, ZYNQ'nun PL (Programlanabilir Mantık = FPGA) tarafına bağlıdır ve bunun için VHDL'de bir denetleyici tasarlamamız gerekecek. Daha önce bir VGA denetleyici tasarladıysanız, buna çok benzer bulacaksınız. HDMI ve VGA zamanlamaları aslında aynıdır, aslında bir HDMI denetleyicisi elde etmek için mevcut bir VGA denetleyicisi üzerine inşa edebilirsiniz.

Gerçekte ne olduğunu daha iyi anlamak için önce bir VGA denetleyici tasarlayacağız.

1920x1080 çözünürlükte görüntülemek istiyoruz.

VGA denetleyicisi, piksel verilerini (RGB formatında) sırayla, piksel piksel ekrana iletmekten sorumludur. 1920x1080'lik gerçek görüntü alanının dışında ayrıca bazı "sınır" alanları vardır, yani: ön sundurma, arka sundurma ve geri izleme. Bu alanların piksel cinsinden boyutu standarttır ve her çözünürlüğe özeldir. Bu alanlar aslında ekranda GÖRÜNMEMEKTEDİR ancak zorunludur ve bu alandaki piksellerin rengi siyah olmalıdır. Geçerli bir soru, bu ekstra alanlara neden ihtiyaç duyulduğu olacaktır. Bu soru, bu talimatın amacına meydan okuyor, ancak merak ediyorsanız, çevrimiçi olarak daha fazla araştırma yapmanızı tavsiye ederim.

Bu, VGA arayüzünü açıklayan iyi bir videodur

Bizim durumumuzda 1920*1080 çözünürlükte görüntüleme yapmak istiyoruz ve bunlar zamanlamalar:

Yatay Görüntüleme Alanı = 1920 piksel

Yatay Ön Sundurma = 88 piksel

Yatay Arka Sundurma = 148 piksel

Yatay Geri İzleme =44 piksel

Dikey Görüntüleme Alanı = 1080 piksel

Dikey Ön Sundurma = 4 piksel

Dikey Arka Sundurma = 36 piksel

Dikey Geri İzleme = 5 piksel

(Burada diğer çözünürlükler için zamanlamaları bulabilirsiniz

Yani gerçek çözünürlüğümüz 2200 x 1125 olacaktır. 60 fps (kare/saniye) istiyoruz, yani piksel saatimiz 60*2200*1125 = 148,5 MHz olacaktır. Zybo Board'da 125 Mhz'lik bir saat sağlanır. İhtiyacımız olan 148,5 MHz Piksel Saatini oluşturmak için bir MMCM IP kullanacağız.

3. Adım: ÇIKIŞ - VGA Denetleyici Bölüm 2

ÇIKIŞ - VGA Denetleyici Bölüm 2
ÇIKIŞ - VGA Denetleyici Bölüm 2

Önceki adımın teorik arka planı ile kendi VGA denetleyicinizi tasarlayabilmelisiniz. Size bunu yapan bir Vivado projesi sunacağım ama en azından önce kendi başınıza yapmaya çalışmanızı tavsiye ederim.

Çoğu VGA bağlantı noktası, piksel başına renk kanalı başına 8 bit vermez (yukarıdaki resme bakın), bu nedenle tasarımı, Kartın sağladığı renk başına pin sayısına uyarlamanız gerekir (bu, HDMI için bir sorun değildir).

Tasarım, kırmızı olacak olan sol üst piksel dışında tüm ekranı maviye boyayacaktır. Bu projenin ZYBO Kurulu için kısıtlamaları kullandığına dikkat edilmelidir. Dolayısıyla, bu projeyi başka bir Panoda çalıştırmak istiyorsanız, kısıtlamalar dosyasını güncellemeli ve renk başına pin sayısını uyarlamalısınız.

Şekil no'ya bir göz atın. 2. VGA Kontrolörümüz renk başına 5/6 bit çıktı verirken, kablodan geçmeden önce bu bitlerin her bir renk kanalı (Kırmızı, Yeşil ve Mavi) için bir analog sinyale dönüştürüldüğünü unutmayın.

Adım 4: ÇIKIŞ - HDMI Denetleyici Bölüm 1

ÇIKIŞ - HDMI Denetleyici Bölüm 1
ÇIKIŞ - HDMI Denetleyici Bölüm 1

Artık VGA denetleyicisinin nasıl çalıştığını bildiğimize ve çalışan bir tasarımımız olduğuna göre HDMI denetleyicisi ile devam edebiliriz. HDMI denetleyicisi aslında VGA denetleyicisinde geliştirdiğimiz tüm kodu kullanacaktır. HDMI ve VGA aynı zamanlamaları ve aynı sinyalleri kullanır. Fark, çıkış pinlerinde görünür.

VGA, her renk için bir kablo kullanarak ve bunun üzerinden bir analog sinyal gönderirken, HDMI, verileri her renk için bir seferde 1 bit dijital olarak iletir ve diferansiyel sinyalleme kullanır. Diferansiyel sinyal, her bit için HDMI'nın biri diğerinin zıttı olan 2 pime sahip olduğu anlamına gelir. Yani bir '1' sinyali iletmek istiyorsak, bir kabloda '1' iletiriz ve diğer kabloda '1' olumsuzlanır. Bu, sinyal bütünlüğünü sağlar ve bununla ilgili daha fazla bilgiyi buradan https://goo.gl/6CPCzB okuyabilirsiniz. Her renk için bu kanallardan biri, KIRMIZI, YEŞİL ve MAVİ ve saat için bir tane var. Diferansiyel sinyallemenin özellikleri nedeniyle, hdmi aracılığıyla gönderdiğimiz sinyaller DC dengeli olmalıdır, bu da 1'lerin ve 0'ların sayısının belirli bir zaman aralığında kabaca eşit olması gerektiği anlamına gelir. Bunu başarmak için 8b/10b kodlamasını kullanacağız. https://goo.gl/hhh8Ge adresindeki DVI spesifikasyonundan diferansiyel sinyalleme ve 8b/10b kodlamanın nasıl çalıştığı hakkında çok şey öğrenebilirsiniz (DVI ve HDMI aynı video sinyallerini kullanır).

Adım 5: ÇIKIŞ - HDMI Denetleyici Bölüm 2

ÇIKIŞ - HDMI Denetleyici Bölüm 2
ÇIKIŞ - HDMI Denetleyici Bölüm 2

Yeter teori, gelelim projemize. VGA Denetleyicide 148,5 MHz'lik bir saat ile kurtulduk, burada her renk için 8 bit iletmek istediğimiz ve piksel başına 10 bit ve 10 bit anlamına gelen 8b/10b kodlamasını kullanmak istediğimiz için bu frekansın 10 katını sağlamamız gerekecek. *148.5MHz = 1485MHz. Bu, Zybo Board'da elde edilemeyecek kadar büyük bir frekanstır. Neyse ki elimizde birkaç numara var. 5*148.5MHz = 742.5MHz'i yönetebiliriz ve verileri 742.5Mhz saatin hem yükselen hem de düşen kenarında iletmek için bir OSERDES (serileştirici) IP kullanacağız, bu yüzden aslında 1485MHz'de iletilen verileri alacağız. Vivado bize bazı zamanlama uyarıları verecek ve her zaman daha küçük bir saatle daha düşük bir çözünürlüğe gidebilirsiniz, ancak çalıştığı için şimdilik bunu gerçekten umursamıyoruz (uyarılar, saat arabelleklerinin resmi olarak olmadığı gerçeğiyle ilgilidir. 464MHz'den daha yüksek frekansları destekler).

O halde yapmamız gereken VGA Controller çıkışımızdan gelen verileri 8b/10b formatında kodlamak ve daha sonra yukarıda bahsedildiği gibi seri hale getirmektir. Serileştirme için 742.5MHz saati oluşturmak için projeye başka bir MMCM eklememiz gerekecek.

Kodlayıcı ve serileştirici için vhdl dosyalarını aşağıya ekledim. Önce RGB kanallarını kodlamanız ve ardından bunları seri hale getirmeniz gerekir.

Kırmızı kanal için örnek:

TMDS_encoder_RED: TMDS_encoder

port haritası(clk148, red_channel_8bits, c_red, video_on, encoded_red_10bits);

Serileştirici_RED: Serileştirici10_1

port haritası(clk148, clk742, encoding_red_10bits, reset, red_serial_1bit);

TMDS_encoder'ın "c" girişi kırmızı ve yeşil için "00" ve mavi için "vsync & hsync"'dir (bu, https://goo.gl/hhh8Ge DVI spesifikasyonunun bir parçasıdır).

Adım 6: RAM'den Görüntüleri Görüntüleme

RAM'den Görüntüleri Görüntüleme
RAM'den Görüntüleri Görüntüleme

HDMI denetleyicisinin amacı, işlenmiş görüntüleri görüntülemektir. Şimdi, denetleyici uygulanmış ve kullanıma hazır olduğunda, bu denetleyiciyi verilerle beslemeyi düşünmeliyiz. Pek çok görüntü geliştirme işleminin PS'de (İşleme Sistemi = ARM İşlemci) gerçekleşeceği ve elde edilen görüntülerin DDR RAM'de bulunacağı göz önüne alındığında. Bu yüzden verileri RAM'den HDMI denetleyicisine almanın bir yoluna ihtiyacımız var.

Bunu başarmak için 3 IP'ye ihtiyacınız olacak:

1) VDMA (Video Doğrudan Bellek Erişimi)

2) VTC (Video zamanlama Denetleyicisi)

3) Video Çıkışına Akış (bundan sonra S2VO olarak adlandıracağız)

S2VO aslında çıkışa bir RGB 24BIT sinyali ve gerekli HSYNC ve VSYNC sinyalleri sağlayacaktır. Böylece HDMI denetleyicisinin o kısmını dışarıda bırakabiliriz.

Bu IP'leri tasarımınıza eklemeli, yapılandırmalı ve uygun bağlantıları yapmalısınız.

Sonunda yukarıdaki şemaya benzeyen bir şey almalısınız.

Adım 7: ÇIKTI - SDK SONU

ÇIKTI - SDK SONU
ÇIKTI - SDK SONU

Tüm donanımlar kurulmuş ve kullanıma hazır durumdayken, şimdi yazılımı PS'de oluşturmalıyız. Donanımı ve veri akışını dışa aktaracağız ve SDK'yı başlatacağız.

1) Dosya -> Dışa Aktar -> Donanımı Dışa Aktar -> Bit Akışını Dahil Et seçeneğini işaretleyin ve Tamam'a basın

2) Dosya -> SDK'yı Başlat

SDK'da yeni bir uygulama projesi oluşturun.

3) Dosya -> Yeni -> Uygulama Projesi

4) Projeniz için bir isim seçin ve İleri'ye basın

5) "Merhaba Dünya" şablonunu seçin ve Bitir'e basın

SDK'daki uygulamanın VDMA'yı programlaması gerekecektir. Bunu başarmak için kullanılan bazı standart işlevler vardır (zamanım olduğunda ayrıntılara gireceğim).

Tasarımımızı test etmek için SDK Geri Yükleme (Xilinx Tools -> Dump/Restore) özelliğini kullanarak DDR RAM belleğe bir resim koyacağız ve bunu HDMI Kontrolörümüzü kullanarak görüntüleyeceğiz. Görüntüyü istediğiniz yere yükleyebilirsiniz (belleğin başındaki bazı küçük kısıtlı alanlar hariç). Örneğimiz için 16777216 adresini ve 8294400 = 1920*1080*4 dosya boyutunu (4 kanal = RGB + alfa) seçtik.

İşe yarıyor !

Devam edecek

Önerilen: