CPU in Minecraft

WORK IN PROGRESS

Voy a ir actualizando este post según valla avanzando con la CPU, ya que es un proyecto complicado que me llevará su tiempo.

Esta Es la segunda CPU que hago en Minecraft. La primera que hice (a principios de 4º de la ESO) fue bastante simple y muy cutre, pero mi intención es hacer una bien hecha, por lo tanto estoy creando esta (a principios de 2º de Bachillerato).

Primera CPU:

https://www.youtube.com/watch?v=lzufHP3hNGU

ÍNDICE

  -ALU
      ·Full Adders
      ·Complemento A2
      ·Comparador
      ·ALU entera
      ·Implementaciones extra
  
  -RELOJ
  
  -MEMÓRIAS
      ·ROM
      ·RAM
      ·Files
      ·...
   
  -PROGRAMAS
      ·Calculadora
      ·Juegos
      ·Editor de texto
  
  -GRÁFICOS
      ·Pantalla
      ·Tarjeta gráfica
  
  -TECLADO
      ·Teclado y Encoder
      ·Serialización de datos
      ·Decoder

ALU

Este es uno de los componentes mas importantes de una CPU, la ALU es la Unidad Aritmetica Lógica de la CPU, es decir, la parte que se encarga de los calculos y las operaciones logicas.

En la ALU que he hecho hay 3 partes importantes: Full Adders, Modulo A2 y un comparador.

FULL ADDERS

Con este circuito logramos hacer sumas en binario. A continuación dejo un esquema de como es el circuito con puertas lógicas:

Entonces lo que he hecho ha sido hacer lo mismo pero en el juego. Generalmente se utilizan dos formas de hacer esto, una es con antorchas de redstone (que son un objeto que permiten invertir la señal) o también se puede hacer con comparadores que es otro objeto con el que se pueden comparar intensidades o hacer restas de intensidades. En la primera CPU utilicé la primera form, pero en esta he optado por la segunda, ya que permite hacer el circuito mas limpio y compacto.

MÓDULO A2

Esta es la forma óptima de hacer restas en binario ya que nos permite hace restas con resultados positivos, negativos o 0.

Hay dos formas de hacer esto, pero voy a explicar la mas compleja pero que para este caso es la mas simple.

Tenemos dos números en binario, uno lo dejamos sin tocar, pero al otro le vamos a hacer un complemento a1, osea, lo vamos a invertir, es decir, que todos los 0 se conviertan en 1 y viceversa. Si no hiciesemos nada mas y sumasemos los dos numeros se haría una resta, pero tendría +0 y -0, pera que eso no pase ahora le tendremos que hacer un complemento a2 es decir, que le vamos a sumar 1. Y aquí ya podemos sumar ambos números y ya estaría.

Ahora vamos a pasar esto a Minecraft:

Ahí estoy utilizando 2 columnas de Full Adders (para que se vea mas claro el proceso), pero no es necesario, podemos directamente injectar +1 en el carry in de los full adders que es lo que haré en la ALU para compactarla. También aqui he tenido el problema de que no se porque no funciona del todo bien, pero eso lo explicaré con la ALU, porque ese problemita lo he solucionado ahí.

COMPARADOR

Como los números negativos en vinario son los positivos invertidos, nos puede dar problemas al interpretar negativos como números enormes, por lo que necesitamos un output que nos diga si es positivo o negativo. Para eso lo que hay que hacer es comparar cual de los números es mas grande. Si el primero es mayor al segundo entonces es positivos, pero sino es negativo.

(es el output que vemos arriba del todo en la ALU)

ALU COMPLETA

Una vez juntados todos los módulos y quitada la primera columna de full adders del módulo a2, queda así:

Vale, como he dicho antes al hacer restas da algún problemita cuando hago restas con resultado negativo va bien, pero con positivos no (resultado = número que debería salir - 1). Por lo que decidí aprobechar el comparador para otra función a parte de la original, es decir, si el resultado de una resta será positivo le hace +1, pero sino no y funciona así que uwu.

IMPLEMENTACIONES EXTRA

Con esto me refiero a multiplicaciones, divisiones.... Esto lo añadiré en el programa de calculadora, ya que no lo necesito para operaciones matematicas y logicas basicas de la CPU.

RELOJ

Esto se puede utilizar como reloj o como cronometro. Da horas desde las 00:00.00 hasta las 23:59.59, es decir horas, minutos y segundos.

Claro, hay un problema, en los últimos 4 digitos todos los numeros son siempre iguales es decir, que van o de 0 a 5, o de 0 a 9. Pero, en los primeros dos no, osea, en el primero puede ir de 0 a 2 y hay todo normal, pero en el segundo va cuando en el primero digito es 0, entonces va de 0 a 9, cuando es 1, lo mismo, pero cuando es 2, entonces irá de 0 a 3, por lo que hay que contemplar esos 3 casos, pera eso lo que he hecho es un contador de 3 que limitará el número maximo antes de que vuelva a 0.

MEMÓRIAS

ROM

(ESTA VERSIÓN DE LAS MEMÓRIAS NO ES LA MAS ACTUALIZADA, LA ACTUAL ESTA MAS ADELANTE PERO YA QUE ESTE FUE EL PRIMER DISEÑO HE DECIDIDO DEJARLO)

Voy a poner un máximo de 10 slots en los que puedas añadir, borrar, editar o leer textos. (En este caso voy a utilizar esta memória solo para textos, pero que la podría utilizar para almacenar cualquier otro tipo de datos)

Estos textos tendrán un máximo de 40 caracteres (quizás mas). Para eso voy a utilizar un concepto de memória bastante básico, basicamente si quiero que almacene informacion activo el dropper y meta un item en el hopper, de esta forma se mantendra en el hopper hasta que lo desbloqueemos, y eso lo podemos detectar:

Claro, esto no lo puedo dejar así porque no serviría para nada. Lo primero que hay que hacer es detectar en que byte del texto esta, para eso utilizamos la parte de la derecha, que hace que al utilizar un byte ese byte se bloquee y se desbloquee el siguiente. Luego tenemos que ver si ese byte esta desbloqueado y si lo esta que se escriba o se lea ahi la información, para eso esta la parte de la izquierda.

En la foto hay un sitio donde pone select, eso es porque cada bite del mismo byte estarán en la misma columna, es decir, uno encima del otro y se desbloqueará esa columna. Y cada archivo estará en la misma fila. Luego a su lado estara el siguiente archivo de texto y asi hasta 10.

Y también el input del medio es el reset, esque me acabo de dar cuenta de que no lo puese y me da pereza editar la foto.

Tras unos cuantos cambios y algunos apaños para solucionar un par de problemitas que había y juntar varios módulos, queda así:

Y la memoria de un archivo de texto quedaría así:

Y ya la de los 10 espacios para archivos así:

Ya lo he terminado, así que voy a explicar un poco lo que le he añadido:

Primero he puesto un sistema de select de memoria, es decir, para activar una unica memoria de las 10 posibles, para eso su input esta aquí abajo:

Con el input del select bloqueo el output de las memórias que no están seleccionadas y a la vez me llevo la señal al otro lado para bloquear el input de la memória, para que no modificar las que no están seleccionadas:

Entonces luego ya conecto todos los inputs de las memórias (ya que si no estan seleccionadas no se pueden modificar), conecto los resets con el cable rojo (que se me ha olvidado ponerlo pero también se bloquean) y pongo un cable que dirá a las memórias cuando se han modificado una vez, para poder dar espacio y que no se escriba nada en ese byte. Y a su vez también por el otro lado conecto los outputs de las memórias.

Y ya una vez terminada la ROM, quedaría así:

(ya lo siento porque me haya extendido tanto en esta parte pero esque llevo 4 días metiendole muchísimas horas y es mas complicado de lo que parece)

Y una pequeña cosa extra, para poder mandar datos a la RAM hay que hacer un pequeño apaño. Hay que dividir el reset en dos para poder moverse hacia adelante y hacia atrás en los bytes de la memoria sin que se borre la memória (la parte del select, es decir la nueva parte del reset es el cable amarillo):

Y vistos algunos fallos he hecho algún que otro apaño mas, pero no quiero escribir mas XD

VERSIÓN ACTUALIZADA

Ya que la versión anterior es muy voluminosa a la hora de agrupar varios modulos uno tras otro, mediante prueba y error he estado intentando hacer una versión mas compacta y este es el resultado:

Y quedaría de este tamaño, en total son 640 bytes:

RAM

La idea es tener una memória en la que puedas gardar cosas temporalmente, entonces conectare los outputs de las otras memórias al input de la ram, y el otput de esta, al input de las memórias (para por ejemplo la opción de pegar texto ya copiado). También tengo que tener en cuenta la cantidad de caracteres y algunas cosas más, pero no me quiero extender.

La Ram estará posicionada en ese sitio, ya que esta cerca de las otras memórias y no estorba demasiado:

Y pues ya todo conectado:

PROGRAMAS

GRÁFICOS

TECLADO