mikrocontroller.net

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


Autor: Klaus L. (klausi5000)
Datum:

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

????

Autor: Weltbester FPGA-Pongo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Funktion ist das?
Warum wird nicht mit Integerwerten gerechnet?

Autor: Klaus L. (klausi5000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist der Tangens und das Format kommt so vom Core!

Autor: Achim (Gast)
Datum:

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

Autor: Gegenkathete (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht 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
Autor: Ankathete (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
René D. schrieb:
> Alles falsch.

So früh am Morgen schon betrunken?

Autor: Klaus L. (klausi5000)
Datum:

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

?

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

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

Autor: Klaus L. (klausi5000)
Datum:

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

?

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.