Dispositivo RAM / tiempos para proyecto VGA pequeño

Para un proyecto de pasatiempo personal, estoy buscando hacer una pequeña pantalla vga usando un fpga. Estaba pensando en hacer que la pantalla fuera de 640x480 píxeles con un byte de color por píxel a 60 Hz (¿creo que esos tiempos deberían funcionar en cualquier monitor?)

Según mi cálculo, eso significa que necesito leer 640*480*60 bytes de la RAM cada segundo, lo que equivale a 18432000 bytes por segundo, lo que da un tiempo por byte de poco más de 54 ns por píxel.

Estoy mirando un dispositivo como este para mi memoria.

http://uk.farnell.com/cypress-semiconductor/cy62128ell-45sxi/ic-sram-1mb-128kx8-5v-soic32/dp/1650060

La hoja de datos indica que tiene un tiempo de acceso de 45 ns, por lo que entiendo que debería ser lo suficientemente rápido para que mi fpga lea los datos. Pero tendría que actualizarlo durante el período en que no se muestran datos, ya que no es lo suficientemente rápido para completar una lectura y escritura en ese momento.

¿Mis cálculos son correctos y ese dispositivo sería adecuado para usarlo de esta manera? ¿O me perdí algo?

Debido a las señales reales requeridas (H-Sync, V-Sync), encontrará que su sistema deberá funcionar a poco más de 25 MHz. Esto significa que su período de búsqueda de memoria será de aproximadamente 39 ns.
¿Por qué quieres almacenar 60 fotogramas en la memoria? Los enfoques que he usado con éxito solo tienen dos cuadros: un cuadro actual y luego el cuadro siguiente. Ese gran requisito de memoria será costoso ($ 20 +)
No . Quiero almacenar un cuadro en la memoria. Sin embargo, tengo que recuperarlo 60 veces por segundo... parece que este proyecto no es práctico en esta forma para mí en este momento de todos modos
Ahhh.... eso tiene más sentido

Respuestas (3)

Así es como lo haría...

Comenzaría con un FPGA Xilinx Spartan-6. La razón por la que elegiría esto es porque tienen "núcleos duros" para una interfaz DDR-SDRAM. Por núcleo duro, me refiero a que el circuito para esta interfaz de memoria es un fragmento de lógica dedicado y no en el "tejido de lógica programado por el usuario" normal. Esto significa que va a cumplir con el tiempo y no tiene que escribir esta lógica por su cuenta.

A continuación, conectaría un poco de SDRAM DDR2 a la pieza. DDR2 SDRAM es bastante económico, fácil de obtener y, sin duda, lo suficientemente rápido y grande para lo que desea hacer. Comenzaría con un bus de datos de 16 bits de ancho y lo aumentaría si necesita más velocidad. Puede usar Xilinx CoreGen o Memory Interface Generator para obtener su núcleo de interfaz DDR2.

El resto es "relativamente fácil", ya que solo se trata de mover datos y generar los pulsos de sincronización adecuados.

Una desventaja importante de este enfoque es que básicamente está limitado a usar BGA tanto para la memoria como para la FPGA. Un lado positivo es que hay placas de desarrollo FPGA que ya tienen este circuito.

Es posible que sea mejor usar el bloque de RAM en un buen FPGA, ya que superará fácilmente el rendimiento de la SRAM externa; Además, si desea hacer una PCB, el enrutamiento será crucial con tiempos de reloj de 54 ns. Además, parece ser de solo 5V; ¿Qué FPGA funcionan en 5V? Necesitaría una traducción de nivel lógico, lo que introduciría un retraso en el procesamiento.

Me imagino que necesita 300 KB y los FPGA pueden tener esta cantidad de memoria integrada.

Ah, sí, el enlace era para un ejemplo del tipo de dispositivo, no exactamente el que yo usaría. 5v claramente no es correcto... Sí, fpga puede tener esta cantidad de memoria, pero esperaba usar una pequeña para esto. Y sí, se me acaba de ocurrir que a esta velocidad es probable que una PCB diseñada para "aficionados" probablemente tenga problemas... Hmmm
@Thomas O 640x480x24bits = alrededor de 7,4 Mbits. Eso equivale a alrededor de 450 RAM de bloque (BRAM de 16kbit). Eso no va a caber dentro de ningún FPGA que tengamos un presupuesto para comprar.
@Thomas OI podría haber leído mal la pregunta. Dijo "Un byte de color por píxel", que interpreté como un byte para el rojo, un byte para el verde y un byte para el azul. Si es 1 byte por píxel, en total, necesitará unos 2,5 Mbits de RAM o 150 bloques de RAM. Eso sigue siendo una gran cantidad de BRAM, pero factible en un FPGA de tamaño mediano.
@David Kessner, lo interpreté como un byte por píxel, en otras palabras, algún tipo de relleno de bytes como RRRGGGBB.
Vale la pena mencionar que, según DigiKey, los FPGA de más de 2,5 mbit solo vienen en paquetes BGA;
Sí, quise decir un byte por píxel con 2 bits por color y uno de repuesto. esto no va a funcionar para mí, soy la forma actual hasta que aprenda mucho más

Sugeriría usar un chip de 64Kx16 o dos chips de 128Kx8; eso reduciría la tasa de datos requerida a la mitad, permitiendo alternar accesos de 40 ns entre la pantalla y la CPU. Si no desea utilizar un bus de datos de 16 bits y no le importa limitar ligeramente la velocidad de los accesos a la CPU externa, aún podría obtener la velocidad deseada con un tiempo de acceso de 40 ns si el tiempo de OE es de 20 ns. Cada doce medios ciclos de un reloj de 25 MHz:

  1. Dirección de píxel de salida 0-1.
  2. Habilite el entorno operativo de bajo byte.
  3. Bloquee los datos del píxel 0, deshabilite el entorno operativo de byte bajo y habilite el entorno operativo de byte alto.
  4. Enganche los datos del píxel 1 y la dirección del píxel 2-3 de salida.
  5. Habilite el entorno operativo de bajo byte.
  6. Bloquee los datos del píxel 2, deshabilite el entorno operativo de byte bajo y habilite el entorno operativo de byte alto.
  7. Enganche los datos del píxel 3 y la dirección del píxel 4-5 de salida.
  8. Habilite el entorno operativo de bajo byte.
  9. Bloquee los datos del píxel 4, deshabilite el entorno operativo de byte bajo y habilite el entorno operativo de byte alto.
  10. Enganche los datos del píxel 5 y la dirección de la CPU de salida.
  11. Habilite OE o WE de byte alto o bajo.
  12. Datos de salida en el bus (si es de escritura) o datos de bloqueo al final del ciclo.

Esto permitiría el acceso remoto a la CPU a una velocidad de aproximadamente 4 MHz. No instantáneo, pero no demasiado malo.

Por cierto, si se necesita desplazamiento, podría ser útil tener 960 bytes de memoria que contengan la dirección de inicio para cada una de las 480 líneas de datos de visualización. Esto permitiría desplazarse por regiones de la pantalla sin tener que mover muchos datos.