Hallo,
folgende Sache: Ich muss einen langen Stream an 36-bit Worten im DRAM
abspeichern, und habe bisher die Worte auf 64-bit aligned, zwei davon
immer zu einem 128-bit Wort zusammengefügt und über den 128-bit Bus zum
DRAM geschrieben. Bisher hat mich das nicht besonders gejuckt, da der
DRAM da war, und ich sonst keine Teilnehmer hatte. Langsam wird das
System jedoch komplexer, und die Bandbreite wird knapp. Deswegen suche
ich nach einer Lösung, die 36-bit Worte so auf die 128-bit zu verteilen,
dass möglichst nur im letzten Wort Bits verschwendet werden, und
ansonsten alle 128 Bits genutzt werden. Ich stehe jedoch auf dem
Schlauch, wie ich das grundsätzlich angehen soll. Mein erster
Papier-Ansatz war ein Random Access Zugriff auf das 128-bit Register,
d.h. ich lasse einen Bit-Offset-Counter mitrechnen, und nutze diesen, um
an die richtige Position zu schreiben. Sobald ich an die Grenze des
128-bit Wortes komme, schicke ich dieses Wort zum DRAM. Die restlichen
Bits werden dann in ein zweites Register geschrieben, sodass ich zu
einem Double Buffering komme. Problem: Random Access führt bei mir im
Kopf immer zu einem großen Muxer, und das gefällt mir nicht. Das Design
soll bei einer hohen Frequenz laufen (zurzeit 300 MHz bei Zynq US+), und
bevor ich hier Mühe reinstecke, wollte ich von euch erfahren, ob ihr
einen anderen Vorschlag habt.
Vielen Dank,
Peter
Kannst du nicht ein 128bit großes Schieberegister bauen, das in jedem
Schritt 36 Bits weiter schiebt? Oder anders betrachtet - 36
Schieberegister, die jeweils 4bit tief sind. Nach den Durchshiften
greifst du die Daten dann parallel ab (auf die richtige Reihenfolge
achten).
Dr. Sommer schrieb:> Kannst du nicht ein 128bit großes Schieberegister bauen, das in> jedem> Schritt 36 Bits weiter schiebt? Oder anders betrachtet - 36> Schieberegister, die jeweils 4bit tief sind. Nach den Durchshiften> greifst du die Daten dann parallel ab (auf die richtige Reihenfolge> achten).
Habe ich dann nicht auch endlich viele Varianten, die Daten abzugreifen?
Ich verstehe den Ansatz nicht genau.
Nein, du greifst immer die unteren 128 Bits den Schieberegisters ab,
sobald mindestens 128 Bit drin sind. Wieviel drin ist, musst du dann
natürlich mitzählen.
schiebepeter schrieb:> Dr. Sommer schrieb:>> Kannst du nicht ein 128bit großes Schieberegister bauen, das in>> jedem>> Schritt 36 Bits weiter schiebt? Oder anders betrachtet - 36>> Schieberegister, die jeweils 4bit tief sind. Nach den Durchshiften>> greifst du die Daten dann parallel ab (auf die richtige Reihenfolge>> achten).>> Habe ich dann nicht auch endlich viele Varianten, die Daten abzugreifen?> Ich verstehe den Ansatz nicht genau.
Ich versuche mal zu erklären, wie ich diesen Ansatz verstehe, oder
umsetzen würde. Ich nutze ein 144-bit Register, welches insgesamt vier
36-bit Worte halten kann. Sobald ein Wort per Stream reinkommt, shifte
ich das komplette Register um 36 bit, und speichere das neue Wort in den
frei gewordenen Bits. Ein Counter beginnt bei 108 (144 - 36), und wird
bei jedem neuen Wort um 36 dekrementiert. Sobald der Counter unter 36
fällt, werden die 128-bit des neu gebildeten Register-Wortes übernommen,
beginnend ab dem Counter-Wert. Der Counter wird dann um 108
inkrementiert, und das Spiel beginnt von vorne. Da das Synthese-Tool
wahrscheinlich kein Pattern erkennt, wird es versuchen, ein 36:1 Demuxer
für jedes Bit zu bauen, optimieren könnte man es auf 9:1 (an den Stellen
0, 4, 8, 12, 16, 20, 24, 28, 32) Demuxer. Schön ist es nicht - besonders
generisch lässt sich damit der Code auch nicht machen, falls ich in
Zukunft das selbe Modul für andere Bitbreiten nutzen möchte.
Habe ich das richtig verstanden?
Also die einfachste Variante wäre 3 36 Bit Wörter in 128 Bit zu
schreiben,
dann hättest du die Effektive Nutzungsrate von 72/128 auf 108/128 (~56%
auf ~84%) gebracht bzw jeden 3. Transfer eingespart.
Ansonsten könntest du auch 7 Wörter in 256 Bit Packen. Da wären nur 4
Bit Verlust auf 256 Datenbit.
Wenn es unbedingt sein muss, 0 Bit Bandbreitenverlust zu haben dann
wirst du um ein Schieberegister nicht herumkommen kommen. Die
Zugriffsmuster wiederholen sich immer um 4 Bit Versetzt, so dass du 64
Datenwörter a 36 Bit in 18 DRam Zugriffen a 128 Bit verpacken kannst....
Dennis Restle schrieb:> Also die einfachste Variante wäre 3 36 Bit Wörter in 128 Bit zu> schreiben,> dann hättest du die Effektive Nutzungsrate von 72/128 auf 108/128 (~56%> auf ~84%) gebracht bzw jeden 3. Transfer eingespart.> Ansonsten könntest du auch 7 Wörter in 256 Bit Packen. Da wären nur 4> Bit Verlust auf 256 Datenbit.> Wenn es unbedingt sein muss, 0 Bit Bandbreitenverlust zu haben dann> wirst du um ein Schieberegister nicht herumkommen kommen. Die> Zugriffsmuster wiederholen sich immer um 4 Bit Versetzt, so dass du 64> Datenwörter a 36 Bit in 18 DRam Zugriffen a 128 Bit verpacken kannst....
Mit 1.5625% Verlust kann ich leben. Das klingt nach einer guten
Variante! Ich probiere es mal aus! Merci