Hallo,
ich versuche grade in Erfahrung zu bringen wie schwer es ist einen
Wandler von MDA nach VGA zu realisieren. Da es sich um Video handelt ist
ein CPLD eine mögliche Lösung.
Meine Erfahrungen in Sachen CPLD/VHDL sind gering, hatte nun ein
Semester Digitaltechnik und da haben wir damit gearbeitet.
Kurze Zusammenfassung der Protokolle:
MDA: 18kHz Zeilentakt, Monochrom, TTL, 720x350
VGA: min. 30kHz Zeilentakt, Monochrom erreicht man relativ einfach indem
man die RGB Leitungen zusammen legt und übern Spannungsteiler an
Digitalausgang hängt (VGA darf nur 0,7V max). 0V ist dann halt Schwarz,
0,7V Weiß.
Das Problem ist nun die verschiedenen Frequenzen. Bislang haben wir
immer mit einem Clock gearbeitet, was die Synchronisierung einer
einzigen Zeile starkt verkompliziert. Und dann kommt noch dazu, dass ich
ja zwei Takte brauche.
Hat da jemand einen Tipp? Will hier nun keine komplette Anleitung, nur
irgend ein Stichwort, Wiki Artikel oder so, weil ich 0 Ahnung habe
wonach ich da suchen könnte :(
> Hat da jemand einen Tipp?
Du wirst einen Pufferspeicher brauchen, in den du eine Seite deines
MDA-Signals speichern kannst.
Aus diesem Speicher wird dann mit dem VGA-Timing (Pixeltakt 25MHz) das
VGA-Signal erzeugt.
Allerdings solltest du dir noch Gedanken darüber machen, wie du 720x350
auf 640x480 skalieren willst...
> Das Problem ist nun die verschiedenen Frequenzen.
Das meinst du... :-o
> ist ein CPLD eine mögliche Lösung
Das ist sehr sportlich, denn für die Pufferverwaltung brauchst du den
einen oder anderen Zähler. Und jeder der Zähler braucht ein paar FFs. In
einem CPLD hast du aber nur sehr wenige Spiechergleider.
Nimm ein FPGA, dazu einen Takt von 100 MHz und ein schnelles Puffer-RAM.
So würde ich mal loslegen. Später, wenn es läuft, sehe ich nach, wo
optimiert werden kann.
Also eigentlich wollte ich die Auflösung identlisch lassen. VGA hat eine
Auflösung, die nur 10 Zeilen höher ist, die lässt man einfach schwarz.
Stellst du dir das nun so vor, dass man einen/mehrere Zähler baut und
die quasi als Timer verwendet und sagt, wenn die einen bestimmten Wert
erreicht haben liegt neuer Wert an?
Dann müsste man ja irgendwie ein gemeinsames Vielfaches der beiden
Frequenzen finden.
Naja der Monitor schafft es ja auch aus dem Signal wieder was
brauchbares zu machen anahnd der Sync Signale.
Und genau das machst du auch, du spielst auf der einen Seite Monitor und
speicherst die Daten in ein RAM mit einer Refreshrate von 18khz (von der
Grafikkarte vorgegeben) brauchst also etwa 32k RAM (bekommt man noch
ganz gut als SRAM).
Auf der anderen Seite gibst du (durch deinen geteilten Haupttakt) wieder
ein Videosignal aus wo du die Daten aus dem RAM liest und mit dem
gewünschten TIming ausgibt, unbenuzte Pixel dann halt auf Schwarz
lassen.
> Dann müsste man ja irgendwie ein gemeinsames Vielfaches der beiden> Frequenzen finden.
Das wäre zwar schön, macht aber keinen Sinn, weil du den MDA-Pixeltakt
nicht hast (oder hast du den?)...
Also gehst du her und sagst: aus 100 MHz kann ich gut das VGA-Timing
ableiten, und die 100 MHz sind schnell genug, um damit das MDA-Signal
überabzutasten. Dazwischen kann ich dann (mit den restlichen Taktzyklen)
die Verwaltung (Schreiben und Lesen) des RAMs erledigen.
> VGA hat eine Auflösung, die nur 10 Zeilen höher ist,> die lässt man einfach schwarz.
Was machst du aus den übrigen 80 Pixeln in der Breite?
>> Monochrom, TTL,
Heißt das: 1 Bit (weiß+schwarz)?
Oder 16 Graustufen, 256 Graustufen...?
@Läubi
Das mit dem RAM und so sehe ich genauso und war auch so angedacht.
>Auf der anderen Seite gibst du (durch deinen geteilten Haupttakt) wieder>ein Videosignal aus wo du die Daten aus dem RAM liest und mit dem>gewünschten TIming ausgibt, unbenuzte Pixel dann halt auf Schwarz>lassen.
Also, MDA hat 18kHz (waren nicht genau 18kHz, finde den Wert grade
nicht) Zeilentakt, bei 720 Pixeln macht das 12,96Mhz Pixeltakt. Jetzt
nenn mir mal einen runden Teiler von 100, der auf 12,96 kommt :-/
>Was machst du aus den übrigen 80 Pixeln in der Breite?http://de.wikipedia.org/wiki/Video_Graphics_Array#Aufl.C3.B6sung
Das heißt ich darf in der Höhe variieren wie ich Lustig bin und 720er
Breite gibt es.
>Heißt das: 1 Bit (weiß+schwarz)?
Ja
>Das wäre zwar schön, macht aber keinen Sinn, weil du den MDA-Pixeltakt>nicht hast (oder hast du den?)...
Nein, habe ich nicht und genau das ist mein Problem. Irgendwie muss ich
den ja erzeugen.
Hm... ich kenn mich nun ja nicht sooo gut aus mit VGA Timing, aber ist
es nicht so das man immer einen VSync und HSync Impuls hat?
Ich hätte einfach einen Zähler laufen lassen und wenn eine Zeile rum ist
weißt du ja wie viele "Counts" eine Zeile hat, das musst du dann nur
noch auf deine Pixelzahl umrechnen und hast den Pixeltakt. Diesen
speicherst du dir für die nächste "Runde" und weißt jezt wo du das
Signal abtasten mußt und kannst die Daten in den RAM schreiben.
@ Fabian S. (jacky2k)
>>Das wäre zwar schön, macht aber keinen Sinn, weil du den MDA-Pixeltakt>>nicht hast (oder hast du den?)...>Nein, habe ich nicht und genau das ist mein Problem. Irgendwie muss ich>den ja erzeugen.
Mit einer PLL. Diese vervielfacht den horizontalen Syncimpuls auf den
Pixeltakt. Alternativ kann man das aber auch volldigital machen, indem
man im FPGA mit einem sehr hohen Takt von sagen wir 240 MHz und mehr das
Ganze abtastet und diesen Takt auf den Zeilensync synchronisiert. Dürfte
ein vertretbares Maß an Jitter erzeugen. 240 MHz sind ~20 Mal mehr als
dein 12,9MHz Pixeltakt, macht 5% Jitter. Bei richtiger Anwendung sieht
man da nix.
Für 720x350x1 reichen 31 kbit Speicher. Das hat heute selbst ein kleines
FPGA. Besorg dir also ein kleines, preiswertes FPGA Evaluationboad und
papp dort ein paar Stecker dran. Bissel programmieren, fertig ;-)
Wahrscheinlich reicht es auch aus, nur eine Zeile zwischenzuspeichern
und diese zweimal hintereinander mit dem doppelten Takt auszugeben. Dann
reicht das allerkleinste FPGA erst recht.
http://www.mikrocontroller.net/articles/FPGA#Entwicklungsboardshttp://www.trenz-electronic.de/products/fpga-boards/trenz-electronic/te0140-spartan-3-series.htmlhttp://shop.trenz-electronic.de/catalog/product_info.php?cPath=1_47&products_id=456
MFG
Falk
>aber ist>es nicht so das man immer einen VSync und HSync Impuls hat?
Ähhh jain, sowohl VGA als auch MDA haben HSync und VSync, wenn ich das
jedoch richtig verstanden habe ist der eine zur Anzeige eines
Zeilenendes, der andere zur Anzeige eines Bildendes verantwortlich und
wärend einer Zeile muss man sich komplett selbst am Leben halten.
@ Fabian S. (jacky2k)
>jedoch richtig verstanden habe ist der eine zur Anzeige eines>Zeilenendes, der andere zur Anzeige eines Bildendes verantwortlich
Ja.
> und>wärend einer Zeile muss man sich komplett selbst am Leben halten.
Eben, deshalb braucht man einen lokalen Oszillator, ideal mit PLL.
MFG
Falk
> Für 720x350x1 reichen 31 kbit Speicher.
Wie kommt das denn hin? Laut meinem Windows Taschenrechner sind
720*350=252000, und 252000/8= ca 31kByte, nicht Bit.
@ Fabian S. (jacky2k)
>> Für 720x350x1 reichen 31 kbit Speicher.>Wie kommt das denn hin? Laut meinem Windows Taschenrechner sind>720*350=252000, und 252000/8= ca 31kByte, nicht Bit.
Uuuups. Stimmt. Nichts desto trotz, für einen Zeilenspeicher reicht es.
Und selbst die kleinsten Spartan3 200 haben 27kByte Speicher. OK, reicht
nicht ganz für den Framebuffer. :-0
MFG
Falk
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.