FPGA tabanlı VGA denetleyici ekran karakter programının ayrıntılı analizi "Mükemmel blog yayını"

Bir omuz sırt çantası

Bu ne kadar zor?

Bir şans ver!

_

Uzun basın tanıma

[Konu]: FPGA tabanlı VGA denetleyici ekran karakter programının ayrıntılı analizi

[Yazar]: LinCoding

VGA herkes için yabancı değildir Bu makale, FPGA tabanlı VGA denetleyici ekran karakter programını ayrıntılı olarak analiz edecektir, bu program R-2R direnç eşleştirme ağına ve ADV7123 donanımına sahip sistemler için uygundur.

Sonuçlar aşağıda gösterildiği gibidir. Odak noktası, VGA denetleyicisinin ve karakter ROM'unun adreslenmesidir.

(CrzayBingo kaynak kodundan değiştirilmiştir)

Aşağıdaki şekil tüm sistemin bir blok diyagramıdır Karakter verileri ROM'da saklanır Karşılık gelen veriler lcd_display ile alınır ve ardından ADV7123'ü çalıştırmak için lcd_driver'a verilir.

1. Önce lcd_driver'dan bahsedeyim

modül lcd_driver (inputclk, // global clock inputrst_n, // global reset inputlcd_data, // ADV7123 HardWare outputlcd_dclk, // ADV7123 clock outputlcd_blank, outputlcd_sync, outputlcd_hs, // yatay sinyal çıkışılcd_vs, // dikey sinyal çıkışılcd_b / outputlcd_g alan etkinleştirme sinyali outputlcd_request, output lcd_xpos, output lcd_ypos);

İlk bölüm, açıklama yapılmadan girdi ve çıkışın tanımıdır.

// ----------------------------------- // h_sync sayacı reghcnt; her zaman @ (posedge clk veya negedge rst_n) başla if (! rst_n) hcnt < = 11'd0; aksi takdirde (hcnt < `H_TOTAL) hcnt < = hcnt + 1'b1; aksi takdirde hcnt < = 11'd1; end assignlcd_hs = (hcnt < = `H_SYNC)? 1'b0: 1'b1; // ----------------------------------- // v_sync sayacı regvcnt; her zaman @ (posedge clk veya negedge rst_n) başla if (! rst_n) vcnt < = 11'd0; Aksi takdirde (hcnt == `H_TOTAL) vcnt < = (vcnt < `V_TOTAL)? Vcnt + 1'b1: 11'd1; başka vcnt < = vcnt; end assignlcd_vs = (vcnt < = `V_SYNC)? 1'b0: 1'b1;

İkinci bölüm, VGA zamanlamasına göre hat sinyallerini ve alan sinyallerini çıkarmak için kullanılan hat tarama ve alan tarama sayaçlarını tanımlar. Makro tanımları ilk olarak lcd_para.h veya lcd_para.v'de tanımlanabilir, bu da transplantasyon için uygundur.

assignlcd_dclk = ~ clk; assignlcd_blank = lcd_hs ve lcd_vs; assignlcd_sync = 1'b0;

Üçüncü bölüm, ADV7123 donanımının gerektirdiği sinyalleri tanımlar. Lcd_dclk, ADC7123'ün saat sinyalidir. Değer, burada ~ clk'ye atanır. Bunun nedeni, ADV7123'ün lcd_dclk'sinin yükselen kenarının, veriyi en kararlı hale getirmek için lcd_hs ve lcd_vs'nin ortasında görünebilmesidir. Aşağıdaki simülasyon şemasında gösterildiği gibi:

localparamCOMPENSATE = 1'b1; localparamH_AHEAD = 1'b1; assignlcd_en = (hcnt > = `H_SYNC +` H_BACK + KARŞILIK hcnt < `H_SYNC +` H_BACK + `H_DISP + COMPENSATE) (vcnt > = `V_SYNC +` V_BACK + KARŞILIK vcnt < `V_SYNC +` V_BACK + `V_DISP + COMPENSATE)? 1'b1: 1'b0; assignlcd_rgb = lcd_en? Lcd_data: 24'd0; assignlcd_request = (hcnt > = `H_SYNC +` H_BACK + COMPENSATE-H_AHEAD hcnt < `H_SYNC +` H_BACK + `H_DISP + COMPENSATE-H_AHEAD) (vcnt > = `V_SYNC +` V_BACK + KARŞILIK vcnt < `V_SYNC +` V_BACK + `V_DISP + COMPENSATE)? 1'b1: 1'b0; assignlcd_xpos = lcd_request? (Hcnt- (` H_SYNC + `H_BACK + COMPENSATE-H_AHEAD)): 11'd0; assignlcd_ypos = lcd_request? (V - (`V_SYNC +` V_BACK + COMPENSATE)): 11'd0;

Dördüncü bölüm, tüm lcd_driver'ın en önemli parçasıdır

1. lcd_en anlamak biraz daha iyidir, yani VGA'nın lcd_hs ve lcd_vs'nin yerleşik veri etkin alanı, mevcut verilerin etkin alanını göstermek için yüksektir.Neden bir KOMPANZA eklendiğine gelince, bu simülasyona dayanır. Eklenmemişse, tam olarak doğrudur Bir numara eksik.

2. lcd_rgb için, veri geçerli alanında geçerli verileri çıkarır, aksi takdirde 0 verir.

3. lcd_request, lcd_en'e benzer, tek farkı H_AHEAD'in hcnt'den çıkarılmasıdır. Bu neden?

Modül ile modül arasındaki bağlantının sıralı mantık olduğunu biliyoruz, bu durumda blok diyagramdan da görülebileceği gibi iletişim için bir clk gereklidir:

Lcd_request sinyali, lcd_driver modülü tarafından lcd_display modülüne gönderilir. Bunların tümü sıralı mantık olduğundan, iletişim için bir clk gereklidir.Ancak, lcd_data'yı lcd_hs ve lcd_vs ile senkronize etmek için, lcd_request önceden bir clk ile lcd_display modülüne gönderilir. Bu sırada lcd_display modülü Lcd_driver modülünden lcd_request alındıktan sonra lcd_data, lcd_driver modülüne gönderilir. Lcd_data, lcd_driver modülüne ulaştığında lcd_hs ve lcd_vs ile tam olarak senkronize olur.Bu, verilerin ve taramanın senkronize olmasını sağlar.

4. lcd_xpos sinyalinin prensibi yukarıdakiyle aynıdır, bir clk sinyali ileri düzeydedir.

Burada herkes merak ediyor olabilir, neden lcd_ypos yerine sadece lcd_xpos'u ilerletin?

Bunun nedeni, vcnt'nin hcnt tarafından belirlenmesidir, yani hcnt H_TOTAL'a kadar saydığında, vcnt bir sayıyı sayar, bu nedenle sadece lcd_xpos'u ilerletmeniz gerekir.

2. lcd_display hakkında konuşalım

modül lcd_display (inputclk, // global saat inputrst_n, // global rst_n inputlcd_request, input lcd_xpos, input lcd_ypos, outputreg lcd_data);

Birinci bölüm, girdi ve çıkışın tanımıdır.

`defineCOMPENSATE9'd1 // ------------------------------------- wirevalid_area1 = ((lcd_xpos > = 10'd64 lcd_xpos < 10'd576) (lcd_ypos > = 10'd128 lcd_ypos < 10'd192))? 1'b1: 1'b0; wirerom_addr1 = lcd_xpos- (9'd64-`COMPENSATE); wirerom_data1; helloworld u_helloworld (.clock (clk), .address (rom_addr1), .q (rom_data1)) ; // ------------------------------------- wirevalid_area2 = ((lcd_xpos > = 10'd64 lcd_xpos < 10'd576) (lcd_ypos > = 10'd256 lcd_ypos < 10'd320))? 1'b1: 1'b0; wirerom_addr2 = lcd_xpos- (9'd64-`COMPENSATE); wirerom_data2; LinCoding u_LinCoding (.clock (clk), .address (rom_addr2), .q (rom_data2)) ;

İkinci bölüm ROM adresleme ve ROM çıkış verileri hakkındadır, dikkat edilmesi gereken bir husus vardır.

COMPENSATE rom_addr1 ve romaddr2'de çıktı, neden bu?

Benzer şekilde, sorun modülün iletişiminde yatmaktadır.

Çünkü bu sefer ROM'a bir adres göndermek için lcd_display modülüne ihtiyacımız var ve ardından ROM, lcd_data'yı lcd_display modülüne döndürür ve ardından lcd_display modülü verileri lcd_driver modülüne gönderir ve lcd_display ve lcd_driver modülleri, lcd_xpos ve lcd_data ile iletişim kurarken kombinatoryal mantığı kullanır, bu yüzden iletişim kurun Zaman göz ardı edilebilir.Zaman yalnızca ROM okuma verilerinin bir clk'sinde ve her zaman bir lcd_display bloğunda boşa harcanır. Bu nedenle, 2 clk gelişmiş olmalı ve lcd_xpos, lcd_driver'da 1 clk gelişmiş olmalıdır, bu yüzden burada sadece ihtiyacımız var Önceden sadece bir clk.

Başlangıçta, bizim varsayımımız, lcd_xpos 64 olduğunda, ROM'daki 0 verinin görüntüleneceği, ancak modülün iletişimi 2 clk tükettiği için, lcd_xpos 62 olduğunda ROM'dan 0. veriyi istememiz gerektiğiydi. ROM, lcd_data'yı lcd_display'e gönderdiğinde, lcd_xpos 63 olur ve lcd_display'in her zaman bloğu 1 clk boşa harcar. Lcd_display lcd_data'yı lcd_driver'a gönderdiğinde, bu anda lcd_xpos 64 olur ve veri eşzamanlı olarak çıkarılarak bizimkilere ulaşır beklenen.

// ------------------------------------- her zaman @ (posedge clk veya negedge rst_n) başlarsa (! rst_n) lcd_data < = `BLACK; else if (lcd_request valid_area1) if (rom_data1 == 1'b1) lcd_data < = `BEYAZ; başka lcd_data < = `MAVİ; aksi takdirde (lcd_request valid_area2) if (rom_data2 == 1'b1) lcd_data < = `BEYAZ; başka lcd_data < = `MAVİ; başka lcd_data < = `SİYAH; son

Son kısım, çıktı verilerinin VGA üzerinde gösterilmesidir.Yazı tipini alırken negatif kod ve sütun sütun kullandığımız için, programın rom verisi 1 olduğunda gerekli veriyi göstermesi gerekir.

Hong Kong filminin on iki saç tokası, eski zamanlar çok güzel
önceki
Protezleri kontrol etmek için bilinci kullanın, BrainCo beyin-bilgisayar arayüz teknolojisinin daha fazla uygulamasını sergiliyor CES 2019
Sonraki
Dünyanın ilk gen düzenlenmiş bebeği Çin'de doğdu! Bu tabak sıcak mı? Önde gelen hisse senetlerinin günlük limiti vardır
Xiaomi Eco-chain Enterprise, Intel çipleriyle donatılmış akıllı koşu ayakkabılarını piyasaya sürüyor
Sürpriz! Hyper Boost hızlandırma motoru, ColorOS 5.2.1 sürümüyle güncellenecektir
sevmek! Chongqing "Yoldaki Ofis", "2018 Çin'in En Mutlu Şehri En İyi Yönetim İnovasyon Modeli" ni kazandı
Zhao Leinin hikayesi çekildi, bu film olmalı
Taoying Daily | 1,4 milyar bayrağı taşıyan vahşi bir kurt! Wu Jing, "Wolf Warrior 2" ile ilgili çeşitli sorulara ve spekülasyonlara yanıt verdi.
UICC Kart Temassız Uygulamasının Örtülü Seçim Tanıma Teknolojisi Araştırması
Yaz tatilinin yarısından fazlası Ağustos ayında kızların izleyebileceği filmler var mı?
Çinli Markaların Yükselen Yolu: CES'ten Hongqi Markasının Yenilikçi Gücüne Bakış
Mart "Vahşi" gişe rekorları kıran filmleri bir araya gelerek yaralanma korkusu olmadan cesurca giriyor
ZigBee Kablosuz Sensör Ağına Dayalı Personel Konumlandırma Sisteminin Tasarımı ve Uygulanması
Yalama Ekran Süresi | "Eski" Düz Göğüslü Tanrıça Milla Jovovich
To Top