Forum: FPGA, VHDL & Co. Blinkfreie Bildausgabe mit FPGA und SDRAM


von GS (chromosoma)


Lesenswert?

Hi,

Ich will mit einem FPGA und einem SDRAM eine  saubere  VGA Ausgabe 
(800x600) realisieren.

Zur Zeit funktioniert es  folgendermaßen:

1:Ein Video wird  von TV-Eingang gelesen  und in den SDRAM geschrieben.
2:Sobald ein Bild vollständig im SDRAM vorliegt, wird es auf dem VGA 
Bildschirm ausgegeben.
3:GoTo 1



Das Problem ist, ich kann nicht gleichzeitig von SDRAM lesen und 
schreiben:(
D.h. der Bildschirm bleibt während  Vorgang 1 schwarz=>ich sehe ein 
blinkendes Bild.

Gibt es ein  Trick, wie ich sowas umgehen kann?

von Detlef K. (adenin)


Lesenswert?

Böser Kommunist schrieb:
> Hi,
>
> Ich will mit einem FPGA und einem SDRAM eine  saubere  VGA Ausgabe
> (800x600) realisieren.
>
> Zur Zeit funktioniert es  folgendermaßen:
>
> 1:Ein Video wird  von TV-Eingang gelesen  und in den SDRAM geschrieben.
> 2:Sobald ein Bild vollständig im SDRAM vorliegt, wird es auf dem VGA
> Bildschirm ausgegeben.
> 3:GoTo 1
>
> Das Problem ist, ich kann nicht gleichzeitig von SDRAM lesen und
> schreiben:(
> D.h. der Bildschirm bleibt während  Vorgang 1 schwarz=>ich sehe ein
> blinkendes Bild.
>
> Gibt es ein  Trick, wie ich sowas umgehen kann?

Du schreibst in einen zweiten SDRAM und schaltest die um.
Double buffering

Zweite Möglichkeit: Wärend des Vorgang 1 wegschauen. ;)

von GS (chromosoma)


Lesenswert?

Ich habe leider nur einen SDRAM chip auf dem Board :) (DE1-SoC)

von Lattice User (Gast)


Lesenswert?

Böser Kommunist schrieb:

> Gibt es ein  Trick, wie ich sowas umgehen kann?

Vorrausgesetzt die Bandbreite des SDRAMs reicht:
Dualport Interface mit ArbiterFSM und Multiplexer implementieren.

von GS (chromosoma)


Lesenswert?

Danke, ich muss mal googlen was ArbiterFSM heißt
Hier sind einiger angaben zum System
SDRAM geht bis 200MHz
VGA Ausgabe mit 49MHz
Tv-Eingabe mit 27 MHz

von Falk B. (falk)


Lesenswert?

@ Böser Kommunist (Firma: UdSSR) (chromosoma)

>Danke, ich muss mal googlen was ArbiterFSM heißt

Nichts weiter als ein etwas intelligenterer Multiplexer, der den Zugriff 
von zwei Logikmodulen auf einen SDRAM regelt.

>SDRAM geht bis 200MHz
>VGA Ausgabe mit 49MHz
>Tv-Eingabe mit 27 MHz

Ja und? Das Grundprinzip ist immer das gleiche. Multiplexen, und das mit 
einer sinnvollen Blockgröße bzw. Frequenz. D.h. man speichert nicht ein 
komplettes Bild ohne Unterbrechung sondern bestenfalls eine Zeile. 
Währenddessen werden die Videodaten aus einem kleinen Zwischenpuffer 
(BRAM) ausgegeben bzw. dort reingeschrieben. Somit ist immer im 
schnellen Wechsel jedes Modul mal dran, das auf den SDRAM zugreifen 
will. So wie L1/L2 cache bei einer großen CPU. Wenn man nicht eine 
komplette Zeile speichern kann/will, muss man halt Teile einer Zeile 
speichern. Letztendlich darf man aber nicht so weit runter gehen, dass 
der SDRAM nicht mehr effektiv im Burstmodus arbeitet, denn dann geht die 
Bandbreite in den Keller. Die Burstlänge sollte man möglichst gut 
ausnutzen (2/4/8 Byte oder ganze Page).
Bei einfachem SRAM kann man auf Byte/Wortebene multiplexen, ohne 
nennenswerte Leistungseinbrüche zu erzeugen.

von GS (chromosoma)


Lesenswert?

Hm, D.h. ich brauche an den beiden Seiten  ein Double Buffer je 
2xBlockgröße.

Ich werde es versuchen

von W.S. (Gast)


Lesenswert?

Böser Kommunist schrieb:
> 1:Ein Video wird  von TV-Eingang gelesen  und in den SDRAM geschrieben.
> 2:Sobald ein Bild vollständig im SDRAM vorliegt, wird es auf dem VGA
> Bildschirm ausgegeben.
> 3:GoTo 1

Also erstens: du meinst nicht wirklich ein "Video" vom TV, sondern 
RGB-Daten, ja?  (Video wäre z.B. AVI, MP4 und Konsorten)

Zweitens: du hast 2 völlig unterschiedliche Zugriffsraten zwischen 
Schreibvorgang vom TV zum RAM und Lesevorgang vom RAM zum VGA-Monitor. 
Dabei muß dein Lesevorgang gleichmäßig sein, damit dein VGA-Monitor sein 
erforderliches Signalverhalten bekommt. Der Schreibvorgang hingegen kann 
ungleichmäßig sein.

Also mußt du für jeden Lesezyklus eine Zweiteilung vornehmen:
In der einen Hälfte des Zyklus liest du den RAM aus und verfrachtest das 
Gelesene in eine Breitseite Latches, von wo aus es für den VGA-Moni zur 
Verfügung steht.
In der zweiten Hälfte des Zyklus kannst du (falls anstehend) einen 
Schreibvorgang in dein RAM vornehmen. Dazu mußt du natürlich die Daten 
vom TV zuvor ebenfalls in einer Breitseite Latches zwischenspeichern und 
dir den Zustand "zwischengespeichert" merken, bis du die Daten im RAM 
untergebrcacht hast.

Klaro?

W.S.

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
Noch kein Account? Hier anmelden.