Me conseguí un panel de evaluación espartano-3an para aprender la programación de fpga y algo de verilog. Se tarda un poco en dejar de verlo en términos de un lenguaje de programación secuencial y comenzar a verlo en términos de conexiones entre bloques de hardware, pero estoy llegando.
He creado un pequeño "programa" que toma una imagen definida en "ram" y la muestra en el puerto vga. El ariete es solo un conjunto de reglas como esta
reg ram[4095:0]; // Video memory for 64x64 pixel display
Utilicé los patrones en la ayuda y el compilador ha inferido que debería poner esto en un blockmem y todo funciona bien.
Sin embargo, mi duda es sobre el tiempo.
Tengo un bloque "siempre" que incrementa un contador para la posición horizontal vga, y otro que incrementa un contador para la posición vertical vga. Luego tengo otro bloque que siempre usa ese contador para generar una dirección en un "registro" que indxes la memoria.
Entonces hay otro bloque "siempre" activado por un reloj que lee esa memoria.
Mi duda es la siguiente: estoy generando los pulsos de sincronización basados en los contadores. Eso está bien, pero estoy generando la dirección en la memoria de video también desde esos contadores para leer el píxel. Sin embargo, esa lectura se producirá en el siguiente pulso del reloj, por lo que mis datos de píxeles se emitirán un ciclo de reloj más tarde de lo que estoy esperando. Calcularé la dirección en un ciclo de reloj, pero no tendré los datos de píxeles disponibles hasta el siguiente.
¿He entendido esa situación correctamente? Y si es así, ¿qué hago al respecto? ¿Ignorarlo porque no será visible? Probablemente podría también amortiguar los pulsos de sincronización y retrasarlos de la misma manera. O podría pre ajustar la dirección de memoria calculada para compensar por adelantado.
¿Qué hace la gente en general en este tipo de situación? ¿O es cada caso diferente?