Forum: FPGA, VHDL & Co. 11Bit Division


von Andi (loopy83)


Lesenswert?

Hallo zusammen,

ich muss einen Dividierer in VHDL bauen und bin bei der Recherche auf 
den Artikel von Lothar gestoßen.
http://www.lothar-miller.de/s9y/archives/29-Division-in-VHDL.html

Leider habe ich folgende Einschränkungen:
- das Ergebnis ist immer <1,5
- oft sogar <1

Wenn ich also zwei 11Bit Werte dividieren muss, brauche ich also, um 
nicht an Genauigkeit zu verlieren ein 12Bit Ergebnis. Ein Bit für die 
2^1 Potenz, also die Vorkommestelle und 11Bit Nachkommastellen, oder?

In dem Dividierer von Lothar gibt es folgenden Sonderfall:
1
-- Sonderfall: Divisor größer als Dividend
2
            if (dr>dd) then 
3
               r <= dd;
4
               z <= done;
5
            end if;
Der bricht mir wohl in 95% meiner Dvisionen das Genick.
Zumal ich nicht verstehe, was genau an dieser Stelle gemacht wird.
Ich habe es versucht an einem Beispiel nachzuvollziehen, aber so richtig 
komme ich auf keinen grünen Zweig.

278/314 = 0,88535031
00100010110/00100111010 = ??

Nach der Bedingung oben ist dr = 314 > dd = 278, also ist q = 0 und r = 
00100010110

Wenn ich das nun aber wieder dezimal umrechne, kommt da eine 0,1357... 
raus.

Wo habe ich noch einen Denkfehler?
Wie kann ich effektiv (heißt langsam aber mit wenig Ressourcen) zwei 
11bit Zahlen dividieren? 11 Takte bei 11bit wären vollkommen i.O.!

Vielen Dank!
Andreas :)

von Uwe (Gast)


Lesenswert?

Hallo Andreas,

Andreas B. schrieb:
> Nach der Bedingung oben ist dr = 314 > dd = 278, also ist q = 0 und r =
> 00100010110
So muss es sein. Quotient = 0, Rest = 278.
> Wenn ich das nun aber wieder dezimal umrechne, kommt da eine 0,1357...
> raus.
Das habe ich nicht verstanden - wobei kommt das raus?

Prinzipiell: Was erwartest du denn für ein Ergebnis: Quotient = ganze 
Zahl + Rest (so hat es der Lothar realisiert) oder Quotient als Wert mit 
Nachkommastellen + ein sehr viel kleinerer Rest?

Wenn letzteres: Die Divisionsschleife muss um so viele Durchläufe 
erweitert werden, wie du Nachkommastellen haben willst. Da dein Ergebnis 
immer < 2 ist, du also als Vorkommastelle niemals mehr als das LSBit 
gesetzt hast, könntest du 10 Nachkommastellen berechnen. Dazu die 
Vorkommastelle = 11 Bit, dann wäre das Ergebnis der Quotient * 1024 (und 
immer < 2048). Den verbleibenden Rest könntest du noch zum Runden 
auswerten.

Uwe

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


Lesenswert?

Andreas B. schrieb:
> Wenn ich das nun aber wieder dezimal umrechne, kommt da eine 0,1357...
> raus.
Wie schon erwähnt kommt da 278 heraus, weil das eine kommalose 
Integer-Division ist.
Wenn du deine "Festkomma" Operation machen willst, dann solltest du eine 
solche Division vorsehen:
(256*278)/314
Dann sind die obersten 8 Bits des Ergebnisses dein "Nachkomma-Wert"...

von Uwe (Gast)


Lesenswert?

Lothar Miller schrieb:
> (256*278)/314

Dann ist der Dividend kein 11-Bit-Wert mehr. So oder so, die Anzahl der 
Schleifen bei der Division muss erhöht werden, um die Nachkommastellen 
zu erhalten.

Aber will der Andreas überhaupt Nachkommastellen?

von Uwe Bonnes (Gast)


Lesenswert?

Wie schnell muss es denn sein? Bei opencores gibt es einen seriellen 
Dividierer, den ich schon mal erfolgreich eingesetzt habe...

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.