Estoy comenzando con la codificación VHDL y he hecho un procesamiento básico de imágenes en mi placa de desarrollo.
Me he dado cuenta de 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, permítanme explicar: Se accede a los datos DRAM por bloque, se puede acceder a los datos SRAM (direccionados) byte por 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 de media simple donde un píxel es la media de su vecino, por ejemplo,
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 las líneas y-1
y y
(haciendo el procesamiento en la línea y+1
). También parece que Quartus tarda mucho tiempo en hacer este sencillo proceso (estoy usando 2ports FIFO).
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 un punto de vista de 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 en paralelo, se puede mejorar, supongo. Entonces, ¿es cierto mi entendimiento? Si no, ¿dónde está el error?
EDIT:
El uso de la 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 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 muy adecuado para acceder a datos con (gran) compensación entre entonces, como en esta declaración:
ByteAdress <= x + (LINEWIDTH*y);
La reorganización de la información requiere mucho tiempo. Yo uso una cámara que genera píxeles de datos secuencialmente, línea por línea. Solo puedo almacenar estos datos en dos puertos FIFO RAM componente 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.