Tengo una transformación de procesamiento de señal particularmente grande que necesita ser portada desde matlab a VHDL. Definitivamente requiere algún tipo de intercambio de recursos. Un poco de cálculo me dio lo siguiente:
- 512 pies de 64 puntos
- 41210 operaciones de adición múltiple
Teniendo en cuenta que el mayor Virtex 6 FPGA tiene ~ 2000 bloques DSP48E, sé que puedo compartir recursos para reutilizar los recursos varias veces. El tiempo de ejecución no es realmente un problema, el tiempo de procesamiento puede demorar relativamente en términos de FPGA.
En cuanto al uso de recursos, el uso de la arquitectura lite de radix-2 me ofrece bloques 4dsp / operación FFT = 2048 bloques DSP, un total de ~ 43k. el mayor Virtex FPGA tiene 2k bloques, o 20 operaciones / mux.
Obviamente, la inclusión de tales grandes muxes en la tela también va a tomar rebanadas. ¿Dónde encuentro el límite superior de este límite? No puedo compartir infinitamente los recursos de FPGA. ¿Los multiplicadores 41210 son demasiado grandes? ¿Cómo calculo lo que es demasiado grande?
También he visto otros recursos (Slices, Brams, etc.). Radix-2 Lite también proporciona 4 x 18k brams / fft = 2048 brams. El Xilinx FPGA más grande contiene 2128 Brams. muy en el límite. Me preocupa que mi diseño sea demasiado grande.
ACTUALIZACIÓN:
Un poco más de información sobre el diseño en sí. No puedo entrar en detalles, pero esto es lo que puedo dar:
Initial conditions -> 512 ffts -> 40k multipliers ---------|----> output data to host
^------re-calculate initial conditions----|
especificación de datos de salida: "más rápido que la simulación matlab"
En cuanto a los cálculos, aquí es donde estoy:
FFT stage: fácil. Puedo implementar FFT de 1/2/4/8, almacenar los resultados en SDRAM y acceder más tarde. Relativamente pequeño, aunque tome mucho tiempo, está bien. usando radix-2 lite puedo obtener 2 DSP48E y 2 18k BRAMS / FFT. La transmisión da 6 DSP48Es 0BRAMS / FFT. en cualquier caso, la FFT de 64 puntos es pequeña en términos de recursos FPGA.
Multiplicadores : este es mi problema. Las entradas de multiplicación se toman de tablas de búsqueda o datos de FFT. Realmente es solo un montón de adiciones múltiples. No hay mucho que optimizar. No es un filtro, pero tiene características similares a un filtro.
Considerando los recursos compartidos en el FPGA, las matemáticas funcionan de la siguiente manera: Un LUT-6 puede usarse como un mux de 4 vías. La fórmula para una M-way, M bit mux es la siguiente:
N*M/3 = number of luts, or N*M/12 = slices (4 LUTS/slice).
crujir los números para mi implementación no da buenos resultados. El 90% de la familia virtix-6 no tiene suficientes segmentos para compartir los recursos de sus DSP con el fin de realizar operaciones de 40k.