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
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...
Lässt sich das Fractacl dann nicht (rück-)rechnen, wenn man den Rest hat?
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
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?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.