Tengo una transformación de procesamiento de señal particularmente grande que debe trasladarse de matlab a VHDL. Definitivamente requiere algún tipo de intercambio de recursos. Un poco de cálculo me dio lo siguiente:
Teniendo en cuenta que el FPGA Virtex 6 más grande 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 ser relativamente largo en términos de FPGA.
En cuanto al uso de recursos, el uso de la arquitectura radix-2 lite me da 4 bloques dsp/operación FFT = 2048 bloques DSP, un total de ~43k. El Virtex FPGA más grande tiene 2k bloques o 20 operaciones/mux.
Obviamente, incluir muxes tan grandes en la tela también tomará porciones. ¿Dónde encuentro el extremo 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 buscado en otros recursos (Slices, Brams, etc.). Radix-2 Lite también ofrece 4 x 18k brams/fft = 2048 brams. El Xilinx FPGA más grande contiene 2128 Brams. muy límite. Me preocupa que mi diseño sea demasiado grande.
ACTUALIZAR:
Algo 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 tasa de datos de salida: "más rápido que la simulación matlab"
En cuanto a los cálculos, aquí es donde estoy:
Etapa FFT: fácil. Puedo implementar 1/2/4/8 FFT, almacenar los resultados en SDRAM y acceder más tarde. Relativamente pequeño, incluso si lleva mucho tiempo, está bien. usando radix-2 lite puedo obtener 2 DSP48E y 2 18k BRAMS/FFT. la transmisión proporciona 6 DSP48Es 0BRAMS/FFT. en cualquier caso, la FFT de 64 puntos es pequeña en términos de recursos de FPGA.
Multiplicadores : este es mi problema. Las entradas de multiplicación se toman de tablas de búsqueda o datos FFT. Realmente es solo un montón de multiplicaciones. No hay mucho que optimizar. No es un filtro, pero tiene características similares a un filtro.
Teniendo en cuenta el uso compartido de recursos en el FPGA, las matemáticas funcionan de la siguiente manera: un LUT-6 se puede usar como mux de 4 vías. La fórmula para un multiplexor de bits M de N vías es la siguiente:
N*M/3 = number of luts, or N*M/12 = slices (4 LUTS/slice).
procesar 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 a fin de realizar operaciones de 40k.
Me pregunto si hay otra forma de ver el problema.
Jugando con su estimación de 512 operaciones FFT (64 puntos cada una) y 42k operaciones MAC... ¿Supongo que esto es lo que necesita para pasar por el algoritmo?
Ahora ha encontrado un núcleo FFT que utiliza 4 unidades DSP... pero ¿cuántos ciclos de reloj se necesitan por FFT? (rendimiento, no latencia)? Digamos 64, o 1 ciclo por punto. Luego, debe completar esas 42k operaciones Mac en 64 ciclos, quizás 1k MAC por ciclo, con cada MAC manejando 42 operaciones.
Ahora es el momento de ver el resto del algoritmo con más detalle: identifique no las MAC sino las operaciones de nivel superior (filtrado, correlación, lo que sea) que se pueden reutilizar. Construya núcleos para cada una de estas operaciones, con reutilización (por ejemplo, filtros con diferentes conjuntos de coeficientes seleccionables) y pronto encontrará que se requieren relativamente pocos multiplexores entre núcleos relativamente grandes...
Además, ¿es posible alguna reducción de fuerza? Tuve algunos casos en los que se requerían multiplicaciones en bucles para generar cuadráticas (y superiores). Al desenrollarlos, pude generarlos iterativamente sin multiplicación: ¡estaba bastante satisfecho conmigo mismo el día que construí un motor diferencial en FPGA!
Sin conocer la aplicación, no puedo dar más detalles, pero es probable que algún análisis de este tipo haga posibles algunas simplificaciones importantes.
Además, dado que parece que no tiene una plataforma definida en mente, considere si puede particionar en múltiples FPGA ... eche un vistazo a esta placa o a esta que ofrece múltiples FPGA en una plataforma conveniente. También tienen una placa con 100 dispositivos Spartan-3...
(PD: me decepcionó cuando los chicos del software cerraron esta otra pregunta; creo que es al menos tan apropiado allí)
Editar: re su edición: creo que está comenzando a llegar allí. Si todas las entradas del multiplicador son salidas FFT o coeficientes "sin filtro", está empezando a ver el tipo de regularidad que necesita explotar. Una entrada a cada multiplicador se conecta a una salida FFT, la otra entrada a una ROM de coeficientes (BlockRam implementado como una matriz constante).
La secuenciación de diferentes operaciones FFT a través de la misma unidad FFT secuenciará automáticamente las salidas FFT más allá de este multiplicador. Secuenciar los coeficientes correctos en la otra entrada MPY ahora es "simplemente" una cuestión de organizar las direcciones ROM correctas en el momento correcto: un problema organizativo, en lugar de un gran dolor de cabeza de MUXes.
Sobre el rendimiento: creo que Dave Tweed estaba siendo innecesariamente pesimista: la FFT toma operaciones n * log (n), pero puede elegir O (n) unidades de mariposa y ciclos O (logN), o unidades O (logN) y O ( n) ciclos, o alguna otra combinación para adaptarse a sus objetivos de recursos y velocidad. Una de esas combinaciones puede hacer que la estructura de multiplicación post-FFT sea mucho más simple que otras...
Si este problema no tiene restricciones estrictas en tiempo real, y parece que no las tiene, solo desea que se ejecute "más rápido", entonces parece que podría ser bastante adecuado para la aceleración en una o más GPU. Hay varias bibliotecas de software que hacen que esta sea una propuesta relativamente sencilla, y esto sería un orden de magnitud más fácil que ir directamente al hardware FPGA personalizado.
Simplemente busque en Google "biblioteca habilitada para GPU" o "biblioteca acelerada por GPU" para comenzar.
¿Qué tan pequeño es el problema del tiempo de ejecución?
Esto realmente parece una situación en la que realmente debería implementar un MCU suave, un FPGA con un MCU duro integrado, o incluso un dispositivo MCU separado, y serializar todas sus operaciones.
Suponiendo que tenga el tiempo de ejecución, hacer sus FFT en el software será mucho más fácil de depurar y probablemente también mucho más simple de diseñar.
Es posible usar un hardware especializado o un FPGA (o incluso un CPLD) para acelerar en gran medida ciertos tipos de operaciones matemáticas. Lo más importante a tener en cuenta cuando se trata de diseñar hardware (circuitos o lógica FPGA) para acelerar las operaciones matemáticas es averiguar en qué orden los datos deberán entrar y salir de su dispositivo. Un dispositivo con un diseño de E/S eficiente puede ofrecer un rendimiento mucho mejor que uno con un diseño ineficiente, incluso si el último dispositivo requiere muchos más circuitos.
No he intentado elaborar un diseño de asistencia de hardware para una FFT, pero uno que he analizado es la asistencia de hardware para operaciones de multiplicación grandes (como podría usarse para el cifrado RSA). Muchos microcontroladores, incluso aquellos con hardware especial de multiplicación rápida, no son muy eficientes en este tipo de operaciones porque requieren una gran cantidad de cambios de registros. El hardware diseñado para minimizar el intercambio de registros podría lograr un rendimiento mucho mejor con operaciones de multiplicación de precisión múltiple, incluso si el hardware en sí no fuera tan sofisticado. Por ejemplo, el hardware que puede realizar una multiplicación de 16xN canalizada dos bits a la vez (desplazando dos bits inferiores de multiplicación y desplazando dos bits superiores de resultado) puede lograr un mejor rendimiento que el hardware que puede realizar una multiplicación de 8x8 en un ciclo. aunque el primero puede requerir menos circuitos (y, en virtud de la canalización, tiene una ruta de datos crítica más corta). La clave es descubrir cómo se verá el "bucle interno" del código necesario y averiguar si hay alguna ineficiencia que pueda eliminarse fácilmente.
chris stratton
el fotón
Gustavo Litovsky
Stanri
el fotón
el fotón
Stanri
el fotón
Stanri
Stanri
el fotón
david tweed
Kortuk
carajo
mult_in <= mux[n]
wheren
se incrementa en uno en cada ciclo se puede minimizar de forma masiva.