MPU accediendo a memoria ocupada

No sabía si colocar esta pregunta aquí o en stackoverflow, pero finalmente decidí publicarla aquí.

Quiero construir un sistema simple que pueda funcionar con periféricos básicos (UART, teclado, monitor VGA). Me gustaría usar MPU en lugar de MCU como 'unidad principal', por lo que habría más memoria para procesar datos. Este chip 'principal' usaría una sola SDRAM para almacenar sus datos.

Para la salida VGA, quiero usar un chip Atmel AVR, que solicitaría datos de otra memoria, que contendría datos de pantalla en formato RGBS de 8 bits. Aquí es donde llego a los problemas.

No necesito mucha memoria VGA (menos de 512 KB), por lo que quiero usar memoria SRAM, que también es fácil de acceder en comparación con SDRAM. La resolución VGA que elegí usa un reloj de píxeles de 25 MHz, lo que significa que solo tengo ~40 ns de tiempo para recuperar un solo píxel de SRAM a DAC. Eso es bueno ya que la mayoría de las memorias que coinciden con mi entrada de búsqueda (>= memoria de 4 Mbit, <40 ns de tiempo de acceso) pueden hacer esto.

Volviendo a la memoria MPU, me gustaría hacer mi primera pregunta: ¿cuándo es necesario enviar un comando de actualización a SDRAM? ¿Tengo que hacerlo, o es posible obtener una memoria que necesitaría magia externa para actualizarla?

Ahora llego al problema de cómo acceder a esa memoria SRAM VGA desde el chip principal, ya que mi controlador VGA casi siempre accede a ella (sin mencionar que necesito otro chip para mapear esta memoria correctamente al espacio de direcciones de MPU). Pensé en reservar algunos pines del controlador VGA para las solicitudes de acceso a SRAM de MPU, lo que significaría que algunos cuadros de video tendrían que omitirse dejando esta SRAM accesible a MPU sin interrupciones.

Estoy atorado aqui. Sólo podía pensar en estas posibles soluciones:

  1. Puedo usar SDRAM en un chip VGA en lugar de SRAM, pero también necesitaré un mejor controlador para la salida de video. Esta SDRAM será compatible con la de la MPU, y tendré que pensar en una táctica especial para el robo de relojes, donde podría acceder a la memoria de video desde el controlador de video y la unidad de procesamiento principal a la vez.
  2. Puedo agregar otro chip que usará el tiempo cuando no se acceda a la memoria de video (pulsos de sincronización, porches, etc.) para copiar bloques de datos de la memoria principal a la memoria de video.
  3. Puedo usar solo una memoria SDRAM y solicitar acceso a ella desde la MPU cada vez que VGA necesita otro píxel. Eso ralentizaría todo el sistema, pero sería más sencillo.

¿Qué piensas de esto? ¿Qué otras formas (trucos, diseños?) hay aquí para tener dos unidades (unidad principal y unidad de procesamiento de video), desde las cuales una está siendo administrada por otra?

Gracias.

Gracias por tus ideas. Supongo que el acceso a la memoria intercalada requiere SDRAM, ¿no es así?
No necesariamente. Yo lo he hecho con SRAM rápida. Con 2 chips intercalados, tenía más de 2 ventanas de acceso (creo que pueden haber sido 4). Por cierto, es mucho más fácil hacerlo con un FPGA.

Respuestas (1)

Una cosa que solía ser común para los controladores de gráficos de video es Video RAM o VRAM .

VRAM tiene dos conjuntos de pines de salida de datos y, por lo tanto, dos puertos que se pueden usar simultáneamente. La computadora host accede al primer puerto, el puerto DRAM, de una manera muy similar a la DRAM tradicional. El segundo puerto, el puerto de video, generalmente es de solo lectura y está dedicado a proporcionar un canal de datos serializados de alto rendimiento para el conjunto de chips de gráficos.

Internamente, VRAM lee una fila DRAM completa y la desplaza secuencialmente hacia el circuito de video. Esto deja la DRAM disponible para que la use la MPU. La VRAM ha sido reemplazada en gran medida por el uso de SDRAM, "aunque solo tiene un puerto y se requiere más sobrecarga".


Una técnica que he usado en el pasado es usar el acceso intercalado a la memoria. Es un poco complejo de explicar (el diablo está en los detalles), pero resumiré lo básico:

Básicamente, la MPU accede a la memoria de video entre accesos de píxeles por parte del controlador de video. Si este tiempo se vuelve demasiado apretado, hay un par de cosas que puede hacer que aliviarán en gran medida el tiempo (por lo general, solo 1 de estas es necesaria):

  1. Puede usar 2 chips de RAM (o bancos) e intercalar los que usan cada chip para cada píxel. En su caso, esto ralentizaría efectivamente su reloj de píxeles a 80 ns por chip, lo que permitiría que el acceso al controlador de video y MPU tenga ventanas de 40 ns cada uno. Esto podría extenderse a más bancos intercalando más píxeles si es necesario. Esta técnica se llama memoria intercalada .
  2. Puede aumentar el tamaño del bus de datos de la memoria de vídeo. El controlador de video leería múltiples píxeles en un solo acceso y los usaría secuencialmente. La MPU tendría un bus de datos más grande, cada acceso se dirigiría al byte (o palabra) apropiado y se utilizarían selecciones de bytes en la memoria de video, o se tendría que realizar una lectura-modificación-escritura para escribir. al tamaño de datos más grande. En su caso, probablemente sería más sencillo aumentar el bus de datos de la memoria de video a 16 o 32 bits (2 o 4 píxeles), y probablemente luego usar una MPU con el mismo tamaño de bus.

Si intercala accesos de video, es posible que desee considerar el uso de un FPGA o CPLD para su controlador de memoria de video.


Otro método es tener 2 memorias de video separadas y usar la selección de banco. La MPU escribe en un banco mientras el otro está siendo utilizado por el controlador de video para la visualización. Cuando la MPU termina de escribir, los accesos al banco se intercambian (generalmente durante un pulso de sincronización).