onda sinusoidal en FPGA

1

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

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

Obtuve esto de una de las respuestas anteriores. Pero, ¿cuál es la resolución de 10 bits de ángulo? Supongo que están usando 1024 muestras para 1/4 ciclo. ¿Es eso correcto?

    

3 respuestas

4

Hay tres formas de hacer esto (enlistadas para completar) y se trata de compensaciones de espacio-tiempo:

¿Realiza los cálculos antes de tiempo (espacio de almacenamiento) o realiza los cálculos sobre la marcha (compensación de tiempo)

1) Buscar tabla. Haga los cálculos antes de tiempo y amp; almacenar la información en una ROM / tabla. Al darse cuenta de que solo tiene que almacenar 1/4 de la forma de onda, puede disminuir la cantidad que necesita almacenar. Sin embargo ... dependiendo de la precisión y amp; el número de pasos puede llevar a una tabla muy grande

2) LUT interpolada. Un intercambio entre una tabla de búsqueda y cálculos completos. Anticipar el cambio entre las entradas podría estar dentro de los errores aceptados. A veces solo se requieren 3 puntos (NOTA: el ejemplo de 3 puntos es solo para atan)

3) CORDIC. (Ordenador digital de rotación coordinada). Básicamente, un algoritmo de búsqueda que se puede reducir a simples agregados y desplazamientos. La precisión está bastante controlada por el número de pasos computacionales

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

Mi consejo. Mira en un córdico. Hay muchos ejemplos de cuerdas en VHDL y un FPGA es perfecto para un CORDIC. Un proyecto en el que estoy trabajando en este momento utiliza mucho los cordic's (12 bits, 14 ciclos para liquidar)

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 FPGA's enlace

    
respondido por el JonRB
1

En general, la forma de hacerlo es con una tabla de búsqueda almacenada en una RAM de bloque. Por ejemplo, podría usar una tabla de 1024 entradas con entradas de 8 bits. Las entradas se calcularán con sin o cos y se almacenarán en la RAM en un bloque inicial. Luego usaría un acumulador de fase para leer las muestras de la RAM en el momento correcto y enviarlas al DAC. Si necesita una resolución muy alta, necesita una tabla con muchas entradas y puede volverse demasiado grande para caber en la memoria RAM del bloque FPGA. En ese caso, es posible utilizar una tabla de búsqueda comprimida. Una tabla comprimida almacena información que puede usarse para recrear muestras de una tabla de búsqueda mucho más grande. Este es 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 requiere menos de 2k entradas de tabla de búsqueda en 3 tablas de búsqueda: alexforencich / verilog-dsp / blob / master / rtl / sine_dds_lut.v "> enlace

    
respondido por el alex.forencich
0

Creo que estás confundido acerca de qué es una LUT (tabla de consulta).

Una LUT es solo una memoria inicializada con valores fijos que no cambian durante el comportamiento normal.

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

En el caso de una Sine Wave , puede inicializar, por ejemplo, una memoria de bloques de profundidad 1024 (debido a la gran cantidad de datos) para almacenar el resultado discretizado de un Ángulo de entrada de 10 bit de ancho. Es decir, para los 360 grados se calcula el resultado del seno para 1024 divisiones de ángulo y se usa este valor para inicializar su posición. Estos valores deben redondearse a la salida de ancho de bits, por lo que más precisión necesita más profundidad y ancho de salida y más memorias de bloque del FPGA que debe consumir.

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

Para hacer esto, puede usar un Asistente de núcleo de su proveedor de FPGA o buscar una plantilla HDL para definir una memoria de bloque inicializada que podría ser interpretada correctamente por el sintetizador.

Y como paso final, puede usar un DAC para pasar un valor digital de la LUT a un voltaje. Cuanto más grande sea la memoria, mayor será la resolución de esta onda sinusoidal "analógica".

Eso es todo. Buena suerte

    
respondido por el David Quiñones

Lea otras preguntas en las etiquetas