VGA jel előállítása

 

 

Hello!

Én 20MHz-en csináltam, és 800x600@60Hz - es felbontást állítottam elő, ezzel egy órát valósítottam meg.
A legelső változat 25MHz-es volt, és 640x480@60Hz-en ment, gondolom ez a mód kell neked, ezt leírom neked.

Az a nagy helyzet, hogy a 640x480 az csak a képernyő látható része, időzítés szempontjából valójában 800x525 a felbontásod.
Pixel órajel: a pixelek rajzolásának frekvenciája.
Ennél a módnál szabványosan 25.175MHz, de 25MHz is megengedett.
800 pixelidőből rakódik össze egy sor(ebből 640-et látsz), azaz a sorfrekvencia: 31.468kHz
Ilyen sorokból 525-öt kell kirajzolni egy képhez(de te csak 480-at látsz), azaz a pontos képfrekvencia: 59,94Hz

szinkronjelek(kioltójelek):
5V-os TTL jelek, VGA monitor esetében ezek alacsony-aktívak, azaz nyugalmi állapotban +5V-osak.
HSYN: vízszintes szinkronjel, hatására a vízszintes eltérítő visszaugrik a sor elejére.
VSYN: függőleges szinkronjel, hatására a függőleges eltérítő visszaugruk a kép tetejére.
A pongyola megfogalmazás ellenére a szinkronjeleket pontosan kell előállítani, különben összeesik a kép vagy letilt a monitor.

A vízszintes szinkronjel 96 pixelidőből áll, utána jön 48 pixelnyi sötétrész(visszafutási idő), majd elkezdhetsz rajzolni 640 pixelt. Ezután 16 pixel előkészítési idő jön, ilyenkor át kell kapcsolnod a színjeleket sötétre különben nem fogsz látni semmit. Ezután újra kiadod a szinkronjelet(96 pixelidő)

A függőleges szinkron is hasonló, csak itt sor-időkkel mérünk: maga a jel 2 soridő, amit 33 sor sötét rész követ. A függőleges szinkronjel és a visszafutás ideje alatt a vízszintes szinkront ugyanúgy ki kell adnod mintha nem is lenne függőleges visszafutás, és továbbra sem rajzolhatsz!
Ezután jöhet a 480 sor amikor lehet rajzolni, utána 10 sor sötét, mert az a függőleges szinkron előkészítési ideje.

Bővebbet itt találsz, és más képernyőmódokhoz is adnak táblázatos, áttekinthető leírást:
http://www.epanorama.net/documents/pc/vga_timing.html

Amit még megemlítenék, az a színjelek kiadása.
Ha mind a 3 színt elkülönítve használnád akkor 180 ohm-os előtét ellenállással rákapcsolhatsz +5V-ot mindegyikre. Ha csak fehér kell, akkor a három színjelet összekötöd, rá egy 470 ohm-os ellenállás, és a másik végét +5V-al birizgálhatod.

Először a szinkronjelekkel játszadozzál, ha nem rajzolsz akkor is meg tudod állapítani hogy jól csinálod-e: ha nem, akkor a monitorod letilt, feltéve ha LCD-t vagy digitális CRT-t használsz. Én LCD-vel játszottam, és egy monitor-átkapcsolóval (KVM switch-el) oldottam meg hogy ugyanazt a monitort használhassam programozásra és tesztekre.
A KVM switch arra is jó, hogy az esetleges nemkívánatos jelektől megvédje a monitor bemenetét.

Ha már jó a szinkronjeled és a monitor felismeri a módot, akkor nincs más dolgod mint rajzolni.
Ha ugyanabban a pixelidőben ugyanazt a jelet adod ki, akkor értelmes képet kaphatsz.

 


Hello!

2 pixelidő egy órajel, de ettől függetlenül is nagyon rosszul számolod. 
Ugyanis az időzítésnél a teljes képet kell alapul venni, nem csak a látható tartományt:
Ez 1056x628 pixelidőnek felel meg, ebből 800x600 ami látható kép.
A pixelfrekvencia 40MHz, így a képfrekvencia 60,3165Hz.

Ez elméletben azt jelenti, hogy 400x600-as felbontásod lesz ezzel a módszerrel. Gyakorlatban még ennél is kevesebb, mert 1 órajel alatt nem fogsz kiadni 1 pixelt, max ha RAM-DAC-ot használsz...
Én néha számolni is kell, feltölteni a puffereket, én azt a sötét részeken oldom meg, amikor az elektronsugár azt a részt pásztázza ahol nem rajzol.
De már egy egyszerű digitális óra esetében is a számolósdi - időben - belelóg a látható tartományba, ezét a VGA órámnál a számok kicsit közelebb vannak a képernyő jobb oldalához mint a balhoz...

Az időzítéseket itt megtalálod: Link

A képeket pedig csatolom. Azért lila, mert az egyik monitorkábel szálszakadásos volt. A fejlesztés ugyanazon a monitoron ment amivel teszteltem, átkapcsolni a monitor switch-el lehetett...