¿Interfaz entre dos velocidades de bus diferentes?

0

Estoy creando una computadora casera y estoy atascado en cómo diseñar / abordar el manejo de solicitudes de datos entre dos secciones diferentes. Lo estoy creando a partir de la mayoría de los chips lógicos de la serie 74HCxxx.

Tengo una CPU homebrew que se ejecuta a 1Mhz y tiene un bus a la RAM. Tiene 32 líneas de dirección y 32 líneas de datos junto con un reloj y líneas de lectura. Por lo tanto, se coloca una dirección en las líneas de dirección y si la línea de lectura es alta, se espera que los datos apropiados se coloquen en las líneas de datos inmediatamente. Si la lectura es baja, entonces la CPU también coloca un valor en las líneas de datos y la memoria debería actualizarse en el siguiente reloj. Todo muy simple y funciona porque la SRAM es comparativamente rápida (~ 50ns) y satisface fácilmente las necesidades de tiempo de la CPU (1000ns).

Ahora he creado una pieza de hardware separada que es un controlador de video. Funciona a 12.587 MHz para emitir una señal VGA de baja resolución. Internamente tiene alguna memoria SRAM que almacena los datos para mostrar. Esto funciona bien por sí solo.

Pero no tengo idea de cuál es el enfoque correcto para que la CPU pueda enviar datos al controlador de video. Quiero que el controlador de video se asigne a la memoria, por lo que cuando la CPU escriba en un rango definido de direcciones de memoria, el controlador de video notará esto y tomará el nuevo valor y lo almacenará internamente. Sería bueno poder leer también desde la memoria del controlador de video, pero eso es opcional.

Soy un programador y no tengo capacitación en ingeniería eléctrica, por lo que esto puede ser trivial para otros pero no es obvio para mí. ¿Debo estar viendo los buffers FIFO? ¿Necesito una interfaz complicada entre los dos? Mi preocupación es que van a diferentes velocidades de reloj y, por lo tanto, ¿a veces se enfrentarán en el tiempo?

    
pregunta Phil Wright

1 respuesta

2

Hay 4 soluciones (¿quizás algunas otras?), ninguna de las cuales es perfecta.

a) Agarra un ciclo de video. Simple, barato, bajo costo de hardware, nieve en la pantalla.

Cree una interfaz de sincronizador simple para la RAM de video, y asigne prioridad a la CPU. Después de todo, solo se escribirá a un máximo de uno por EE.UU., donde el video está leyendo aproximadamente 12 por EE. UU. Cada ciclo de video, ¿la CPU ha escrito una palabra? Si es así, realice una escritura, si no, lea un píxel para mostrar. La nieve se puede mitigar repitiendo el último píxel de salida de video, en lugar de emitir un valor fijo.

b) Insertar un ciclo de escritura. Simple, sin nieve, necesita una memoria RAM de video más rápida.

Organice la sincronización de la memoria RAM del video para que haya dos ciclos por píxel, una escritura de la CPU (la mayoría de los cuales estará inactiva) y una lectura de píxeles.

c1) Guardar todas las escrituras para intervalos de rastreo. Sin nieve, necesita un FIFO ancho.

Escriba los valores de píxeles y las direcciones en un FIFO, haga estallar el FIFO en la RAM de video cuando la pantalla está oscura

c2) solo escribe durante los intervalos de supresión. No necesita FIFO, pero restringe la velocidad de actualización de la CPU. Guarda un sincronizador.

Cambie el bus de RAM de video a la CPU durante el rastreo, deje que escriba al azar.

d) Doble buffer. Simple, sin nieve, necesita el doble de RAM de video.

Tiene dos búferes de RAM, uno de ellos en pantalla, uno escrito desde la CPU. Intercambiarlos con suficiente frecuencia. La memoria RAM es barata. Es posible que desee un hardware BLIT o algún software adicional para actualizar rápidamente el búfer que la CPU no estaba actualizando la próxima vez que lo obtenga.

e) (¡Pensé que habría más de 4!) Wide RAM.

Este es uno que implementé al comienzo de los años 80, cuando la RAM era lenta y costosa. La RAM de velocidad completa está dispuesta en 2 de ancho, por lo que se lee dos píxeles sucesivos cada 2 píxeles. Un mux simple serializa los píxeles en la pantalla, y ese ciclo de repuesto está disponible para una escritura aleatoria de la CPU. 2 podría generalizarse a N, si es necesario.

f) (¡Estoy seguro de que no puedo enumerarlos todos!)

    
respondido por el Neil_UK

Lea otras preguntas en las etiquetas