Forum: FPGA, VHDL & Co. Dualport Interface mit single port SDRAM


von GS (chromosoma)


Lesenswert?

Abend
gegeben ist ein TV-Eingang,SDRAM (Single Port) und VGA Monitor

TV-Eingang liefert Daten @ 27Mhz
SDRAM läuft @166Mhz
VGA liest  Daten @ 49.5Mhz
Der TV-Eingang liefert ein Bild, das  in dem SDRAM gespeichert werden 
muss.*Gleichzeitig* muss das Bild  aus dem SDRAM auf dem Bildschirm 
angezeigt werden.

Hier im  Forum wurde mir ein Dualport Interface mit FSM empfohlen.

Im Moment bin ich einwenig durcheinander.
Meine  Realisierung sieht so aus:
Ein doppelter input-buffer für TV-IN, und doppelter Output-Buffer für 
VGA-Out. Beides als BRAM.

------------Initialisiserung--------------
State1:
Schreibe in Inputbuffer1,

State2:

Schreibe in Inputbuffer2
Übertrage Inputbuffer1=>SDRAM

State3:
Schreibe in Inputbuffer1
Übertrage Inputbuffer2=>SDRAM

State4:
Inputbuffer1 ist voll
Schreibe in Inputbuffer2
Übertrage SDRAM=>Outputbuffer1

State5
Übertrage Inputbuffer1=>SDRAM
Schreibe in Inputbuffer2

State6
Inputbuffer2 ist voll
Schreibe in Inputbuffer1
Übertrage SDRAM=>Outputbuffer2

--------------------VGA Ausgabe beginnt ab hier---------------
State7
Lese Outputbuffer1
Schreibe in Inoutbuffer1
Übertrage  Inputbuffer2=>SDRAM

State8
Lese Outputbuffer2
Schreibe in Inputbuffer2
Übertrage Inputbuffer1=>SDRAM

State9
Lese Outputbuffer2
Schreibe in Inputbuffer2
Übertrage SDRAM=>Outputbuffer1

State10

Lese Outputbuffer1
Schreibe in Inputbuffer1
Übertrage  Inputbuffer2=>SDRAM

State11

Lese Outputbuffer1
Schreibe in Inputbuffer1
Übertrage SDRAM=> Outputbuffer2

State12
Lese Outputbuffer2
Schreibe in Inputbuffer2
Übertrage Inputbuffer1=>SDRAM

State13
 GoTo State9
-------------------------------------------



Wie man sieht, SDRAM muss in der Lage sein, während ein Buffer 
geschrieben/gelesen wird die Daten aus einem Buffer  in den anderen zu 
schieben.
Eigentlich soll das auch gehen, weil der  SDRAM Clock  deutlich 
schneller als  TV-In oder VGA ist.Nicht?

Was mich auch verwirrt, der SDRAM braucht  alle 64ms 8K Refresh-Zyklen.
D.H in dieser Zeit sammelt sich die "Warteschlange" auf der TV-In Seite 
von 1301 Byte, und auf der VGA Seite 2400 Byte.
Entsprechen diese  Größen auch die minimale Buffergröße?

D.h. ich werde so um 2x1301 und 2x2400 BRAM Benötigen?
Bin ich auf dem richtigen Weg, oder mache ich es komplett falsch?=)

Vielen dank für  Hilfe=)

: Bearbeitet durch User
von Duke Scarring (Gast)


Lesenswert?

Böser Kommunist schrieb:
> Was mich auch verwirrt, der SDRAM braucht  alle 64ms 8K Refresh-Zyklen.
Da Du den SDRAM kontinuierlich ausliest, braucht der auch keinen Refresh 
mehr. Hast Du mal den Link zum Datenblatt des SDRAM?

Duke

von (prx) A. K. (prx)


Lesenswert?

Böser Kommunist schrieb:
> Was mich auch verwirrt, der SDRAM braucht  alle 64ms 8K Refresh-Zyklen.

Daten wiederauffrischen, die keine 64ms im RAM drin bleiben?

von Klaus F. (kfalser)


Lesenswert?

Böser Kommunist schrieb:
> Bin ich auf dem richtigen Weg, oder mache ich es komplett falsch?=)

IMHO eher zu kompliziert.
- Wozu braucht Du überhaupt noch das SDRAM, wenn Du die Daten sowieso 
komplett im BRAM zwischenbufferst? Wieso nicht nur 2 BRAM Buffer, einer 
wird gefüllt, der anderer solange immer wieder ausgelesen bis der andere 
frisch gefüllt ist. Dann wird umgeschalten.

- So wie ich Deinen FSM Ansatz verstehe, funktioniert das auch nicht 
richtig, weil so Operationen
"Übertrage Inputbuffer1=>SDRAM"
"Übertrage SDRAM=> Outputbuffer2"
lange brauchen und nicht hintereinander ausgeführt werden sollten, 
sondern parallel.
Deine FSM macht aber alles hintereinander.

Wenn Du es mit SDRAM machen willst, dann schreibe oder suche einen SDRAM 
Controller mit 2 Ports, einer fürs Lesen, einer fürs Schreiben.
Beide Ports sind dann hand-shake getrieben, d.h. sie haben kein 
deterministisches Timing, sondern zeigen mit einem Quittierungssignal 
an, dass die Schreib- oder Leseanforderung erledigt wurden. Der SDRAM 
Controller versteckt dann intern die Details wie
- Gleichzeitiger Lese-/Schreibzugriff an beiden Ports
- den Refresh des SDRAMs. Der Refresh wird übrigens nicht alle 64 ms 
ausgeführt, sondern gleichmäßig über die 64 ms verteilt.

Da Du nun aber kein deterministisches Timing am SDRAM Controller mehr 
hast, Du aber die Daten weiterhin mit einer festen Taktrate 
hereinbekommst, braucht es zwischen TV-IN und SDRAM ein FIFO, das die 
Daten kurzzeitig aufnimmt, wenn der SDRAM Controller die Daten nicht 
sofort schlucken kann.
Beim Auslesen ist es ähnlich.

von GS (chromosoma)


Lesenswert?

morgen
es geht um  iS42/45S16320
http://www.issi.com/WW/pdf/42-45R-S_86400D-16320D-32160D.pdf&ved=0CBwQFjAA&usg=AFQjCNHD2YIKDr_o5YGz6oDSVtt3_N43Uw&sig2=3E-wyb2hb62JrdFsZP_bQQ
Ich brauche Sdram, weil ich das ganze Bild abspeichern will.
Ich verwende altera sdram controller, und kann somit nicht entscheiden, 
wann refresh statt findet.
Wie führe ich denn Lese- und Schreibvorgänge parallel aus, wenn ich 
einen single port Chip habe?

: Bearbeitet durch User
von Klaus F. (kfalser)


Lesenswert?

Böser Kommunist schrieb:
> Ich brauche Sdram, weil ich das ganze Bild abspeichern will.

Böser Kommunist schrieb:
> Ein doppelter input-buffer für TV-IN, und doppelter Output-Buffer für
> VGA-Out. Beides als BRAM.

Wie groß sind dies Buffer dann? Nur ein Teil des Bildes?

Böser Kommunist schrieb:
> Wie führe ich denn Lese- und Schreibvorgänge parallel aus, wenn ich
> einen single port Chip habe?

Es geht nicht um den Speicherchip, den bedient der SDRAM Controller.
Du oder deine Logik sprichst nur mit dem SDRAM Controller, und der kann 
verschieden ausschauen, und ein oder mehrere Ports haben (z.B. der MIG 
von Xilinx).
Wenn er 1 Port hat, dann musst Du die Zugriffe regeln und eine Art 
Multiplexer bauen, der z.B. den Lesezugriff warten macht, bis der 
Schreibzugriff abgeschlossen ist.
Hat der SDRAM Controller mehrere Ports, dann ist dieser Multiplexer 
schon intern eingebaut.
In jedem Fall hast Du kein deterministisches Timing, sondern jede 
Lese-/oder Schreibanforderung muss solange warten bis der SDRAM 
Controller sie quittiert, weil ja intern im SDRAM Controller gerade 
schon ein Zugriff oder ein Refresh Zyklus laufen kann.

: Bearbeitet durch User
von GS (chromosoma)


Lesenswert?

Ja, Der Buffer soll nur  ein Teil des Bildes  buffern. Vllt.  eine Linie 
(752 Pixels).
Mein SDRAM Kontroller hat  nur ienen Port. also  muss ich es mit einem 
MUX machen,. So wie oben beschrieben praktisch

von GS (chromosoma)


Lesenswert?

Ok, ich nehme an, mein oben beschriebener Plan ist richtig:)

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.