Algorithmus für Divider mit Fractionaldarstellung gesucht

Gast #1888512
Lesenswert?
• ▲
▼
Hallo,

ich suche für mein derzeitiges Projekt (Altera-FPGA) einen 
Divider-Algorithmus oder eine fertige Megafunction (Quartus), die neben 
beispielsweise ganzzahligem Numerator/Denumerator/Quotient nicht den 
Remainder/Rest ausgibt sondern in Form einer Fractional-Darstellung. 
Sprich den Rest durch den Denumerator teilt. Signed/Unsigned ist vorerst 
mal nicht so wichtig. Divider gibt es im Netz viele, doch mit Fractional 
sieht es da eher schlecht aus.
Xilinx bietet im Core-Generator einen wunderbaren Divisor an, bei dem 
man zwischen Remainder und Fractional wählen kann - leider andere Firma 
:-)
Bei Quartus konnte ich bisher nur einen FloatingPoint-Divisor und 
Divisor mit Remainder finden.
Ich wundere mich etwas über die wohl schwache Nachfrage solch eines 
Dividers, denn so speziell ist doch mein Problem eigentlich nicht :-)

Also wenn ihr eine guten Tipp oder Idee für mich parat habt, bitte 
posten. :-) Ich freu mich über jeden Beitrag! Schonmal vielen Dank!!
Gruß Bene
Gast #1891416
Lesenswert?
• ▲
▼
Hallo

ich mach mal ein Beispiel:
mit Remainder:
7/4 = 1,75 --> 0111 / 0100 = 0001 Rest 0011
mit Fractional
7/4 = 1,75 --> 0111 / 0100 = 0001 Frac. 1100
sprich 0*8 + 0*4 + 0*2 + 1*1 und 1*1/2 + 1*1/4 + 0*1/8 + 0*1/16

Man könnte für den Fractionalteil den Rest (einer vorhandenen Divison) 
mit Nullen erweitern bis er durch den Denumerator teilbar ist. Aus der 
Anzahl der angehängten Nullen bzw. "Verschiebung des Kommas" könnte man 
den Fractionalteil ermitteln.

Interessant könnte es allerdings dann werden, wenn Vorzeichen mit ins 
Spiel kommen bzw. je nach vorgegebener Zahlendarstellung, also Integer 
bzw. 2-Komplement...

Deshalb meine Frage, ob es vielleicht bereits bekannte 
Algorithmen/Altera Megafunctions gibt, die einem die Arbeit etwas 
erleichtern. ;-)

Ich freu mich über weitere Beiträge :-)

Gruß Bene
Gast #1892446
Lesenswert?
• ▲
▼
Hallo,

ja genau - Fixkomma-Division ist ein sehr gutes Stichwort, dannach werde 
ich mal suchen.

Gibt es solch eine Fixkomma-Divison bereits in Altera oder bekannte 
gängige Algorithmen, die vielleicht auch mit vorzeichenbehafteten Zahlen 
umgehen können?

Gruß Bene
Gast #1892478
Lesenswert?
• ▲
▼
Kurz off-topic: Der 'Denumerator' heißt richtig Denominator!

Mann kann einfach den Zähler um die entsprechend gewünschten 
Nachkommastellen erweitern, also rechts Nullen anhängen. Das Ergebnis 
stellt man sich dann als Festkommazahl vor. Einen Rest, falls vorhanden, 
verwirft man dann.

Beispiel in Dezimal (ist einprägsamer, geht binär natürlich genauso):

37 : 7 = 5 Rest 2

soll aber als

37 : 7 = 5,285 (abgerundet)

angezeigt werden. Daher erweitern wir mit drei Stellen:

37000 : 7 = 5285 R 5

Die 5285 stellt man dann als 5,285 dar, den Rest lassen wir Rest sein.

Wenn man die drei Nullen hier im Beispiel festverdrahtet an den 
Dividierer anschließt (z. B. port map ... Numerator_i => My_Num & 
"00000000", ...), sollte die Synthese die sonst zusätzlichen Register 
wieder wegoptimieren können.

Zusätzliche Takte muss man aber einkalkulieren für die Nachkommastellen. 
Auch werden Schieberegister (Nenner) und der Subtrahierer (Zähler) und 
der Quotient um die zusätzlichen Stellen breiter, was bzg. des 
Subtrahieres in einer geringeren möglichen Taktfrequenz endet. Der Rest 
fällt hingegen immer für umsonst aus dem Subtrahierwerk heraus.
Gast #1893407
Lesenswert?
• ▲
▼
Hallo,

das ist ein super Idee! Damit kann ich sogar wieder auf die Altera 
Megafunction zurückgreifen, indem ich den Quotienten und Numerator um 
die Kommastellen, wie beschrieben, erweitere. Anschließend das Ergebnis 
neu zusammensetzen. Die Nachteile (Takte) sollten erstmal nicht das 
Problem sein!
Vielen Dank! :-D

Gruß Bene

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