Un framebuffer es básicamente una gran parte de RAM. Generalmente mucho más grande que un FPGA tiene internamente.
Así que necesitarás:
- Alguna RAM (su placa puede tenerla a bordo, de lo contrario tendrá que encontrar alguna forma de cablearla) - suficiente para mantener su framebuffer a la profundidad deseada
- Código para interactuar con la RAM que desea (ese código depende de su tecnología RAM) DDR necesita una dirección IP especial de DDR, la SRAM es más simple (aunque más costosa) y tiene una interfaz mucho más simplista. La RAM ideal, sin embargo, sería VRAM de doble puerto.
Su código VGA se lee desde un puntero de dirección incremental en la RAM para mostrarlo en la pantalla indexada por el reloj de píxeles y la línea de escaneo (esos son sus valores de COLUMNA y FILA). Solo la parte visible de la pantalla necesita leer realmente desde la RAM (el bit que es un cuadrado de color en este momento).
Para obtener datos en el framebuffer, debe escribir en la RAM. La ubicación en la RAM para un píxel es la misma que se lee desde esa ubicación en la pantalla. Entonces, si tiene una pantalla de 640x480 con una profundidad de 8 bits, que es un tamaño de RAM de 307200 bytes, la posición del píxel (200,100), compensada desde la esquina superior izquierda del área visible de la pantalla, sería 200 + (100 * 640), es decir, 100 filas de 640 píxeles para llegar al inicio de la fila 100 (basada en 0) más otros 200 píxeles para llegar al píxel 200 dentro de esa fila.
No es posible leer y escribir en la memoria RAM al mismo tiempo. Por lo tanto, depende de usted decidir cómo y cuándo intercalar las escrituras en las lecturas. Tienes poco control sobre cuándo se lee (la interfaz VGA determina eso para ti por el reloj de píxeles), pero cuando escribes depende totalmente de ti. Muchos sistemas limitarán la escritura solo al período en blanco. Algunos que son lo suficientemente rápidos pueden intercalar la escritura entre la lectura de píxeles sucesivos. Sin embargo, necesitas RAM muy rápida para eso. Esta es la razón por la que recomendé VRAM de doble puerto (que es raro y costoso), que le permite leer y escribir al mismo tiempo y se ocupa de la intercalación para usted (el "doble puerto" significa literalmente que obtiene dos interfaces de bus a ello).
Si tiene algo de bloque-RAM en su FPGA (los Spartans a menudo hacen IIRC), entonces puede usar eso para el búfer de línea, es decir, en el período de supresión horizontal de una línea, lee todos los datos de esa línea rápidamente. RAM interna. Que luego libera la memoria RAM externa para escribir. El VGA luego sale de la RAM interna para el resto de esa línea. Por supuesto, su RAM debe ser lo suficientemente rápida como para leer el valor de los datos de toda la línea en BRAM en el corto período de tiempo en blanco.
Es posible que desee consultar Gameduino para obtener inspiración y ejemplos.