Modulador BPSK con DDS en FPGA

Estaba desarrollando un modulador BPSK con un AD9852. Dado que AD no parece ofrecer ninguna forma de simular funcionalmente sus circuitos integrados DDS, de repente me veo en la necesidad de cambiar por una arquitectura FPGA. Todavía no he trabajado con un FPGA o VHDL. Después de investigar un rato, se me ocurrieron un par de preguntas (más bien muchas) sobre las arquitecturas FPGA y DDS:

1) ¿Qué tan rápido puede ir el reloj de referencia interno en el FPGA? ¿Se puede dividir internamente para obtener un reloj de referencia más alto?

2) ¿Es posible hacer un DAC interno en el FPGA?

En caso de que no lo sea, ¿se puede enviar el reloj de referencia interno a un DAC externo? ¿Cómo se puede arreglar el retraso de la tubería en este caso?

En caso de que ambos sean posibles, ¿cuál sería el recomendado?

3) En varios proyectos con FPGA, el modulador se simplifica usando el DDS para generar la frecuencia portadora, luego multiplexarla con su complemento y la entrada de datos binarios. En los esquemas tradicionales, la modulación de fase se realiza a la salida del acumulador de fase, antes de la LUT. ¿Cómo se puede hacer esto en la práctica (por lo que puedo ver con las herramientas FPGA, la mayoría de estos bloques ya están disponibles).

Además, la LUT se puede reducir explotando la simetría de onda sinusoidal hasta un cuarto o simplemente eliminándola y aplicando el algoritmo CORDIC. ¿Cómo se puede hacer este truncamiento de fase? en el caso de CORDIC, ¿hay un bloque CORDIC implementado para esto?

Por cierto, pregunta tonta. ¿Se deben calcular los valores LUT para cada palabra de sintonización de frecuencia en el acumulador de fase o solo depende del reloj de referencia (en cuyo caso, se debe calcular para una frecuencia de referencia específica)?

4) ¿Es posible hacer cálculos de punto flotante DSP en FPGA? Soy consciente de que hay algunas placas integradas con ARM cortex.

Finalmente, ¿qué modelos/placas de FPGA recomendaría para esta aplicación en particular (también teniendo en cuenta que tengo un presupuesto limitado)?

Soy consciente de que estas son muchas preguntas, pero cualquier ayuda sobre estos problemas sería apreciada.

gracias de antemano

Sin saber a qué frecuencias está operando y qué FPGA tiene, estas preguntas son difíciles de responder.
¿Qué frecuencia portadora/frecuencia planea usar? ¿Y a qué velocidad de datos estás tratando de transmitir?
Dado que AD no parece ofrecer ninguna forma de simular funcionalmente sus circuitos integrados DDS, de repente me veo en la necesidad de cambiar por una arquitectura FPGA. Me perdiste con esta declaración. ¿Por qué necesitas simular?

Respuestas (1)

1) El reloj de referencia puede ir tan rápido o tan lento como desee. La mayoría de los FPGA tienen PLL incorporados que pueden convertir un reloj de referencia externo en cualquier frecuencia que necesite (dentro de lo razonable). Entonces, podría tomar una referencia externa de 10 MHz y multiplicarla hasta 100, 150, 200 MHz, etc.

2) No, los FPGA no contienen DAC. Puede ser posible construir un DAC R-2R, pero si desea ejecutar a una frecuencia de muestreo alta, entonces puede ser recomendable usar un DAC externo de alto rendimiento con una amplia interfaz paralela o incluso serial de alta velocidad (no SPI, alta velocidad como en >1 Gbps por carril). Obviamente, un DAC necesitará un reloj de muestra, y generar esto en el FPGA es ciertamente posible. Si usa un flip flop DDR para generar el reloj, entonces debería coincidir exactamente con las muestras que se sincronizan en paralelo.

3) Agregar una compensación de fase después del acumulador de fase es simple: solo agregue un sumador entre los dos y agregue la compensación que necesita en cada ciclo.

En lo que respecta a una LUT, esa simetría es solo una cosa que puedes explotar. Si está de acuerdo con el uso de un par de segmentos DSP (multiplicadores), es posible comprimir una tabla equivalente muy grande (fase de 18 bits, amplitud de 16 bits) en 3 LUT pequeñas (~512 entradas). Esto utiliza la identidad trigonométrica sin(A+B) = sin(A) + cos(A)*sin(B) para reconstruir la onda sinusoidal a alta resolución. Consulte https://github.com/alexforencich/verilog-dsp/blob/master/rtl/sine_dds_lut.v para ver un ejemplo. Los valores LUT solo tienen que calcularse para la profundidad de bits requerida, selecciona la frecuencia que desea con la palabra de control de frecuencia.

4) Es posible, pero generalmente no es muy eficiente. Los FPGA están optimizados principalmente para punto fijo rápido y matemáticas enteras. Hay algunos que admiten punto flotante de hardware, pero estos son relativamente raros.