Mi experiencia haciendo una CPU usando puertas NAND
Una de las cosas que aprendí en la universidad fue a diseñar una CPU muy sencilla, la cual solo tenía 16 instrucciones en total y un direccionamiento de 8 bits, vamos que solo podía operar con 256 bytes de memoria. ¿La particularidad? La diseñamos íntegramente con puertas NAND, en vez de usar el resto de puertas lógicas.
Índice de contenidos
La puerta NAND es universal
La puerta NAND o AND negada es un tipo de puerta lógica básica. En este tipo de circuitos electrónicos básicos podemos tener una cantidad determinada de entradas que reciben una señal binaria (0 o 1) cada una de ellas en un extremo, para tener una única salida en el otro extremo, también binaria, que emitirá un valor de 0 o 1 dependiendo del tipo de puerta lógica y su operación correspondiente.
La particularidad de la puerta NAND es su universalidad, así pues, podemos generar el resto de puertas lógicas con combinaciones de este tipo de puertas, tal y como se puede ver en el diagrama de abajo. Lo cual fue la base para el ejercicio de diseño que hice ya hace años cuando estuve estudiando la carrera.
Sin embargo, no se trata del único componente que podemos construir usando puertas NAND, también se puede hacer otro componente básico, el SR Latch, utilizando esta puerta universal para su construcción. ¿Y qué es este componente? Pues memoria SRAM de 1 bit que se puede usar para modelar los registros de un procesador, sus cachés e incluso chips de memoria RAM externa.
¿Qué necesitamos un decodificador, por ejemplo? No hay problema, lo podemos hacer también con puertas NAND. Al final nos encontramos que es posible crear un microprocesador entero usando esta puerta lógica.
Usamos un FPGA para el ejercicio
Ahora bien, hemos de partir del hecho que utilizamos Verilog para la creación de este sencillo chip y con ello un FPGA sumamente sencillo, tan simple que no era ni tan siquiera una tarjeta, sino que se conectaba a través de un puerto USB. En concreto lo hicimos usando un Xilinx Spartan-3AN como el que veis abajo programando con Verilog, pero que teníamos que compartir entre todos.
En cuanto a Verilog, se trata de un lenguaje de descripción del hardware, el cual se basa en enumerar los diferentes elementos en un lenguaje de sintaxis tipo C y la interconexión entre ellos. Lo redujimos todo al uso de la puerta NAND para poder comparar soluciones entre nosotros a la hora de resolver el ejercicio.
Sin embargo, nos pasamos más tiempo corrigiendo errores del generador automático que otra cosa. La gracia es que no programábamos directamente en Verilog, sino que a través de un programa interconectábamos las puertas entre sí. Y muchas veces la aplicación no trasladaba eso al código correcto, por lo que nos tocaba corregirlo a mano.
La verdad de la experiencia
El profesor que nos tocó para las prácticas no tenía ni la más remota idea de trabajar con Verilog, ni VHDL ni nada por el estilo, era un profesor de FP que se ganaba un dinero extra, por lo que al final tuvimos que ser nosotros los que no sacamos las castañas del fuego.
Para que os hagáis una idea, el ejercicio nos decía que teníamos que hacer un programa de 256 bytes dónde cada byte era una instrucción base. La salida de datos se hacía a través de una serie de luces LED que tenían que encenderse de una manera u otra y en un orden concreto para comprobar que el ejercicio estaba bien. Por lo que nuestro docente aparecía al final del ejercicio para hablarnos siempre de las lucecitas o meternos bronca por la circuitería analógica.
Al final, toda la asignatura, o mejor dicho, esa sesión de prácticas, se basó en el libro But How Do it Know, un libro casi desconocido, pero que os recomiendo leer si queréis saber los entresijos de cómo funciona realmente un microprocesador. Es más, la mejor forma de entender algo es haciéndolo.