Forum: FPGA, VHDL & Co. BRAM: Nur bestimmte Bits einer Addresse aendern


von Tester (Gast)


Lesenswert?

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

von berndl (Gast)


Lesenswert?

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...

von Markus F. (Gast)


Lesenswert?

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

von user (Gast)


Lesenswert?

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

von dito (Gast)


Lesenswert?

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.

von Sigi (Gast)


Lesenswert?

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.

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


Lesenswert?

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
Noch kein Account? Hier anmelden.