mikrocontroller.net

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


Autor: Bene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Harald D (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daran wäre ich auch interessiert?

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Mirco (Gast)
Datum:

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

Autor: Bene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Bene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: df1as (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.