Principiante con fpga y problemas de tiempo

5

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?

    
pregunta John Burton

2 respuestas

2
  

He entendido esa situación   correctamente?

Sí: si alguna parte de los datos de salida está disponible más tarde que otras partes, debe retrasar las otras partes para que se alineen.

No es un fudge o una cosa "mala" que hacer, es simplemente lo que se debe hacer para que los resultados sean correctos.

  

Probablemente podría también amortiguar los pulsos de sincronización y retrasarlos de la misma manera.

Eso es lo que yo haría. (EDITAR: Y como Yann me recordó, las señales de retardo pueden ser muy baratas en los FPGA de Xilinx - 16 ticks pueden caber en una sola tabla de consulta + 1 más en el flipflop que está al lado de la LUT)

  

O podría pre ajustar la dirección de memoria calculada para compensar por adelantado.

Esa es otra opción, pero probablemente tomará más lógica.

    
respondido por el Martin Thompson
1

La forma genérica de lidiar con cosas que toman más de un ciclo de reloj es la canalización, por ejemplo. en su caso, podría crear una tubería de dos etapas, en la primera etapa generará la dirección y leerá las señales de la memoria, y en la segunda etapa procesará el resultado y generará los pulsos de sincronización cuando sea apropiado.

Sin embargo, debido a que en su caso simple solo necesita lidiar con la sincronicidad de los pulsos de sincronización, lo más simple sería retrasarlos un ciclo de reloj en un flip-flop.

    
respondido por el Jaroslav Cmunt

Lea otras preguntas en las etiquetas