VHDL / FPGA ¿Debo bloquear una matriz en matrices de dimensiones con potencias de 2?

0

Estoy construyendo una pantalla VGA con un Xilinx FPGA. No estoy exactamente seguro de cuál es la mejor manera de almacenar marcos VGA. La resolución es de 640x480. Debo usar una matriz 2D 640x480 o un bloque 640x480 en lo siguiente:

  1. [256x512 256x128]
  2. [128x512 128x128]
  3. [64x512 64x128]
  4. [32x512 32x128]

cada bloque 2 ^ N X K representa una RAM de bloque con una dirección de N bits y una palabra de K bits.

En realidad, cada color es de 8 bits, por lo que el ancho de las palabras terminará 8 veces más.

O mejor aún, ¿cuáles son mejores formas de construir esta memoria?

    
pregunta A__A

1 respuesta

2

Leí su pregunta como: ¿debería (a) implicar un RAM de búfer de cuadros de 640 x 480 x 8 bits usando una matriz y dejar que la herramienta de síntesis la resuelva en RAM de Bloque; (b) cree una instancia directa de las RAM del Bloque para crear la RAM de la memoria intermedia de cuadros y elija el ancho de bits o el tamaño de las RAM del Bloque para construirlas.

En primer lugar, con FPGA RAM que es tan flexible en el ancho de bits, puede elegir un ancho que se pueda leer y escribir de manera conveniente ya buena velocidad. Se comparte un búfer de cuadros entre al menos dos maestros de bus: la CPU / DMA / GPU que coloca las imágenes en él y el controlador de pantalla que lee los píxeles y los envía a la pantalla (los llamaré Dibujar y Mostrar).

Cuanto más frecuentemente cada uno accede al buffer de cuadros, menos tiempo obtiene cada maestro en general. Tiene sentido hacer que la interfaz de Draw sea tan ancha como el bus de datos del Draw. Para la interfaz de pantalla, cuantos más bits obtenga en una lectura, más píxeles obtendrá y más tiempo podrá seguir funcionando solo hasta que necesite volver a leer. Si la pantalla obtiene 64 bits por lectura, leerá ocho veces menos que si obtiene 8 bits por lectura.

Entonces, tus primeros cálculos comenzarán con Draw y lo que estás tratando de mostrar (si no estás mostrando un texto que cambia con poca frecuencia, no necesitarás una interfaz tan rápida como para los juegos). Si Draw tiene una interfaz de 32 bits, puede considerar Mostrar con una interfaz de 32 bits. Luego, sobre la base de una lectura por reloj lógico CLK, puede calcular cuántas lecturas necesitará la pantalla para leer el búfer de cuadros por, digamos, cuadro (o por línea ... o por 'n' CLK ... lo que sea parece relevante para usted). Entonces sabrá cuántas lecturas / escrituras están disponibles para Dibujar en ese período. Si no es suficiente, considere hacer que la RAM tenga el doble de bits de ancho para que la pantalla necesite leer la mitad de la frecuencia. (Eso puede complicar la interfaz Draw para que necesite lectura-modificación-escritura para escrituras si la memoria RAM FPGA no admite escrituras de bytes en ese ancho, pero una cosa a la vez). Calcule para eso y si es insuficiente, considere cuatro veces más ancho ... y así sucesivamente.

Entonces, todo eso fue para llevarte a un punto en el que tienes tu arreglo de búfer de fotogramas ...

Para implementar el RAM del buffer de cuadro en VHDL, personalmente crearía una entidad llamada FRAME_BUFFER_RAM con una interfaz para Draw y otra para Display. Esto mantiene la parte específica de la tecnología dentro de ese archivo de diseño, por lo que si cambia los FPGA, solo tiene un archivo para considerar el cambio.

Dentro de esa entidad, crearía una instancia de las RAM del bloque directamente porque querría un control directo sobre la cantidad de RAM que se utiliza y en qué disposición. Normalmente, el bloqueo de RAM es una cosa preciosa y, al no saber en qué dispositivos podría instalarse en el futuro o qué más contendrán, siempre lo uso lo menos posible.

Espero que esto ayude y aborde la pregunta que estaba haciendo.

    
respondido por el TonyM

Lea otras preguntas en las etiquetas