¿Cómo minimizar el tamaño de un microcontrolador implementado en un FPGA?

5

Tengo 1500 líneas de datos de 16 bits que necesitan procesamiento. Diseñé un microcontrolador para ejecutar un algoritmo de procesamiento de datos en el conjunto de datos. Funciona bien cuando el número de líneas es pequeño (< 100), pero explota rápidamente a medida que aumenta.

¿Cómo trata normalmente una gran cantidad de datos mientras mantiene un área pequeña? Tenga en cuenta que tengo una experiencia limitada en la implementación de FPGA en general.

    
pregunta geft

2 respuestas

13

Supongo que está realizando una operación de procesamiento de datos en 1500 palabras de 16 bits.

En general, los FPGAs permiten el intercambio de área reducida por velocidad reducida y mayor complejidad.

Digamos que su algoritmo era autocorrelación, que es algo que tiene una complejidad 2 y volaría a 100 elementos pero tomaría para siempre a 1500 elementos (225 veces más).

En un FPGA podría diseñar un módulo pequeño que contendría un contador de muestra, un contador de compensación y un acumulador. El contador de muestra aumentaría una vez por cada ciclo de reloj, el contador de compensación aumentaría una vez por cada bucle del contador de muestra. El contador de la muestra sería una dirección en los datos, y el contador de la muestra + offset sería la otra dirección. El producto de los dos se añadiría al acumulador. Al final del bucle de contador de muestra, el resultado se escribiría en el búfer de datos de salida y el acumulador se borraría.

Esta es probablemente la implementación de área mínima. Si es lo suficientemente rápido, genial, pero si no tiene la flexibilidad que no tenía en el microcontrolador. Puede canalizar el diseño para asegurarse de obtener una acumulación múltiple por reloj. Puede asegurarse de utilizar bloques de bloque y multiplicadores de disco duro para obtener Fclk más rápido desde las herramientas de sintetizador / lugar y ruta. Finalmente, puede aumentar el paralelismo, a costa de área. Podría agregar un multiplicador adicional para realizar más de una operación a la vez. Esto duplicará el rendimiento, pero también duplicará el ancho de banda de la memoria.

Todo esto es mucho más difícil que escribir el código del microcontrolador, pero tiene tantos grados de libertad, que puede converger en una solución óptima.

    
respondido por el Kevin Moore
6

En términos generales, la forma en que se diseñan los FPGA si sus datos se almacenaron en una memoria tipo RAM y el procesamiento se realizó con un microcontrolador simple, el único aumento que debe ver en el tamaño del procesador debe ser el ancho de direccionamiento y las señales / módulos relacionados (IE cache).

Los controladores generalmente están diseñados para escalar bien con el aumento de los espacios de memoria; después de todo, su procesador Intel puede usar 4, 8 o 16 GB de memoria con la misma arquitectura, por lo que están relacionados, pero solo de la siguiente manera: Para acceder individualmente a 1500 elementos requiere log2 (1500) = 11 bits de direccionamiento, 100 líneas (7 bits). Dicho esto, la cantidad de bits requeridos es menos que el doble, por lo que esto no tiene en cuenta la "explosión" descrita, por lo que el problema probablemente reside en cómo se almacenaron los datos (IE no RAM como acceso paralelo / accidente de codificación), etc.

Dos ideas generales:

1) Que FPGA es un conector generalista de todos los comercios y no es óptimo para almacenar datos grandes (la forma en que DRAM es al menos).

2) Que la codificación RTL para FPGA no es como escribir software para procesadores. Usted escribe RTL para utilizar las funciones FPGA y las adapta a los patrones que necesita (si es posible), desafortunadamente, lo que sucede a menudo es que si escribe RTL que no se adapta bien a la funcionalidad del FPGA, el software "ayudará" Usted y encuentra una manera de hacer lo que pidió, o tratar de fallar, y luego a menudo no comunica la naturaleza del resultado de una manera humanamente comprensible. El software siempre está interpretando lo que realmente desea, por lo que siempre debe verificar que esas suposiciones fueron precisas (leer registros e informes de la herramienta).

Es muy útil si puede dibujar o conceptualizar de alguna manera su diseño en puertas o, preferiblemente, en cortes y chanclas. Si puede hacer eso, probablemente pueda obtener una idea aproximada de cuántos recursos puede esperar que utilice. Si puede visualizar el hardware y entender cómo su idioma (Verilog o VHDL) define ese hardware, es más probable que escriba un código que las herramientas interpretarán correctamente (pero, de todos modos, lea los informes de recursos como un halcón). Obviamente, Roma no se construyó en un día y esto requiere práctica.

Entonces, en línea con la filosofía de "utilizar el hardware que existe", considere cómo se almacenan sus 1500 líneas en el FPGA. Si se almacenan como bits en flip flops de 1500 * (ancho de datos), quemará sus recursos.

las memorias eficientes en los FPGA tienen una estructura rígida y esto significa que su controlador puede tener un espacio de memoria de 1500 palabras, pero que solo debería ser accesible 1 dirección (a veces 2 direcciones) en una memoria a la vez porque esa es una de las Maneras en que puedes implementarlo eficientemente. Cuando restringe el problema de esta manera, el FPGA puede, a menudo con ayuda de la herramienta (IE ip catalog, otros), implementar una memoria eficiente (ejemplo BRAM). Para conjuntos de datos más grandes, las personas generalmente usan memorias reales que están fuera del FPGA en su tablero cuando sea necesario y práctico. Es posible que este no sea el patrón de acceso que desea, pero es el que generalmente se escala en muchos casos. Si, por ejemplo, está intentando diseñar un estilo de acceso diferente para sus datos, por ejemplo, CAM (memoria accesible) hacerlo en cualquier plataforma es muy costoso en términos de puertas y puertas en términos relativos.

    
respondido por el tjester

Lea otras preguntas en las etiquetas