Forum: FPGA, VHDL & Co. Kommunikation zwischen Prozesse


von VHDL Neuling (Gast)


Lesenswert?

Hallo Leute,

ich komme zwar aus der Embedded Software Ecke, versuche aber ein kleines 
(FPGA) Projekt fertig zu bekommen.

Mein Problem ist das ich aus zwei Prozesse Daten von verscheidenen 
(8xEBR)RAMs lesen muss und aus einem Prozess lesen und schreiben.

Ich habe mir gedacht ich werde das direkt Lesen und Schreiben von RAMs 
in einem extra Process (MemoryController), der alles organisiert und die 
Daten im/vom richtigen RAM liest/schreibt.

Wie können jetzt die drei Prozesse mit dem MemoryController 
kommunizieren?

wenn der MemoryController eine Entity mit z.B. "Enable", "Address", 
"DataIn" Signale hat, dann dürfen diese Signale NUR IN EINEM PROZESS 
gesetzt werden, und die anderen können nur lesend darauf zugreifen.

Hat jemand eine Idee wie ich das besser organisieren kann?

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


Lesenswert?

VHDL Neuling schrieb im Beitrag #3070335:
> Wie können jetzt die drei Prozesse mit dem MemoryController
> kommunizieren?
Über Umschalter aka. Multiplexer.

Es hilft nichts, wenn du dein Design auf möglichst viele kleine Häppchen 
aufteilst, dir aber nicht vorstellen kannst, wie du die dann 
verbindest. Sinnvoller wäre da eine Skizze, dann erkennst du, wo 
welche Datenpfade zusammenkommen, und kannst dann abschätzen, ob du sie 
zeitlich auflösen kannst (auf ein RAM kannst du nunmal nicht 
gleichzeitig zugreifen [Ausnahmen ausgenoimmen])...

> Mein Problem ist das ich aus zwei Prozesse Daten von verscheidenen
> (8xEBR)RAMs lesen muss und aus einem Prozess lesen und schreiben.
Hier wirst du em ehesten ein DPRAM nehmen, den Schreib-Lese-Porzess auf 
einen Port zugreifen lassen, die anderen beiden Prozesse müssen sich den 
anderen Port teilen, und nacheinander ihre Daten abholen.

von Helfender (Gast)


Lesenswert?

Ohne jetzt dein Problem genau zu kennen oder durchdacht zu haben:
Wenn du eine Ressource hast und mehrere darauf zugreifen können sollen,
dann gibt es m.E. 2 Möglichkeiten:
a) hintereinander
b) zugleich

Möglichkeit (a) würde bedeuten, dass, wenn einer gerade darauf zugreift,
die anderen warten müssen. Ist das möglich? Oder muss jeder sofort
Zugriff auf die Daten haben? Vielleicht auch so etwas wie eine
Auftragswarteschlange. Prozess 1 setzt Auftrag ab, bekommt dann
irgendwann später eine Antwort. Der Prozess kann vielleicht in der Zeit
etwas anderes machen oder schlicht auf die Antwort warten.

Abwandlung wäre eine Scheduling mit festen Zeitschlitzen:
Jeder der 3 Prozesse bekommt 1/3 der Zeit. In der Zeit muss aber alles
neu eingestellt werden, z.B. wenn beim RAM erstmal die Adresse
irgendwo rein geschrieben werden muss, dann wird er unterbrochen,
und der nächste schreibt dann eine neue Adresse rein, dann kann
der alte nicht mehr davon ausgehen, dass die Adresse noch vom
letzten Mal vorhanden ist.

Möglichkeit (b): Vielleicht eine Art Caching? Jeder Prozess bekommt
eine Kopie der ganzen Daten und kann dann lesen wie/wann er will.
Dabei hast du aber das Problem, dass einerseits der Cache mal angelegt
werden muss (kleineres Problem), andererseits du die Schreibzugriffe
wieder auf die Caches verteilen musst. Was passiert, wenn einer gerade
ließt und der andere (auf die gleiche Stelle) schreibt?

von VHDL Neuling (Gast)


Lesenswert?

Vielen Dank für die Antwort.
Mein Problem ist gar nicht die Organisation, und die drei Prozesse 
dürfen nicht gleichzeitig auf die RAMs zugreifen.

Das Problem liegt bei der Ansteuerung des MemoryController => also die 
Lese/Schreibe Aufträge von unterschiedlichen Prozesse zu setzen (Weil in 
VHDL (meinen Kenntnissen nach) ein Signal_ _nicht_ _in 
unterschiedlichen_ Prozesse geschrieben werden darf):
Also entweder mache ich im (MemoryController's) Interface für jeden 
Prozess seine eigene Signale, somit werden dies nur im eigenen Prozess 
geschrieben, und eine Art Multiplexer im MemoryController, oder lasse 
alle vier Prozesse in einem großen verschmelzen, beide Varianten 
gefallen mir aber nicht!

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


Lesenswert?

VHDL Neuling schrieb im Beitrag #3070383:
> Weil in VHDL (meinen Kenntnissen nach) ein Signal nicht in
> unterschiedlichen Prozesse geschrieben werden darf
Doch, du könntest das. Aber nur, wenn es aufgelöst werden kann. Im 
"inaktiven" Prozess muss dann dieses Signal mit 'Z' getreiben werden. 
Und heraus kommt mit so einer Beschreibung (weil es einen Tristate-Bus 
im FPGA nicht gibt): ein Multiplexer.

Das wird auch passieren, wenn du z.B. eine shared variable verwenden 
würdest (die du allerdings als Anfänger meiden solltest wie der Teufel 
das Weihwasser)...

Du kannst wie erwähnt auf eine einzige Ressource nur zeitlich versetzt 
zugreifen. Das ist wie beim WC: wenn schon einer drauf hockt musst du 
warten, sonst gibts Probleme...

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.