La E / S más simple posible para la CPU Homebrew de 8 bits

5

Estoy trabajando en el diseño de una CPU de 8 bits como un proyecto personal sin ninguna razón real. Estoy utilizando la mayoría de los chips de la serie 74HC y, en general, me concentro en la facilidad de programación sobre el rendimiento.

Estoy usando varios proyectos en Internet como inspiración, y creo que tengo un buen conocimiento de cómo funcionarán los conceptos básicos, incluidos el alu, los registros y la ruta de memoria básica.

Lo único sobre lo que no tengo idea es sobre la entrada y la salida. No estoy realmente interesado en nada super elegante, como tcp / ip o uarts, pero me gustaría tener un teclado y una salida de texto básica para un monitor de algún tipo. Realmente no tengo idea de qué hardware usar, o qué instrucciones debo hacer para usarlo.

Podría sacar algunas instrucciones más especializadas de mi ISA para acceder a hardware especializado, pero si pudiera hacerlo todo con algún tipo de esquema de asignación de memoria que podría ser aún mejor. Estoy planeando usar un chip ram de 64K, pero tal vez ciertas direcciones podrían desviarse a otro hardware o algo.

Realmente no quiero implementar interrupciones, pero tampoco quiero perder datos del teclado. ¿Eso significa que necesito algún tipo de chip buffer de cola para mi teclado? Ni siquiera sé por dónde empezar a buscar un chip de video, o cómo me conectaría con él.

Cualquier consejo sería muy apreciado. Una vez más, no necesito nada sofisticado, bastaría con un simple getChar y putChar. El control de nivel de píxeles de los gráficos podría ser genial, pero no es absolutamente necesario. Creo que solo necesito que me apunten en la dirección correcta.

    
pregunta captncraig

6 respuestas

4

La "E / S más simple posible" depende de cuáles sean sus requisitos de E / S. Sería muy sencillo, si tiene el control del diseño de la CPU, implementar un par de instrucciones especiales para ingresar y emitir algunos bits de E / S paralelas.

Pero como menciona el teclado y el video, parece que su requisito es poder interactuar con su sistema de esa manera, y la forma más sencilla de hacer que es incorporar un baud fijo. califique el puerto serie y use una PC & Programa de terminal para suministrar el teclado y el video. El uso de 9600 bps está bien para propósitos de consola humana, o si espera transferir binario, 115200 podría manejar 64K bytes en aproximadamente 6 segundos.

Un chip UART estándar, como el 6850 o el 8250 (bueno, de todos modos, de todos modos) necesitará solo de 2 a 8 registros para obtener una solución estándar de stdin / stdout. Esta es una huella pequeña en comparación con tratar de implementar un teclado y una interfaz de video directamente. Probablemente pueda manejar una matriz de teclado con un solo puerto de salida de 8 bits y un solo puerto de entrada de 8 bits, pero el video necesitará direcciones de 2K solo para proporcionar el búfer de cuadros para una pantalla de 80x25 caracteres. Si considera que las llamadas soluciones LSI como la 8250 son engañosas, yo diría que construir un UART desde 74xx probablemente sería más fácil que construir un generador de video con la misma tecnología.

Dicho esto, la parte inferior de la UART es que es probable que pierda información a menos que (a) la interrogue con la frecuencia suficiente, o (b) implemente interrupciones. Para una prueba de concepto simple para su CPU, solo bastará el sondeo, a menos que también esté tratando de probar las capacidades de interrupción de su CPU (si las tiene), en cuyo caso, manténgase al día con la entrada en serie el uso de interrupciones de UART sería un buen caso de prueba.

    
respondido por el JustJeff
3

Además de los puertos de E / S en paralelo estándar, definitivamente querrá E / S en serie , como U (S) ART, también. Lo necesitaremos en un minuto.

Entrada
Para la entrada, construiría una interfaz para un teclado de PC común (el llamado PS / 2). Esto utiliza un protocolo serial síncrono ; para eso necesitará la interfaz serial. Eso significa SIPO (Serial In / Parallel Out) y PISO (entrada / salida en paralelo). Un protocolo síncrono como el teclado PS / 2 tiene la ventaja de que también hay una señal de reloj, lo que hace que la conversión sea más fácil que, por ejemplo, un UART. (Pronto querrás un UART también)

Mostrar
La mayor parte de la computadora para el hogar TRS-80 fue, aparte de la CPU (Z80) y la memoria, construida con circuitos integrados TTL, incluyendo el video de 16 líneas x 64 caracteres , por lo que el < a href="http://incolor.inebraska.com/bill_r/trs80_schematics.htm"> schematics puede ayudarlo a comenzar.
Pero esto ya puede ser un gran paso, y comenzaría con algo más simple, para que pueda concentrarse en la CPU, que probablemente necesitará un poco de depuración antes de que funcione correctamente. Y sería bueno tener algo de exhibición para eso. (No desea depurar la CPU y la lógica de video al mismo tiempo. Dé un paso a la vez.)
Yo sugeriría usar una pantalla LCD de 4x20 caracteres comunes (más grande también está bien). Esto es fácil de conectar y puede mostrar ya mucha información (depuración).
Otra opción es que crees una interfaz UART . Es estándar en la mayoría de los microcontroladores y lo necesitará tarde o temprano de todos modos. El UART le permitirá conectarse a una PC, y con un protocolo simple puede usar la pantalla de la PC para mostrar una pantalla virtual de su propia computadora en una ventana.

Interrupciones
Mike comenta que las interrupciones no son tan difíciles de implementar, pero creo que es una buena idea dejarlas por el momento. do agregan un nivel de complejidad y riesgo de inestabilidad (más en un software que en un nivel de hardware); Los microprocesadores críticos para la seguridad generalmente no tienen interrupciones. Recuerdo el viejo Viper, que se usaba en aviones de combate.
Para asegurarte de no perder datos entrantes, tendrás que almacenarlos. La solución habitual es un FIFO . Este es un bloque de construcción de la serie 74HC, por lo que simplemente puede usar eso, o puede rodar tu propio. (No sé cuáles son sus criterios de fabricación o compra).

Lecturas adicionales
TRS-80 Technical Manual

    
respondido por el stevenvh
1

Asignación de E / S

"Algunos esquemas de asignación de memoria" es prácticamente la definición de E / S asignada en memoria.

Pruebe el truco de Commodore 64: los periféricos comparten el espacio de memoria con la RAM, y cualquier dirección que no sea tomada por un periférico va a la RAM.

O el truco de Intel x86: I / O obtiene su propio espacio de direcciones separado de la RAM. Esto hace que el uso de punteros con periféricos sea mucho más difícil.

Los periféricos en general tienen solo los pines de dirección para dirigir sus registros, un pin de selección de chip (CS) que dice cuándo está seleccionado, y un pin de Lectura / Escritura o un par de pines de Habilitar Lectura y Habilitar de Escritura.

Framebuffer

La forma más sencilla de generar una señal de video es hacer un circuito que lea direcciones consecutivas de la RAM y las convierta en una señal de video. La forma en que genera la señal depende de la señal que desea generar (NTSC, CGA, VGA, LVDS, etc.) Si ejecuta la CPU lo suficientemente lento, podría tener la RAM de acceso a la CPU en la mitad de un ciclo de reloj y luego deje que el framebuffer lea la RAM en el otro semiciclo (el Commodore 64 hizo esto). Alternativamente, si su bus de memoria maneja los estados de espera, puede darle a la memoria RAM acceso de prioridad de framebuffer.

La ventaja de este framebuffer es que es fácil de implementar y escribir. La desventaja es que toma una gran cantidad de RAM y empuja la generación de texto en la CPU (pero también te permite hacer fuentes de ancho y altura variables).

Lo triste es que estarás bastante solo aquí; el mercado para este tipo de chip de video de bajo nivel es prácticamente inexistente en estos días. Sin embargo, recuerde que Apple II hizo su generación de video en componentes discretos sin un chip dedicado, por lo que usted también puede. ^ _-

Interrupciones

Las interrupciones no deberían ser tan difíciles de implementar: si se controla una línea de interrupción y las interrupciones están habilitadas globalmente, y esa interrupción en particular no está deshabilitada, luego empuje la PC hacia la pila (al igual que para una llamada de subrutina), y, finalmente, cargue un nuevo valor de PC desde una dirección dependiendo del número de interrupción (el método de la tabla vectorial), o simplemente configure el PC en un valor fijo dependiendo del número de interrupción, esperando un GOTO en esa dirección para obtener el procesador donde lo necesita para ir (el método de la tabla de salto).

Interfaz de teclado

Stevenvh publicó su respuesta cuando estaba casi a la mitad con la mía, así que secundaré la recomendación de usar la interfaz PS / 2. Una cosa interesante a tener en cuenta es que la interfaz PS / 2 puede intercambiarse en caliente y puede detectar automáticamente si el teclado o el mouse están conectados. Estas características nunca llegaron a las placas base porque nadie quería pagar el $$$ $$$ extra o reescribirlo. sus controladores para admitirlo, pero lo he hecho en un FPGA, así que tú también puedes.

El truco, sin embargo, es que la interfaz PS / 2 es bidireccional, por lo que probablemente querrás usar un diseño de puerto serie basado en interrupciones para interactuar con él. Puedes usar chips llamados FIFOs (Cypress hace muchos) para aflojar los requisitos de latencia; necesitarás uno que vaya en cada dirección.

    
respondido por el Mike DeSimone
0

Si tienes una CPU razonablemente rápida, los circuitos serán más simples si dejas que la CPU haga una parte significativa del trabajo que la genera. Como un caso más simple, suponga que su objetivo es un video de 40 columnas, su procesador ejecuta un millón de instrucciones de 16 bits por segundo desde la RAM, utilizando tiempos derivados de un reloj de 8MHz, y no le importa no poder hacer nada más mientras generando video En ese caso, podría tener un bit de E / S como habilitación de video maestro, y tres más como una selección de sub-fila, y luego organizar las cosas de modo que cada vez que se obtenga una instrucción de una dirección donde el bit 6 sea alto, los 8 bits inferiores de la instrucción recuperada se incluirán en una ROM de 2Kx8 junto con los tres bits de selección de sub-fila; la salida de eso alimentará a un 74HC165 para registrar los píxeles. Para mostrar el video, haga arreglos para obtener grupos de 40 instrucciones donde el LSB de cada instrucción es un byte de datos de visualización. Este enfoque acapararía totalmente la CPU, pero requeriría un hardware extremadamente pequeño.

Un enfoque ligeramente más agradable sería agregar un par de contadores, lo que provocaría una interrupción una vez por línea o marco. La CPU no podría hacer nada durante la parte visible del cuadro, pero no tendría que perder la sincronización cada vez que decidiera hacer algo más que mostrar el video.

Por cierto, puede ser más fácil usar la pantalla LCD que el video. Una pantalla LCD que tenga un controlador incorporado probablemente sea lo más conveniente, pero incluso una que solo tenga controladores puede ser algo más sencilla que el video, ya que los tiempos tienden a ser un poco más indulgentes.

    
respondido por el supercat
0

Haré de esto una respuesta en lugar de un comentario, ya que el material se presenta mejor.

Cerebro se desvaneció - me refiero a Sinclair ZX80! :-(. Vídeo en hardware utilizando Z80 cpu DMA, creo

El diagrama del circuito de Sinclair ZX80 aquí

Construye tu propio ZX80 aquí

Diagrama de circuito anotado que muestra bloques funcionales

Más ZX80 {good}

Electronics Australia describió la computadora DREAM 6800 en xxx. Esto tenía una memoria de video de hardware puro de resolución muy baja asignada. Sin generador de caracteres: gráficos solo con texto producido en software.

Aquí: dice

La computadora de video DREAM 6800: el proyecto se publicó en las ediciones de mayo, junio y julio de 1979 de la revista Electronics Australia. EA ejecutó una serie de proyectos basados en él, incluido el sistema de cinta DREAM 6800 en mayo de 1981, la pantalla DREAM 6800 RTTY, enero de 1981 y la expansión de RAM 4K en diciembre de 1980

    
respondido por el Russell McMahon
0

Comience con un uart / puerto serie simple. No necesita funciones, todo lo que necesita es 8 bits sin paridad 1 paro de parada.

    
respondido por el old_timer

Lea otras preguntas en las etiquetas