Hallo, ich bin recht neu in VHDL und habe Frage zum Speichern von Daten im BRAM. Gibt es eine Moeglichkeit bei einem BRAM nur bestimmte Bits vom Inhalt einer Speicheradresse zu aendern ohne dass man den Ihnalt jedes Mal erst auslesen muss. Die Frage versteh ich so selbst nicht, also am besten ein Beispiel: Nehmen wir an, an der Adresse 1 im BRAM steht als erstes: 0000 0000 0000 0000. Nun erhalte ich 4 Bit an Daten (z.B. 1101) die ich an dieser Adresse folgendermassen speichern moechte: 0000 0000 0000 1101 Dann erhalte ich wieder 4Bit an Daten (z.B. 1010) die wieder an der selben Adresse gespeichert werden sollen. Danach soll der Ihnalt folgendermassen sein: 0000 0000 1010 1101 Naechsten 4 Bit (z.B. 1111). Inhalt dann: 0000 1111 1010 1101 usw. Erst wenn alle Daten da sind muss die Adresse wieder komplette ausgelesen werden um die Daten weiter zu verarbeiten. Ich muss BRAM verwenden, da es insgesamt zu viele Daten sind um sie in FFs oder LUTs zwischen zu speichern. Natuerlich kann ich das so machen, dass ich zunaechst den Inhalt auslese, mit den neuen Daten zusammenfasse und dann wieder an der selben Adresse speichere. Das kostst aber zusaetzliche Takte. Ich kann die Daten auch nicht auf verschiedene Adressen aufteilen, da ich die Daten innerhalbt eines Taktes brauche. Am besten sollte jedes schreiben nur 1 Takt und dann auch jedes lesen nur 1 Takt brauchen. Gibt es also eine andere Moeglichkeit? Oder hat sonst jemand eine Idee wie ich das angehen koennte? (Ich habe einen Virtex 5) Viele Gruesse
Wenn die Daten sequentiell (also jeweils 4bit nacheinander auf die gleiche Adresse) gehen, dann kannst du die ersten 12bit in Registern halten, wenn die letzten 4bit kommen, dann alle 16 gleichzeitig schreiben. RAMs koennen oft auch asymetrische Eingangs und Ausgangsports haben, musst halt mal schauen ob das beim Virtex 5 fuer dich passt Du koenntest auch 4 RAMs parallel schalten. Beim schreiben wird jeweils eines selektiert, beim lesen alle 4 Du siehst, es gibt durchaus Moeglichkeiten...
Tester schrieb: > Erst wenn alle Daten da sind muss die Adresse wieder komplette > ausgelesen werden um die Daten weiter zu verarbeiten. Würde ich in einem externen Register machen
Die BRAMs kannst du in verschiedene Modi benutzen, da gibt es auch welche mit 18bit, 9bit, 4bit, 2bit und 1bit Breite, du kannst also mehrere mit 1bit Breite verwenden und somit jedes mit einzeln setzen/löschen
So wie es berndl beschrieben hat, solltest du es machen. Nur der Vollständigkeithalber: Die meisten Block RAMs auf FPGA's verfügen über einen "byte enable"-Port. Damit kann kannst du z.B. genau das Byte eines Wortes auswählen welches überschrieben werden soll. Die anderen Bytes werden ignoriert. Da du aber mit Nibbles adressieren willst, ist das für deinen Fall wohl nicht geeignet.
Oder falls möglich 4 BRAMs mit 4Bit Datenbreite instantiieren und jedes der WE-Signal als Nibble-Write-Enable verwenden. Auslesen geht genauso wie oben gewünscht.
Unterschiedliche Portbreiten beim Virtex 5? Siehe dort auf Seite 120: http://www.xilinx.com/support/documentation/user_guides/ug190.pdf
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.