Cómo usar el código VHDL para generar el seno de un ángulo dado usando el algoritmo CORDIC

Consulte este código de ejemplo:

Calcular pecado y cos. El vector se encuentra originalmente en el eje xy comienza con una longitud menor para compensar la escala. El ángulo tiene 3 bits más, las coordenadas tienen 2 bits más.

entidad cordic es

genérico (pasos: entero: = 9);

puerto (clk: en std_logic;

clr: en std_logic;

validi: en std_logic;

w: en std_logic_vector (6 downto 0); – 0 a 90 grados

valido: fuera std_logic;

sin: out std_logic_vector (7 downto 0); – 0 a 255

cos: fuera std_logic_vector (7 downto 0)); – 0 a 255

final cordic;

una arquitectura de cordic es

tipo angle_arr es una matriz (0 a 9) de rango entero 0 a 511;

ángulos constantes: angle_arr: = (360, 213, 112, 57, 29, 14, 7, 4, 2, 1);

constante x_ini: Entero: = 620;

El subtipo xy_type es Integer range -1024 to 1023;

El subtipo w_type es el rango entero -1024 a 1023;

tipo xy_arr es una matriz (0 a pasos) de xy_type;

tipo w_arr es una matriz (0 a pasos) de w_type;

ángulo de señal: w_arr;

señal x, y: xy_arr;

señal sin_i, cos_i: rango entero de 0 a 255;

señal válida: std_logic_vector (0 a pasos);

proceso (clk)

empezar

if rising_edge (clk) entonces

si clr = ‘1’ entonces

para i en 0 a pasos de bucle

x (i) <= 0; y (i) <= 0; ángulo (i) <= 0;

bucle final

x (0) <= x_ini;

válido ‘0’); valido <= '0';

más

ángulo (0) <= conv_integer ('0' & w) * 8; válido (0) <= válidoi;

para i en 1 a pasos bucle

válido (i) <= válido (i-1);

si ángulo (i-1)> 0 entonces

x (i) <= x (i-1) -y (i-1) / 2 ** (i-1);

y (i) <= y (i-1) + x (i-1) / 2 ** (i-1);

ángulo (i) <= ángulo (i-1) -angles (i-1);

más

x (i) <= x (i-1) + y (i-1) / 2 ** (i-1);

y (i) <= y (i-1) -x (i-1) / 2 ** (i-1);

ángulo (i) <= ángulo (i-1) + ángulos (i-1);

terminara si;

bucle final

valido <= válido (pasos);

si x (pasos) <0 entonces cos_i <= 0; sino cos_i <= x (pasos) / 4; terminara si;

si y (pasos) <0 entonces sen_i <= 0; sino sen_i <= y (pasos) / 4; terminara si;

terminara si;

terminara si;

proceso finalizado;

cos <= conv_std_logic_vector (cos_i, cos'length);

sin <= conv_std_logic_vector (sin_i, sin'length);

Puede visitar mi sitio web de FPGA para ver más proyectos: fpga4student.com
Proyectos de diseño digital FPGA utilizando Verilog / VHDL

More Interesting

¿Cuáles son los 100 deben resolver preguntas de SPOJ?

¿Qué es lo más profundo que aprendiste al leer SICP?

¿Cómo podrías escribir un programa que ingrese un número entero positivo N y genere el número de Fibonacci F2N?

Cómo hacer para recolectar datos de entrenamiento para un algoritmo de aprendizaje automático

¿Cuál es el mejor algoritmo de sustracción automática de fondo para una sola imagen?

¿Cómo se ordenan 10 números en orden creciente?

Cómo implementar un algoritmo C4.5 usando MATLAB

¿La matriz de Java de primitivas se almacena en la pila o el montón?

¿Cuáles son los beneficios de usar la recursividad de la cola? ¿Es siempre posible?

¿Qué hay de malo con este código C?

¿Cuál es la mejor manera de saber qué estrategia (codiciosa, dividir y conquistar, programación dinámica) funcionaría mejor para un problema de algoritmo en particular?

¿Algún consejo para estudiar la complejidad del espacio para programar entrevistas? ¿Cuáles son algunos buenos recursos para aprender sobre la complejidad del espacio?

No puedo entender algoritmos y estructuras de datos. ¿Cómo puedo aprender algoritmos y estructuras de datos de una manera simple?

¿Puede alguien sin antecedentes de cálculo aprender estructuras de datos y algoritmos leyendo CLRS?

Estoy tomando un curso en línea, Algorithms Part 1 de Sedgewick y Wayne en Coursera. Conozco bastante a Java, pero me llevó más de un día llegar a la mitad de la resolución de la primera tarea de programación. ¿Debería dejarlo? ¿Todos sienten lo mismo mientras aprenden sobre algoritmos?