architecture BEH of Acum_Fase is
signal mod_reg: unsigned(N-1 downto 0) := (others => '0');
signal rem_nc: unsigned(N-1 downto 0) := (others => '0');
signal term_add: unsigned(N-1 downto 0) := (others => '0');
begin
rem_nc <= to_unsigned(Q,N) – mod_reg;
term_add <= to_unsigned(P,N);
Modular_Addition: process(clk) is
begin
if rising_edge(clk) then
if (rem_nc<=to_unsigned(P,N)) then
mod_reg <= to_unsigned(P,N) – rem_nc;
else
mod_reg <= mod_reg + term_add;
end if;
end if;
end process Modular_Addition;
acum_reg <= std_logic_vector(mod_reg);
end architecture BEH;
Ejemplo de implementación en VHDL y simulación
Sistemas Digitales – UBA
Fue descripto por primera vez en 1959 por Jack E. Volder
Desarrollado en el departamento de aeroelectrónica de Convair
Más tarde John Stephen Walther, en Hewlett-Packard, generalizó el algoritmo
Originalmente fue implementado usando el sistema binario. En los 70’s su variante decimal se empezó a usar fuertemente en calculadoras de mano
Introducción
CORDIC
Es utilizado sobre todo en dispositivos en los que no hay disponibilidad de multiplicadores, por ejemplo en microcontroladores y FPGA's pequeñas
Sólo utiliza las operaciones de suma, resta y desplazamiento
Se lo utiliza para la rotación de vectores, el cálculo de funciones trigonométricas (sen, cos, tan, etc), la transformación de coordenadas, etc
Introducción
1
2
Ecuaciones
Desarrollando el coseno y el seno de la ecuación 2:
3
Ecuaciones
Sacando cos(b) como factor común en la ecuación 3:
4
Ecuaciones
4
Sustituyendo la ecuación 1 en 4:
x1
Ecuaciones
4
Sustituyendo la ecuación 1 en 4:
y1
Ecuaciones
Sustituyendo la ecuación 1 en 4:
(Gp:)
Givens
Ecuaciones
Hasta este momento no hemos llegado a nada interesante.
Ahora, pensemos por un momento qué pasaría si los ángulos en los que puede rotar el vector se restringen de tal manera que:
(Gp:) ¿Se lograría algún beneficio con esto?
(Gp:) i
(Gp:) tg
(Gp:) –
(Gp:) ±
(Gp:) =
(Gp:) 2
(Gp:) )
(Gp:) (
(Gp:) b
(Gp:) ¡La multiplicación en el término que incluye la tangente se reduce a una simple operación de desplazamiento!
Ecuaciones
Por lo dicho:
(Gp:) )]
(Gp:) .
(Gp:) d
(Gp:) .(
(Gp:) x
(Gp:) y
(Gp:) .[
(Gp:) y
(Gp:) )]
(Gp:) .
(Gp:) d
(Gp:) .(
(Gp:) y
(Gp:) x
(Gp:) .[
(Gp:) x
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) K
(Gp:) K
(Gp:) –
(Gp:) +
(Gp:) –
(Gp:) +
(Gp:) +
(Gp:) =
(Gp:) –
(Gp:) =
(Gp:) 2
(Gp:) 2
(Gp:) 1
(Gp:) 1
Ecuaciones
Luego, reemplazando en las ecuaciones de Givens:
El producto de los Ki’s se puede tratar como una ganancia del sistema. La ganancia exacta depende de la cantidad de iteraciones y es aproximadamente igual a 1,647:
Por lo dicho:
Ecuaciones
Luego, reemplazando en las ecuaciones de Givens:
El valor de di será ±1
(Gp:) )]
(Gp:) .
(Gp:) d
(Gp:) .(
(Gp:) x
(Gp:) y
(Gp:) .[
(Gp:) y
(Gp:) )]
(Gp:) .
(Gp:) d
(Gp:) .(
(Gp:) y
(Gp:) x
(Gp:) .[
(Gp:) x
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) i
(Gp:) K
(Gp:) K
(Gp:) –
(Gp:) +
(Gp:) –
(Gp:) +
(Gp:) +
(Gp:) =
(Gp:) –
(Gp:) =
(Gp:) 2
(Gp:) 2
(Gp:) 1
(Gp:) 1
El algoritmo incluye una tercera ecuación que describe el acumulador angular:
Ecuaciones
El algoritmo puede operar en dos modos diferentes:
Modo rotación
– Rota un vector en un ángulo especificado
– El acumulador angular se inicializa con el ángulo
a rotar
– La decisión de rotación en cada iteración se lleva
a cabo de tal manera de disminuir el ángulo residual
en el acumulador angular (se utiliza su signo)
Modo vector
– Rota un vector hacia el eje de coordenadas x, guardando
los ángulos requeridos para lograrlo
– Busca minimizar la componente y del vector residual
– La dirección de rotación se decide por el signo de la
componente y residual
Modos de operación
Modo rotación
Modos de operación
Donde: di = -1 si zi < 0, en otro caso +1
Finalmente se tiene:
Modo vector
Modos de operación
Donde: di = +1 si yi < 0, en otro caso -1
Finalmente se tiene:
Ángulo a rotar: 20º
Ángulo inicial: 33º
Ejemplo
Iteración 1
Ejemplo
atan = 45º
ang acum = 20 – 45 = -25
Iteración 2
Ejemplo
atan = 26,56º
ang acum = -25 + 26,56 = 1,56
Iteración 3
Ejemplo
atan = 14,03º
ang acum = 1,56 – 14,03 = -12,47
Iteración 4
Ejemplo
atan = 7,12º
ang acum = -12,47 + 7,12 = -5,35
Iteración 5
Ejemplo
atan = 3,57º
ang acum = -5,35 + 3,57 = -1,78
Iteración 6
atan = 1,78º
ang acum = -1,78 + 1,78 = 0
Ejemplo
Iterativa
Unrolled
Pipeline unrolled
Arquitecturas
Página anterior | Volver al principio del trabajo | Página siguiente |