Cómo implementar la E / S mapeada en memoria

7

Estoy describiendo un sistema en VHDL. Este sistema ya contiene un procesador, un controlador DDR SDRAM y un controlador VGA. VGA lee píxeles de SDRAM (ya validado y probado en FPGA).

Aunque VGA y SDRAM ya se están comunicando entre sí, todavía necesito Para implementar la conexión entre el procesador y la SDRAM. Al final, lo que yo. La intención de tener es un procesador que dibuja en el framebuffer almacenado en SDRAM. Luego, ocurre un cambio de página y VGA comienza a buscar la nueva imagen que dibujó el procesador.

Para indicarle al VGA que busque desde la nueva ubicación, me gustaría informar el controlador VGA (usando la memoria mapeada io) la nueva dirección de la nueva imagen. Una estrategia simple que pensé fue poner un mux y verificar si el rango de direcciones cae en los registros del controlador VGA o en el rango de direcciones del caché. Además, ¿tendría que preocuparme por diferentes relojes? dominios? En caso afirmativo, ¿qué posibles problemas me deberían importar?

Por ejemplo, en algún momento en el pasado vi un código de x86 que escribe (usando instrucción de outb) y la siguiente instrucción fue un inb para el mismo y / o una ubicación relacionada. En este caso, ¿necesitaría modificar la lógica del procesador? para detenerse en tales operaciones? En caso afirmativo, ¿cuántos casos implementar? Cuántos ¿Interfaces para cuidar?

Además, en el arranque, ¿cómo se usa el caché si todas las entradas se invalidan? Yo creo Hay una imagen ROM con el código de inicio. ¿Podría existir también una memoria RAM local temporal para las escrituras hechas por el código almacenado en la ROM (instrucciones sw)?

Currículum: necesito información sobre cómo implementar la jerarquía de memoria circuitos: cachés, memoria mapeada io, TLBs, memoria virtual, etc. Y cómo todo esto se comunica entre sí. Yo se como implementar cachés y TLB, por ejemplo. Pero no estoy seguro de cómo conectarlos. juntos. Podría usar algo que funcione (como la idea mux). Pero yo quiero Seguir los diseños que se establecen en la industria.

Lo que ya he estudiado: - como ejecutar mips - Arquitectura de la computadora (Patterson) - Manuales MIPS - Manuales de ARM - Manuales de Intel

Pero ninguno explica en detalle.

Si hay muchas formas de implementar, solo muéstrame una que conozca, por favor. Incluso si se trata de código fuente o un diagrama de bloques. De nuevo, no necesito el Explicación de cómo funciona internamente. Solo necesito saber las interfaces entre los módulos.

Gracias a todos

    
pregunta hdhzero

2 respuestas

2

Aquí hay un enlace a una breve explicación de cómo funciona la E / S asignada en memoria en un sistema informático de estilo antiguo. Quizás esto pueda responder algunas de sus preguntas:

enlace

    
respondido por el Nedd
2

Después de todo este tiempo, no he encontrado nada detallado sobre el tema. Decidí simplemente codificar algo que funcionaría y olvidar cómo funciona la industria. Esto fue después de leer alguna documentación sobre el proyecto del bus Wishbone que dice que en FPGA usan un grupo de multiplexores para crear las rutas entre los módulos.

Mi consejo para aquellos que están intentando algo similar en FPGA: simplemente haga algo que funcione. Puede que me equivoque, pero simplemente no hay información detallada sobre cómo hacer este tipo de cosas.

En primer lugar, he aceptado mi realidad: soy un tipo de FPGA, generalmente limitado por relojes de 50MHz. Tampoco estoy proyectando que un sistema se interconecte con una placa base o PCI o lo que sea. Es un SoC simple y todas las interfaces físicas que necesito (teclado, mouse, VGA, SDRAM, etc.) están listas para mi uso a través de asignaciones de pin (por supuesto, todavía tengo que implementar la lógica en VHDL).

En otras palabras: solo necesito preocuparme por la VHDL porque las cosas físicas ya están hechas por los chicos de Altera / Xilinx / YourVendorHere.

Explicaré brevemente cómo lo hice:

  • No implementé un bus. Al principio quería usar un autobús porque así es como hecho en general Pero la verdad es que un bus solo es útil si vas a conectar módulos de reproducción y este no fue mi caso (corríjame si me equivoco). Así que al final solo usé un grupo de multiplexores para asignar las direcciones.

  • Para los registros de estado / control / datos dentro de los módulos, decidí usar un 'protocolo' simple que pueda pensar como un apretón de manos / sondeo: en un bucle sigo leyendo el registro hasta que entrega el valor que espero , luego realizo la operacion que quiero.

  • No tengo idea de cómo los chicos de ARM e Intel hacen su trabajo, pero aquí simplemente agregué una ROM y RAM (ambos ram de bloque) para el código de arranque. Es simple y funciona.

  • La interfaz entre el procesador y cache / tlb / mmu es la siguiente: cache, tlb y mmu no toman medidas por sí solas. Si hay una falla, es el procesador el que tiene que darles instrucciones para obtener los datos necesarios.

Hay tantos detalles que no sé qué se debe explicar o no. Si alguno de ustedes necesita información detallada sobre cómo hice las cosas, solo envíeme un correo electrónico a: [email protected] Estaré encantado de presentar cualquier cosa aquí en la pila o en mi correo electrónico.

También dejaré aquí algunos enlaces que me ayudaron: enlace enlace

También recomiendo el siguiente libro, que tiene algunos capítulos que describen cómo puede conectar un procesador con módulos IO: enlace

    
respondido por el hdhzero

Lea otras preguntas en las etiquetas