Hallo,
ich habe eine kleine Aufgabe gestellt bekommen und bin mir nicht sicher,
wie sie am geschicktesten zu lösen ist.
Eine kleine Skizze der Anordnung habe ich angehängt.
Bedingungen:
1) Der UC schreibt UND liest Daten vom Speicher. Er legt dort Teile des
Bildes ab und liest sie wieder aus. Teilweise ist es notwendig das
gesamte Bild auszulesen, manchmal nur Teile... Das Auslesen und Einlesen
läuft mit einer Geschwindigkeit von 25 MHz ab (16 Bit breit).
2) Der FPGA liest das Bild aus, sendet es an das Display und erzeugt die
entsprechenden Sync-Signale für das TFT. Das Display hat einen Pixeltakt
von 40 MHz
Mein Problem ist jetzt, dass ich drei Zugriffe auf den externen Speicher
mit einer hohen Geschwindigkeit habe.
Fragen:
Welcher Speicher ist für diese Aufgabe geeignet (SSRAM,QDRII-SRAM,
SD-RAM, DDR-RAM) ? Komm ich um einen Speicher mit Dual-Port nicht herum?
Wie würdet ihr die Zugriffe synchronisieren? Ich habe bisher für jede
Datenrichtung relativ große FIFO Speicher vorsehen um in Zeiten, wo
keine Daten geschrieben oder gelesen werden, die Daten vorzubereiten
(Z.B. während der vertikalen und horizontalen Synchronisation).
Mein Hauptproblem ist, dass ich möglichst frühzeitig eine Hardware
erstellen muss und ich nicht ausreichend Zeit zum Simulieren im Vorfeld
habe.
Vielen Dank für eure Hilfe.
Thomas schrieb:
> Welcher Speicher ist für diese Aufgabe geeignet (SSRAM,QDRII-SRAM,> SD-RAM, DDR-RAM) ?
Alle kommen in Frage, bei der Geschwindigkeit und Bildgröße würde ich
SDRAM oder DDR SDRAM verwenden.
> Komm ich um einen Speicher mit Dual-Port nicht herum?
Kommt drauf an wie schnell das Lesen der Daten zum µC sein soll.
> Wie würdet ihr die Zugriffe synchronisieren? Ich habe bisher für jede> Datenrichtung relativ große FIFO Speicher vorsehen um in Zeiten, wo> keine Daten geschrieben oder gelesen werden, die Daten vorzubereiten> (Z.B. während der vertikalen und horizontalen Synchronisation).
In Richtung TFT ist das die Standardlösung, da hier die Daten die in
Zukunft benötigt werden schon lange im Vorraus bekannt sind.
Beim Schreiben vom µC ins SDRAM kann man es ähnlich machen: Man weiß
welche Daten wo hinsollen, die kann man in ein FIFO zwischenpuffern.
Nur das Lesen der Daten aus dem Speicher macht Probleme.
Außer man baut eine 2 teilige Lesefunktion: Der µC setzt die Adresse die
er lesen möchte und wartet auf eine Ready vom Speichercontroller. Dann
kann er das angeforderten Daten lesen. Sequentiell kann er auch mehrere
Daten nach dem Setzen der Adresse lesen, denn der Speichercontroller
liest immer gleich mehr mehrere Werte ein.
Vielen Dank für deine erste Antwort. Also das Auslesen läuft auch mit 25
MHz ab. Aber hier ist das Problem, es ist keine Reihenfolge der Bytes
vorgeschrieben. Das heißt, über ein großes FIFO geht das hier
schlecht...
Ich hatte so ein ähnliches Problem mal, bei dem ich per wahlfreien
Zugriff auf ein 15ns SRAM zugreifen wollte, um Bilddaten rauszuholen.
Es ist normalerweise ein cycle-shared-Verfahren möglich, bei dem das RAM
mit der doppelten Bandbreite angesteuert wird und jeweils die Hälfte von
µC und FPGA verwendet wird.
Hatte versucht herauszufinden, ob man das einfach auf SDRAM skalieren
könnte, aber da wär ein Haufen zusätzlicher Aufwand notwendig gewesen,
weil das mit den Bankumschaltungen ein ziemliches Problem war. Zum
Schluss war ich soweit, dass ich mir sicher war, dass ein wahlfreier
Zugriff vom µC ein echtes Problem darstellt.
Vlt hab ich mich auch irgendwo vertan ...
Grüße
Gast
@Gast (Gast)
>Schluss war ich soweit, dass ich mir sicher war, dass ein wahlfreier>Zugriff vom µC ein echtes Problem darstellt.
Ist es auch.
>Vlt hab ich mich auch irgendwo vertan ...
Nöö, SD-RAM und alles was danach kommt ist nicht für beliebige
EInztelzugriffe entwickelt, sondern Burst-Zugruffe. Erst dann bekommt
man nämlich annähernd volle Bandbreite. Viele Einzelzugriffe müssen über
ein Cache abgefangen werden.
@ Thomas (Gast)
>Mein Problem ist jetzt, dass ich drei Zugriffe auf den externen Speicher>mit einer hohen Geschwindigkeit habe.
Naja, eigentlih nur zwei, der uC wird kaum lesen UND schreiben zugleich
machen wollen ;-)
>Welcher Speicher ist für diese Aufgabe geeignet (SSRAM,QDRII-SRAM,>SD-RAM, DDR-RAM) ?
Im Prinzip jeder. Wenn du es dir für den Anfang aber einfach machen
willst, nimm 15ns SRAM. Dann kannst du wie bereits angedeutet jeweils
einen Takt für den Zugriff des uC reservieren und jeden zweiten für den
Zugriff des TFT. Der macht 50MHz++ mit, sollte reichen.
> Komm ich um einen Speicher mit Dual-Port nicht herum?
Nein, Dual Port RAM brauchst du nicht, wenn gleich er das Problem
vereinfachen würde. Wobei man als normaler Mensch die Frage anders
stellen würde ;-)
>Wie würdet ihr die Zugriffe synchronisieren? Ich habe bisher für jede>Datenrichtung relativ große FIFO Speicher vorsehen
Wie gross? Für den TFT brauchst du max. 1 Zeile, eher weniger.
MFG
Falk
Hi vielen Dank für die Hinweise.
Hmm, das mit dem SDRAM und dem DDR-SDRAM hab ich mir schon so gedacht.
Und nen Cache zu implementieren macht absolut keinen Sinn bei der
gestellten Aufgabe...
Ich werd mal schauen, dass ich es mit einem SRAM hinbekomme. Werde ein 8
oder 10 ns verwenden, um noch ein bißchen Reserve zu haben.
Das Dual-Port-RAM wollt ich möglichst vermeiden, sind ja
schweineteuer...
Normaler Mensch? Da hast recht, das bin ich net =)
Das FIFO für den TFT hab ich für 1,5 Zeilen ausgelegt. Ich mach es
lieber ein bißchen größer. BLOCK-RAM ist im FPGA noch genügend
vorhanden.
Danke euch...
Hallo,
ich weiss dass der Beitrag hier schon etwas älter ist, aber vielleicht
erreicht er dich ja noch.
Bist du hier in der Zwischenzeit weiter gekommen?
Ich bin genau an dem selben Projekt im Moment beschäftigt.
UC schribt und liest aus / ins SRAM, FPGA stellt das Bild dar über das
SRAM. (320*240*16Bit), so ca. 40-50 Hz, habs gerade nicht genau im Kopf.
Das geht einigermaßen.
Will das ganze aber umschreiben auf SDRAM.
Können wir den Quellcode tauschen um uns gegenseitig zu unterstützen ?
noeppkes ...