¿Por qué no SRAM para FPGA en el procesamiento de imágenes?

Estoy comenzando con la codificación VHDL y he realizado un procesamiento básico de imágenes en mi placa de desarrollo.

He notado que la mayoría de las placas de desarrollo FPGA a menudo usan DRAM (SDRAM, DDRAM) como RAM. Por ejemplo, estoy usando una placa de desarrollo FPGA de TERASIC y usa DRAM. Aunque la memoria DRAM parece ser más barata que la SRAM (RAM estática), desde mi punto de vista no está optimizada para el procesamiento de imágenes, déjame explicarte: a los datos DRAM se accede por bloque, a los datos SRAM se puede acceder (direccionar) byte a byte ( o palabra por palabra, o 36 bits a la vez, lo que sea). Esta función se adapta más al procesamiento de imágenes, por ejemplo, un filtro medio simple donde un píxel es la media de su vecino, digamos

Pix(x,y) = (Pix(x-1,y-1) + Pix(x,y-1) + Pix(x+1,y-1) + Pix(x-1,y) + Pix(x,y) 
           + Pix(x+1,y) + Pix(x-1,y+1) + Pix(x,y+1) + Pix(x+1,y+1))/9

es difícil de hacer con DRAM, necesita tener un búfer interno de al menos dos líneas para memorizar líneas y-1y y(hacer el procesamiento en la y+1línea). También parece que a Quartus le toma una gran cantidad de tiempo hacer este procesamiento simple (estoy usando FIFO de 2 puertos).

Si la placa hubiera utilizado SRAM como IS61LPS25632A de ISSI, por ejemplo, el procesamiento sería sencillo ya que la dirección de un píxel puede ser, por ejemplo

ByteAdress <= x + (LINEWIDTH*y);

Desde el punto de vista del hardware, con 9 ciclos de reloj de memoria de lectura/escritura, el proceso se realiza para una imagen y, con algunos trucos en el procesamiento paralelo, supongo que se puede mejorar. Entonces, ¿es cierto mi entendimiento? Si no, ¿dónde está el error?


EDITAR:

Usar RAM FPGA interna no es una opción para mí ya que no hay suficiente memoria dentro del dispositivo FPGA que uso (Cyclone III) y no sé si pagar por un kit de desarrollo más caro solo para tener más RAM dentro de FPGA es juicioso .

Mi pregunta está más relacionada con la eficiencia del código. Digamos por ejemplo que uno tiene 8MB de SRAM. Desde mi punto de vista, el código producido con este tipo de RAM será más eficiente (velocidad y almacenamiento en búfer) en el caso del procesamiento 2D (como el procesamiento de imágenes) porque el verdadero acceso aleatorio es adecuado para acceder a datos con (gran) desplazamiento entre entonces, como en esta declaración:

ByteAdress <= x + (LINEWIDTH*y);

Reorganizar la información lleva mucho tiempo. Uso una cámara que emite píxeles de datos secuencialmente, línea por línea. Solo puedo almacenar estos datos en un componente FIFO RAM de dos puertos construido con DRAM. No puedo hacer ni siquiera una simple transposición antes de almacenar los datos con esto. Sorprendentemente, no encontré ningún código en la web que se ocupe de este problema 2D.

Quizás pueda mencionar si tiene un problema de latencia. es decir, ¿puede tener un retraso de 1 cuadro en su transmisión de video o no? Si puede, entonces todo lo que dice @DaveTweed le conviene y es típico para el procesamiento de video en tiempo real.

Respuestas (3)

No hay razón fundamental por la que no. La SRAM síncrona es un acceso verdaderamente aleatorio, bastante económico y fácil de conectar.

Su desventaja es que ocupa un nicho bastante estrecho entre BlockRam en el chip (no mucho más pequeño, gratuito hasta que lo obligue a seleccionar un chip más grande, masivamente paralelo y más flexible) y DRAM externa (capacidad de almacenamiento masiva a un precio que SSRAM puede no coincide).

Por lo tanto, hasta 0,5 o 1 MB, la SSRAM externa es innecesaria, y por encima de 8 MB o 16 MB (¡los números pueden variar según su presupuesto y los precios actuales!), la SSRAM se vuelve lo suficientemente costosa como para que la DRAM se haga cargo a pesar de sus límites. Luego, si necesita acceso aleatorio, debe reorganizar masivamente el cálculo para leer fragmentos (ráfagas o páginas) de DRAM en BlockRam, donde puede procesarlo rápidamente antes de volver a escribir ráfagas, etc.

Pero si tiene una función para SSRAM dentro de esa ventana, hágalo. He agregado tableros SSRAM caseros simples para aumentar las plataformas FPGA comerciales donde sea necesario.

SDRAM es en realidad una muy buena opción para el procesamiento de imágenes, porque tanto la capacidad como el ancho de banda (especialmente con DDR) son mejores que los de SRAM. Junto con el uso de la SRAM en el chip de la FPGA como búfer de línea, permite canalizar prácticamente cualquier cálculo de imagen completa (incluido el FIR 2D que proporciona como ejemplo) hasta el punto en que puede procesar un píxel por reloj. Si está trabajando con video HD en tiempo real, poder hacer esto es esencial.

No descarte la importancia de la capacidad. Los sensores de imagen modernos están en el rango de múltiples megapíxeles para video y decenas de megapíxeles para imágenes fijas. En muchas aplicaciones, se requieren múltiples búferes de cuadros que tienen de 4 a 6 bytes por píxel, para cosas como datos de corrección por píxel y procesamiento de imágenes de ping-pong. La memoria total requerida supera rápidamente lo que se puede implementar económicamente con SRAM.

Incluso si solo le interesan las imágenes fijas, los kits de desarrollo están diseñados para admitir una gama más amplia de desarrollo de aplicaciones. Por cierto, tengo una placa Terasic que tiene DDR SDRAM y ZBT SSRAM.

Como hay SSRAM DDR y QDR (2 puertos), no estoy seguro de que eso sea cierto para el ancho de banda. El punto sobre el uso de RAM en el chip como almacenamiento en línea, el tipo de reorganización que estaba insinuando, es crucial para usar DDR de manera efectiva.
@BrianDrummond: Sí, el problema del ancho de banda puede ser un problema, pero el problema de la capacidad suele ser más importante. Ver mi edición de arriba.
no hay argumento allí! Como dije, la ventana donde gana SSRAM es bastante estrecha. Encontré conveniente tener SRAM y DRAM para diferentes propósitos.

Tanto SRAM como DRAM creo que es necesario.

para la máscara de esfuerzo en la imagen, SRAM es útil debido a la convolución. pero almacenar el resultado de la imagen Dram es eficiente.