Visualización de caracteres en Verilog con VGA

Estoy tomando una introducción al curso ECE como estudiante de informática y para un proyecto final vamos a diseñar un juego codificado en Verilog usando la pantalla VGA en una placa DE1-SoC.

Decidí crear un juego del ahorcado, pero no sé cómo mostrar los personajes en la pantalla VGA. Se me ocurrieron tres opciones: hacer el alfabeto y los guiones bajos como imágenes y subirlos a la pantalla VGA, usar algún tipo de búfer de caracteres incorporado (encontré información sobre esa parte en línea, pero no puedo encontrar ningún ejemplo del uso it) o ​​simplemente dibujar cada carácter píxel por píxel.

La forma píxel por píxel parece extremadamente complicada, pero al mismo tiempo, casi no hay recursos que pueda encontrar sobre los otros dos métodos. ¿Alguien puede decirme cuál sería la forma más eficiente y fácil de usar para mi juego? Realmente solo aprendimos a mostrar formas en clase, pero no estoy seguro de que dibujar cada letra sea el método más eficiente.

Depende de cómo esté funcionando su controlador VGA. Si tiene un búfer de cuadros, puede tener una tabla de búsqueda de caracteres que asigna los valores de los caracteres a mapas de bits de píxeles y luego traza los píxeles para cada carácter.

Respuestas (1)

En última instancia, tendrá que enviar datos de píxeles a la pantalla. No hay forma de evitar eso; así es como funciona VGA. El monitor en el otro extremo solo entiende cuadros, el FPGA necesitará generar cuadros completos a la velocidad correcta. La forma más sencilla de hacer esto es tener un búfer de fotogramas que contenga datos de píxeles para toda la pantalla. Esto generalmente requerirá más memoria de la que tendrá internamente el FPGA, lo que significa que su búfer de cuadros tendrá que estar en una memoria externa.

Sin embargo, si lo que pretende mostrar tiene alguna estructura, es posible que no necesite un búfer de cuadro completo. Por ejemplo, si desea hacer una pantalla de solo texto, todo lo que necesita es un búfer de caracteres que indica qué carácter mostrar en cada posición de la pantalla, cada posición corresponde a un cuadro de píxeles del tamaño de un carácter. Luego puede crear un 'mapeo' entre los caracteres en el búfer y los píxeles en la pantalla: un búfer de fuente. Para generar una línea de video, extraiga los caracteres de la fila correspondiente en el búfer de caracteres, utilícelos para indexar el búfer de fuentes y luego muestre los píxeles que corresponden a la fila particular en los caracteres seleccionados. Esta sería una tubería de dibujo de texto muy simple. También es posible hacer algo similar con sprites para que pueda hacer gráficos básicos sin requerir un búfer de cuadro completo. Dependiendo de la implementación, puede ser más eficiente usar un motor de dibujo de sprites de hardware, ya que mover el sprite solo implica actualizar la posición en el motor de dibujo en lugar de reescribir todos los píxeles que componen el sprite.

Una versión que requiere menos memoria sería un búfer de píxeles de línea, con la actualización del búfer desencadenada por la sincronización horizontal.
No estoy seguro de cómo eso sería menos memoria. El búfer de línea aún tendría que llenarse desde algún lugar en cada sincronización horizontal.
Los píxeles se proporcionarían (probablemente) desde una tabla de búsqueda de píxeles, y esta tabla solo necesitaría contener uno de cada carácter posible (probablemente 64 serían suficientes, o 256 como máximo), en lugar de los 2000 necesarios para una pantalla estándar de 80x25 .
Eso es básicamente lo que describí, ¿no? Tiene un byte por ubicación de carácter (80x25 caracteres serían 2000 bytes, esto debería caber en un bloque de RAM), luego una tabla de mapas de bits indexada por el carácter y la fila de píxeles. Para generar una línea de escaneo, itere sobre los caracteres en la fila correspondiente en el búfer de caracteres, utilícelo para obtener la fila correcta en el mapa de bits correspondiente, genere eso mientras obtiene el siguiente carácter. No estoy seguro de cómo encaja un búfer de línea aquí. A menos que esté malinterpretando lo que quiere decir con búfer de línea.