1 votos

onda sinusoidal en FPGA

¿Se supone que debo generar una onda sinusoidal en el ciclón 2 altera? Entiendo que tengo que almacenar los valores en LUT o alguna memoria. Creo que el ciclón 2 utiliza una LUT de 4 entradas. No estoy seguro de cómo debo seguir con el siguiente paso. ¿Cómo puedo dar o alimentar los valores y hay una manera de almacenar más valores que una sola LUT puede contener? ¿Interfaz DAC?

Por ejemplo, el SIN se implementa a menudo como una tabla de búsqueda. Si los ángulos de 10 bits tienen suficiente resolución, entonces toda la función puede implementarse como una tabla de búsqueda con 1024 entradas. (En realidad, en el caso de SIN, sólo se almacena 1/4 de ciclo y luego se niega o se indexa hacia atrás, dependiendo del cuadrante real, pero eso es un aparte específico de SIN).

Lo he sacado de una de las respuestas más antiguas. Pero, ¿cuál es la resolución angular de 10 bits? Supongo que están usando 1024 muestras para 1/4 de ciclo. ¿Es eso cierto?

5voto

JonRB Puntos 4599

Hay tres maneras de hacerlo (enumeradas a continuación para completar) y se trata de compensaciones espacio-temporales:

¿Se hacen los cálculos con antelación (espacio de almacenamiento) o se hacen los cálculos sobre la marcha (compensación de tiempo)?

1) Tabla de búsqueda. Haz los cálculos con antelación y almacena la información en una ROM/tabla. Al darse cuenta de que sólo tiene que almacenar 1/4 de la forma de onda puede disminuir la cantidad que necesita para almacenar. Sin embargo... dependiendo de la precisión y el número de pasos puede llevar a una tabla muy grande

2) LUT interpolada. Un compromiso entre una tabla de búsqueda y los cálculos completos. El avance del cambio entre entradas puede estar bien dentro de los errores aceptados. A veces sólo se requieren 3 puntos (NOTA: el ejemplo de 3 puntos es sólo para atan)

3) CORDIC. (COordinate Rotation DIgital Computer). Básicamente es un algoritmo de caza que puede reducirse a simples sumas y desplazamientos. La precisión se rige más o menos por el número de pasos computacionales

4) Ampliación completa de taylor. Si la precisión es primordial, la velocidad es importante pero el almacenamiento local no es una opción

Mi consejo. Busca un CORDIC. Hay un montón de ejemplos de cordics en VHDL y una FPGA es perfecta para un CORDIC. Un proyecto en el que estoy trabajando en este momento utiliza en gran medida cordic's (12bit, 14 ciclos para establecerse)

Ejemplo cordic en python

#http://code.activestate.com/recipes/576792-polar-to-rectangular-conversions-using-cordic/
def to_polar(x, y):
    'Rectangular to polar conversion using ints scaled by 100000. Angle in degrees.'
    theta = 0
    for i, adj in enumerate((4500000, 2656505, 1403624, 712502, 357633, 178991, 89517, 44761)):
        sign = 1 if y < 0 else -1
        x, y, theta = x - sign*(y >> i) , y + sign*(x >> i), theta - sign*adj
    return theta, x * 60726 // 100000

def to_rect(r, theta):
    'Polar to rectangular conversion using ints scaled by 100000. Angle in degrees.'
    x, y = 60726 * r // 100000, 0
    for i, adj in enumerate((4500000, 2656505, 1403624, 712502, 357633, 178991, 89517, 44761)):
        sign = 1 if theta > 0 else -1
        x, y, theta = x - sign*(y >> i) , y + sign*(x >> i), theta - sign*adj
    return x, y

#if __name__ == '__main__':
#    print(to_rect(471700, 5799460))     # r=4.71700  theta=57.99460
#    print(to_polar(250000, 400000))     # x=2.50000  y=4.00000

Notas sobre CORDICS y FPGAs http://www.uio.no/studier/emner/matnat/ifi/INF5430/v12/undervisningsmateriale/dirk/Lecture_cordic.pdf

1voto

silverbolt Puntos 18

Generalmente, la forma de hacerlo es con una tabla de búsqueda almacenada en un bloque de RAM. Por ejemplo, podrías usar una tabla de 1024 entradas con entradas de 8 bits. Las entradas serían calculadas con sin o cos y almacenadas en la RAM en un bloque inicial. Luego usarías un acumulador de fase para leer las muestras de la RAM en los momentos correctos y enviarlas al DAC. Si necesitas una resolución muy alta, entonces necesitarás una tabla con muchas entradas y puede llegar a ser muy rápidamente demasiado grande para caber en la RAM del bloque de la FPGA. En ese caso, es posible utilizar una tabla de búsqueda comprimida. Una tabla comprimida almacena información que puede ser usada para recrear muestras de una tabla de búsqueda mucho más grande. Aquí hay un ejemplo de una tabla de búsqueda de seno/coseno en cuadratura que tiene una resolución de fase de 18 bits y una resolución de amplitud de 16 bits, pero que requiere menos de 2k entradas de tabla de búsqueda en 3 tablas de búsqueda: https://github.com/alexforencich/verilog-dsp/blob/master/rtl/sine_dds_lut.v

1voto

Traveler Puntos 56

Creo que estás confundido sobre lo que es una LUT (Look Up Table).

A La LUT es sólo una memoria inicializada con valores fijos que no cambian durante el comportamiento normal.

En una arquitectura FPGA tienes básicamente LUTs combinados con registros. Estas LUTs se inicializan con los valores de un tabla de verdad para definir una lógica de salida combinacional de algunas entradas.

En el caso de un Onda sinusoidal puede inicializar, por ejemplo, una memoria de bloque de 1024 de profundidad (debido a la gran cantidad de datos) para almacenar el discretizado resultado de una entrada angular de 10 bits de ancho. Es decir, para los 360 grados calculas el resultado del seno para 1024 divisiones de ángulos y utilizas este valor para inicializar su posición. Estos valores deben ser redondeados a la salida de ancho de bits, por lo que más precisión se necesita más profundidad y ancho de salida y más memorias de bloque de la FPGA tiene que consumir.

Ese es el planteamiento inicial del problema. Además puedes aprovechar la naturaleza de la onda sinusoidal, calculando sólo los valores del primer cuadrante (0 a 90 grados) y utilizando alguna lógica combinacional para transformar cualquier ángulo a su valor equivalente en el primer cuadrante. Tendrás el mismo resultado pero ahorrando 3/4 de la memoria del bloque.

Para ello puede utilizar un asistente de núcleo de su proveedor de FPGA o buscar una plantilla HDL para definir una memoria de bloque inicializada que pueda ser interpretada correctamente por el sintetizador.

Y como paso final puedes utilizar un DAC para pasar un valor digital de la LUT a una tensión. A mayor memoria, mayor resolución de esta onda sinusoidal "analógica".

Eso es todo. Buena suerte.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X