Procesador TTA. Parte 1

Prefacio


La idea de crear mi propio procesador simple, si puedo llamarlo así, encendí durante mucho tiempo. La elección de la arquitectura es un asunto ambiguo, pero siendo parcialmente minimalista, quería implementar algo simple, al mismo tiempo potente y expandible, TTA fue perfecto para esto.
Parte 1.
Parte 2.
En resumen, la idea es que la unidad de control tendría un solo comando de movimiento de datos, y los cálculos serían un subproducto de estos movimientos.

Lo traeré a la vida en un programa simple para compilar y simular circuitos lógicos y eléctricos: Logisim lo eligió por su simplicidad y accesibilidad; en caso de una implementación exitosa, se planea reescribirlo a Verilog .

Al leer, es mejor tocar el proyecto de inmediato, se puede encontrar al final del artículo.

Bloque de control


La unidad de control es el componente principal. Para simplificar, se decidió elegir 16 entradas y 16 salidas, como resultado, el comando recibido en la unidad de control es de 8 bits, la primera mitad de los cuales apunta a una de las entradas, el otro a una de las salidas. Para que el bloque receptor entienda que los datos han llegado a él, se agrega 1 bit a cada entrada del bloque, es habitual llamar a estos bloques bloques funcionales.

Entonces:



Memoria


Para que la unidad de control ejecute el programa, debe almacenarse en algún lugar, la memoria será una unidad funcional, una de las salidas que se conectará al bus de la unidad de control.

Entonces:


La entrada más baja es una señal de reloj, la más a la izquierda son datos de entrada, la más a la derecha son datos de salida, también son comandos BU y el último es el que sirve como indicador, informando la llegada de datos. Al recibir los datos, se escribe en el contador, que indica el comando actual, con cada pulso de reloj, el contador aumenta y la unidad de control transmite datos de una FU a otra.

Otro fu simple


Cree FU simples que realizarán acciones comunes de suma y resta.
La plantilla FU se ve así: en la entrada hay registros de 8 bits de acuerdo con la cantidad de entradas, la escritura se realiza al recibir los datos. La salida también puede contener los registros en los que se almacenará la respuesta, pero esto no es necesario para el sumador.

Por lo tanto, el sumador y el sustractor se verán así:



Dispositivo terminado


Conectemos la memoria y la unidad de control, y luego intentaremos crear una nueva unidad de control y escribir un programa.
El botón actuará como una señal de reloj.

Entonces la conexión:


Ahora conecte el sumador y el sustractor, así como dos constantes de entrada:


Todo está listo para escribir un programa, realizará una secuencia banal de acciones: agregue una al valor anterior del sumador, y luego vaya al principio por medio de una transición relativa (para esto, se realizó un sustractor: 3).

Escribamos un programa.

Inicialmente, todos los registros se reinician, por lo que no tiene sentido hacerlo, el primer comando es enviar una unidad a una de las entradas del sumador (In3 -> O2), enviar la salida del sumador a su segunda entrada (In1 -> O1), enviar la dirección de memoria actual a la entrada del sustractor (In0 -> O3), al enviar el cambio de dirección a otra entrada del sustractor, se restará (In4 -> O4), después de que el sustractor vaya a la entrada del puntero de dirección, completando así la transición (In2 -> O0).

El programa se ve así:

1. In3 -> O2
2. In1 -> O1
3. In0 -> O3
4. In4 -> O4
5. In2 -> O0

En memoria:


Eso es todo. Este programa funciona correctamente. Planeo hacer más UF y hacer que su conexión con la unidad de control sea más conveniente, por cierto, las UF son prácticamente dispositivos ControlFlow. También puede conectar varias unidades de control juntas, es decir, crear una red de dichos dispositivos.

¡Gracias por la atención!

GitHub

All Articles