VHDL - CORDIC Verfahren Marc Reichenbach und Michael Schmidt Informatik 3 / Rechnerarchitektur Universität Erlangen Nürnberg 04/12 1 / 30
Gliederung Motivation und Geschichte des CORDIC-Verfahrens CORDIC-Verfahren Der verallgemeinerte CORDIC 2 / 30
Motivation oft Standardfunktionen benötigt meistens nur mit hohem Aufwand zu berechnen spezielle iterative Algorithmen ohne Verwendung von Multiplikationen dadurch Einsparung von Chipfläche 3 / 30
Standardfunktionen Sinus Cosinus Tangens Exponentialfunktion Logarithmusfunktion Arcus- und Areafunktionen Quadratwurzel Multiplikation, Division 4 / 30
Einsparung von Chipfläche Multiplikationen sehr zeitintensiv Multiplikationswerke sehr groß Technologien damals LSI, MSI, SSI: Anzahl der Transistoren begrenzt Technologien heute Verwendung schneller Multiplizierer Einsatz in platzkritischen Technologien wie FPGA Einsatz bei massiv parallelen Architekturen 5 / 30
Alternative Technologien Lookup-Tabellen viel Platzverbrauch für jede Funktionen eine eigene notwendig Interpolation zwischen den Werten BKM (Bit) Algorithmen iterative shift-and-add Algorithmus nur für Logarithmus- und Expotentialfunktionen geeignet Taylorreihe Beispiel Sinus an a = 0: sin(x) = x + x 3 3! + x 5 5! + x 7 7! + x 9 9!... benötigt auch Multiplikationen 6 / 30
CORDIC Entwicklung CORDIC-Verfahren von Volder (1959) und Walther (1971) entwickelt Konvergenzverfahren auf Basis von Koordinatentransformation Verfahren benötigt nur einfache Operationen Addition (RCA) Schiebeoperationen (Multiplexer) Abfragen (Multiplexer) Tabellenzugriff (ROM, Counter) alle Standardfunktionen damit umsetzbar 7 / 30
CORDIC - Veröffentlichungen und Einsatz Volder 1959: The CORDIC Trigonometric Computing Technique. sin, cos, arctan, sqrt CORDIC - coordinate rotation digital computing Walther 1971: A unified algorithm for elementary functions. sinh, cosh, e, ln, div Einsatz in den ersten Generationen der HP Taschenrechner CORDIC-Prozessor als ASIC in Roboter-Steuergung: Timmermann et al.: A CMOS floating-point vector-arithmetic unit 8 / 30
Prinzip des CORDIC-Verfahren Berechnung Sinus bzw. Cosinus wird auf Koordinatentransformationen zurückgeführt Drehung eines Vektors (x 0, y 0 ) um einen Winkel Θ in einen Vektor (x n, y n ) mathematisch durch Multiplikation mit sog. Rotationsmatrix durchführbar (x n,y n ) Θ xn y n ] ] cos Θ sin Θ = sin Θ cos Θ x0 y 0 ] (x 0,y 0 ) 9 / 30
CORDIC - Sinus und Kosinus durch Drehung des Vektors (1, 0) um Θ ist sin Θ und cos Θ berechenbar xn ] ] y n cos Θ sin Θ = sin Θ cos Θ ] 1 0 sin Θ (x n,y n ) Θ cos Θ (1,0) 10 / 30
CORDIC - Umformung in den Tangenz durch mathematische Umformung nur noch Abhänigkeit von einer Winkelfuntion tan Θ wichtig um Multiplikationen durch Schiebeoperationen nach rechts zu ersetzen Drehung um den Winkel Θ wird nun durch Folge von Drehungen um Teilwinkel α i realisiert xn y n ] = xn y n ] ] cos Θ sin Θ = sin Θ cos Θ cos Θ = 1 1 + tan 2 Θ 1 1 + tan 2 Θ x0 y 0 ] ] 1 tan Θ tan Θ 1 x0 y 0 ] 11 / 30
CORDIC - Einführung Teilwinkel Teilwinkel α i sind bereits vorab definiert Teilwinkel so gewählt, dass der gewünschte Winkel Θ als Linearkombination der Teilwinkel α i darstellbar ist n 1 Θ = σ i α i σ i { 1, 1} i=0 d.h., der Winkel Θ wird durch eine alternierende Approximation angenährt bedeutet, dass man vor- und zurückdreht ist man bei einer Teildrehung zu weit gegangen, d.h. über den Winkel Θ hinaus, so muss man im nächsten Schritt wieder zurückdrehen die Drehrichtung wird durch den Parameter σ i gesteuert 12 / 30
CORDIC - Linearkombination der Teilwinkel zur Steuerung des Vorzeichens bzw. der Drehrichtung wird Hilfsvariable z i eingeführt z 0 wird mit dem gewünschten Drehwinkel Θ initialisiert Θ α 1 α 1 +α 2 α 1 +α2+α3 α 1 +α 2 +α 3 -α 4 α 4 (x n,y n ) α 3 α 2 α 1 Θ z 0 = Θ (1,0) { 1 z i 0 z i+1 = z i σ i α i σ i = 1 z i < 0 13 / 30
CORDIC - Eliminierung der Multiplikationen Mathematischer Ausdruck einer Teildrehung: xi+1 y i+1 ] = 1 1 + tan 2 α i Eliminierung der Multiplikationen: wesentliche Idee hinter dem Verfahren 1 σ i tan α i σ i tan α i 1 ersetze Multiplikationen durch Schiebeoperationen ] xi y i ] tan α i = 2 i i = 0... n 1 14 / 30
CORDIC - Iteration ohne Multiplikation Teildrehung um α i xi+1 y i+1 k i = ] 1 σi 2 = k i i ] σ i 2 i 1 1 1 + tan 2 α i = xi y i 1 1 + 2 2i ] da es sich bei den Teilwinkeln α i um bekannte Werte handelt, können die k i vorab zusammengefasst werden 15 / 30
CORDIC - Iterationsformeln Iterationsformeln x i+1 = x i σ i 2 i y i y i+1 = y i + σ i 2 i x i z i+1 = z i σ i arctan (2 i) Faktor k k = n 1 i=0 1 1 + 2 2i 16 / 30
CORDIC - Initialwerte Lösung des Systems von Differenzengleichungen ist x n = x 0 cos z 0 y 0 sin z 0 y n = y 0 cos z 0 + x 0 sin z 0 Durch geeignete Wahl der Initialwerte ist damit Sinus und Cosinus berechenbar x 0 = 1 y 0 = 0 x n = cos z 0 y 0 = sin z 0 Achtung: Um den Wert k zu klein! k = n 1 i=0 1 1 + 2 2i 17 / 30
CORDIC - Initialwert k Multiplikation nicht notwendig, wenn Startwert gut gewählt x 0 = x 0 k = k y 0 = y 0 k = 0 k (x n,y n ) (x n,y n ) k (1,0) (1,0) 18 / 30
CORDIC - Vektormodus eben gezeigtes Verfahren verfolgte Strategie die z-komponente gegen 0 streben zu lassen dies wird Rotationsmodus genannt es gibt aber auch die Möglichkeit, mit der zweiten Variable y i gegen 0 zu kovergieren Θ (x 0, y 0 ) (x n, 0) x 0 cos Θ = x0 2 + y 0 2 sin Θ = y 0 x 2 0 + y 2 0 tan Θ = y 0 x 0 (x 0 2 + y 0 2 ) 1/2 = x n 19 / 30
CORDIC - Funktionalität des Vektormodus diese Strategie wird Vektormodus genannt graphisch gesehen kann dann auf der x-achse die Länge des Vektors (x 0, y 0 ) abgelesen werden werden gleichzeitig in der dritten Komponente alle z alle Teilwinkel aufsummiert, erhält z n den Winkel identisch mit arctan(y 0 /x 0 ) Iterationsformeln identisch wie beim Rotationsmodus zur Bestimmung des Vorzeichens σ i muss nun die Variable y i abgefragt werden 20 / 30
CORDIC - wichtige Formeln des Vektormodus Zusammenfassung in Formeln Länge eines Vektors / Wurzel: x n = x0 2 + y 0 2 Winkel eines Vektors / arctan: z n = z 0 + Θ = z 0 + arctan(y 0 /x 0 ) Vorzeichen für die Iterationen: { 1, y i 0 σ i = 1, y i < 0 21 / 30
CORDIC - Erweiterung zum allgemeinen CORDIC bisher gezeigten Iterationsformeln erlauben die Berechnung der Wurzelfunktion des Arkustangens der trigonometrischen Funktionen Walther erweiterte 1971 das von Volder für zyklische Koordinatensysteme entwickelte Verfahren auf lineare und hyperbolische Koordinatensysteme 22 / 30
CORDIC - Norm eines Vektors x 2 + m y 2 x 2 + y 2 x x 2 y 2 m=1 zyklisches KOS m=0 lineares KOS m=-1 hyperbolisches KOS 23 / 30
CORDIC - Veralgemeinerte Rotationsmatrix xi+1 y i+1 ] = 1 1 + tan 2 (α i m) 1 σ i m tan(αi m) tan(α σ i m) i m 1 ] xi y i ] m = 1 zyklisch 1 ] σ i tan α i σ i tan α i 1 tan α i = 2 i m = 0 linear ] 1 0 σ i α i 1 α i = 2 i m = 1 hyperbolisch ] 1 σ i tanh α i σ i tanh α i 1 tanh α i = 2 i 24 / 30
CORDIC - Verallgemeinerte Iterationsformeln Iterationsformeln x i+1 = x i mσ i 2 F (i) y i y i+1 = y i + σ i 2 F (i) x i z i+1 = z i σ i α i i wenn m = 0 m = 1 1, 2, 3, 4, 4, 5, 6,..., F (i) = 13, 13, 14, 15,..., 40, 40, 41,... wenn m = 1 25 / 30
CORDIC - Die Funktion F (i) Zahlen 4, 13, 40, k, 3k + 1 treten im hyperbolischen Fall doppelt auf Grund ist Konvergenz für die Einhaltung der Konvergenz muss für verschiedene Teilwinkel α i gelten α i n 1 j=i+1 α i < α d.h., jeder Teilwinkel einer Iteration kann durch alle folgenden Teilwinkel bis auf einen Restfehler kompensiert werden 26 / 30
CORDIC - Konvergenz der Teilwinkel Restfehler des Gesamtverfahrens ist durch den Teilwinkel der letzten Iteration definiert damit Kompensation möglich ist, muss Nachfolgewinkel mindestens die Hälfte des Vorhergehenden betragen α i+1 1 2 α i für zirkulares und lineares Koordinatensystem erfüllt für hyperbolisches nicht: eine Winkeldrehung muss an bestimmten Fällen eventuell wieder vollständig rückgängig gemacht werden 27 / 30
CORDIC - Übersicht Betriebsart m Funktion Rotationsmodus 1 x n = x 0 cos z 0 y 0 sin z 0 z n 0 y n = y 0 cos z 0 + x 0 sin z 0 0 x n = x 0 y n = y 0 + z 0 x 0-1 x n = x 0 cosh z 0 + y 0 sinh z 0 y n = y 0 cosh z 0 + x 0 sinh z 0 Vektormodus 1 x n = (x0 2 + y 0 2) y n 0 z n = z 0 + arctan(y 0 /x 0 ) 0 x n = x 0 z n = z 0 + y 0 /x 0-1 x n = x0 2 y 0 2 z n = z 0 + Atanh(y 0 /x 0 ) 28 / 30
CORDIC - Berechenbare Funktionen e z = cosh z + sinh z e z = cosh z sinh z z = (z + 1 4 )2 (z 1 4 )2 tan z = sin z cos z ln z = 2Atanh( z 1 sinh z z+1 ) tanh z = cosh z 29 / 30
CORDIC - Architektur x i+1 = x i mσ i 2 F (i) y i y i+1 = y i + σ i 2 F (i) x i z i+1 = z i σ i α i x i y i z i 2 -F(i) Shift Shift α i mσ i σ i +/- +/- +/- σ i x i+1 y i+1 z i+1 30 / 30