Forum: FPGA, VHDL & Co. BlockRAMs mit 3 Anschlüssen


von Neu-Xilist (Gast)


Lesenswert?

Ich habe zwei schreibende und einen lesenden Prozess mit jeweils 
unterschiedlichen Takten. Es muss in alle Richtungen gelesen und 
geschrieben werden können. Durch Semaphoren ist sichergestellt, dass 
immer nur einer auf einen Block schreiben kann.

Nun möchte ich ein Blockram mit 3 Anschlüssen bauen.

Aus meiner Altera-Zeit weiß ich, dass man da drei Anschlüsse machen 
konnte. wie geht das beim Grossen X?

von Christian R. (supachris)


Lesenswert?

Leider nicht, die haben nur Dual Port RAM. Da braucht es einen externen 
Arbiter.

von Fpgakuechle K. (Gast)


Lesenswert?

Neu-Xilist schrieb:
> Ich habe zwei schreibende und einen lesenden Prozess mit jeweils
> unterschiedlichen Takten. Es muss in alle Richtungen gelesen und
> geschrieben werden können. Durch Semaphoren ist sichergestellt, dass
> immer nur einer auf einen Block schreiben kann.
>
> Nun möchte ich ein Blockram mit 3 Anschlüssen bauen.
>
> Aus meiner Altera-Zeit weiß ich, dass man da drei Anschlüsse machen
> konnte.

Geht wohl auch beim A nicht mehr, ist aber leicht nachbaubar:
https://www.altera.com/support/support-resources/knowledge-base/solutions/rd08132012_451.html

Dieser "workaround" ist auch bei X möglich. Wenn du bereits semophoren 
realisiert hast sollt es nicht schwierig sein einen datanmultiplexer zu 
ergänzen desen Auswahlsignal (select) auch von der Semaphor-steuerung 
geschaltet wird.

MfG,

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Fpga K. schrieb:
> Geht wohl auch beim A nicht mehr, ist aber leicht nachbaubar:...
Das ist aber kein "TriPortRAM", wo an jedem der 3 Ports gelesen und 
geschrieben werden kann. Sondern es werden wie bei Xilinx einfach 2 RAMs 
parallel geschaltet und von 1 Port ausschließlich geschrieben (also 
dort nicht mal gelesen!), sowie von den anderen beiden Ports nur 
gelesen.

Neu-Xilist schrieb:
> Es muss in alle Richtungen gelesen und geschrieben werden können.
Es ist mit 3 Dual-Port-RAMs eigentlich recht einfach: man schaltet alle 
3 parallel, jeder der 3 Teilnehmer bekommt einen Lese-Port. Und auf der 
anderen Seite wird über einen Multiplexer jeweils einem der drei 
Teilnehmer der Schreib-Port auf alle 3 RAMs zugeteilt...
Fazit: Gesamtaufwand = 3 RAMs + 1 Adress/Datenmultiplexer

> Es muss in alle Richtungen gelesen und geschrieben werden können.
Was ist denn dein eigentliches Problem? Warum geht es nicht mit 1 RAM 
und 1 Arbiter, der das RAM zuteilt? Weltweit funktionieren milliarden 
Rechner auf diese Art. Ich hätte bei dieser Lösung mit 3 RAMs Bedenken, 
dass da mal Inkonsistenzen in den Speichern auftreten könnten...

von J. S. (engineer) Benutzerseite


Lesenswert?

Die im link beschriebene Lösung ist ein Shadow-Ram und ersetzt nicht die 
geforderte Funktionalität des vollständigen bidirektionalen Betriebs 
eines Dreifach-RAMs. Das geht nur über einen Sternpunkt, also ein 
einziges RAM mit gfs davor geschalteten FIFOs, um die Anforderungen 
handhaben zu können.

Auch bei den Altera-RAMs bin ich mir nicht sicher, ob die wirklich einen 
dritten Schreibport hatte. Ich hatte mal eine APP, wo ich mit 
Shadow-RAMs gearbeitet habe, weil ein und dasselbe von zwi 
unterschiedlichen Abnehmern und leicht unterschiedlichen Zeiten gelesen 
wurde. In dem Fall in dem es doch derselbe Zeitpunkt war, hat es die 
Synthese erkannt und die RAMs zusammengeführt.

Aber: Das war nur Lesend!

Die einzige Möglichkeit, es wirklich mit voller Bandbreite und 
wahlfreiem Zugriff zu bauen, ist, das RAM per Hand aufzuziehen - eben 
so, wie man es für die Semaphore selbst auch tun muss.

Ob das hier nötig ist, bezweifle ich ein wenig, weil sich meines 
Erachtens der erste und der zweite Satz des TE widersprechen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jürgen S. schrieb:
> Ob das hier nötig ist, bezweifle ich ein wenig, weil sich meines
> Erachtens der erste und der zweite Satz des TE widersprechen.
Entsprechend dem ersten Satz würde ich auch sagen: ein einziges DPRAM 
reicht aus, weil ja gewährleistet ist, dass nur ein einziger Prozess 
darauf schreibt...

von Falk B. (falk)


Lesenswert?

@ Neu-Xilist (Gast)

>Ich habe zwei schreibende und einen lesenden Prozess mit jeweils
>unterschiedlichen Takten.

Wirklich unterschiedliche, sprich asynchrone Takte? Oder eher 
abgeleitete Takte?

Taktung FPGA/CPLD

> Lothar Miller (lkmiller) (Moderator) Benutzerseite
>> Ob das hier nötig ist, bezweifle ich ein wenig, weil sich meines
>> Erachtens der erste und der zweite Satz des TE widersprechen.
>Entsprechend dem ersten Satz würde ich auch sagen: ein einziges DPRAM
>reicht aus, weil ja gewährleistet ist, dass nur ein einziger Prozess
>darauf schreibt...

Denke ich auch.

von Neu-Xilist (Gast)


Lesenswert?

Nein, es sind drei unterschiedliche Domänen - das ist ja das Problem. 
Und ich weiß nicht, wann sie schreiben. Funktionell ist das ziemlich 
entkoppelt, ich muss gfs die Schreiber in eine Warteschlange schicken.

von Falk B. (falk)


Lesenswert?

@ Neu-Xilist (Gast)

>Nein, es sind drei unterschiedliche Domänen - das ist ja das Problem.

Das klingt sportlich. Dann würde ich aber auf jeden Fall den BRAM nur 
mit EINEM Takt laufen lassen und alle drei Taktdomänen per asynchronem 
Mini-FIFO oder ähnlichem ankoppeln. Dann entschärft sich auch das 
Problem der 3 Ports. Der Arbiter hat dann 2 volle Port zur Verfügung und 
kann ggf. 2 Zugriffe gleichzeitg machen. Wenn doch zufällig ein dritter 
zeitgleich auftritt, fängt das der jeweilige FIFO ab.

von J. S. (engineer) Benutzerseite


Lesenswert?

Das macht aber dann richtig schön wenig Bandbreite. Vielleicht doch als 
distri Ram bauen?

von Sym (Gast)


Lesenswert?

Wie von Falk Brunner gesagt, kann man das gut mit FIFOs an den Ports und 
einem 2-Port RAM lösen. Den Speicher würde man eben entsprechend höher 
takten, sodass es sich immer ausgeht.

Beachte allerdings die Anforderungen an read-after-write bei so einer 
Lösung. Durch die FIFOs erhöht sich die Antwortzeit um einige Takte und 
es kann vorkommen, dass Lesezugriffe Schreibezugriffe überholen. Da kann 
man dann Z.B. mit CAMs aushelfen, einfacher wird es damit aber nicht.

Wenn das RAM klein ist, dann kann man es auch aus Registern bauen und 
sich den Aufwand sparen.

von Fragi (Gast)


Lesenswert?

Sym schrieb:
>CAM

???

Keine Abkürzungen unbekannter Art verwenden.

von Falk B. (falk)


Lesenswert?

content addressable memory

Eingangssignal ist der INHALT, welcher im Speicherarray gesucht wird. 
Ausgangssignal ist die ADRESSE, in welcher dieser zu finden ist.


Ist quasi eine Suchmaschine mit vielen parallelen Komparatoren. Google 
in Hardware ;-)

von Bit Wurschtler (Gast)


Lesenswert?

Fragi schrieb:
> Sym schrieb:
>>CAM
>
> ???
>
> Keine Abkürzungen unbekannter Art verwenden.

Och, da kann man auch bei Wikipedia nachschlagen:
https://de.wikipedia.org/wiki/CAM
in dieser Abk.-liste findet sich auch der passende Link:

https://de.wikipedia.org/wiki/Assoziativspeicher


Wer diesen dt. Begriff geprägt hat gehört allerdings geschlagen ;-)

In Praxis ist mir ein solcher Speicher bisher nur einmal vorgekommen und 
zwar in den Neunziger bei Evaluierung von Aufrüstoption für 386 PC 
Motherboard. Da konnte man den Cache aufrüsten und so den cachebaren 
Bereich aufrüsten. Allerdings auch nicht mehr als der Address tag RAM 
hergibt. der ist wohl als CAM organisiert, und da würde es wichtig zu 
wissen ob man einen n-fach aasoziativ Cache oder einen direct mapped 
Cache wählt. Nicht ganz trivial das Thema:
https://de.wikipedia.org/wiki/Cache#Block.2FSatz-Aufteilung_der_Tags

Eine IMHO bessere Darstellung findet sich in:
ISBN: 978-3528051730

von Tech Nick (Gast)


Lesenswert?

Wenn ich das alles so lese, dann frage ich mich, ob nicht ein round 
Robin mit entsprechender Frequenz das Einfachere ist.

von Sym (Gast)


Lesenswert?

Sorry wegen der Verwirrung mit den CAMs. Für mich ist das so alltäglich 
wie JTAG und AXI4.

Round-Robin geht natürlich. Allerdings kann dadurch die Reihenfolge 
verändert werden. Nehmen wir drei Teilnehmer A, B, und C. Nehmen wir an 
der Pointer steht bei A. A setzt einen Schreibzugriff beim Übergangs des 
Pointers auf B ab, dieser kann aber erst in der nächsten Runde 
serviciert werden. Beim Übergang von B auf C setzt C einen Lesezugriff 
ab. Da nun C drankommt, wird der Lesezugriff durchgeführt. Somit hat der 
Lesezugriff den Schreibzugriff überholt.

So, und nun kommt die CAM ins Spiel. Man speichert die Schreibaddressen 
im CAM ab und die Daten in einem zum CAM gehörenden Speicher. Beim Lesen 
fragt man zuerst mit der Leseaddresse im CAM nach: Wurde diese Addresse 
unlängst geschrieben? Falls ja, holt man die dazugehörigen Daten aus dem 
CAM zugehörigen Speicher. Falls nein, nimmt man die Daten aus dem 
(Round-Robin beschriebenen) RAM.
Wenn man aber weiß, dass ein Read nach einem Write auf dieselbe Addresse 
erst viel später gelesen wird, dann kann man sich die CAM sparen, weil 
das RAM immer die richtigen Daten hat.

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.