Entrenador de CPU de 4 bits – Parte 2

En el capítulo anterior hemos definido la arquitectura de nuestra CPU virtual de 4 bits, que incluye características modestas para ser fácil de estudiar pero, aún así, no dejará de ser funcional. En este capítulo definiremos la interfaz de nuestra tarjeta o placa impresa que nos permitirá usar al entrenador.

La interfaz de nuestra tarjeta consiste en los controles que debemos incluir en nuestra tarjeta o PCB principal (la única) que deben permitirnos realizar, principalmente, las siguientes funciones:

  • Programación de la CPU.
    • Ingreso de valores en la memoria.
    • Inspección de los valores ingresados.
  • Ejecución de los programas ingresados.
    • Ejecución de todo el programa.
    • Ejecución paso por paso.

Por simplicidad, los controles a usar en nuestra tarjeta serán solo pulsadores y diodos led, excepto, tal vez, un interruptor que usaremos para el encendido. Este tipo de interfaz nos puede recordar al viejo computador Altair 8800:

Altair 8800 – Fuente: Wikipedia

El control de nuestra CPU será muy similar a como lo hacía este equipo en su momento, con la diferencia de que nosotros haremos emulación de la CPU, en lugar de trabajar con el hardware real de la CPU. De esta forma simplificaremos considerablemente el circuito, ya que el control de la CPU, y la CPU misma, se hará por software. Esto es posible porque, actualmente, contamos con una variedad de microcontroladores que son varios órdenes de magnitud más potentes que el 8080 que usaba el Altair 8800.

Otra diferencia del Altair 8800, es que nuestra tarjeta será alimentada por batería y se controlará con pulsadores en lugar de interruptores. Se prefieren a los pulsadores porque estos son pequeños, económicos y permiten realizar diversas funciones que se activen con eventos como «doble click» o pulsación contínua.

Quizá un proyecto más similar al nuestro sea el mostrado en: https://github.com/Subsystems-us/4-bit-Microprocessor-Trainer:

Al igual que esta tarjeta, nosotros tampoco diseñaremos la carcaza y solo nos quedaremos en el PCB. La diferencia con este proyecto es que nosotros no usaremos una pantalla LCD sino que todo se mostrará en binario usando leds.

Después de este repaso, y teniendo ya definida la arquitectura de nuestra CPU virtual, podemos ya esbozar el diseño de nuestra placa.

En principio, necesitaremos 8 leds para mostrar las direcciones de memoria y 4 leds para mostrar el contenido de una celda de memoria. Esos mismos 4 leds nos pueden servir para ingresar los datos, en el modo de edición.

Nuestro primer acercamiento a la interfaz sería así:

Primer diseño de la interfaz

Si hay un modo de edición, debe haber un modo de ejecución. Entonces ya disponemos de al menos dos modos.

Para el modo de edición, necesitaremos poder editar:

  • Los 16 leds de la dirección de memoria actual. Y así poder ver el valor que contiene en los 4 leds de datos.
  • El valor actual de la dirección de memoria actual. Estos son solo 4 bits.

Podríamos tener 12 pulsadores para editar ambos valores, pero para simplificar el circuito, nos conviene tener solo 8 pulsadores que nos permitan editar tanto la dirección actual, como el valor actual.

Bajo esta consideración, necesitamos un modo adicional de trabajo. De forma tal que, tendremos hasta 3 modos diferentes de funcionamiento:

  • Modo edición de valores (DATA MODE).
  • Modo edición de direcciones (ADDRESS MODE).
  • Modo de ejecución (RUN).

Como debemos cambiar de modo, necesitamos al menos un botón para fijar el modo. Por practicidad usaré dos botones. Uno para ejecutar el programa al que llamaré RUN y otro para cambiar el modo de edición al que llamaré ADDR/DATA MODE, y que nos permitirá entrar al modo de edición y también el elegir el modo de edición. El esquema quedaría así:

Interfaz de la tarjeta entrenadora

Los 8 leds nos permitirán editar la dirección actual que representa al valor del registro PC. También nos permitirán editar los 4 bits del valor actual (DATA), cuando nos encontremos en el modo de edición de valores.

Se han agregado dos leds adicionales para mostrar el valor de las banderas Z y C, cuando se esté en modo de ejecución.

Para complementar nuestra interfaz, agregaremos un par de botones para facilitarnos el incrementar o decrementar la dirección actual o el valor actual. También agregaremos un botón de ejecución paso (STEP) a paso y uno para reiniciar el modo de trabajo y la dirección actual (RESET).

Finalmente necesitamos un botón para introducir el valor actual editado, en la memoria y de paso incrementar la dirección actual. A este botón le llamaremos STORE & INC y será uno de los 8 botones que no se usan en el modo DATA MODE.

Con estas nuevas modificaciones, nuestra tarjeta quedaría en la siguiente forma:

Interfaz completa de la tarjeta entrenadora

Los tres leds indicadores de la derecha nos mostrarán, en todo momento, el modo de operación de la tarjeta entrenadora.

Con estos controles, ya sería posible controlar completamente a nuestra tarjeta entrenadora y hasta podría implementarse una función más. De momento he contemplado las funciones LOAD y SAVE para grabar y cargar un programa de forma permanente usando las facilidades de memoria EEPROM que nos ofrecen los microcontroladores modernos.

En resumen, la función de los botones serán:

BotonesFunción en modo DATAFunción en modo ADDRESSFunción en modo RUN
B7 a B0B3 a B0 permiten editar el valor actual.Editan la dirección actual.B3 a B0 permiten introducir un valor al acumulador, cuando el programa se detiene.
STORE&INCAlmacena el valor D3~D0 en la dirección actual y la incrementa.Igual a B7No tiene efecto.
SAVEGuarda el programa actual en la memoria EEPROM.Igual a B4No tiene efecto.
LOADCarga el programa almacenado en la memoria EEPROM.Igual a B5No tiene efecto.
ADDR/DATA
MODE
Pasa el modo de edición de la dirección (ADDRESS MODE)Pasa el modo de edición de dato (DATA MODE)Pasa el modo de edición de dato (DATA MODE)
INCIncrementa el dato actual.Incrementa la dirección actual.Incrementa el valor del acumulador, cuando el programa se detiene.
DECDecrementa el dato actual.Decrementa la dirección actual.Decrementa el valor del acumulador, cuando el programa se detiene.
RESETPone la dirrección actual en 0 y pasa al modo DATA MODE.Pone la dirrección actual en 0 y pasa al modo DATA MODE.Pone la dirrección actual en 0 y pasa al modo DATA MODE.
RUNEjecuta el programa desde la dirección actual, hasta que encuentre una instrucción HALT.Ejecuta el programa desde la dirección actual, hasta que encuentre una instrucción HALT.No tiene efecto.
STEPEjecuta la instrucción actual y se detiene como si se hubiera encontrado una instrucción HALT.Ejecuta la instrucción actual y se detiene como si se hubiera encontrado una instrucción HALT.Detiene el programa en la instrucción actual.

Un detalle importante es que la ejecución del programa, con el botón RUN, iniciará desde la posición actual. Si el programa empieza en la dirección 0, se puede pulsar primero el botón RESET antes de la ejecución.

Hay que notar que ya se ha definido que debe existir al menos una instrucción llamada HALT y que permitirá detener la ejecución de un programa, así que funcionará como un punto de interrupción. Al detenerse el programa, se hará parpadear el led RUN y se mostrará:

  • El contenido del acumulador en los leds D3 a D0.
  • El valor de la bandera Z en el led Z.
  • El valor de la bandera C en el led C.

En este modo se podrá editar el valor del acumulador, usando los botones B3 a B0. Para continuar la ejecución, se deberá pulsar nuevamente el botón RUN o STEP.


Sé el primero en comentar

Dejar una contestacion

Tu dirección de correo electrónico no será publicada.


*