Forum: FPGA, VHDL & Co. Algorithmus für Divider mit Fractionaldarstellung gesucht


von Bene (Gast)


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

von Harald D (Gast)


Lesenswert?

Daran wäre ich auch interessiert?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Was genau meinst du?
32 / 6 = 5 + 2/6 = 5 + 1/3
Das ist offenbar ein Bruch... meinst du das? Dazu brauchst du ja eine 
Division mit Rest, und der Bruch da ist der Rest durch den Divisor, und 
dann einmal gekürzt. Suchst du vielleicht letzteres, einen 
Kürzungs-Algorithmus? Das könnte etwas schwierig werden...

von Mirco (Gast)


Lesenswert?

Lässt sich das Fractacl dann nicht (rück-)rechnen, wenn man den Rest 
hat?

von Bene (Gast)


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

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Bene schrieb:
> sprich 0*8 + 0*4 + 0*2 + 1*1 und 1*1/2 + 1*1/4 + 0*1/8 + 0*1/16
Anders ausgedrückt, du möchtest eine Fixkomma-Division durchführen? Das 
ist ja im Prinzip nichts anderes als 0001.1100 oder?

von Bene (Gast)


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

von df1as (Gast)


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.

von Bene (Gast)


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

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.