Logarithmus in VHDL

Gast #1389814
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
Gast #5616914
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
Gast #6409401
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.
Moderator (Firma: Titel) Persönliche Seite #6411659
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.
Persönliche Seite #6420059
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren