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#Entwicklungsboards http://www.trenz-electronic.de/products/fpga-boards/trenz-electronic/te0140-spartan-3-series.html http://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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.