Forum: FPGA, VHDL & Co. Xilinx CORDIC Core - FixPoint manuell umwandeln


von K. L. (Gast)


Lesenswert?

Ich benötige eine schnelle Winkelfunktion im FPGA. Es ist ein eher 
einfaches design, soll aber eine Winkelüberwachung liefern.

Nun bin ich auf zwei Probleme gestossen:

1) Der Xilinx Cordic ist langsam, weswegen ich eine Alternative suche. 
Siehe auch hier:
Beitrag "Re: CORDIC in VHDL"

Ich hätte gerne eine Latenz von maximal 20 Takten bei 50 MHz und möchte 
den FPGA nicht gerne hochtakten.

Leider habe ich 24 Bit Daten für den Eingang und brauche alle 4 
Quadranten!

2) Der CORE möchte die Werte im Zweiterkomplement als fixed point 
eingespeist bekommen, aber es scheint was nicht zu passen.

Die Werte sind vom Core her auf +1.0000 und -1.0000 limitiert wobei laut 
Datenblatt die Repräsentation folgende sein soll:

"0100000000" => 01.00000000 => +1.0
"1100000000" => 11.00000000 => -1.0

Macht das Sinn? Weiter hinten ist nämlich die Ausgabe als Teile von PI 
erklärt, die lauten soll:

"01100100100" => 011.00100100 => +3.14
"10011011100" => 100.11011100 => - 3.14

und da ist für mich ein Widerspruch! Wenn das erste Bit ein Minus ist, 
und angeblich das Zweikomplement gilt, dann wäre nur die PI-Darstellung 
richtig und die -1 im Beispiel oben falsch, weil die heissen müsste:

"1000000000" => 10.00000000 => - 1.0

oder?

Meine Werte kommen rein als echtes Zweierkomplement, wie wandle ich die? 
Einfach das höchste Bit vorne hinkopieren, damit das "-" stimmt?

Mein Maximum (pos) wäre also gemäß dem Beispiel 0011111111, also ein 
digit weniger, als 0100000000

Mein Minium, )also das negative Maximum) wäre analog 1100000000, also 
genau der Wert.

Das scheint aber so nicht zu stimmen. Es kommen komische Werte.

Ich habe mir eine Matrix von 1024 x 1024 Punkten anzeigen lassen und 
speise -512 ... 511 für die beiden Werte X und Y ein. Rauskommen tut 
aber seltsamerweise nur etwas für die Winkel 45 bis 135 Grad, ausgehend 
von 0 =Norden,  also für positive X-Achse innerhalb der Gerade Y<X sowie 
Y=-X.

Es entstehen bildlich gesprochen nur gültige Werte für einen dreieckigen 
Sektor, der sozusagen nach ost öffnet.

Komisch ist, dass er dabei offenbar negative Y/X verarbeiten kann, wenn 
das Y negativ ist. Denselben Wert, wenn x negativ ist, kriegt er nicht 
hin.

????

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Welche Funktion ist das?
Warum wird nicht mit Integerwerten gerechnet?

von K. L. (Gast)


Lesenswert?

Es ist der Tangens und das Format kommt so vom Core!

von Achim (Gast)


Lesenswert?

Hallo,

das Zahlenformat ist davon abhängig, ob du das Phase Format auf 
"Radians" oder "Sacled Radians" einstellst. Such mal nach diesen 
Begriffen im Datenblatt, dort ist es recht gut erklärt.

Viele Grüße

Achim

von Gegenkathete (Gast)


Lesenswert?

Auch bestehende gepipelinete CORDICs werden dir nur ein Bit pro Stufe 
generieren. Bei 50 MHz lassen sich aber sicherlich zwei Stufen pro Takt 
verarbeiten. Trivial ist das aber sicher nicht. Ich würde sagen schau 
bei opencores nach Beispielcode und versuch dich dran.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Gegenkathete schrieb:
> Auch bestehende gepipelinete CORDICs werden dir nur ein Bit pro Stufe
> generieren. Bei 50 MHz lassen sich aber sicherlich zwei Stufen pro Takt
> verarbeiten.

Alles falsch.

Bei höheren Frequenzen wird keine Stufe übersprungen. Und die 
Genauigkeit nimmt mit Piplinetiefe zu. Das hat zum Nachteil es entsteht 
ein delay.
Es ist aber nicht ein Bit pro Pipelinestufe zu.

: Bearbeitet durch User
von Ankathete (Gast)


Lesenswert?

René D. schrieb:
> Alles falsch.

So früh am Morgen schon betrunken?

von K. L. (Gast)


Lesenswert?

Ok, das heisst, man kann den Cordic so  bauen, dass er pro Takt zwei 
Stufen an Genauigkeit gewinnt? Mir ist es nämlich auch aufgefallen, dass 
die Zahl der delays genau um mit der Auflösung wächst.

Zunächst ginge es mir aber auch um die andere Frage, wie sich das mit 
der Interpretation des fixed point verhält. Irgendwas passt da ja nicht.

Mit welchen Werten geht man denn jetzt genau rein und wie kommt man 
raus?

Wenn ich nämlich einen extremen Wert vorgebe, der zu 90 GRad führt, sind 
die Werte nicht genau geschlossen. Eigentlich erwarte ich aber doch 
einen Vollkreis.

?

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Klaus L. schrieb:
> Ok, das heisst, man kann den Cordic so  bauen, dass er pro Takt zwei
> Stufen an Genauigkeit gewinnt? Mir ist es nämlich auch aufgefallen, dass
> die Zahl der delays genau um mit der Auflösung wächst.
>
> Zunächst ginge es mir aber auch um die andere Frage, wie sich das mit
> der Interpretation des fixed point verhält. Irgendwas passt da ja nicht.
>
> Mit welchen Werten geht man denn jetzt genau rein und wie kommt man
> raus?
>
> Wenn ich nämlich einen extremen Wert vorgebe, der zu 90 GRad führt, sind
> die Werte nicht genau geschlossen. Eigentlich erwarte ich aber doch
> einen Vollkreis.
>
> ?
Cordic ist ein großer Umfang.
Ursprünglich wurde Cordic um Sinus und Cosimuswerte zu berechnen mit 
Digitalen Gattern.

Tangens und Log sind später eindesigned.

Cordic ist ein Näherungsverfahren wobei der Fehler sehr schnell gegen 
Null konverigert. Es gibt nur eine maximale Schrittweite, sonst wird der 
Fehler wieder größer. Man wird mit der Schrittweite immer feiner.

Man kann von einem beliebigen Startwert beginnen. Es ist z.B. clever das 
Vorzeichen zu nutzen um einen geeigneten Startwert zu wählen. Rechte 
oder Linke Hälfte.

von K. L. (Gast)


Lesenswert?

Ich habe das jetzt am Laufen - kapiere allerdings immer noch nicht die 
Diskrepanz in der Darstellung wie oben beschrieben. Ich gehe davon aus, 
dass die Xilinx Doku unrichtig ist.

?

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.