Descripción en VHDL de arquitecturas para implementar el algoritmo CORDICCapítulo 1 El algoritmo CORDIC CORDIC es un acrónimo de COordinate Rotation DIgital Computer que en castellano significa Computadora Digital para Rotación de Coordenadas. El algoritmo original fue propuesto por Jack Volder en el año 1959 [1], con el propósito de calcular funciones trigonométricas mediante la rotación de vectores. La rotación de vectores puede utilizarse a su vez para conversión de sistemas de coordenadas (cartesiano a polar y viceversa), magnitud de vectores y como parte de funciones matemáticas mas complejas como ser la Transformada Rápida de Fourier (Fast Fourier Transform, FFT) y la Transformada Coseno Discreta (Discrete Cosine Transform, DCT). 1.1 Fundamento teórico El algoritmo CORDIC, proporciona un método iterativo para rotar vectores ciertos ángulos determinados y se basa exclusivamente en sumas y desplazamientos. El algoritmo original tal como fue propuesto inicialmente, describe la rotación de un vector bidimensional en el plano cartesiano. Su funcionamiento se deduce de la fórmula general para rotación de vectores como se muestra a continuación x' = x cosθ − y sen θ (1.1) y ' = y cosθ + x sen θ Figura 1.1 1 4) y ' = cosθ ( y + x tg θ ) Si además cosθ = cos 2 θ = = 1 = 1 cos 2 θ 1 = 1 cos 2 θ 1 sen θ + cos θ cos 2 θ 2 2 = 1 cos θ sen 2 θ + cos 2 θ cos 2 θ 2 = 1 1 + tg 2 θ entonces la ecuación (1.2.b).1).4) puede expresarse como x' = y' = x − y tg θ 1 + tg 2 θ (1. se obtiene x' = cos(θ + φ ) = cosθ cos φ − sen θ sen φ = x cosθ − y sen θ y ' = sen(θ + φ ) = sen θ cos φ + cosθ sen φ = x sen θ + y cosθ Con lo que se obtiene la fórmula general (1.5) y + x tg θ 1 + tg 2 θ En el algoritmo CORDIC.1) se deduce a partir de las identidades trigonométricas conocidas. Utilizando las identidades para el seno y el coseno de la suma de ángulos se tiene sen(α + β ) = sen α cos β + cos α sen β cos(α + β ) = cos α cos β − sen α sen β (1.3) y (1. en donde x = r cos φ V : y = r sen φ (1. las rotaciones de vectores son reemplazadas por pseudorotaciones [7] como se muestra en la figura 1.3) Si se sustituye ω = θ + φ en (1.2.a).a) x' = r cos ω V ': y ' = r sen ω (1.2. aplicando (1. 2 .2.Descripción en VHDL de arquitecturas para implementar el algoritmo CORDIC La fórmula (1.2. la cual se puede reagrupar considerando que cosθ ≠ 0 [4] de forma tal que x' = cosθ ( x − y tg θ ) (1.b) Si r = 1 y θ = ω − φ entonces ω = θ + φ . n −1 n −1 n −1 x n' ' = x cos ∑θ i − y sen ∑θ i ∏ 1 + tg 2 θ i i =0 i =0 i =0 n −1 n −1 n −1 y n' ' = y cos ∑θ i + x sen ∑θ i ∏ 1 + tg 2 θ i i =0 i =0 i =0 n −1 z n' ' = z − ∑θ i i =0 3 (1. luego de n iteraciones para una rotación real se obtiene.Descripción en VHDL de arquitecturas para implementar el algoritmo CORDIC Figura 1.8) n −1 z n' = z − ∑θ i i =0 mientras que para una pseudorotación.7) y ' ' = y + x tg θ La rotación de un ángulo puede descomponerse en una suma de rotaciones mas pequeñas.6) 1 + tg 2 θ respecto del vector original V. n −1 n −1 x n' = x cos ∑θ i − y sen ∑θ i i =0 i =0 n −1 n −1 y n' = y cos ∑θ i + x sen ∑θ i i =0 i =0 (1.2 Mientras que una rotación real no cambia la magnitud del vector V una vez rotado. La pseudorotación por el ángulo θ está caracterizada por las ecuaciones El vector pseudorotado V‘’ incrementa su magnitud en x' ' = x − y tg θ (1. una pseudorotación incrementa su magnitud en V ' ' = V 1 + tg 2 θ (1. Si se asume inicialmente que x = x0. y = y0 y z = z0.9) . 3 Si los ángulos de rotación se restringen de forma tal que tg θ = ±2 − i . K i = cosθ i = cos arctg 2 −i = −i ) ) (1. la multiplicación por la tangente.9 se agrega una tercera ecuación para zn que se denomina acumulador angular [7] porque incluye las rotaciones efectuadas hasta el momento.4). en donde n −1 ∑θ i =0 i =θ A las ecuaciones 1. Si se elimina K i de las ecuaciones iterativas. El factor K i puede aplicarse al final del proceso como una constante K n . Los diversos ángulos pueden obtenerse realizando una serie de rotaciones elementales cada vez mas pequeñas [Anexo A]. se reduce a una operación de desplazamiento. se elige el sentido de rotación. Partiendo de las ecuaciones dadas en (1. En cada iteración. i ∈ Ν . en lugar de determinar si se debe rotar o no.Descripción en VHDL de arquitecturas para implementar el algoritmo CORDIC .3 se muestra un vector V rotado sobre otro vector V’ mediante rotaciones menores. de los ángulos de las rotaciones elementales. El ángulo final de una rotación está determinado por la suma algebraica. se obtiene un algoritmo basado en sumas y desplazamientos. según el sentido de rotación. Figura 1. una iteración puede expresarse como ( = K (y xi +1 = K i xi − y i d i 2 − i y i +1 i ( i + xi d i 2 ) en donde.8 y 1. El factor de expansión K i debe ser multiplicado por las ecuaciones correspondientes a las pseudorotaciones para obtener la rotación real. definida como sigue 4 . y considerando que cos(θ i ) = cos(− θ i ) .10) 1 1 + tg θ i 2 = 1 1 + 2 −2i y d i = ±1 dependiendo del sentido de rotación. En la figura 1. denominado vectorización (vectoring). 5 . se modifica el acumulador angular para dar lugar a la ecuación. Por lo tanto cada ángulo final se puede representar mediante un vector de signos. acumulando el ángulo necesario para efectuar dicha rotación.6073 n →∞ i =0 El valor exacto de K n depende del número de iteraciones. El primero. se almacenan en la tabla las arcotangentes correspondientes en ese sistema. LUT). luego de n etapas.12) ( ) z i +1 = z i − d i arctg 2 −i − 1 . cuando z n → 0 1 entonces n −1 ∑θ i =0 i = z para x = x0. La decisión sobre el sentido de rotación en cada paso de iteración. ( ) z i +1 = z i − d i arctg 2 − i (1. si z i < 0 en donde. se efectúa para minimizar la magnitud del ángulo acumulado. En el caso de una rotación.6467 K n i =0 K i i =0 Como se explicó anteriormente. Con esto último. rota el vector de entrada hacia el eje X. en donde cada componente corresponde a un ángulo de la secuencia de ángulos elementales. en cada paso de iteración. en lugar de decidir si rotar o no.9). Para el modo rotación. se obtiene del valor de dicho ángulo en cada paso. Se define además An = n −1 n −1 1 1 =∏ = ∏ 1 + 2 − 2i ≅ 1. El segundo modo. se decide el signo o sentido de la rotación a efectuar.11) Dependiendo del sistema angular con el que se trabaje. El algoritmo CORDIC se opera normalmente en dos modos. Por ello. a los efectos de simplificar las expresiones. Dichos ángulos elementales se almacenan en una tabla de búsqueda (Lookup Table. d i = 1 . las ecuaciones son xi +1 = xi − y i d i 2 − i y i +1 = y i + xi d i 2 −i (1. el signo que determina el sentido de rotación.Descripción en VHDL de arquitecturas para implementar el algoritmo CORDIC n K n = lim ∏ K i ≅ 0. y = y0. se denomina rotación (rotation) que rota el vector de entrada un ángulo específico que se introduce como parámetro. el acumulador angular se inicializa con el ángulo a rotar. z = z0 [7] se obtiene 1 De aquí en más se utiliza wn para una variable de la forma wn' ' . si z i ≥ 0 partiendo de las ecuaciones (1. en lugar de minimizar la magnitud del acumulador angular. si y i ≥ 0 en donde. Por lo tanto se pueden deducir las siguientes ecuaciones xi +1 = xi − y i d i 2 − i y i +1 = y i + xi d i 2 −i (1. se puede reducir al primer o cuarto cuadrante. Si se inicializa y0 = 0. Asimismo se utiliza el signo del componente y para determinar la dirección de rotación. y = y0.15) n −1 An = ∏ 1 + 2 − 2i i =0 π π ≤ θ ≤ debido a que los 2 2 ángulos elementales convergen sólo dentro de esos límites [Anexo A] [4].2 Cálculo del seno y del coseno El modo rotación del algoritmo CORDIC puede utilizarse para calcular el seno y el coseno de un ángulo en forma simultánea.13) n −1 An = ∏ 1 + 2 − 2i i =0 Para una vectorización.Descripción en VHDL de arquitecturas para implementar el algoritmo CORDIC x n = An ( x0 cos z 0 − y 0 sen z 0 ) y n = An ( y 0 cos z 0 + x0 sen z 0 ) zn = 0 (1. al final del proceso contendrá el ángulo de rotación adecuado. Para tratar ángulos que caen fuera de ese rango. z = z0 [7] se obtiene x n = An x02 + y 02 yn = 0 y z n = z 0 + arctg 0 x0 (1. el ángulo ingresado se rota para alinearlo con el eje X. luego de n etapas cuando y n → 0 entonces tg ∑θ i = − para x i =0 x = x0. ya que si y = 0 entonces el vector se encuentra sobre el eje X. El algoritmo CORDIC está restringido a ángulos θ tales que − 1. Si el acumulador angular se inicializa con cero.9). d i = 1 .13) se obtiene 6 . de la fórmula (1. se minimiza la magnitud del componente y.14) ( ) z i +1 = z i − d i arctg 2 −i − 1 . si y i < 0 y n −1 partiendo de las ecuaciones (1. Para obtener este resultado. se define como x = r cosθ T : y = r sen θ Si se reemplaza en (1. de (1.16) n −1 An = ∏ 1 + 2 − 2i i =0 Si además x0 = 1 . que hace corresponder coordenadas polares a cartesianas.16) se tiene que An x n = cos z 0 y n = sen z 0 (1.19) Utilizando el modo vectorización de CORDIC.3 Transformación de coordenadas polares a cartesianas y viceversa La transformación T. 1.18) 1 r An y0 = 0 z0 = θ x0 = (módulo) (fase) se obtiene la transformación T.Descripción en VHDL de arquitecturas para implementar el algoritmo CORDIC x n = An x0 cos z 0 y n = An x0 sen z 0 zn = 0 (1. La transformación de coordenadas cartesianas a polares se puede llevar a cabo utilizando la transformación inversa T’ r = x 2 + y 2 T ': y θ = arctg x (1. (1.17) zn = 0 que calcula el seno y el coseno del ángulo inicial z0 . se puede sustituir en (1.13).15) x0 = x y0 = y z0 = 0 7 . 1.) pueden asumir uno de los tres valores que se muestran a continuación µ =1 µ =0 y y µ = −1 y f ( x) = arctg( x ) f ( x) = x Rotación Circular (CORDIC básico) Rotación Lineal f ( x) = tgh −1 (x ) Rotación Hiperbólica 1. lo cual agrega cierta complejidad al algoritmo inicial ya que se precisa de un multiplicador con el mismo ancho en bits que el resultado.5.) que adquiere significado según el sistema que se utilice. Nuevamente para eliminar a la constante An se debe agregar al algoritmo un multiplicador. Esta generalización fue propuesta por Walther [5].15). Si se inicializa z0 = 0 y se sustituye en (1.20) n −1 An = ∏ 1 + 2 − 2i i =0 El término xn representa el módulo de un vector en el espacio bidimensional en donde x0 e y0 son sus componentes. Se define xi +1 = xi − µ y i d i 2 − i y i +1 = y i + xi d i 2 −i (1.Descripción en VHDL de arquitecturas para implementar el algoritmo CORDIC Sin embargo el algoritmo también computa la constante An que puede ser eliminada multiplicando por su inverso.21) ( ) z i +1 = z i − d i f 2 −i La única diferencia que presenta este algoritmo con el básico.1 Caso lineal Si se parte de (1. es la introducción del parámetro µ en la ecuación correspondiente al componente x y la función f(.4 Arcotangente y módulo de un vector El arcotangente se puede calcular utilizando el modo vectorización de CORDIC.5 CORDIC generalizado El algoritmo CORDIC básico puede ser generalizado para proveer una herramienta aún mas potente para el cálculo de funciones. El parámetro µ y la función f(.21) con µ = 0 y f ( x) = x se obtiene 8 . se obtiene el término zn x n = An x02 + y 02 yn = 0 y z n = z 0 + arctg 0 x0 (1. 1. 25) ( ) z i +1 = z i − d i tgh −1 2 −i 9 .22) z i +1 = z i − d i 2 −i − 1 .Descripción en VHDL de arquitecturas para implementar el algoritmo CORDIC xi +1 = xi y i +1 = y i + xi d i 2 −i (1. si z i < 0 Para el modo rotación.2 Caso hiperbólico Si se parte de (1. sustituyendo x0 = a y0 = 0 z0 = b − 1 .b. si y i ≥ 0 En modo vectorización. donde d i = 1 . si y i < 0 la rotación lineal produce x n = x0 yn = z0 − y0 x0 (1.21) con µ = -1 y f ( x) = tgh −1 ( x ) se obtiene xi +1 = xi + y i d i 2 − i y i +1 = y i + xi d i 2 −i (1. donde d i = 1 .5. sustituyendo x0 = b y 0 = −a z0 = 0 1.23) zn = 0 Por lo tanto a partir de estas ecuaciones puede obtenerse el producto de dos valores a.24) zn = 0 Por lo tanto a partir de estas ecuaciones puede obtenerse el cociente de dos magnitudes a/b. si z i ≥ 0 la rotación lineal produce x n = x0 y n = y 0 + x0 z 0 (1. 80 i =0 − 1 . Y y Z. si z i < 0 Para el modo rotación.Descripción en VHDL de arquitecturas para implementar el algoritmo CORDIC − 1 . La denominación de paralela se debe a la forma en que se opera con las componentes X. una de las arquitectura correspondientes es la arquitectura bit-paralela iterativa [3]. Sin embargo Walther [5] demostró que se pueden conseguir los resultados esperados si se repiten algunas de las iteraciones efectuadas [6]. donde d i = 1 .27) n −1 An = ∏ 1 − 2 − 2i i =0 Las rotaciones elementales en el sistema hiperbólico no convergen.26) n −1 An = ∏ 1 − 2 − 2i ≅ 0. si y i ≥ 0 Para el modo vectorización. si y i < 0 la rotación hiperbólica produce x n = An x02 − y 02 yn = 0 y z n = z 0 + tgh −1 0 x0 (1. Las señales correspondientes a los componentes X e Y son desplazadas y luego restadas o sumadas a las señales sin desplazar.26. correspondientes al componente opuesto. En esta arquitectura cada etapa del algoritmo consiste de un registro para almacenar la salida. si z i ≥ 0 la rotación hiperbólica produce x n = An ( x0 cosh z 0 + y 0 senh z 0 ) y n = An ( y 0 cosh z 0 + x0 senh z 0 ) zn = 0 (1. donde d i = 1 . Al comenzar el cálculo.6. 1. El componente Z combina los valores almacenados en el registro con valores que obtiene de una tabla de búsqueda (Lookup Table. El bit más significativo del componente Z ó Y en cada paso de iteración determina la operación a efectuar por el sumador algebraico en modo rotación o vectorización respectivamente. una unidad de desplazamiento y un sumador algebraico. Las funciones trigonométricas hiperbólicas equivalentes a las funciones trigonométricas circulares pueden obtenerse de manera similar a partir de la ecuación 1. los valores iniciales para x0 . LUT) de arcotangentes precalculadas con una cantidad de 10 .6 Arquitecturas para implementar el algoritmo CORDIC 1. y 0 y z 0 ingresan en forma paralela a los registros a través del multiplexor.1 La arquitectura Bit-Paralela Iterativa Cuando el algoritmo CORDIC se implementa en hardware. El diseño se separa en etapas correspondientes a cada iteración. La dirección de memoria cambia acorde al número de iteración. Los valores iniciales para x0 . el diseño puede desplegarse [3] como muestra la Figura 1. La desventaja que presenta esta arquitectura es la enorme cantidad de espacio que requiere su implementación. La segunda ventaja radica en que el circuito es puramente combinatorio. Este diseño introduce dos ventajas importantes. y por lo tanto no se necesita de una unidad de control. la cantidad de desplazamientos y el direccionamiento de las constantes precalculadas. multiplexores. dos unidades de desplazamiento y dos sumadores algebraicos. Para n iteraciones el valor a calcular puede ser obtenido en la salida.5. debido a que los recursos (registros. Esta representación tiene como ventaja el uso eficiente de hardware. En la figura 1.2 La arquitectura Bit-Paralela Desplegada En lugar de almacenar el resultado de cada paso de iteración en registros y volver a utilizar los mismos recursos.4 1. Por consiguiente la salida de una etapa corresponde a la entrada de la siguiente etapa.4 se muestra el esquema correspondiente a la arquitectura descripta.Descripción en VHDL de arquitecturas para implementar el algoritmo CORDIC entradas proporcional a la cantidad de iteraciones. unidades de desplazamiento y sumadores) son reutilizados en cada iteración. y 0 y z 0 se ingresan en paralelo a la primera etapa. Sin embargo se puede ampliar el ancho en bits de los buses internos para obtener una mejor exactitud [6]. 11 .6. Las unidades de desplazamiento así como las constantes correspondientes a cada iteración pueden ser cableadas. simplificando enormemente el diseño. Cada etapa está compuesta por los mismos componentes. La señal Modo especifica el modo de operación (Rotación o Vectorización). Se considera además en el esquema que las componentes tienen un ancho de m bits. Se requiere de un controlador que puede ser implementado como una máquina de estados para controlar los multiplexores. Figura 1. Esta tabla de búsqueda puede ser implementada como una memoria ROM. 6. Para el modo vectorización.6. un registro de desplazamiento y un sumador algebraico bit-serie. 12 .5 1.3 La arquitectura Bit-Serie Iterativa En un diseño en serie. El desempeño δ de esta arquitectura se puede calcular como δ= velocidad de reloj número de iteraciones ⋅ ancho de palabra La arquitectura resultante se muestra en la Figura 1. se procesa un bit por vez. con lo cual las interconexiones se reducen al ancho de un bit [1] [3]. Cada etapa del algoritmo consiste en un multiplexor. La operación a efectuar por el sumador algebraico se obtiene del bit de signo del componente z para el modo rotación. El sumador algebraico se implementa como un sumador completo en el que una resta se lleva a cabo sumando el complemento a dos del valor a restar. La señal Modo indica el modo de operación al igual que en el caso iterativo.Descripción en VHDL de arquitecturas para implementar el algoritmo CORDIC En el esquema se supone un ancho de palabra de m bits. Figura 1. del bit de signo se obtiene del componente y. La ventaja que presenta esta arquitectura es que los buses de interconexión entre los componentes son del ancho de un bit y el registro de desplazamiento está integrado con el registro intermedio. La desventaja que presenta esta arquitectura con respecto a las que procesan los vectores de entrada en forma paralela es que se introduce un retardo proporcional al ancho de palabra en cada etapa. y 0 y z 0 ingresan al registro de desplazamiento por el extremo izquierdo en el esquema. Por último. Alternativamente la carga y lectura del registro de desplazamiento puede efectuarse en paralelo para simplificar el diseño. Cuando el primer bit que fue ingresado al registro es procesado por el sumador algebraico.6 La operación de desplazamiento (multiplicación por 2 − i ) se lleva a cabo leyendo el bit i – 1 considerado a partir del extremo derecho del registro de desplazamiento.Descripción en VHDL de arquitecturas para implementar el algoritmo CORDIC Figura 1. Se puede usar un multiplexor para cambiar la posición de acuerdo a la iteración actual. el multiplexor permite nuevamente el ingreso de los bits sumados al registro de desplazamiento. 13 . minimizando espacio al momento de su implementación. Los valores iniciales para x0 . Por otra parte se requiere de hardware de control mas complejo. cuando se han completado todas las iteraciones los multiplexores permiten el ingreso de un nuevo valor al registro de desplazamiento y el valor calculado se obtiene en la salida. ocasionado por los desplazamientos.