Hola. En esta clase vamos a tratar de hacer un procesador simple. Veamos cómo va. Este procesador va a tener 4 registros de n bits cada uno, conectados a un "bus" con "tri-state buffers". Entonces, aquí tenemos registro 0, registro 1, 2 y registro 3 y estos están conectados. Entonces, yo puedo meter datos en cada uno de estos registros o puedo sacar datos. Estos datos van conectados al mismo "bus". Tengo un circuito de control, que me va a estar controlando los estados de estos "tri-state buffers". Y bueno, la señal "Extern" que está aquí, controla un "tri-state buffer" que recibe datos externos desde acá. Entonces yo además podría hacer que los datos que entran a este "bus" no solo vengan desde estos cuatro registros, R0 a R3, sino que también pueden venir de afuera, desde el mundo. El registro G recibe el resultado del módulo sumado: aquí está mi módulo sumador y aquí está el registro G que recibe ese resultado. Fíjense que el sumador opera sobre un registro A y una palabra B que está en el "bus", esa va a ser nuestra arquitectura de procesador. Podríamos haberlo hecho distinto, por ejemplo, podríamos haber puesto otro registro B aquí y hay que cargar el registro A para hacer la suma, hay que agregar el registro B para hacer la suma y luego de eso usamos la suma. En este caso, vamos a asumir que el registro A es un operando y B, que es el otro operando, viene directamente del bus. Perfecto. Así va a ser nuestro proceso. La señal "AddSub" que aparece aquí, determina si vamos a sumar o restar. Si es 0, vamos a sumar. Si es 1, vamos a restar. Entonces hay que hacer una ALU que tome esa señal y opere como sumador o restador. El procesador puede hacer las 4 operaciones que están en la tabla. Aquí hay una tabla. Puedo cargar un registro con datos y esto de aquí, es parecido a lo que uno diría en el lenguaje Assembly. Entonces, lo que estamos haciendo es mover el dato al registro Rx. Luego tenemos este otro, que es mover Rx a Ry, que significa mover el contenido. Esto significa el contenido de Ry al registro Rx; después sumar. Cuando uno dice mover, no es mover como uno mueve archivos. Mover es más bien copiar, en este caso. No es que lo movamos y el otro quede vacío. Mover es copiar. Después está sumar, donde el contenido de Ry y el contenido de Rx se guardan en Rx y finalmente, está restar. Las operaciones "Load" y "Move" requieren un ciclo de reloj, pero las operaciones de suma y resta requieren tres ciclos, porque primero tengo que meter Rx en A, después tengo que meter Ry en B y después tengo que sacar G, suponiendo que la operación aritmética es instantánea. Aquí, como dije antes, no tenemos un registro, no hay un registro en B, propiamente tal. Pero yo primero muevo un dato a A; luego, conecto algún registro a B. Entonces, no es que estemos moviendo el registro a B, sino que más bien estamos poniendo el dato de un registro en B. Y luego, hacemos la suma. La entrada "Function" va a determinar qué operación queremos hacer. Entonces, hay que tener un valor para "Function", que es la operación. 4 posibilidades. La operación es iniciada cuando hacemos W igual 1 y al terminar, el procesador entrega el "output" "Done". Entonces, cuando terminó la operación, después de los ciclos correspondientes, aquí aparece uno nuevo diciendo: "Hey, terminé". El dato que hay en G es el resultado. Dado que las operaciones de suma y resta requieren 3 ciclos de reloj, entonces vamos a usar un contador, en este caso de 2 bits, para controlar la operación, para ir contando en cuál de las tres partes de la operación estamos. Si mi contador dice 0, por ejemplo, voy a estar aquí. Si mi contador dice 1, voy a estar aquí. Si mi contador dice 2, voy a estar aquí, por ejemplo. El 0 va a ser una señal activa cuando no hay operación en curso y varias señales de control son generadas en los pasos T1 a T3. Entonces, este de aquí es mi contador de 2 bits. Cuando estoy en 0 no hay nada activo y eso es 0. Y después con este decodificador, finalmente digo cuál es el paso dentro de una operación. Aquí tengo mi registro de la función. Con mi registro de la función yo puedo decir qué operación quiero hacer. Entonces, cada operación está especificada, en este caso por 6 bits. O sea, no basta con decir 2 bits, que este sea 0-0, este sea 0-1, 1-0 y 1-1. No basta, en este caso. Vamos a usar 6 bits. F0 y F1 especifican cuál de las 4 operaciones vamos a usar. Esto sería F0 F1 y después necesitamos otros 4 bits. ¿Para qué son otros 4 bits? Para determinar los operandos. Porque yo tengo que saber si el primer operando viene del registro 0, 1, 2 o 3 y los otros 2 bits me dicen si el operando B viene del registro 0, 1, 2, 3. De ahí vienen. ¿Entonces yo no puedo meterle un dato directo desde afuera para operar? No, porque yo tengo que decirle a alguno de los 4 registros para operar con B. Entonces, B es uno de los 4 registros. Perfecto. Un circuito combinacional toma las salidas I, X e Y para generar las señales "Extern", "Done", los A, G, "AddSub", etcétera. Entonces, hay un circuito combinacional que genera todo eso. Faltan señales todavía. La señal "Clear", por ejemplo, es activada para que el contador vuelva a 0, cuando W igual 0 y no hay ninguna operación en curso. También tenemos que activarla cuando se acaba una operación para resetear el contador y volver a 0. Entonces, "Clear" va a ser W negado de 0, o listo. Eso simplemente, es lo que está acá. Frin va a ser utilizada para cargar la función en el registro "Function" cuando la señal W pase a 1; cuando estoy haciendo una función, entonces tengo que cargar esto en el registro "Function". Por lo tanto, Frin va a ser wT0. Y así con todas las señales que faltan. Este ejemplo está muy bien descrito en el libro. El Verilog está aquí. No vamos a ir sobre los detalles de Verilog. Lo dejo aquí para que lo miren. Y con eso concluimos esta clase. ¿Qué aprendimos hoy? Aprendimos un procesador simple que tiene registros, que puede operar sobre esos registros. Yo puedo cargarle datos de registros a la ALU para que sume y reste y aprendimos que puede hacer operaciones básicas. Aprendimos en general el circuito control y aprendimos el registro de función y decodificador, y vimos muy por encima cómo es el diseño en Verilog. Eso queda de tarea para ustedes. Nos vemos en la próxima. Chau.