Forum: FPGA, VHDL & Co. 36-bit auf 128-bit Worte effizient mappen


von schiebepeter (Gast)


Lesenswert?

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

von Dr. Sommer (Gast)


Lesenswert?

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

von schiebepeter (Gast)


Lesenswert?

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.

von Da D. (dieter)


Lesenswert?

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.

von schiebepeter (Gast)


Lesenswert?

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?

von Dennis Restle (Gast)


Lesenswert?

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

von schiebepeter (Gast)


Lesenswert?

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

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.