Entrenador de CPU de 4 bits – Parte 1

Después de estar un tiempo desconectado del blog, por estudios, retomo la electrónica para presentarles un proyecto muy útil para la enseñanza de arquitectura de computadoras.

Introducción

Este proyecto nació como una necesidad técnica cuando estaba elaborando un curso de electrónica y detecté la necesidad de un material educativo para practicar la programación de una CPU minimalista con el objeto de familiarizar a los alumnos con el funcionamiento interno de los microprocesadores.

El circuito que voy a presentar es llamado «Entrenador de CPU de 4 bits», y como cualquier «entrenador» en electrónica, se trata de un material didáctico, que, en este caso, permitirá ensayar de forma práctica:

  • La programación de una CPU usando códigos binarios.
  • La ejecución de programas almacenados en memoria.
  • El uso del lenguaje máquina.

Además, el disponer de este equipo, que es una CPU completa pero minimizada, permitirá entender la arquitectura y el funcionamiento de los microprocesadores electrónicos.

El uso del lenguaje máquina (el entrenador no permitirá otra forma de uso) nos obligará a familiarizarnos con las conversiones binario->decimal y viceversa. Esta es otra de las ventajas que se obtendrá con el uso de este equipo.

En síntesis, se obtienen varios beneficios en el uso de un equipo «Entrenador de CPU» como el que vamos a realizar en este artículo.

El alcance

Aterrizaremos el alcance de la idea, respondiendo a la pregunta: ¿qué pretendemos hacer? o más específicamente: ¿qué pretendo hacer?

Lo que voy a hacer es: diseñar e implementar un circuito electrónico que haga las funciones de «Entrenador de CPU», incluyendo el circuito impreso y el montaje de los componentes. No incluiré el diseño de la caja o gabinete en donde montar el PCB y la fuente de alimentación.

El circuito se diseñará con componentes comunes en el formato THT o de orificio pasante, que son los más fáciles de ensamblar y de adquirir también, en comparación con los de montaje superficial. También se buscará usar un PCB de una sola cara y con pistas anchas de modo que sea fácil de fabricar, de forma casera, y así hacer el proyecto más accesible, sin necesidad de tener que mandar a fabricar la tarjeta a una empresa especializada.

Este proyecto requiere que el lector tenga conocimiento de electrónica, al menos a nivel de montaje, y del funcionamiento de las CPU digitales.

Parte del proyecto consiste en diseñar una CPU didáctica, que es la que se programará con el circuito entrenador. Sin embargo, y aunque es totalmente posible, no voy a diseñar la electrónica necesaria para implementar la CPU a partir de circuitos integrados secuenciales como registros o una ALU, sino que voy a realizar la emulación de esta CPU usando un microcontrolador PIC, de modo que la implementación del circuito se simplifique considerablemente y pueda hacerse en una sola tarjeta de tamaño manejable.

No diseño la CPU, al menos por ahora, porque no es el objetivo del proyecto y requeriría una circuitería bastante extensa, aún para una CPU de potencia reducida.

Si alguien me pregunta: ¿por qué no uso Arduino? La respuesta es: porque la idea de este proyecto es hacer un circuito que pueda alimentarse de una simple pila de 3V y que tenga bajo consumo. Además, como siempre he dicho, y sin ánimo de ofender, a Arduino prefiero usarlo para enseñar microcontroladores a los niños.

Diseñando una CPU

A pesar de que la CPU que usaremos será una emulación, eso no quita que debamos definir la arquitectura interna de esta CPU. Así que aquí vamos.

Una CPU se puede diagramar, de forma simplificada, como se muestra a continuación:

Arquitectura de una CPU – Fuente: WIkipedia

En primer lugar, hay que decidir el tamaño del dato o la cantidad de bits que manejará nuestra CPU. Como nuestros fines son didácticos, elegiremos una CPU de 4 bits porque es, prácticamente, la arquitectura más simple, que puede realizar algún trabajo útil, como el cálculo con números. De hecho la primera CPU completa en un solo chip, fue de 4 bits y corresponde al mítico 4004.

La simplicidad de una CPU de 4 bits, en comparación a las actuales CPU de 64 bits, puede parecer limitada en términos de potencia de cálculo, pero resultará valiosa en el sentido pedagógico, que queremos darle a este proyecto..

Hay que aclarar que, el tamaño de 4 bits se refiere solamente al tamaño de los datos que puede procesar la Unidad Aritmético Lógica (ALU). Este tamaño define también el tamaño de los datos que manejará la CPU. Queda pendiente definir el tamaño de las instrucciones que manejará la CPU, que no tiene que ser necesariamente de 4 bits, sino que depende del modelo de memoria que adoptemos.

Este modelo tiene que ver con la localización de la memoria del programa y de datos. Y para este detalle de la arquitectrua existen las opciones:

  • Arquitectura Von Neumann. Que almacena programas y datos en la misma memoria.
  • Arquitectura Harvard. Que almacena programas y datos en memorias separadas.

Para no complicar el diseño, elegiremos la arquitectura Von Neumann que es fácil de entender y también de implementar.

Como la memoria de programa y de datos van a ser la misma memoria, entonces debemos asumir que el tamaño de las instrucciones y de los datos deben ser iguales.

Como el tamaño de los datos va a ser de 4 bits, y los datos e instrucciones van a compartir la misma memoria, se define que las instrucciones deben ser también de 4 bits.

Una instrucción de 4 bits tendrá la forma:

Celda de memoria de 4 bits

A este tamaño de memoria se le llama también «nibble» (la mitad de un byte) y es el tamaño que tendrán tanto datos como instrucciones. Solo así podrán convivir juntos en una misma memoria (que es lo que se espera pues no conozco ninguna memoria que maneje celdas de diferentes tamaños). Vista como una arreglo, la memoria podría diagramarse así:

Instrucciones y datos en la memoria

Si bien, las instrucciones ocuparán una celda de memoria, se requerirá el uso de uno o más celdas para incluir los parámetros u operandos de las instrucciones. Esto lo veremos más adelante, cuando definamos las instrucciones de nuestra CPU.

Los registros

Los registros son parte importante en la estructura de las CPU porque definen las capacidades de cálculo, el modelo de programación, y las instrucciones soportadas.

En general, todas las CPU implementan al menos 4 grupos principales de registros:

  • Registros acumuladores o de propósito general.
  • Contador de programa.
  • Registros de banderas.
  • Registros de instrucción y de direcciones.

Con respecto a los acumuladores, para mantener el espíritu minimalista de este proyecto, elegiremos un único registro de 4 bits al que llamaremos «A». No incluiremos registros de pila ni índices adicionales. Así, simplificaremos considerablemente el modelo de programación a bajo nivel.

Como contador de programa usaremos un registro al que llamaremos «PC» y que nos permitirá direccionar la memoria para extraer la instrucciones y los operandos que se necesitan en la ejecución de una instrucción.

Aquí salta un detalle importante: ¿Cuánta memoria podrá direccionar nuestra CPU?

Este dato es importante por cuanto el tamaño de la memoria direccionable determinará el tamaño del registro PC.

En principio, estuve pensando en permitir al menos 1KB de memoria para manejar programas respetables, pero eso implicaría que el tamaño del registro PC debería ser de 10 bits, lo que no era un valor muy apropiado para manejarse con instrucciones de 4 bits que deban incluir referencia a memoria.

Como ejemplo, imaginemos que tenemos una instrucción que carga un valor de memoria al registro acumulador. Esta instrucción debe tener los 4 bits del «Opcode» de la instrucción, más 3 celdas adicionales de memoria para almacenar la dirección de 10 bits. Y, como en nuestro entrenador de CPU, las instrucciones las iremos introduciendo manualmente, celda por celda; resultaría algo tedioso introducir instrucciones de 4 celdas.

Para limitar la cantidad de celdas (nibble) que tendrá una instrucción, decidí que solo trabajemos con una memoria de 256 celdas, y un registro PC de 8 bits, de modo que solo nos bastará con dos nibble adicionales para almacenar los operandos de las instrucciones que deban poder acceder a todo el espacio direccionable de memoria.

El tamaño de 256 celdas puede parecer algo reducido, pero no perdamos de vista que estamos diseñando una CPU para la enseñanza no para escribir programas útiles.

Más adelante, cuando diseñemos el conjunto de instrucciones, veremos que se puede reducir aún más el tamaño de las instrucciones usando direccionamiento de 4 bits para los datos.

Con respecto a las banderas de nuestra CPU (registro de banderas), solo implementaremos dos banderas que son:

  • Bandera Z -> Que se activará cuando la última operación obtuvo cero como resultado.
  • Bandera C -> Que se activará cuando la última operación generó un acarreo.

Estas dos banderas son más que suficientes para nuestra CPU elemental y nos permitirán implementar sumas, restas y comparaciones.

Con estas decisiones, ya podemos esquematizar mejor los interiores de nuestra CPU:

CPU de 4 bits

Para terminar esta entrega, definiremos que los registros de instrucción y de direcciones, se implementarán de forma interna en el programa de emulación de nuestra CPU que correrá en un microcontrolador PIC.


Sé el primero en comentar

Dejar una contestacion

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


*