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. ????
Welche Funktion ist das? Warum wird nicht mit Integerwerten gerechnet?
Es ist der Tangens und das Format kommt so vom Core!
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
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.
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
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. ?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.