mikrocontroller.net

Forum: FPGA, VHDL & Co. Asynchrone konvertierung von MDA nach VGA


Autor: Fabian S. (jacky2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 :(

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Fabian S. (jacky2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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...?

Autor: Fabian S. (jacky2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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#...
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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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#Entwi...
http://www.trenz-electronic.de/products/fpga-board...
http://shop.trenz-electronic.de/catalog/product_in...

MFG
Falk

Autor: Fabian S. (jacky2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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

Autor: Fabian S. (jacky2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.