Forum: FPGA, VHDL & Co. Pipeline Dividierer


von Frank M. (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem.
Ich habe als Ergebnis einer Berechnung einen 46bit Vektor, wobei 26bit 
auf den Integer-Wert und 20bit auf die Nachkommastellen entfallen.

Nun möchte/muss ich diesen Wert durch 4096 teilen.
Dabei reicht mir aber die einfache Shiftoperation nicht aus, denn bei 
der wird ja prinzipiell abgerundet. Ich interessiere mich für die 
"Nachkommastellen", die nach der Division entstehen, denn das ist mein 
Ergebnis zum Weiterrechnen.

Einen Dividierer zu entwerfen ist an sich nicht schwer bzw. gibt es ihn 
schon fertig z.B. von Lothar Miller.
Aber gibt es eine Möglichkeit, dass mit jedem Takt ein Ergebnis bereit 
steht?
Ich füttere also den Dividierer mit jedem Takt und nach einer Latenz X 
(wird sicher die Bitbreite in Takten sein) steht das Ergebnis am Ausgang 
bereit, das aber jeden Takt, so dass keine Pausen entstehen, sondern nur 
eine Art Delay.

Bei 46 Takten wären das 46 Takte Delay... kann man diese Latenz noch 
verkürzen, indem man z.B. mit Variablen rechnet und dadurch mehrere 
Rechenschritte pro Takt ausführen kann?

Ist so etwas möglich, oder wurde so etwas schon umgesetzt?

Danke im Vorraus!
Mfg Frank

von S. K. (Gast)


Lesenswert?

Das Problem gibt es eigentlich überall und kann nicht von der Sprache 
abhängen. Ich kenne es aus der Finanzmathematik und mache das mit SAS 
immer so, dass zuerst der Wert, um den dividiert werden soll, hälftig 
oder statistisch addiert wird. Danach kann man runden.

Möchte man z.B. einen Wert auf 3 Nachkommastelen genau haben, muss 
statisch mit 0,0005 addiert werden. Statistisch mit 0,00025 +/- 0,00025.

Dies stimmt bei negativen und postiven Zahlen, soforn die Integerrundung 
und nicht die mathematische Rundung (Gaussklammer) eingesetzt wird.

Bezogen auf 1/4096 sind es dann 1/8192, die zu addieren wären. Im 
Binärsystem ist das immer das nächstgelegene niederwertigere Bit.

Mit welcher Technik dann dividert wird, ist unerheblich.

von Duke Scarring (Gast)


Lesenswert?

Frank M. schrieb:
> Bei 46 Takten wären das 46 Takte Delay...
...
> Ist so etwas möglich, oder wurde so etwas schon umgesetzt?
Ja, wie Du schon schreibst, nennt sich das Ganze Pipeline-Prinzip.

> kann man diese Latenz noch
> verkürzen, indem man z.B. mit Variablen rechnet und dadurch mehrere
> Rechenschritte pro Takt ausführen kann?
Jein. Du gehst immer einen Kompromiss ein: Je weniger Register drin 
sind, umso länger wird der kombinatorische Pfad und umso langsamer die 
Taktfrequenz ( z.B. Plasma 25 MHz vs. Microblaze 100 MHz).

Frank M. schrieb:
> Nun möchte/muss ich diesen Wert durch 4096 teilen.
> Dabei reicht mir aber die einfache Shiftoperation nicht aus, denn bei
> der wird ja prinzipiell abgerundet. Ich interessiere mich für die
> "Nachkommastellen", die nach der Division entstehen, denn das ist mein
> Ergebnis zum Weiterrechnen.
Das ist mir ein bissel konfus. Was willst Du denn nun:
1. richtig runden oder
2. modulo 4096 rechnen?

Duke

P.S.: Und brauchst Du wirklich in jedem Takt eine Division?

von (prx) A. K. (prx)


Lesenswert?

Frank M. schrieb:

> Nun möchte/muss ich diesen Wert durch 4096 teilen.
> Dabei reicht mir aber die einfache Shiftoperation nicht aus, denn bei
> der wird ja prinzipiell abgerundet.

Das erscheint mir als Motiv für einen vollständigen und sogar 
gepipelineten Dividierer etwas schwach. Rundung/Vorzeichenspielerei 
sollte nicht wirklich soo arg schwierig sein.

von Hajo (Gast)


Lesenswert?

Darf man mal fragen, welches Ergebnis hier erwartet wird, dass anders 
aussieht, als das, was bei 1/4096 rauskommt?

Das Ergebnis kann ja nicht genauer sein, als die 12 Bits einerseits und 
dem Eingangsvektor andererseits. Wenn der Eigangsvektor grösse ist, fügt 
man einfach die fehlenden Stellen hinzu und multipliziert.

1/4096 * 2hoch38 = 1.UUUUU mit einer Auflösung von 26 Bit.

q.e.d.

von tomb (Gast)


Lesenswert?

Frank M. schrieb:
> Nun möchte/muss ich diesen Wert durch 4096 teilen.
> Dabei reicht mir aber die einfache Shiftoperation nicht aus, denn bei
> der wird ja prinzipiell abgerundet. Ich interessiere mich für die
> "Nachkommastellen", die nach der Division entstehen, denn das ist mein
> Ergebnis zum Weiterrechnen.

Ich versteh das Problem auch nicht ganz. Die ersten 12 + 20 Bits sind 
deine Nachkommastellen wenn du durch 4096 dividieren willst.

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.