VRAM Datenpuffer
VRAMs wurden speziell für CAD Grafikkarten entwickelt, als es noch keine SDRAMs oder andere außreichend schnelle Speicher ab (SRAMs waren zwar schnell aber zu teuer), um hohe Auflösungen darstellen zu können. Mit VRAMs können sehr schnell Daten sequentiell übertragen werden. Je nach Speicher lassen sich so problemlos Datenraten von 25MB/s - 50MB/s erreichen, ohne dass ein Controller jedes Byte einzeln lesen muss.
VRAMs
sind meist als 4, 8 oder 16bit DRAMs ausfgeführt. Übliche Größen
sind 128kByte ode 512kByte. Am häufigsten sind 128kByte Speicher zu finden,
die entweder als 256k x 4 (links) oder 128k x 8 (rechts) organisiert sind. In
manchen PCI Grafikarten der ersten Generation findet man auch größere
Speicher (z.B. 256k x 16).
Mit einer Adapterplatine habe ich zwei 256k x 4 VRAMs zu einem 256k x 8 Modul
verbunden. Zur Ansteuerung von 4 bit LCDs reicht aber auch ein Speicher.
Die
Ansteuerung eines VRAM ist ähnlich einem DRAM, d.h. Adressmultiplex über
CAS\ und RAS\, Refresh notwendig. Zusätzlich ist noch ein 256 oder 512Byte
SRAM mit Adresszähler eingebaut, das parallel mit dem DRAM verbunden ist
(d.h. mit einem einzigen Befehl wird der komplette Inhalt des SRAMs vom/zum
DRAM übertragen).
Eine Besonderheit ist auch der Split Transfer. Dabei wird der SRAM in zwei Hälften
geteilt. Eine führt den Datentransfer durch, während die andere Daten
mit dem DRAM austauschen kann.
Um damit nun Daten aufzuzeichnen initialisiert man das VRAM mit der Pseudo-Write
Prozedur. Dadurch wird der SRAM Datenport auf Dateneingang geschaltet. Während
dieser Prozedur muss der Takt SC abgeschaltet sein, und SE\ muss auf high liegen.
Danach aktiviert man den Takt, wodurch bei jeder Low-High Flanke ein Datenwert
von den SDQ Eingänge im SRAM gespeichert wird. Ist die Hälfte des
SRAMs voll, wechselt QSF den Zustand, was vom uC erkannt wird, woraufhin dieser
die Daten aus dem SRAM ins DRAM schreibt. Dieser Schritt wird solange wiederholt,
bis der DRAM voll ist. Danach kann man die Daten in Ruhe weiterverarbeiten,
solange man den Refresh nicht vergisst...
Die
Schaltung ist extrem einfach: Ein Mikrocontroller steuert den VRAM direkt an.
Nach einer Initialisierung muss der uC nur den Inhalt des SRAMs vom/zum DRAM
übertragen. Dazu dienen außer den üblichen DRAM Steuerleitungen
CAS\, RAS\ OE\ und WE\ noch die beiden Anschlüsse DSF und QSF. DSF unterscheidet
ob der SRAM in zwei Hälften geteilt wird, und QSF gibt den Zustand des
Adresszählers an: Low: Adresszähler in der unteren Hälfte, High:
Adresszähler in der oberen Hälfte.
Da der Mikrocontroller nur alle 128 (bzw. 256) Bytes eine Hälfte des SRAMs
übertragen muss, kann man mit einem 8051 der mit 24MHz getaktet ist (d.h.
2MHz CPU Takt) problemlos 10MB/s (bzw. 20MB/s) übertragen.
Mit
einer kleinen Adapterplatine lassen sich auch SMD Bausteine leicht auf normalen
Lochrasterplatinen verwenden.
Diese Schaltung ist universell verwendbar. Das 4 polige Kabel auf der linken
Seite ist die RS232 Verbindung zum PC, das 20 polige Kabel auf der rechten Seite
dient als 8bit Daten Ein/Ausgang. Hier kann man alles anschließen, was
Daten erzeugen oder empfangen kann.
Mit
einem High Speed DA Wandler am Ausgang kann man zum
Beispiel ein SW Videosignal erzeugen. Nachdem die Daten in den Speicher geladen
wurden, werden diese fortlaufend ausgegeben. Dazu benötigt man wirklich
nur 4 ICs: Das VRAM Modul, den uC, einen 74HC32 um den Pixeltakt zu schalten
und ein 74HC574 Latch mit einem R2R Netzwerk als DA Wandler. Das Bild ist super
scharf, und hat etwa 430 x 230 Pixel Auflösung bei etwa 7,5bit Graustufen,
da ein nicht gerade geringer Anteil der Daten für die Sync Signale verwendet
wird.
Mit
einer externen Sync Erzeugung kann man auch 512 x 256 Pixel bei 8bit Graustufen,
oder bei Verwendung eines RAMDAC ICs aus einer ISA Grafikkarte auch 256 Farben
aus einer 256k Farbpalette. Das ganze sieht dann in etwas so aus...
Das Signal wird über den RGB Anschluss der SCART Buchse eingespeist, oder
mit einem AD722 Videoencoder in ein Composite oder S-Video Signal umgewandelt.
Natürlich
kann man auch einen AD Wandler anschließen und so ein Videosignal digitalisieren.
Hier wurd ein TV Bild mit 8MHz abgetastet. Bei 8MHz erreicht man nämlich
genau 512 Pixel pro Bildzeile, so dass man auf einen HSync verzichten kann,
wenn der 8MHz Takt ausreichend genau ist. Man erkennt das daran, dass das Bild
leicht schief ist. Wenn man das Bild mit 12MHz digitalisiert erhält man
768 x 341 Pixel Auflösung, was für ein komplettes Halbbild ausreicht.
Auf der linken Seite des Bildes erkennt man deutlich das feine Muster, das vom
4,43MHz Farbträger stammt.
Per
Software lässt sich das Bild sogar in ein Farbbild umwandeln ! Man benötigt
nur einen Software PLL, der den Farbträger erkennt, aus dem Bild entfernt
und das Signal dekodiert.
Lässt
man den DA Wandler weg, kann man die Daten auch an ein LCD senden. Den Pixel
Takt (XSCL) hat man, als Latch Impuls (LP) und Zeilentakt (YSCL) kann man das
QSF Signal verwenden. Um z.B. ein DualScan 640x480 LCD anzusteuern, müssen
in jedem Byte 4bit für die obere und 4bit für die untere Displayhälfte
gespeichert sein. Nach 128 Bytes geht QSF auf High. Bisher wurden 4x128, also
512Bytes übertragen. Da 128k für ein 640x480 Display mehr als ausreichen
und um die Anseteuerung zu vereinfachen wurden für jede Zeile 256Bytes
(=1024 Pixel) reserviert. Das Display speichert nur die ersten 640 Pixel, alles
weitere wird ignoriert. Wenn YSCL/LP auf High liegt, ignoriert das Display die
Daten. Daher wird mit einem Inverter und einem RC Glied bei jeder High-Low Flanke
des QSF Signals ein positiver Impuls von etwa 200ns für das LP/YSCL Signal
erzeugt.
Da der Mikrocontroller bei der geringen Datenrate von 4MHz recht wenig zu tun
hat, zählt er nebenher noch die Zeilen und empfängt Daten, die er
ins DRAM schreibt. Bei Zeile 1 und Zeile 243 wird der First Line Marker (Din,
FLM) Impuls erzeugt. Bei Zeile 484 wird der Zähler auf 0 zurückgesetzt.
Da noch genügend Platz im Speicher war, werden immer zwei Bilder ausgegeben.
Ist ein Pixel nur in einem Bit an, wird eine Graustufe erzeugt.
Im VRAM gibt es einen speziellen Write-Per-Bit Modus, mit dem nur einzelne Bits
in einem Byte beschrieben werden können. Dies ist optimal für ein
Dualscan LCD: Man muss nicht immer die obere und untere Displayhälfte gleichzeitig
beschreiben. Mehr zum Thema LCD Ansteuerung gibt es hier.
Wenn
man an den Eingang nur einen HCMOS Puffer anschließt, hat man entweder
einen 8 Kanal Bitmustergenerator, oder ein 8 Kanal Logik Analyser mit 32MS/s.
Dies reicht aus, um bei normalen Mikrocontrollerschaltungen Fehler zu finden.
Da am Mikrocontroller noch genügend IO pins frei waren, wurde ein 32MHz
Quarz mit umschaltbarem Teiler eingebaut. Über einen 74HC74 wird das Aktivierungssignal
des Aufzeichnungstaktes mit einer Triggerbedingung synchronisiert.
Hier als Beispiel ein Signal von der DRAM Ansteuerung,
bei der Daten von einem 8051 uC von einer Festplatte gelesen werden (2x 8bit)
und dann ins DRAM geschrieben werden. Da alle 10 Sekunden 1 Sektor gelesen wird,
könnte man die Signale nie auf einem normalen Oszilloskop betrachten...