VGA ekranları bu kadar yüksek piksel saat frekanslarında sürmek nasıl mümkün olur?


12

80x30 metin modunda 640x480 VGA ekran sürmek için ayrık bileşenler kullanan bir dijital devre üzerinde çalışıyorum.

640x480 ekran için piksel saati 25.175MHz'dir ve bu süre 40ns civarındadır. Ekrana bu kadar sık ​​nasıl yeni bir piksel sağlayabildiğimi anlamıyorum.

Devrem için temel mimari aşağıdaki gibidir:

  1. Yatay pikseller için ikili sayaç 25.175 MHz'de 800'e kadar sayar (640 görünür piksel + ön sundurma, senkronizasyon, arka sundurma için 160). 800'de dikey satır sayacını artırın (ve 525 satırda sıfırlayın)

  2. Yatay ve dikey konumu kullanarak, geçerli karakterin x, y koordinatlarını elde edin.

  3. ASCII karakterini almak için x, y karakter koordinatı, video belleğine indeks kullanarak.

  4. Karakter için bit kalıbı elde etmek üzere karakter ROM'unda dizinlemek için ASCII karakterini kullanın

  5. 8 piksel karakter satırını piksel saat frekansında ayrı bitlere dönüştürmek için seri kaydırma yazmacına paralel kullanın

Zinciri takip ederseniz, gider: Sayaç -> RAM -> ROM -> Seri Vites Kaydına Paralel

Bulabildiğim en hızlı bileşenleri kullanarak, yayılma gecikmeleri ve erişim süresi yaklaşık 25ns + 20ns + 70ns + 15ns = 120ns, 25MHz için 40ns süresinden çok daha fazladır.

Daha yüksek çözünürlüklerde ve yenileme hızlarında, 10 MHz'lik bir dönem olacak 100MHz'in üzerinde piksel saatlerine sahip olabilirsiniz.

Sisteminizdeki diğer tüm sinyalleri göz önünde bulundurmadan bile, RAM / ROM için erişim süresi zaten çok yukarıda olduğunda, ekrana her 10 saniyede bir yeni pikseller sağlamak nasıl mümkün olur?


7
Özel video RAM kullanırsınız ve bunu doğrudan video sinyaline saat olarak ayarlarsınız. Gerçekten göstermeden önce neyin görüntüleneceğini anlamaya çalışıyorsunuz.
Hearth

2
Maximite hakkında okuyun . Bir VGA bağlantı noktasını çalıştırmak için sadece bir MCU'nun çevre donanımını ve birkaç direnci kullanır. Başladığı PIC32 çevre birimini inceleyerek başlayın. İyi çalışıyor. (Burada bir Maximit'im var.)
jonk

"Don Lancaster" tarafından "Ucuz Video Yemek Kitabı"
Jasen

Yanıtlar:


17

Bunu zor bulmanın iki ana nedeni vardır.

İlk olarak, bunu VGA çağında yapmak için kullanılandan daha eski ve daha ayrık (daha düşük ölçekli entegrasyon) parçalar kullanıyorsunuz.

Ama sonra, onları atipik bir şekilde kullanıyorsunuz. Özellikle, yaklaşımınız, birden çokpipelined şey eklemeniz gerektiği anlamına gelmez. aralığınızı ve dolayısıyla oranı belirlerken gecikme .

Buna karşılık, hız elde etmeye çalışan senkron dijital tasarımlar, kayıtlar arasında mümkün olduğunca az yapmaya çalışır.

Ayrıntılar muhtemelen biraz farklı olsa da, kabaca konuşmak gerekirse şöyle bir şey işe yarayacaktır:

  • Adresi arttırır veya sıfırlarsınız, daha sonra bu bir kayıt defterine gider.
  • Adresi senkron belleğe kilitlersiniz
  • Senkron belleğin çıkışını kilitlersiniz
  • Bunu senkron karakter üretecinin adresine kilitlersiniz
  • Karakter üretecinin çıkışını çıkış kaydına kilitlersiniz
  • palet aramasını uygula ...
  • senkron DAC'a ...

Böyle bir görevi bozduğunuzda, yalnızca bir kombinasyonel gecikme artı bazı yayılma gecikmesi elde edersiniz ve saatler arasında uyması gereken kurulum ve tutma sürelerini kaydedersiniz.

Bu şekilde yapılmış bir tasarım, bir çıktı üretmek için birçok saati alacaktır - gecikme aslında tamamen birleştirici bir tasarımdan daha yüksek olacaktır. Ancak çok daha hızlı bir saatin her döngüsünde yeni bir doğru çıktı üretir.

Ve hey, bu video, CRT'nin piksel sayacının arkasına bir düzine piksel çizip çizmemesi gerçekten önemli değil - elbette bunu senkronizasyon sinyallerinin zamanlamasında dikkate alırsınız, böylece verilerin gerçekte ne zaman doğru olduğuna göre DAC'den çıkıyor.

Uygulamada, neredeyse tüm karmaşık dijital sistemler bu şekilde çalışır, çünkü bu harika bir fikirdir - bir boru hattı CPU daha erken bir hesaplama sonucuna veya koşullu bir dalı bağımlı hale gelinceye kadar ... dijital sistem sınıfının bir sonraki dersinde - ama neyse ki VGA durumunuz çok daha basittir, özellikle de ekran çizilirken karakter arabelleği değişirse, yırtılma etkileri konusunda endişelenmiyorsanız.

Pratik bir konu olarak, bunu inşa etmek istiyorsanız, bir FPGA'da yapın. Bu, dahili bellek kullanırsanız sizi senkronize anıları veya harici bellek kullanıyorsanız senkronize IO kayıtlarını zorlar. Uygun bir tasarıma doğru çok fazla sürükleneceksiniz, kumaşın kendisi ayrı parçalarınızdan daha hızlı olacak ve elbette bir hata yaparsanız, uzun bir gün yeniden kablolama yapmak yerine yeniden derlerken başparmaklarınızı çevirmeniz yeterlidir. .


"özellikle ekran çizilirken karakter arabelleği değişirse efektlerin yırtılmasından endişe etmiyorsanız" - işte bu nedenle video yardımcı işlemcilerinin ilk günlerinden itibaren yardımcı işlemciler ana işlemi, şu anda belleklerini ekrana döküyorlar ve video arabelleğini değiştirmek istiyorlarsa, şimdi yapmalılar.
John Dvorak

Bence bunu çok karmaşık yapıyorsun. Zaten piksel saati başına bir bit veren 8 bitlik bir kaydırma yazmacı kullandığını belirtti. Muhtemelen bu, mandallı 8 bitlik bir kaydırma yazmacıdır. Bu, yeni bir baytı sadece bir kez 8 piksel saat almak zorunda olduğu anlamına gelir, bunun için 3.125MHz. Bu, tüm 320n'lerin veriyi kaydırma yazmacı mandalına almasını sağlar;
Chris_F

Çok basit bir düşük çözünürlüklü tek renkli vaka için, evet, baytların zamanlaması çok zor olmazdı, ancak sorunun önemli bir kısmı, askerin tipik "gerçek" önemsiz çözünürlük sistemlerinin performansını nasıl anlamaya çalıştığıydı. mümkün. Ve cevap diğer tüm yararlı dijital sistemlerle aynıdır: daha hızlı teknoloji ve ardışık senkron tasarım.
Chris Stratton

2

Bulabildiğim en hızlı bileşenleri kullanarak, yayılma gecikmeleri ve erişim süresi yaklaşık 25ns + 20ns + 70ns + 15ns = 120ns, 25MHz için 40ns süresinden çok daha fazladır.

Bir grafik adaptörünün asla tek bir piksel çizmeyeceğini unutmayın - en azından tam bir tarama çizgisi. Bu nedenle, bu tamamen borudan geçirilebilir bir problem olacaktır.

Ayrıca, şimdiye kadar video üretim donanımının beş yıl olduğunu unutmayın. Sorununuz genellikle harflerinizi bir bağlantı noktasında oluşturduğunuz ve sırayla bir video sinyali DAC'sine okunan özel bir RAM türü ile çözülür. Bu donanım baktığınızdan çok daha hızlı.

Devrem için temel mimari aşağıdaki gibidir:

  1. Yatay pikseller için ikili sayaç 25.175 MHz'de 800'e kadar sayar (640 görünür piksel + ön sundurma, senkronizasyon, arka sundurma için 160). 800'de dikey satır sayacını artırın (ve 525 satırda sıfırlayın)

  2. Yatay ve dikey konumu kullanarak, geçerli karakterin x, y koordinatlarını elde edin.

Hayır, neden bunu yapasın? Sıra pikselinizi bitişik bir bellek alanına yerleştirir ve doğrusal olarak DAC'ınıza çıkarırsınız - eğer bu bir CPU / MCU uygulamasıyla ilgiliyse, CPU'nuzun bunu yapmasına bile izin vermezsiniz, ancak programlanmış bir DMA birimi bir değeri diğerinden sonra almak ve CPU çekirdek etkileşimi olmadan bir paralel veri portuna koymak.

  1. ASCII karakterini almak için x, y karakter koordinatı, video belleğine indeks kullanarak.

Ah, anında işlemek istiyorsunuz - iyi bir seçim, ancak modern RAM maliyetlerinde olağandışı. Bunun yerine, karakteri önceden bir çerçeve arabelleğine dönüştürürsünüz veya cihaz aşırı derecede inceyse, karakter satırını DAC'ye doğrudan ekleyin (yukarıdaki DMA açıklamama bakın).


1
Modern şeyler önceden oluşturulmuş çerçeve tamponlarını tercih etme eğiliminde olsa da, çok fazla koç olmadan çalışmaya çalışıyorsanız açıkçası kötü bir seçimdir. Bunu bir FPGA'da yapıyorsanız, DMA durum makinesinin karakter hücre haritasından adresler almasını ve ardından karşılık gelen karakter gliflerinden okumasını sağlayabilirsiniz.
R .. GitHub DURDURMA BUZA YARDIMCI OLMAK

burada tamamen katılıyorum! dolayısıyla üçüncü soru hakkındaki cevap bölümüm.
Marcus Müller

2

Oldukça boru hattı dışında (ki çok ne yapmanız gerekir), önemli bir şey eksik ....

Paralel giriş, seri çıkış kaydırma yazmacı saatler 25 tek Mhz'de nokta, elbette, ancak karakterleriniz 8 piksel genişliğinde ise, girişi sadece ~ 3.2MHz'de ve VGA dönemi LS serisi için kolayca erişilebilir durumda. vardiya kaydı geçerli olanla bittiğinde bir sonraki baytın hazır olması gerekir (bu, boru hattının geldiği yerdir).

Metin arabelleğini ve CG ROM'unu sürmek için ~ 25MHz'de bir piksel saati ve bunun 1 / 8'inde bir bellek saati oluşturun, ardından bu belleği ve CG ROM erişim öğelerini boru hattına bağlayın.

Başka bir hile, metin tampon çıkışı herhangi bir metin satırındaki her satır için tekrarlanacaktır, böylece 80 baytlık metni bir halka arabelleğine saatleyebilir ve daha sonra sonraki 7 satır için ram okumayı durdurabilirsiniz (8 çizgi karakteri), bu, işlemcinin kullanması için hafızayı boşaltmanıza izin verir, bu da nesnenin yanına 80 baytlık koça ihtiyaç duyar.


1

Açıkçası bu işe yaramıyor; bir boru hattına ihtiyacınız var.

1) Karakterleri bitişik olarak hafızada saklayın. Sol üst köşeden başlayın.

2) Boşluk aralığı sırasında bir karakter getirin. Karakterleri bellek sırasıyla almaya devam edin.

3) Her kodu çözülmüş karakteri ve satır indeksini ROM'a ekleyin.

4) ROM çıkışını bir arabelleğe bağlayın.

5) Tamponu bir kaydırma yazmacına bağlayın. Pikselleri bundan 40ns aralıklarla sürekli olarak okuyun.

(Bu, her 320 saniyede bir vardiya kaydına yeni bir karakter yüklemeniz gerektiği anlamına gelir; bu, sistemin geri kalanını boru hattına bağlamadan bile yapılabilir.)

6) Yatay karartma sırasında ya satır başlangıcına dönün ya da sonraki karaktere ilerleyin (yani bir sonraki satırın başlangıcı)

Bonus özellik: Her 320 saniyede bir karaktere ihtiyacınız olduğu için, bir karakter + renk çiftini de okuyabilir ve MSDOS tarzı veya Spektrum Tarzı renk karakterleri yapabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.