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?
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.
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?
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.