Creación de perfiles para los requisitos de FPGA para una cámara de alto rendimiento

Me gustaría saber cómo crear perfiles de una tubería de adquisición y almacenamiento de imágenes en un sistema basado en FPGA, capturar imágenes de un sensor de imagen CMOS a través de la interfaz LVDS, realizar un procesamiento básico de imágenes y luego almacenar los datos en dos SSD.

Estoy hablando de 100 fps, 11,94 megapíxeles, 16 bits por píxel, por lo que el ancho de banda es bastante grande: no se trata de las cámaras clásicas a las que estamos acostumbrados.

¿A qué te refieres con "perfilar"?
Comprender cuántos recursos necesito para una determinada tarea, para poder saber qué FPGA SoC elegir.
Veo de dónde viene, aunque la elaboración de perfiles no es realmente el término correcto aquí. Los FPGA no están programados en el mismo sentido que una computadora. Usted describe qué hardware se requiere usando el código, luego lo sintetiza usando la cadena de herramientas del proveedor específico cuyo FPGA está apuntando, y eso le indicará la utilización de recursos del diseño. Los diseños de FPGA no cambian dinámicamente, por lo que realmente no se perfila.
"algún procesamiento básico de imágenes" es una frase notablemente opaca.
Lo lamento. Estoy hablando de la sustracción de cuadros oscuros, la sustracción de FPN y tal vez un procesamiento de ruido básico.
Para FPN de 100fps y 11.94Mp, necesita 2x1194M 16bits MAC/s más al menos 1x16bit acceso a memoria de 1194M acceso por segundo para cada operación de lectura y escritura.

Respuestas (3)

El ancho de banda de datos que mencionó es ciertamente parte del cálculo, pero solo el comienzo: el FPGA y el módulo de la cámara necesitan una interfaz compatible que pueda alcanzar la velocidad requerida.

Si su canal de procesamiento se puede realizar depende en gran medida de su definición de "procesamiento básico de imágenes". Idealmente, su algoritmo es paralelizable para que pueda crear múltiples instancias y optimizado para el uso de recursos de FPGA para evitar quedarse sin recursos limitados como multiplicadores.

El uso de recursos en FPGA no siempre es lineal, por lo que cinco copias de la misma lógica pueden usar diez veces más LUT que cuatro copias, simplemente porque se quedó sin algunos bloques "especiales" y la quinta instancia intenta emularlos, o porque una instancia debe envolverse alrededor de un bloque especial.

Hablando en abstracto: siempre puede compilar y simular su diseño con la cadena de herramientas del proveedor de FPGA, incluso sin el hardware real. Si las restricciones se especifican correctamente y la síntesis tiene éxito sin mostrar errores de tiempo, entonces también debería ejecutarse; no hay una reasignación dinámica de recursos que haría que el comportamiento fuera impredecible a menos que lo agregue explícitamente (lo que puede ser necesario, por ejemplo, para compartir unidades multiplicadoras) .

Sin embargo, la interpretación de errores de compilaciones de FPGA y la optimización de diseños son temas bastante complejos sobre los que se han escrito libros completos. El compilador que informa sobre la falta de recursos podría significar que necesita un FPGA más grande con más tablas, o que necesita reescribir el algoritmo, o ambos.

Veo de dónde viene, aunque la elaboración de perfiles no es realmente el término correcto aquí. Los FPGA no están programados en el mismo sentido que una computadora. Usted describe qué hardware se requiere usando el código, luego lo sintetiza usando la cadena de herramientas del proveedor específico cuyo FPGA está apuntando. Luego obtiene un informe de síntesis que le indicará la utilización de recursos del diseño. El hardware de FPGA no cambia dinámicamente, es decir, conoce el uso exacto de los recursos en el momento de la compilación y, por lo tanto, no lo "perfila".

Además, ¿te refieres a FPGA o FPGA SoC? Los dos son diferentes. Algunos FPGA tienen un procesador duro integrado (SoC). Otros no. Si planea intentar hacer esto en software en un procesador integrado (soft o hard) en el FPGA frente a la lógica dedicada, la respuesta es muy diferente.

Para agregar a la respuesta de Simons, es virtualmente imposible decir qué recursos usará cualquier diseño dado simplemente porque depende no solo del diseño, sino también de muchos otros factores, como la familia específica si FPGA está usando, qué parte del FPGA está utilizando y las velocidades de reloj a las que se está ejecutando. De hecho, puede cambiar una línea de código que parece intrascendente y, cuando vuelve a compilar, la disposición completa del diseño y la utilización de recursos pueden cambiar drásticamente debido en parte a las optimizaciones de síntesis.

Para los diseños de FPGA, generalmente lo que hace es comenzar a diseñar la lógica y los algoritmos que planea usar primero. Elija un proveedor (p. ej., Altera, Xilinx, etc.) y comience a realizar compilaciones de prueba de partes de su diseño. Para empezar, puede elegir cualquier familia de FPGA, es solo para tener una idea de cuántos recursos se requieren en varias familias de FPGA diferentes (puede probar más de una).

Una vez que tenga una idea de lo que se requiere, puede ver los requisitos de funciones especiales. Necesitará bloques LVDS SERDES y PLL para la interfaz de su cámara, así que observe qué velocidades admite cada familia. Además, si está haciendo muchas cosas de multiplicación y DSP que parece que está haciendo, querrá ver familias que tienen una gran cantidad de recursos DSP (multiplicadores de hardware, etc.).

Una vez que tenga una idea de qué familia va a elegir, comience a diseñar su código en torno a esa familia. Realice más compilaciones de prueba con fragmentos cada vez más grandes de su diseño. Esto le dará una estimación aproximada de los requisitos de recursos que necesitará en su diseño final, y luego podrá decidirse por un FPGA específico: cuanto más grandes sean, más caros serán, por lo que realmente no querrá ir con uno que tiene cientos de veces más recursos de los que necesita, pero igualmente no desea optar por uno demasiado pequeño para que el diseño encaje.

Idealmente, desea apuntar a un FPGA que su diseño utilizará alrededor del 70% o menos. El uso de recursos aumenta a medida que usa más y más del diseño debido a la duplicación lógica para cumplir con el tiempo y también con la congestión de enrutamiento (demasiadas cosas que intentan caber en un espacio demasiado pequeño). ¿Por qué el 70%? bueno, eso es solo una suposición aproximada: a veces, incluso si solo está utilizando una pequeña fracción de los recursos, puede tener problemas si todos esos recursos intentan estar en el mismo lugar en el diseño (debido a requisitos de tiempo, etc.). ) lo que da como resultado una utilización máxima mucho mayor.

Entonces, ¿tengo que comenzar a escribir el código usando el IDE y luego ver los recursos necesarios?
@ user6401990 no mira tanto los recursos necesarios, compila el diseño y le dirá lo que se requiere. Piense en ello como cuando crea un programa para un microcontrolador: el compilador le indicará el uso de flash y los requisitos de memoria estática. La herramienta de síntesis le indicará el uso de LUT, el uso del bloque DSP (si lo hay), el uso del bloque RAM (si lo hay), el uso del pin, el uso del transceptor, etc.
eso tiene sentido para mí, gracias! Sin embargo, dado que ahora estoy comenzando con FPGA, debo elegir un proveedor y una familia para invertir dinero y tiempo en él (digamos: ALTERA, Cyclone V SoC) para poder comprar una placa de desarrollo y comenzar a codificar con el IDE específico del proveedor. .
@user6401990 la belleza de los FPGA es que no necesita comprar hardware de inmediato. Puede hacer una gran cantidad de diseño con simulación incluso antes de tener que considerar qué familia de FPGA va a utilizar. Para la serie Cyclone, por ejemplo, Quartus (cadena de herramientas Altera) es gratis. Entonces puede configurar eso y comenzar a desarrollar código. Una vez que tenga una idea de los recursos que necesitará, puede mirar el hardware real.

¡Trabajé en una empresa que quería diseñar una cámara 4K a 300 fps usando un FPGA de bajo costo!

El proyecto no era realista debido a muchos problemas que no tuvieron en cuenta en la planificación de su producto.

La dificultad de diseñar una cámara, especialmente una 'gama alta' es principalmente el ancho de banda de la memoria y la cantidad de memoria a la que tienes acceso.

Si desea capturar un sensor de imagen de 12 MP a 100 fps y 16 bits, necesitará 12e6x100x16 = 1,92e10 bits/seg para la interfaz hacia la cámara.

El problema comienza después de eso, debe elegir capturar los datos y procesarlos tal como están, o convertirlos a RGB, lo que triplicará la cantidad de datos que tiene, además necesita una gran cantidad de operaciones matemáticas y debe mantener en menos 3 líneas de datos en una memoria para poder manejarla.

El siguiente paso depende de lo que desee hacer con los datos, si desea realizar un filtro de corriente oscura o cualquier otro filtrado que requiera una cantidad significativa de operaciones matemáticas y de memoria.

El GRAN problema es cuando quieres almacenar los datos. Puede elegir comprimir la imagen o guardarla en formato RAW. Ambos tienen ventajas y desventajas, el ancho de banda de recursos siempre es una elección difícil que se debe hacer al diseñar un producto de tan alto rendimiento.

No creo que sea fácil responder a su pregunta, pero es posible diseñar un producto de este tipo utilizando un FPGA de alta gama, pero el precio será bastante alto (en mi opinión)

Creo que la compañía mencionada tenía la intención de comprimir los datos, y no creo que quisieran datos de 16 bits o incluso de 12 bits o 10 bits. Estoy hablando de datos no demostrados de 16 bits almacenados directamente en dos SSD. Mi principal problema es el ancho de banda (de la cámara a la FPGA y de esta al almacenamiento). Quiero mantener todo lo más simple posible para mantener los costos lo más bajos posible. ¿Me podrías dar una idea de tu experiencia? ¿El requisito era datos de 4k a 300 fps? ¿8 bits sin mostrar? ¿Interfaz LVDS? ¿Qué hay de la compresión y el almacenamiento? ¿Qué familia de FPGA no fue suficiente?
Bueno, la mayoría de los FPGA de gama alta usan líneas LVDS de 300 o 600 Mbps (algunos admiten velocidades más altas, pero no estoy familiarizado con ellos). cualquier familia moderna de Xilinx FPGA puede manejar datos de 12Mp/100fps. Para SSD, ¿estás hablando de SATA 3.2? ¡Porque con SATA 3, el rendimiento teórico máximo es 1.2e10bps para 2 discos! ¿Cómo puede guardar datos de 1.92e10bps en esos 2 discos sin compresión?
oh... la ultima vez que hice calculo fue para 16bit, 3.69 MP, 100 fps... Debo reconsiderar como solucionarlo, tal vez aumentando SSDs (no me importa si el tiempo de grabacion se divide por la mitad) o probando para implementar la compresión wavelet
Ah, ok, esa es una historia TOTALMENTE diferente. ¡Es una GRAN diferencia entre 3.69Mp y 11.94Mp! Debe recordar que necesita tener un controlador SATA para cada dispositivo SATA, y necesita tener transceptores de 6 Gbps para los canales SATA, ese será uno de los factores más importantes al elegir su FPGA. Con esa especificación, puede hacerlo fácilmente con un dispositivo Kintex 7 y usar la placa de evaluación Kintex 7: xilinx.com/products/boards-and-kits/ek-k7-kc705-g.html luego debe buscar un Placa HMC con varios conectores SATA.