11Bit Division

OP #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
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
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

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.