11Bit Division

#4042023
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 :)
Gast #4042469
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
Moderator (Firma: Titel) Persönliche Seite #4042663
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"...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren