www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Pipeline Dividierer


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Frank M. (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,

ich habe folgendes Problem.
Ich habe als Ergebnis einer Berechnung einen 46bit Vektor, wobei 26bit 
auf den Integer-Wert und 20bit auf die Nachkommastellen entfallen.

Nun möchte/muss ich diesen Wert durch 4096 teilen.
Dabei reicht mir aber die einfache Shiftoperation nicht aus, denn bei 
der wird ja prinzipiell abgerundet. Ich interessiere mich für die 
"Nachkommastellen", die nach der Division entstehen, denn das ist mein 
Ergebnis zum Weiterrechnen.

Einen Dividierer zu entwerfen ist an sich nicht schwer bzw. gibt es ihn 
schon fertig z.B. von Lothar Miller.
Aber gibt es eine Möglichkeit, dass mit jedem Takt ein Ergebnis bereit 
steht?
Ich füttere also den Dividierer mit jedem Takt und nach einer Latenz X 
(wird sicher die Bitbreite in Takten sein) steht das Ergebnis am Ausgang 
bereit, das aber jeden Takt, so dass keine Pausen entstehen, sondern nur 
eine Art Delay.

Bei 46 Takten wären das 46 Takte Delay... kann man diese Latenz noch 
verkürzen, indem man z.B. mit Variablen rechnet und dadurch mehrere 
Rechenschritte pro Takt ausführen kann?

Ist so etwas möglich, oder wurde so etwas schon umgesetzt?

Danke im Vorraus!
Mfg Frank

Autor: Silke Kuhn (Firma: S.K. Consulting) (medberata) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Das Problem gibt es eigentlich überall und kann nicht von der Sprache 
abhängen. Ich kenne es aus der Finanzmathematik und mache das mit SAS 
immer so, dass zuerst der Wert, um den dividiert werden soll, hälftig 
oder statistisch addiert wird. Danach kann man runden.

Möchte man z.B. einen Wert auf 3 Nachkommastelen genau haben, muss 
statisch mit 0,0005 addiert werden. Statistisch mit 0,00025 +/- 0,00025.

Dies stimmt bei negativen und postiven Zahlen, soforn die Integerrundung 
und nicht die mathematische Rundung (Gaussklammer) eingesetzt wird.

Bezogen auf 1/4096 sind es dann 1/8192, die zu addieren wären. Im 
Binärsystem ist das immer das nächstgelegene niederwertigere Bit.

Mit welcher Technik dann dividert wird, ist unerheblich.

Autor: Duke Scarring (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Frank M. schrieb:
> Bei 46 Takten wären das 46 Takte Delay...
...
> Ist so etwas möglich, oder wurde so etwas schon umgesetzt?
Ja, wie Du schon schreibst, nennt sich das Ganze Pipeline-Prinzip.

> kann man diese Latenz noch
> verkürzen, indem man z.B. mit Variablen rechnet und dadurch mehrere
> Rechenschritte pro Takt ausführen kann?
Jein. Du gehst immer einen Kompromiss ein: Je weniger Register drin 
sind, umso länger wird der kombinatorische Pfad und umso langsamer die 
Taktfrequenz ( z.B. Plasma 25 MHz vs. Microblaze 100 MHz).

Frank M. schrieb:
> Nun möchte/muss ich diesen Wert durch 4096 teilen.
> Dabei reicht mir aber die einfache Shiftoperation nicht aus, denn bei
> der wird ja prinzipiell abgerundet. Ich interessiere mich für die
> "Nachkommastellen", die nach der Division entstehen, denn das ist mein
> Ergebnis zum Weiterrechnen.
Das ist mir ein bissel konfus. Was willst Du denn nun:
1. richtig runden oder
2. modulo 4096 rechnen?

Duke

P.S.: Und brauchst Du wirklich in jedem Takt eine Division?

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Frank M. schrieb:

> Nun möchte/muss ich diesen Wert durch 4096 teilen.
> Dabei reicht mir aber die einfache Shiftoperation nicht aus, denn bei
> der wird ja prinzipiell abgerundet.

Das erscheint mir als Motiv für einen vollständigen und sogar 
gepipelineten Dividierer etwas schwach. Rundung/Vorzeichenspielerei 
sollte nicht wirklich soo arg schwierig sein.

Autor: Hajo (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Darf man mal fragen, welches Ergebnis hier erwartet wird, dass anders 
aussieht, als das, was bei 1/4096 rauskommt?

Das Ergebnis kann ja nicht genauer sein, als die 12 Bits einerseits und 
dem Eingangsvektor andererseits. Wenn der Eigangsvektor grösse ist, fügt 
man einfach die fehlenden Stellen hinzu und multipliziert.

1/4096 * 2hoch38 = 1.UUUUU mit einer Auflösung von 26 Bit.

q.e.d.

Autor: tomb (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Frank M. schrieb:
> Nun möchte/muss ich diesen Wert durch 4096 teilen.
> Dabei reicht mir aber die einfache Shiftoperation nicht aus, denn bei
> der wird ja prinzipiell abgerundet. Ich interessiere mich für die
> "Nachkommastellen", die nach der Division entstehen, denn das ist mein
> Ergebnis zum Weiterrechnen.

Ich versteh das Problem auch nicht ganz. Die ersten 12 + 20 Bits sind 
deine Nachkommastellen wenn du durch 4096 dividieren willst.

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net