Forum: FPGA, VHDL & Co. Logarithmus in VHDL


von Midnight (Gast)


Lesenswert?

Liebe Kollegen!

Gibt es einen Logarithmus in VHDL oder muss ich eine function basteln?

LG
Midnight

von Gast (Gast)


Lesenswert?

Ich würde es bei http://www.gidf.de/ versuchen. Da gibt es eigentlich 
immer etwas.

von Midnight (Gast)


Lesenswert?

Tolle Hilfe, danke.

Nein da habe ich nichts brauchbares gefunden.

von max (Gast)


Lesenswert?

was für einen log brauchst du?

google findet da sehrwohl was...
beispielsweise für den log2 hier direkt im forum: 
Beitrag "log2 in VHDL auf integer?"

von Midnight (Gast)


Lesenswert?

Die kurze Antwort ohne viele Belehrungen ist also:

Nein, mußt selber basteln.

Danke, jetzt kenn ich mich aus.

LG
Midnight

von dito (Gast)


Lesenswert?

Das Package math_real bietet Logarithmus-Funktionen an. Ist aber nicht 
synthesierbar.

von Midnight (Gast)


Lesenswert?

Ja, leider.

Werde ein kleines Unterprogramm (function) entwickeln, das die Funktion 
ausrechnet. Das kann ich dann immer wenn ich es brauche einbinden.

von dito (Gast)


Lesenswert?

Entweder so oder du generierst dir ein Look-up-Table mit den Werten.

Halt das übliche Dilemma: Chipfläche <-> Geschwindigkeit

von Bastelboy (Gast)


Lesenswert?

Leider hast du nicht beschrieben, welches Zahlenformat du verwendest.
Laß mal ein paar deiner Randbedingungen rüberwachsen.

von Midnight (Gast)


Lesenswert?

Ich rechne mit std_logic Matrizen. Für den letzten Schritt werden daraus 
integer Matrizen und die werden mit einer Formel (unter anderem LOG) 
umgerechnet und schließlich über die RS232 ausgegeben.

Mein Problem hat sich aber inzwischen gelöst. Ich habe ein Package für 
die Rechenoperationen erstellt und werde die Zahlen in Real konvertieren 
(sonst wirds zu ungenau).

LG
Midnight

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Hab mal im "Mayer-Baese" ISBN 3540211195 nachgeschaut: die einzige 
Stelle zur log-Berechnung ist der Cordic-Algorithmus, auf dem Umweg über
ln(W)=2*arctanh(Y/X) mit Y=W-1 und X=W+1

von Midnight (Gast)


Lesenswert?

DANKE für´s nachsehen. Wenn ich alles richtig gemacht habe sollte der 
Log funktionieren.

Das Buch sieht gut aus, ich glaube ich will mir das kaufen.

von Bastelboy (Gast)


Lesenswert?

>Wenn ich alles richtig gemacht habe sollte der Log funktionieren.

Könntest du mal deinen Log hier posten, würde mich sehr interressieren 
wie dein VHDL-Code aussieht!

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

es gibt eine Neuauflage von 2007 (die Nummer war von 2004), erweitert - 
ich habe eine FFT mit NIOS gesehen - ISBN 3540726128
man kann bei Amazon und books.google.com drin blättern

von Thomas P. (pototschnig)


Angehängte Dateien:

Lesenswert?

Vlt hilft meine Variante der Logarithmus ...

von Thomas P. (pototschnig)


Angehängte Dateien:

Lesenswert?

Und das ROM dazu ...

von J. S. (engineer) Benutzerseite


Lesenswert?

So ähnlich mache ich es auch, wobei ich mir die Zeilen automatisch 
generieren lasse. Je nach Realisation kann man das in ein 
Ein-Clock-Modul pressen.

Beispiel fuer Teiler (127/127): 
Beitrag "Re: Durch 10 teilen"

von Morten (Gast)


Lesenswert?

Christoph db1uq K. schrieb:
> Hab mal im "Mayer-Baese" ISBN 3540211195 nachgeschaut: die einzige
> Stelle zur log-Berechnung ist der Cordic-Algorithmus, auf dem Umweg über
> ln(W)=2*arctanh(Y/X) mit Y=W-1 und X=W+1

Hallo, ich suche ein Implementation für pipeline. Cordic habe ich 
geschaut, ist aber zu kompliziert und ungenau. Ich brauche Log (n) in 
Ganzzahl nur für Werte bis (65536*65536-1).

Knn diese Algorithmus umgeschrieben werden?

Thomas P. schrieb:
> Vlt hilft meine Variante der Logarithmus ...

Wie kann das erreicht werden?

Danke

von Duke Scarring (Gast)


Lesenswert?

Morten schrieb:
> Cordic habe ich geschaut, ist aber zu kompliziert und ungenau.
Ungenau? Das ist doch nur eine Frage der Bitbreiten und der Zahl der 
Iterationen...

Das hier hattest Du schon gefunden?!:
Beitrag "Re: CORDIC in VHDL"

Und das hier dürfte sich auch relativ brauchbar in VHDL umsetzen lassen:
Beitrag "Re: Code für Logarithmus gesucht"

Duke

von J. S. (engineer) Benutzerseite


Lesenswert?


von Rechenphreak (Gast)


Lesenswert?

Ich nehme das Beispiel von oben aus der WIKIPEDIA und habe dazu eine 
Frage:
https://de.wikipedia.org/wiki/Logarithmus

Der Algo ist so definiert:
1
INPUT 1 ≤ x < 2
2
OUTPUT Nachkommastellen bi der Binärdarstellung von log2(x)
3
i ← 0
4
LOOP
5
   i ← i + 1
6
   x ← x*x
7
   IF x ≥ 2 THEN
8
      x ← x / 2
9
      b(i) ← 1
10
   ELSE
11
      b(i) ← 0
12
   END IF
13
END LOOP

Wie kann ich eine binäre Zahl, die z.B. 16 Bit hat hier verwenden - im 
Bezug auf "X zwischen 1 und 2" bringen?

Meine INT-Zahl hat 16 Vorkommastellen und 16 Nachkommastellen, also etwa 
so:
33333.32768, was 33333.5 sind.

: Bearbeitet durch Moderator
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Rechenphreak schrieb:
> Meine INT-Zahl hat 16 Vorkommastellen und 16 Nachkommastellen, also etwa
> so:
> 33333.32768, was 33333.5 sind.
Kannst du diese Herleitung noch mal ein wenig ausführlicher darstellen? 
Welche Zeichenkombination hat da welche Basis und welches Zeichen an 
welcher Stelle welche Wertigkeit?

> Meine INT-Zahl hat 16 Vorkommastellen und 16 Nachkommastellen
Integerzahlen haben eigentlich prinzipiell keine Nachkommastellen.

> Meine INT-Zahl hat 16 Vorkommastellen und 16 Nachkommastellen
Wenn es eine vorzeichenbehaftete Festkommazahl ist, dann passen schon 
die 33333 nicht in die 16 zur Verfügung stehenden Vorkommastellen. Wenn 
deine Zahl unsigned ist, dann solltest du das sagen.

> Meine INT-Zahl hat 16 Vorkommastellen und 16 Nachkommastellen
Dann hat sie insgesamt 32 Stellen und wegen des Kommas in der Mitte 
einen Wertebereich von -2147483648/65536  bis  +2147483647/65536. Das 
erste Bit links vom Komma hat die Wertigkeit 1. Des erste Bit rechts vom 
Komma hat die Wertigkeit 0,5.

Prinzipiell solltest du dir also vorrangig nochmal die binäre 
Darstellung einer Festpunktzahl. Im Grunde ist das nur eine Integerzahl, 
bei der man sich an einer bestimmten Stelle ein Komma "hindenkt" und 
deshalb den Integerwert durch eine bestimmte Zweierpotenz (bei dir 2^16 
wegen der 16 Nachkommastellen) teilen muss.

Rechenphreak schrieb:
> Wie kann ich eine binäre Zahl, die z.B. 16 Bit hat hier verwenden - im
> Bezug auf "X zwischen 1 und 2" bringen?
Das steht im Grunde im Text deines Links: du suchst das MSB und schiebst 
dann die Zahl soweit nach rechts, bis du diese Bedingung erfüllst.

von J. S. (engineer) Benutzerseite


Lesenswert?

Lothar M. schrieb:
>> Meine INT-Zahl hat 16 Vorkommastellen und 16 Nachkommastellen
> Integerzahlen haben eigentlich prinzipiell keine Nachkommastellen.

Wahrscheinlich sind binäre Zahlen mit verschobenem Komma gemeint. Für 
die gilt aber grundsätzlich das Gleiche. Es steckt ja nur ein Faktor 
drin. Aufpassen muss man freilich bei der anschließenden Interpretation 
des Ergebnisses:

Bei einer Wurzel ist das Ergebnis nur noch halb so "lang" wie der 
reingesteckte Wert, also YYYY.XXXX -> ZZ.KK.

Bei dem Beispiel des LOG steckt dann gemäss LOG (A x K) ein Faktor LOG K 
im Ergebnis, der als Offset auftaucht. Schlauerweise wird man dann um 
eine Zahl erweitern, die so groß ist, dass die sich ergebende Auflösung 
in Bits bei der kleinsten Zahl noch groß genug ist, also EXP(k,2)+n.

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.