Emulación de CPU en Arduino UNO.

Hola!

Recientemente diseñé un esquema de una CPU de 8 bits (Apodado "MAINOR-CPU V1")y tenía la intención de llevarla a cabo sobre un soporte físico. La primera idea que se me ocurrió fue hacerlo con componentes discretos (inspiración: aquí), pero llevaría mucho tiempo y la dificultad que conllevaría seria alta. Entonces se me ocurre que tal vez pueda emular la CPU en un Arduino UNO, con un input (interruptores y un botón) para programar la ROM y un output (leds) en el que mostrar la salida de la ALU y el reloj.

Es una CPU simple. Se denomina RISC por tener un set de instrucciones sencillo (Reduced Instruction Set Cpu), sólo tiene IMM (IMMediate, un valor) y OP (OPerand, la operación de la ALU, registros y RAM).

Mi duda es la siguiente: ¿Sería el Arduino UNO capaz de emular una CPU así de simple? Presupongo que la respuesta es sí, que no hay problema, pero quería saer la opinión al respeto y las dudas o sugerencias que puedan aparecer.

Gracias!

Una rápida búsqueda en Google sobre "MAINOR-CPU V1" me arroja, como único resultado relevante, este hilo; por lo tanto no tengo contexto alguno de lo que pretendes hacer. Sin embargo, si conoces las caraterísticas necesarias de dicho CPU, podrías bien emularlo con un Arduino.

Suponiendo que se trata de construir una computadora de arquitectura Harvard (datos y dirección están separados en buses distintos) como de la época de los 80 (donde CPU, RAM y las E/S están consolidados en chips separados), debes saber que un Arduino posiblemente no pueda emular la cantidad de pines de un CPU físico de aquel entonces; con sólo decir que solían tener 16 pines para el bus de dirección.

Debido a lo anterior, el bus de dirección podría ser emulado únicamente por un Arduino Mega o dos registros de desplazamiento (shift registers en inglés) SIPO en cascada (asumiendo que cada uno tenga 8 salidas); mientras que el bus de datos, al ser de 8 bits según dices, perfectamente lo puede manejar el Arduino directamente, con todavía pines de sobra como para otras líneas (aparte de las requeridas por los registros de desplazamiento) como el señalador de lectura o escritura (R/W), señales de interrupción (creo que esa función sería para un proyecto más avanzado), y tal vez una entrada (o salida) de reloj en caso de que todos los componentes deban trabajar sincronizadamente. Pero bueno, eso va a depender del "pinout" (y sus funciones) del CPU que se quiera emular.

Otro detalle interesante, es que se puede utilizar la RAM del microcontrolador para emular los registros de dicha CPU, preferiblemente en un vector de bytes. Así, podremos mapear los registros referenciados por algunos "opcodes", a espacios de ese vector (ej.: registro[0x04] mapea el quinto registro de la CPU real).

Lo que debes programar en el Arduino para emular dicha CPU, es la decodificación de los "opcode" (conjunto de instrucciones) y lo que hace internamente para ejecutarlos (microcódigo); además de los aspectos que no se deben obviar, como el proceso de obtener una instrucción, y la manipulación adecuada para con el exterior (buses, líneas de señalización, etc.; básicamente lo que se refiere a los pines).

Eso es todo lo quisiera decir al respecto sobre el tema, esperando que se haya comprenido, o al menos que de algún modo sirviera de ayuda! :)

Lo mejor es que vayas por el camino de las FPGA´s