La M aquina Sencilla Organizacion de Computadoras I 18 de marzo de 2002 Este apunte esta hecho por la catedra de Organizacion de Computadoras I de la Facultad de Ciencias Exactas y Naturales de la Universidad de Buenos Aires. Esta basado un texto de la Universidad Politecnica de Catalunia. A lo largo del apunte describiremos la arquitectura y la organizacion de una maquina muy sencilla pero con gran detalle. En muchos casos se presenta una parte de la arquitectura y luego su manera de implementarla (organizacion) sin separarlas en distintas secciones. En el captulo 1 trataremos brevemente algunos conceptos basicos que seran usados luego en el resto del apunte. En el captulo 2 describiremos la arquitectura y organizacion de la maquina. En el caso que se detecten errores o se deseen hacer sugerencias con respecto a este apunte por favor mandar un mail a [email protected] 1 Indice General 1 Arquitectura y Organizacion 1.1 Procesador . . . . . . . . . 1.2 Memoria . . . . . . . . . . . 1.3 Entrada/Salida . . . . . . . 1.4 System Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4 6 7 8 2 La Maquina Sencilla 2.1 Arquitectura y organizacion . . . . . . . . . . . . . 2.1.1 Conjunto de instrucciones . . . . . . . . . . 2.1.2 Memoria . . . . . . . . . . . . . . . . . . . . 2.1.3 Formato de instruccion . . . . . . . . . . . 2.1.4 Codigo de operacion . . . . . . . . . . . . . 2.1.5 Operandos . . . . . . . . . . . . . . . . . . 2.2 Dise~no del procesador . . . . . . . . . . . . . . . . 2.2.1 Registros . . . . . . . . . . . . . . . . . . . 2.2.2 Unidad aritmetico logica (ALU) . . . . . . 2.2.3 Accesos a memoria . . . . . . . . . . . . . . 2.3 Esquema completo de la Maquina Sencilla . . . . . 2.4 Ciclo de instruccion . . . . . . . . . . . . . . . . . 2.4.1 Ciclo de instruccion en la Maquina Sencilla 2.5 Dise~no de la Unidad de Control . . . . . . . . . . . 2.5.1 Ciclo de instruccion . . . . . . . . . . . . . 2.6 Optimizacion de los ciclos de instruccion . . . . . . 2.6.1 Optimizacion de la instruccion ADD . . . . 2.6.2 Optimizacion de M OV , C M P y BE Q . . . 2.6.3 Estados . . . . . . . . . . . . . . . . . . . . 2.7 Implementacion de la UC . . . . . . . . . . . . . . 2.7.1 Descripcion . . . . . . . . . . . . . . . . . . 2.7.2 Clock . . . . . . . . . . . . . . . . . . . . . 2.7.3 Implementacion . . . . . . . . . . . . . . . . 2.7.4 Comentario sobre la UC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 10 10 12 13 13 14 15 16 18 19 20 22 23 23 24 27 27 29 30 31 31 32 32 35 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A Logica Digital 37 A.1 Operaciones logicas . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2 Cap tulo 1 Arquitectura y Organizacion >Que es una computadora? En inges el verbo \To Compute" signica \hacer cuentas". Historicamente \computer" no era una maquina, sino era el que trabajaba haciendo calculos. Desde este punto de vista podemos pensar que una computadora es una maquina capaz de hacer calculos. Las primeras computadoras podan resolver determinados problemas |ejecutar determinados algoritmos| que eran parte de la computadora. Las maquinas actuales permiten ejecutar todo tipo de algoritmos ya que estos son ingresados como datos. Una computadora esta caracterizada por varios aspectos, uno de los principales es el conjunto de instrucciones a partir de los cuales se deben expresar todos los algoritmos. La arquitectura se puede denir como las caractersticas de una computadora que necesita conocer un programador para poder hacer uso de el. Esta denicion de arquitectura no es la unica ni la mejor, veamos otras dadas por distintos autores: Baer: \Es el dise~no de un sistema integrado que brinda una herramienta util para el programador" Hayes: \El estudio de la estructura, el comportamiento y el dise~no de las computadoras" Abd-Alla: \El dise~no de la especicacion del sistema a un nivel general o a un nivel de de sub sistema" Foster: \El arte de dise~nar una maquina con la cual sera un placer trabajar" Hennessy and Patterson: \La interface entre el hardware y el nivel mas bajo del software" 3 La diversidad de estas deniciones nos muestra que no esta claro que partes |reales o conceptuales| forman parte de la arquitectura de una computadora. En este curso usaremos la denicion del parrafo anterior y la de HennessyPatterson. Estas dos tienen muchas cosas en comun. La organizacion de una computadora es la implementacion de su arquitectura. Esta es invisible al programador. Incluye que bloques funcionales lo constituyen y como se relacionan. No siempre es facil determinar si un determinado componente pertenece a la arquitectura o a la organizacion. Se denomina programa a la secuencia de instrucciones que resuelve un determinado problema o implementa un determinado algoritmo. Toda computadora consta de las siguiente partes: Procesador: esta destinado a ejecutar operaciones. Sus componenetes basicos son: { Unidad Aritmetico-Logica (ALU): destinada a realizar operaciones aritmeticas (+; ; ; =) y logicas (and, or, xor . . . ). { Registros: almacenan los datos con que operar y resultados de la operacion. { Unidad de Control (UC): gobierna el funcionamiento del procesador. Para cada instruccion del programa, la UC decide que accion debe realizar cada parte del procesador. { Reloj: emite pulsos regularmente. La UC funciona gracias a estos pulsos. Memoria: almacena informacion a la espera de ser trasladada al procesador o al subsistema de entrada/salida. Entrada/Salida: permite toda comunicacion con el exterior, a traves de perifericos o dispositivos de E/S. Esta comunicacion puede ser con un usuario (monitor, mouse, teclado, etc.), con almacenamientos secundarios (disco rgido, disco optico, CD) o con otros sistemas (redes, puertos seriales, USB, etc) Buses: permiten la transferencia de informacion entre las distintas partes que constituyen el computador. La estructura general de una computadora es la mostrada en la gura 1.1 En general se suelen utilizar echas con area para indicar un grupo de lneas y echas de una dimension para indicar una unica lnea. 1.1 Procesador Para el progamador de la computadora, el procesador se caracteriza por su conjunto de instrucciones (conjunto de operaciones basicas que es capaz de 4 Figura 1.1: estructura general de una computadora realizar). Para cada instruccion, la UC realiza una secuencia de acciones a n de realizar la operacion indicada en la instruccion. Es conveniente tener una peque~na memoria dentro del procesador, para tener \a mano" datos usados repetidas veces o resultados intermedios de operaciones mas complicadas que las elementales. Esta memoria son los registros. Podemos dividir a los registros en dos categoras: los de usuario o de uso general y los de sistema o de uso especco. Los primeros estan a disposicion del programador, y este los usara para guardar cualquier valor que crea conveniente, los segundos no son directamente accesibles por el programador y tienen un n determinado, no es posible guardar en ellos cualquier valor. Ejemplos de registros de uso especco son: Program Counter (PC): indica la direccion de memoria donde se encuentra la proxima instruccion a ejecutar. Tambien se suele usar el nombre Registro de Proxima Instruccion (RPI). Registro de Instruccion (RI): Guarda la instruccion que se esta ejecutando. Registro Direcciones de Memoria (RDM): se usa para mandar direcciones a memoria. Registro Buer de Memoria (RBM): se usa para mandar y recibir datos desde y hacia memoria. Codigos de condicion: guardan |entre otras cosas| informacion sobre la ultima operacion realizada por la ALU. Tambien se suele usar el nombre de Program Status Word (PSW) La ALU es la unica parte con capacidad de hacer operaciones aritmeticas y logicas sobre numeros. Toma dos numeros como entrada y devuelve el resultado 5 de una operacion entre esos numeros e informacion adicional sobre ese resultado. Esa informacion es usada |por ejemplo| para realizar comparaciones, y queda almacenada en el registro de codigos de condicion. Ver gura 1.2. Figura 1.2: estructura general de un procesador 1.2 Memoria El bloque de memoria almacena dos tipos de informacion: datos: variables y constantes utilizados en el programa programa: secuencia de instrucciones La memoria esta compuesta por una enorme cadena de ceros y unos. Esta cadena se divide en celdas de tama~no jo. Cada celda de memoria tiene una direccion (un nombre) para poder ser usada por el procesador (o el subsistema de E/S). Un acceso a memoria es una operacion de la forma \Dar el contenido de la celda con direccion 3322" o \Guardar el valor 33 en la celda con direccion 1234". El tama~no de las celdas y el tama~no de las direcciones depende de cada computadora. 6 En un acceso a memoria se puede traer una o mas celdas de memoria. La cantidad de celdas de memoria que se traen en un acceso es determinada por el dise~nador de la computadora, no por el programador. La longitud de la palabra es la cantidad de bits que se traen en un acceso a memoria 1 . Podemos pensar a la memoria como un gran arreglo de celdas donde cada ndice del arreglo se corresponde con la direccion de cada celda. De esta manera, para indicar del contenido de una determinada direccion escribiremos Mem[direccion] o simplemente [direcci on], de la misma forma que haramos en un arreglo. Existen distintas formas de indicar a la memoria cual es la celda sobre la que se desea trabajar. Direccionar quiere decir indicar a la memoria una direccion. Las distintas formas de direccionar se llaman modos de direccionamiento, y estos tambien son parte de la arquitectura. Los modos de direccionamiento mas comunes son los siguientes: Directo: Traer el contenido de la celda 1234. Ej: Mem[1234] Indirecto: Traer el contenido de la celda, cuya direccion esta guardada en la direccion 2345. Ej: Mem[Mem[2345]] Inmediato: No se accede a memoria. El dato es una constante. Ej: 1024 1.3 Directo de Registro: Traer el contenido de la celda, cuya direccion esta guardada en el registro 2. Ej: Mem[R2] Indexado: Traer el contenido de la celda cuya direccion se obtiene haciendo la suma de dos direcciones. Cada una de estas direcciones pueden tener cualquiera de los anteriores modos de direccionamiento. Ej: Mem[R1+10] Entrada/Salida El subsistema de entrada salida esta compuesto por dos partes: controladores, intefaces y procesadores de E/S dispositivos de E/S Los ejemplos de dispositivos de E/S son innumerables, aqu se mencionan solo algunos: De entrada: scanner, lapiz optico, mouse, joystick, teclado, touch screen, etc. De salida: monitor, impresora, plotter, etc. De E/S: disco rgido, disco exible, disco optico, cintas, CD, CDR, DVD, tape backup, placas de red, placas de sonido, placas de video, etc. 1 Esta es una denici on posible de palabra pero no la unica. Existen excepciones por causas particulares. 7 Los controladores, interfaces, y procesadores de E/S hacen de intermediarios entre el procesador y los dispositivos. Alivian la tarea el procesador y proporcionan al programador una forma simple de usar cada dispositivo. As como cada celda de memoria tiene una direccion unica para poder ser referenciada, cada controlador tiene al menos una direccion propia. En la gura 1.3 vemos un esquema del subsistema de E/S Figura 1.3: Subsistema de Entrada/Salida 1.4 System Bus La transferencia de informacion entre las distintas partes de una computadora se realiza usando un bus. En principio podemos pensar un bus como un conjunto de cables o lneas por los cuales se transmitira informacion. Un system bus se divide en las siguientes partes: Bus de direcciones: a traves de el el procesador indica la direccion de memoria donde se encuentra el dato que desea acceder. Bus de datos: por el se transere el contenido de la posicion de memoria seleccionada. Es un bus bidireccional, es decir, permite la transferencia de informacion desde memoria al procesador (operacion de lectura) o desde el procesador a memoria (operacion de escritura). Bus de control: conjunto de lneas que controlan la transferencia a realizar (entre otras cosas). Cabe destacar, de entre otras, las lneas de lectura/escritura, acceso a memoria/periferico, reloj, . . . 8 Figura 1.4: Partes de un bus En la gura 1.4 se muestra un esquema de las partes de un bus. Como en un instante cada lnea fsica del bus puede tener un unico valor, no es posible transmitir mas de un dato por vez. Al estar conectado el bus con muchas partes funcionando en forma asncrona es posible que mas de una parte desee hacer uso del bus en un instante. En este caso se debe priorizar alguna parte con algun criterio. Justamente estos criterios, constituyen la poltica de asignacion del BUS. Notacion: su suele usar el smbolo @ para designar direcciones. 9 Cap tulo 2 La Maquina Sencilla 2.1 Arquitectura y organizaci on 2.1.1 Conjunto de instrucciones Queremos dise~nar un procesador capaz de ejecutar 4 instrucciones diferentes: suma: suma el contenido de dos posiciones de memoria Dst y F te dejando el resultado en la direccion Dst: ADD Dst, Fte [Dst] [Dst] + [F te] Ademas modica un codigo de condicion que denominaremos F Z en funcion del resultado de la operacion. Este indicador toma el valor 1 si el resultado es cero o se activa a 0 en caso contrario, es decir, FZ ([Dst] + [F te] = 0) 1 movimiento: copia el contenido de una posicion de memoria posicion Dst: MOV Dst, Fte [Dst] [F te] FZ ([F te] = 0) comparacion: compara el contenido de dos posiciones de memoria F te: CMP Dst, Fte [F te] [Dst] FZ ([F te] [Dst] = 0) No almacena el resultado de la operacion en el destino. salto: si F Z = 1, pasa a ejecutar la instruccion que se encuentra en la direccion Dst. En caso contrario, continua con la siguiente instruccion de F te a otra Dst y 1 En esta asignaci on se esta guardando en FZ el valor de verdad de la expresion de la derecha. 10 memoria. BEQ Dst Si F Z = 1 entonces P C Dst Esta instrucci on permite romper el secuenciamiento implcito de las instrucciones de un programa. Veamos cual sera la secuencia de instrucciones que debera ejecutar la CPU para realizar una multiplicacion de dos variables a y b dejando el resultado almacenado en la variable c. El algoritmo escrito en lenguaje Pascal sera: begin c := 0; i := 0; while i < b do begin c := c + a; i := i + 1; end end Se entiende por lenguaje ensamblador a un conjunto de instrucciones con nombres mnemotecnicos mas algunas facilidades para el programador como las etiquetas. Una traduccion posible de este algoritmo al lenguaje ensamblador de nuestra computadora es: begin: MOV MOV while: CMP BEQ ADD ADD CMP BEQ end: c, 0 i,0 i, b end c, a i, 1 1, 1 while ; c := 0 ; i := 0 ; mientras i < b ; c := c + a ; i := i + 1 Fijemonos que la ultima instruccion de salto debe ser incondicional, es decir, debe saltar siempre. Como nuestro conjunto de instrucciones no incluye un salto incondicional se hace una comparacion que fuerce F Z = 1 con lo cual logramos que el BE Q salte siempre. Un programa ensamblador no puede ser ejecutado directamente en una computadora. Se debe ensamblar y linkear el programa para convertirlo en codigo de maquina (lenguaje de maquina). Este ultimo es la codicacion en binario del programa ensamblador y es lo que entiende el procesador. El lenguaje ensamblador existe simplemente para facilitar la tarea del programador. Una caracterstica importante de un lenguaje ensamblador es que sus instrucciones se corresponden una a una con el lenguaje de maquina. 11 2.1.2 Memoria Tanto el programa como las variables y constantes que se utilizan deben residir en memoria. En el dise~no de esta computadora supondremos que el bloque de memoria dispone de una capacidad de 128 palabras. La interfaz de la memoria es la que muestra en la gura 2.1 Se conecta con el bus de direcciones para recibir en donde debe leer o escribir, con el bus de datos para enviar o recibir datos y tiene una lnea de control de un bit para que le indiquen la operacion que debe realizar (lectura o escritura). Figura 2.1: Memoria Veamos como se ubicara el programa anterior en la memoria. Suponiendo que las variables y constantes se almacenan a partir de la direccion 0x10 2 y el programa a partir de la direccion 0, tendremos las siguientes direcciones de memoria asignadas a las variables, constantes e instrucciones del programa, suponiendo que cada una de ellas ocupa una palabra de memoria: etiqueta a b c i 1 0 begin: while: end: 2 0x direccion 0x10 0x11 0x12 0x13 0x14 0x15 0x00 0x02 0x08 se usa para aclarar que los numeros estan en hexadecimal. 12 2.1.3 Formato de instrucci on En las secciones anteriores vimos que tanto los programas como los datos que estos utilizan estan almacenados en memoria y viajan al procesador a traves del bus de datos. Esta observacion, en principio trivial, esconde un concepto importante; para el procesador no hay diferencia entre los programas y los datos. Si uno mirara un pedazo de la memoria no podra saber si en ese lugar esta almacenado un programa o los datos que el programa usara. Esta claro que el procesador interpretara programas y datos de una manera muy distinta, ya que en cada acceso a memoria sabe si lo que recibe es un dato o una instruccion, pero a pesar de ser interpretados de distinta manera ambos son tratados |desde el procesador| como datos. El hecho que los programas sean datos para el procesador, es lo que hace que una computadora sea de proposito general. Las primeras computadoras no fueron de proposito general sino que tenan determinados algoritmos que saban aplicar a los datos residentes en la memoria. Una maquina es de proposito general cuando los algoritmos que aplica son un dato mas de entrada. Ahora que tenemos en claro que los programas residen en la memoria y, que sabemos que un programa esta compuesto por un conjunto de instrucciones, podemos asegurar que cada instruccion debera codicarse en binario para poder ser almacenada en memoria. Se denomina formato de una instruccion a la organizacion en campos de bits de toda la informacion que requiere la instruccion para ser ejecutada. 2.1.4 Codigo de operacion Veamos que es lo que hace el procesador cuando recibe una instruccion de memoria. Primero debe conocer de que instruccion se trata, la manera mas simple de hacer esto es asignarle un numero o codigo a cada instruccion. Este codigo se llama codigo de operacion (CodOp) (muchas veces se usan los terminos instruccion y operacion indistintamente). El procesador en la UC tendra un decodicicador que le permita saber que codigo se corresponde a que accion (que instruccion). Demos un ejemplo: el codigo de operacion esta en el sistema (2, 3), esto permite tener 23 instrucciones distintas. Ademas de conocer la longitud del codigo de operacion es necesario conocer su ubicacion dentro de la palabra (recordemos que de memoria siempre llegan palabras). Es natural suponer que los 3 bits mas signicativos de la palabra tienen el codigo de operacion. 3 Al llegar una palabra de memoria la UC compara los 3 bits del codigo de operacion con su tabla, si no se encuentra tenemos un error, si se encuentra la UC sabe que acciones debe realizar para ejecutar esa instruccion. 3 Pero es una decision arbitraria 13 2.1.5 Operandos Una vez que la UC sabe de que instruccion se trata, tambien sabe cuantos parametros necesita y de que tama~no. Si la instruccion es una suma, debera tener al menos dos valores para sumar y un lugar para guardar el resultado. Al ser estos los valores usados para ejecutar la operacion se les da el nombre de operandos. Vimos que existen muchas maneras de decir donde se encuentra un dato (modos de direccionamiento). Cuando la UC busca los valores para ejecutar la operacion debe conocer que modo de direccionamiento se esta usando en este caso. Esa informacion tambien esta implcita en el codigo de operacion. Para el caso de nuestra suma podemos suponer que la instruccion tiene dos operandos, ambos usando el modo de direccionamiento directo. Esto quiere decir que la instruccion tendra dos direcciones de memoria donde se encuentran los dos numeros que se deben sumar. Es comun suponer que el resultado se almacenara en la primera de estas direcciones, muchos procesadores actuales as lo hacen. Veamos como queda el formato de nuestra instruccion de suma: Codop dst fte En el caso que el dise~nador desee agregar una nueva instruccion de suma, por ejemplo con un operando con modo de direccionamiento directo y un operando con modo inmediato, debera agregar un nuevo codigo de operacion, ya que para resolver esta nueva suma la UC debe hacer distintas acciones que para resolver la anterior. Maquina Sencilla Como nuestra maquina dispone solo de 4 operaciones distintas, alcanza con que el campo que indique la instruccion a ejecutar tenga 2 bits. Los codigos de operacion asignados a cada instruccion seran los de la tabla 2.1 CodOp 00 01 10 11 operacion ADD CMP MOV BEQ Tabla 2.1: Codigos de operacion de la MC Las instrucciones ADD, CMP y MOV necesitan dos operandos (suponiendo que ADD guarda el resultado en uno de ellos) y la instruccion BEQ uno solo, as que en la maquina tendremos dos formatos distintos de instruccion. En maquinas reales suele haber mas formatos de instrucciones pero no demasiados ya que, cuantos mas sean, mas complicada sera la UC. Como la memoria de nuestra maquina es de 128 palabras y deseamos que un operando pueda estar en cualquier lugar de la memoria, cada direccion debe 14 tener 7 bits. Por lo tanto los formato de instruccion en la nuestra maquina son los siguientes: Formato de las instrucciones ADD, CMP y MOV Formato 1 2 bits Codop 7 bits Dst 7 bits Fte 2 bits Codop 7 bits Dst 7 bits Basura Formato de la instruccion BEQ Formato 2 Al ejecutar un programa, el procesador lee de memoria una a una las instrucciones que constituyen dicho programa. Si las instrucciones precisan datos, sus direcciones estaran despues del codigo de operacion. Datos Los datos que nuestra maquina va utilizar son numeros sin signo o notacion complemento de 16 bits. La memoria se utiliza para almacenar tanto instrucciones como datos, est organizada como 128 palabras de 16 bits cada una. Con este formato para instrucciones y datos, el programa ejemplo anterior quedara almacenado en memoria tal como muestra la gura 2.2. En la primera columna vemos cada instruccion del programa en lenguaje ensablador. En la segunda, en que direccion de memoria se almacena esa instruccion. Luego cada campo en binario de la instruccion. Donde aparece x es porque no interesa el valor del bit. Se asumio que son ceros. En la ultima esta la codicacion en binario de la instruccion, es decir cada instruccion en lenguaje de maquina. Leng. Ens. MOV c, 0 MOV i,0 CMP i, b BEQ end ADD c, a ADD i, 1 CMP 1, 1 BEQ while Dir 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 CoDop 10 10 01 11 00 00 01 11 Destino 00 1001 0 00 1001 1 00 1001 1 00 0100 0 00 1001 0 00 1001 1 00 1010 0 00 0001 0 Fuente 000 0000 000 0000 001 0001 xxx xxxx 001 0000 001 0100 001 0100 xxx xxxx Cod. maquina 8900 8910 4991 C400 0910 0994 4A14 C100 Tabla 2.2: Programa almacenado en memoria 2.2 Dise~ no del procesador Pasaremos a dise~nar el procesador de nuestra maquina. 15 2.2.1 Registros Contador de programa Hemos visto en la introduccion que existen algunos registros de uso especco que estaran en cualquier maquina. Uno de ellos es el program counter (P C ) o contador de programa o registro de proxima instruccion (RP I ). Este registro tendra siempre la direccion de memoria donde se encuentra la proxima instruccion que se debe ejecutar. Como un programa siempre estara almacenado en la memoria de forma secuencial, es decir, una instruccion detras de la otra, cada vez que ejecutemos una instruccion se debera incrementar en uno el P C para ejecutar las instrucciones en orden. Esta operacion de suma sobre el P C se debera realizar muchas veces (una vez por cada instruccion a ejecutar), por lo tanto no es ilogico pensar en agregar circuitera especial para realizarla. Un diagrama de esta circuitera se muestra en la gura 2.2. Figura 2.2: PC con su sumador En la gura se muestran dos lneas de control. Todas las lneas de control |de este y de todos los esquemas| estan conectadas a la unidad de control, es esta ultima la que las activa y desactiva en el momento indicado para que las instrucciones sean ejecutadas correctamente. El estado natural de la lnea P Cin es 0 y en ese estado el registro manda por el bus de salida su contenido. Cuando la lnea P Cin toma el valor 1, el registro P C deja de mandar su contenido por el bus de salida y toma el contenido del bus de entrada. El registro toma un nuevo valor y cuando la lnea P Cin vuelva a 0, se mandara el nuevo valor por el bus de salida. Este funcionamiento de los registros es muy importante. De aqu en mas todas las lneas de control llamadas 2in funcionan de la manera recien descripta. En particular el registro Latch y su lnea de control funcionan as. Luego volveremos sobre el registro Latch y veremos su funcion. El componente +1 es un sumador. Toma el valor de su bus de entrada, le suma 1 y manda el resultado por el bus de salida. Este componente tiene el 16 mismo comportamiento todo el tiempo, le suma uno a todo lo que entra por el bus de entrada, es por eso que no necesita ninguna lnea de control. Con esta circuitera podemos ejecutar un programa con todas sus instrucciones ordenadas, pero existen casos donde el programador desea realizar distintas acciones (ejecutar distintas instrucciones) dependiendo de algun resultado anterior. Para esto existe la instruccion BE Q que le permite al programador modicar el contenido del P C . Registro de instrucci on Veamos que hace el procesador cuando debe ejecutar una instruccion. En el P C est a la direccion de la instruccion que se debe ejecutar. Una vez que se haya pedido a la memoria que de el contenido de la celda con la direccion que esta almacenada en el P C y que se haya recibido la respuesta de la memoria, se debe mirar los bits correspondientes al codigo de operacion para saber de que instruccion se trata. Determinar que instruccion se acaba de traer de memoria se llama decodicar la instruccion. Para esto debemos tener almacenado en algun lugar la instruccion recien recibida. Para esto se utiliza un registro de uso especco llamado registro de instruccion (RI ). En el RI siempre estara almacenada la instruccion que se esta ejecutando. Operandos Supongamos ahora que se acaba de decodicar una instruccion y que se determina que es un ADD. Se debes buscar los valores de memoria para sumarlos. Pero solo se puede pedir un valor por vez a la memoria (<solo hay un bus de datos!) As que se pedira uno de los valores a la memoria y cuando se reciba el dato habra que guardarlo en algun lado hasta que se reciba el otro valor a ser sumado. Nuevamente este es un registro de uso especco que llamaremos A. De igual manera guardaremos el otro operando en un registro llamdo B 4 Codigos de condici on Como se explico en la introduccion, los codigos de condicion guardan informacion sobre la ultima instruccion ejecutada. En el caso de nuestra maquina la unica informacion que se necesita es la que precisa la instruccion BE Q, ya que es la unica instruccion que necesita informacion de la ejecucion anterior. As que alcanza con tener un registro de codigos de condicion de un unico bit. A este registro lo llamaremos F Z . 4 Se puede ver que este registro no es indispensable para el funcionamiento de la m aquina tal cual esta presentada en este apunte 17 Registros de usuario En nuestra maquina no existen registros de usuario. La razon de esta ausencia es mas didactica que practica. Todas los procesadores actuales tienen registros de este tipo, (16 registros es un numero habitual) podramos decir que hay una tendencia a tener cada vez mas registros de usuario dentro de los procesadores. Un exceso de registros (512 registros de usuario o mas) hace que un procesador sea muy rapido, pero trae problemas a nivel de organizacion que deben ser resueltos usando tecnicas especiales. Para mantener nuestra maquina simple, excluiremos estos registros de nuestro dise~no. 2.2.2 Unidad aritmetico logica (ALU) La ALU debe resolver todas las operaciones necesarias para ejecutar todas las instrucciones de nuestro procesador. Estas son: Sumar dos numeros de 16 bits. Comparar dos numeros de 16 bits, ver si son iguales. Esta operacion se puede realizar de varias maneras: restando los numeros y viendo si el resultado es cero o comparando bit a bit con una compuerta XOR5 . Nosotros adoptamos la segunda solucion. Mas adelante veremos que por como estan conectados los componentes a los buses necesitamos que la ALU en algunos casos no haga nada; simplemente de como resultado uno de los parametros de entrada. Ademas necesitamos que se detecte si el resultado es cero o no. La interfaz de nuestra ALU consta de dos buses de entrada llamados A y B , por donde recibir a los numeros sobre los que operara, y un bus de salida S por donde dara el resultado. Tiene dos lneas de control por donde se eligira la operacion a realizar. Por ultimo tiene una lnea de salida que tendra el valor del codigo de condicion Z . As como pusimos codigos para cada instruccion (al procesador) pondremos codigos para cada operacion de la ALU. Estos codigos seran mandados a la ALU por la UC a traves de las lneas de control. Los codigos estan descriptas en la tabla 2.3 CodOp ALU 00 01 10 11 operacion S A +B A xor B S B indenida Tabla 2.3: Codigos de operacion de la ALU Podemos ver el dise~no de la ALU en la gura 2.3. 5 Ver Apendice 18 Figura 2.3: Unidad Aritmetico Logica 2.2.3 Accesos a memoria Hay 3 motivos para acceder a memoria en nuestra maquina: para traer la proxima instruccion a ejecutar para buscar un operando sobre el cual se operara para guardar un resultado obtenido de la ALU En cada uno de estos casos se debe dar a la memoria la direccion en donde debe leer o escribir y, en cada caso esa direccion estara almacenada en distintos registros de nuestro procesador: en el primero la direccion estara almacenada en el P C , en el segundo en el RI en la parte correspondiente al operando fuente, y en el ultimo tambien estara en el RI pero en la parte del operando destino. La UC decidira en cada acceso a memoria que direccion se le enva a la memoria. Para esto se incorporo un multiplexor. Un multiplexor (MUX) en un componente que permite seleccionar una de varias entradas posibles. En la gura 2.4 tenemos un esquema de un multiplexor de 4 entradas. Cada entrada del MUX recibira un valor y de acuerdo a las lneas de control e1 y e2 se mandara por la salida S el valor recibido por entrada que corresponda. El resto de las entradas se ignoraran. En nuestro procesador conectaremos a las entradas del MUX los registros de donde puede necesitarse la direccion para ser mandada a memoria: el P C y los dos operandos del RI . Cuando se realice un acceso a memoria la UC seteara las lneas de control del MUX para que llegue a memoria la direccion que corresponde. En la tabla 2.4 vemos las asignaciones en nuestra maquina. 19 Figura 2.4: Multiplexor e1 e2 00 01 10 11 entrada PC no utilizada op. Fte del RI op. Dst del RI Tabla 2.4: Conexiones del MUX en la maquina Sencilla 2.3 Esquema completo de la Maquina Sencilla En la seccion anterior vimos con algun detalle los distintos componentes que componen nuestra maquima y como funciona cada uno. El objetivo de esta seccion es entender como se relacionan entre ellos y como cooperan para resolver las instrucciones. El funcionamiento de la UC sera dejado para una seccion posterior. Empecemos viendo en la gura 2.5 la organizacion completa de nuestro procesador. En esta gura tenemos mucha informacion, vemos todos los registros que existen en el procesador, vemos todos los buses y que conecta cada uno y vemos todas las lneas de control necesarias para manejar todos los componentes. Las lnas de control son todas las lneas de un bit que tienen un extremo sin conectar en la gura. Todos los extremos sueltos estan realmente conectados a la UC, para que esta coordine todos los componentes. Tambien vemos en la gura que existen dos tama~nos de bus distintos, los buses por donde viajan datos (16 bits) y a buses por donde viajan direcciones (7 bits). Otra particularidad que vemos en la gura es que el RI , a diferencia de todos los demas registros no esta conectado a un unico bus de salida, sino a tres buses distintos: uno conectado a los bits que corresponden al operando fuente, otro conectado a los bits que corresponden al operando destino y, por 20 Figura 2.5: Organizacion de la Maquina Sencilla ultimo uno que conecta el codigo de operacion con la UC para poder realizar la decodicacion de la instruccion. Cual de los operandos se utilizara en cada momento sera determinado por el valor del MUX. La UC usara la informacion del codigo de operacion a la hora de decodicar. Por ultimo hemos incorporado el registro R que tiene un comportamiento inverso al resto de los registros de la maquina. Digimos que el seteo a 1 de una lnea de control de cualquier registro hace que este guarde el valor que recibe por el bus de entrada, y que el resto del tiempo se esta mandando el contenido del registro por el bus de salida. El registro R es la unica excepcion a esta regla en nuestra maquina. La lnea de control de R cuando esta en 1 provoca que el contenido de este registro se vuelque al bus de salida y, el resto del tiempo toma el valor que recibe por el bus de entrada. La razon de esta excentricidad la entenderemos en la proxima seccion, pero ya podemos intuir que se debe a que si R y la memoria vuelcan su contenido simultaneamente al bus, este quedara con un valor indeterminado. La lnea de control de R no tiene un nombre propio ya que es la negacion de la linea R=W . Esta conexion tambien es simple de entender: siempre que la memoria mande un dato la bus, R no debe mandar nada, y al reves, siempre que la memoria escriba un dato, este vendra del registro R. 21 2.4 Ciclo de instruccion Un procesador ejecuta instrucciones. Esa es su funcion y su razon de ser. No \sabe" hacer otra cosa que ejecutar instrucciones (un procesador es un automata). Veremos es esta seccion como es que se ejecuta una instruccion. Como siempre, para simplicar una tarea complicada la dividiremos en pasos mas peque~nos y simples. La ejecucion de una instruccion sera dividida en los siguientes pasos: Busqueda de la instruccion en memoria. Recordemos una vez mas que lo unico que conocemos de una instruccion antes de ejecutarla es donde esta ubicada en la memoria. As que lo primero que debemos hacer es pedirle a la memoria que nos de el contenido de la direccion que esta guardada en el P C y almacenar ese dato en el RI . Toda esta operacion de busqueda en memoria y almacenado del resultado se llama Fetch o Instruction Fetch. Una vez que la instruccion se encuentra en el RI se debe ver de que instruccion se trata. Esto es realizado por la UC. Este paso se llama decodicacion. Ya sabemos que instruccion debemos ejecutar, por lo tanto sabemos si necesita operandos o no. En el caso que s, se buscaran los los operandos en memoria y se almacenaran en los registros destinados a tal n. Este paso se suele llamar Operand Fetch. Una vez que se trajeron todos los operandos se opera con la ALU para obtener el resultado. Este paso se llama ejecucion. Si el resultado se debe guardar en la memoria se hace una operacion de escritura. Por ultimo y muy importante, se debe incremetar en P C , ya que si no se hace en el proximo ciclo el P C tendra el mismo valor y se ejecutara nuevamente la misma instruccion. Estos pasos no se siguen exactamente en el orden descripto, ni se realizan necesariamente todos en la ejecucion de una instruccion; la instruccion C M P no guarda ningun resultado y la instruccion M OV no utiliza la ALU. Podemos decir que los unicos pasos que estaran en todos los ciclos son el Fetch, la decodicacion y el incremento del PC. La ejecucion de los pasos necesarios para ejecutar una instruccion se llama ciclo de instruccion. Un procesador esta realizando todo el tiempo ciclos de instruccion. Un procesador solo realiza ciclos de instruccion, no sabe hacer ninguna otra cosa. Resumiremos los pasos de un cclo de instruccion en la tabla 2.5. 22 1. Fetch 2. Decodicacion 3. Operand Fetch 4. Ejecucion 5. Guardar resultados 6. Incrementar P C Tabla 2.5: Ciclo de instruccion 2.4.1 Ciclo de instrucci on en la Maquina Sencilla Cuando se dise~na una maquina se decide cuales de los pasos del ciclo de instruccion se realizan simultaneamente. Esta decision esta fuertemente condicionada por el dise~no de la organizacion del procesador. Un ejemplo simple: si se tiene un unico bus dentro del procesador todos los movimientos de datos entre registros se deben realizar de forma secuecial (uno detras de otro), si se tiene mas de un bus, dependiendo de como se conecten se podran realizar varios movimientos a la vez. 2.5 Dise~ no de la Unidad de Control Pasaremos a dise~nar la UC, encargada de sincronizar todos los componentes que se han sido agregados a nuestra maquina. Sin duda este sera el componente mas complicado de nuestro procesador. Como primer paso se puede ver en la gura 2.5 que para controlar todos los componentes del procesador hacen falta solo 11 lneas de control. Todas estas lneas seran la salida de la UC. De igual manera se puede ver que la UC recibe solo 4 lneas de entrada. Estas son las dos lneas correspondientes al Codop, el codigo de condicion almacenado en F Z y el reloj que no esta dibujado en la gura pero no debemos olvidarlo nunca. Veamos que lneas de control se deben activar (setear a 1) para ejecutar cada una de las acciones de cada paso de una instruccion. Para hacer esta tarea mas facil, pondremos algunos nombres mnemotecnicos a las lneas de control. Esto es solo para facilitar la lectura. 23 Nombre MUX = P C M U X = F te M U X = Dst M emwrite lnea de control M U X0 = 0, M U X1 = 0 M U X0 = 0, M U X1 = 1 M U X0 = 1, M U X1 = 1 R=W = 1 R=W = 0 Lin Latchin ALUadd ALU0 ALUxor ALU0 M emread = 0, ALU1 = 0 = 0, ALU1 = 1 ALU0 = 1, ALU1 = 1 ALUnop El subndice nop signica \No Opera", esta es la operacion de la ALU que manda B como salida. 2.5.1 Ciclo de instrucci on Teniendo en cuenta estas lneas y los pasos de el ciclo de instruccion de nuestra maquina analizaremos nuevamente la instruccion ADD, viendo en cada paso que lneas de control se deben activar. Instruccion Fetch ADD IR PC Decod. Op. Fetch Exec. Res. [P C ] PC + 1 Decod. C0 y de C1 B [F te] A [Dst] R A +B [Dst] R MUX MUX = P C , M emread , I Rin = P C , Lin P Cin = F te, M emread , Bin = Dst, M emread , Ain ALUadd , F Zin M U X = Dst, M emwrite MUX MUX Hay varios detalles de este cuadro muy importantes. Primero vemos que en la Maquina Sencilla hemos reducido el numero de pasos con respecto a la tabla 2.5. En realidad lo que hicimos fue agrupar estos pasos. Otra cosa que debemos notar en el cuadro es que las lneas de control se activan con un cierto orden. Veremos que las lneas de control que estan en un mismo renglon separadas por comas se activan todas juntas, y que en el paso de un renglon a otro todas las lneas pierden su valor. Entonces para mantener una lnea activa en varios ranglones se debe activarla en cada uno de ellos. Miremos con detalle que es lo que estamos haciendo en cada paso del cuadro anterior. Es muy importante que mientras se lea la siguente explicacion se siga cada paso en el la gura 2.5. Fetch En este paso se hacen dos tareas distintas: { Primero se busca en memoria la proxima instruccion a ejecutar. Para esto se setea el M U X de manera tal que el contenido del P C 24 llegue al bus de datos y de ah a la memoria. Mientras tanto se le da a la memoria una orden de lectura, lo que provoca que el resultado de esta lectura (la instruccion que se debe ejecutar) pase el bus de datos. Como tambien activamos lnea in del registro RI el contenido del bus de datos queda guardado en este registro. De esta manera hemos logrado poner en el RI la proxima instruccion a ejecutar. { Luego se incrementa el P C para que en el proximo ciclo de instruccion se levante la siguiente instruccion del programa. Para esto se utiliza el sumador +1. Este componente siempre esta activo y no tiene ninguna lnea de control; siempre que pase una direccion por el bus de direcciones la salida de +1 tendra esta direccion incrementada en uno. Por lo tanto lo que controlara el el uso de la salida de +1 sera el registro Latch. La lnea in de Latch sera activada solo cuando el dato que sale de +1 deba ser pasado al P C . En cualquier otro caso la salida de +1 sera ignorada. Como se quiere incrementar el P C justamente se hace que su contenido llegue al bus de datos, de ah pasara a +1 y, se habilita la lnea Lin para tener ese resultado disponible. Una vez que en Latch este guardado el resultado, se activa la lnea P Cin para que este valor pase al P C y este quede listo para el proximo ciclo de instruccion. Decod Por ahora la decodicacion la pasaremos por alto. Sabemos que en este paso la UC averigua que instruccion se levanto en el paso anterior y, en base a eso elije que pasos se deben ejecutar, es decir que lneas activar y en que orden. Operand Fetch En el Operand Fetch se debe traer los datos a sumar de la memoria y dejarlos en los registros destinados a los operandos. Se empieza por el traer en operando fuente. Para esto se debe mandar a la memoria la direccion de donde se quiere leer, esto se hara seteando el M U X para que mande el contenido de la porci on de RI que corresponde al operando fuente al bus de direcciones. Mientras se activa la lnea de lectura de memoria y la lnea in del registro B para guardar el resultado de la lectura. Con el operando destino se hace exactamente lo mismo, guardando el resultado en el registro A. Cual de los dos operandos se lee primero es indistinto en esta maquina. Exececution Los datos ya estan en los registos correctos, por lo tanto estan llegando a la ALU, solo se debe setear el codigo de operacion de la ALU correctamente para que esta haga la operacion. Como el registro R esta siempre tomando el valor del bus de salida de la ALU, no hace falta activar ninguna lnea para que tome el valor. Esto no ocurre con el codigo de condicion F Z que si se debe decir explcitamente que tome el valor que da la ALU activando su lnea in. 25 Save Result Para guardar en la memoria el resultado de la operacion se setea el M U X para que llegue al bus de direcciones la direccion destino almacenada en el RI y se manda una orden de lectura a la memoria. Como la orden de lectura esta tambien conectada a la lnea de control del registro R, este manda su contenido al bus de datos de donde la memoria lo tomara para almacenarlo en la direccion indicada. La razon por la que la lnea de control de R sea la misma que la que controla la memoria es que siempre que se haga una escritura en la memoria, el dato que se escriba estara almacenado en R. Ya hemos visto todas los pasos necesarios para completar una instruccion . Veamos el resto de las instrucciones. ADD Instrucci on M OV La instruccion M OV es muy parecida a ADD. La unica diferencia es la orden que le damos a la ALU. Fetch I R [P C ] M U X = P C , M emread , I Rin PC PC + 1 M U X = P C , Lin Decod. Op. F. Exec. Res. Instruccion Decod. C0 y de C1 B [F te] A [Dst] R [Dst] B R P Cin = F te, M emread , Bin = Dst, M emread , Ain ALUnop , F Zin M U X = Dst, M emwrite MUX MUX CM P La instruccion C M P diere muy poco de las anteriores. Es simple entender su funcionamiento. El paso de guardar resultados es inexistente. Fetch I R [P C ] M U X = P C , M emread , I Rin PC PC + 1 M U X = P C , Lin Decod. Op. F. Exec. Instruccion Decod. C0 y de C1 B [F te] A [Dst] AxorB P Cin = F te, M emread , Bin = Dst, M emread , Ain ALUxor , F Zin MUX MUX BE Q Esta instruccion diere de los anteriores porque su ejecucion depende del valor del registro F Z . Para realizar esto pondremos una ejecucion condicional que depende del registro F Z . En el caso que F Z tenga el valor 0 ese paso no se ejecuta. 26 Fetch IR PC Decod. Res. [P C ] PC + 1 MUX MUX Decod. C0 y de C1 if F Z = 1 = P C , M emread , I Rin = P C , Lin P Cin MUX = Dst, Lin P Cin 2.6 Optimizacion de los ciclos de instruccion Hemos visto las secuencias de lneas de control que es necesario activar para ejecutar cada una de las instrucciones de nuestra maquina. Vimos que lneas se deben activar al mismo tiempo, y que lneas se deben activar secuencialmente. Llamaremos ciclo de reloj o simplemente ciclo a la activacion de todas las lneas de un mismo renglon en un intervalo de tiempo. De esta manera la instruccion ADD necesita 7 ciclos para ser ejecutada si se ejecuta tal cual est a en la tabla. Sin embargo al armar las tablas no prestamos atencion a ver que pasara si juntamos mas lneas de control en un mismo ciclo. En esta seccion nos ocuparemos de ver que lneas de control podemos activar simultaneamente y cuales no. Esto nos permitira reducir el numero de ciclos de cada instruccion y as obtener un procesador mas veloz. Nuevamente haremos un analisis profundo sobre la instruccion ADD y luego lo repetiremos para el resto de las instrucciones. 2.6.1 Optimizacion de la instrucci on ADD Empecemos por el Fetch. Este es comun a todas las instrucciones. Fetch Podemos ver que en los dos primeros ciclos del fetch se utiliza el valor del P C en el bus de direcciones, por lo tanto podramos intentar unicar estos dos ciclos. De hecho, si lo hacemos nos queda un fetch con esta forma IR [P C ], P C PC +1 MUX = P C , M emread , I Rin , Lin Aun nos falta el ultimo ciclo del fetch, pasar el valor de Latch a P C . Si miramos la organizacion de nuestro procesador, vemos que esa transferencia se hace usando un bus exclusivo para ese n. Por lo tanto podramos realizar esa operacion en simultaneo con cualquier otra sin tener ningun conicto. >Por que entonces no juntarla tambien con las anteriores? No es posible juntarla con las anteriores por dos razones. La primera es que no tenemos garanta de que el resultado del sumador sea el correcto hasta que halla nalizado el ciclo completo. Esta regla vale para todos los componentes: no podemos asumir que un registro guardo un valor del bus hasta que no haya terminado el ciclo, no podemos suponer que el resultado de la ALU es el correcto antes del n del 27 ciclo, etc. La segunda razon por la que no podemos juntar el P Cin con el resto del fetch es que si lo hacemos necesitamos que el P C de su contenido al bus de salida y tome su contenido del bus de entrada en el mismo ciclo. Eso no es posible para ningun registro en ningun caso. Ya que necesitaramos que la lnea de control tenga el valor 0 y el valor 1 a la vez. Una lnea de control mantiene su valor a lo largo de todo un ciclo. Hemos nombrado algunas reglas del funcionamiento de un procesador: 1. No se puede asumir que el resultado de una operacion es correcto hasta el n del ciclo en que se realiza esa operacion. 2. No es posible leer y escribir un registro en un mismo ciclo. 3. Una lnea de control mantiene su valor durante todo el ciclo. 4. De las regla 3 se deduce que no importa en que orden escribamos las lneas de control ya que todas estaran activas (o no) durante todo un ciclo. A pesar de no poder juntar todo el fetch en un solo ciclo podemos posponer esta parte del fetch para hacerla mas adelante junto con alguna otra accion. Esto desordenara un poco nuestro ciclo de instruccion pero hara un procesador mas rapido. Data Fetch Es este paso levantamos los dos operandos que necesita la instruccion ADD. No es posible relizar esto en menos de dos ciclos ya que la memoria no puede satisfacer dos pedidos a la vez, el bus de datos y el de direcciones pueden tener un unico valor a lo largo de un ciclo, etc. Pero no olvidemos el ultimo ciclo del fetch; este se puede juntar con cualquiera de estas dos lecturas sin problemas. Con lo que nuestro Data Fetch queda de la siguiente manera: B [F te] M U X = F te, M emread , Bin , P Cin A [Dst] M U X = Dst, M emread , Ain Ejecucion y guardado de resultados Cada uno de estos pasos se realiza en un unico ciclo as que no sera posible reducirlos. Pero podramos intentar juntar ambos pasos entre s o con los anteriores. Una vez que tengamos los valores con los que operar podemos pasar a la fase de ejecucion. Entonces podramos suporponer la ejecucion con el segundo ciclo del data fetch. En este ciclo la memoria pone en el bus de datos el resultado de la lectura, este pasa por A y llega a la ALU |B ya tiene el valor correcto desde el ciclo anterior| por lo tanto si activamos la ALU tendremos en su bus de salida el resultado de la operacion, y como R graba todos los resultados de la ALU y, este se activa junto con el pedido de lectura a memoria, en R tenemos el resultado de la suma. 28 El data fetch/ejecucion queda con la siguiente forma: B [F te] M U X = F te, M emread , Bin , P Cin A [Dst] M U X = Dst, M emread , Ain , ALUadd, F Zin El paso del resultado desde R a la memoria nuevamente no es posible hacerlo hasta que no se libere el bus de datos. As que tendremos que usar un nuevo ciclo para ello. Ciclo de instrucci on de ADD optimizado Resumamos lo discutido en la seccion anterior. Nuestro ciclo de instruccion para ADD es el siguiente: M U X = P C , M emread , I Rin , Lin E0 Decod. C0 y de C1 M U X = F te, M emread , Bin , P Cin E1 M U X = Dst, M emread , Ain , ALUadd , F Zin E2 M U X = Dst, M emwrite E3 Hemos agregado a cada conjunto de lneas que se activan en un ciclo un nombre (estado). Esto nos servira para ordenar nuestra unidad de control. En la siguiente seccion reduciremos los ciclos del resto de las instrucciones de la maquina de la misma manera que lo hicimos con ADD. 2.6.2 Optimizacion de MOV , CMP y BEQ M OV = P C , M emread , I Rin , Lin E0 C0 y de C1 M U X = F te, M emread , Bin , P Cin E1 M U X = Dst, M emread , Ain , ALUnop , F Zin E4 M U X = Dst, M emwrite E3 Como la unica diferencia entre M OV y ADD es la operacion de la ALU el tercer ciclo es al unico que le asignamos un nuevo estado. MUX Decod. CM P = P C , M emread , I Rin , Lin C0 y de C1 M U X = F te, M emread , Bin , P Cin M U X = Dst, M emread , Ain , ALUxor , F Zin MUX Decod. BE Q MUX Decod. = P C , M emread , I Rin , Lin C0 y de C1 P Cin if F Z = 1: if F Z = 1: MUX P Cin = Dst, Lin E0 E6 E7 E6 29 E0 E1 E5 2.6.3 Estados Hemos conseguido reducir todas nuestras instrucciones a su mnima cantidad de ciclos, alcanza con 4 ciclos para ejecutar cualquier instruccion. Vimos que con 8 estados distinos se describen todas las acciones que debe realizar la UC para ejecutar cualquier instruccion. Estos 8 estados deben ser combinados en cierto orden. Nos interesa ahora ver como se relacionan y se ordenan estos estados. Para esto usaremos la gura 2.6 en donde cada crculo se corresponde con un estado, y cada echa se corresponde con un cambio de estado. Cuando la echa tiene nombre, ese nombre esta indicando una condicion para que el cambio de estado ocurra. Cuando la echa no tiene nombre es cambio de estado ocurre siempre. Figura 2.6: Estados de la UC En la gura 2.6 dividimos a la ejecucion de todas las instrucciones en 4 ciclos. Para seguir entendiendo el funcionamiento de la UC esta division es muy importante; nos esta diciendo como se relaciona un ciclo de instruccion con un ciclo de reloj. Cada division en el graco se corresponde con un ciclo de reloj. Esto quiere decir que en un ciclo de reloj se mantentran constantes todas las lneas de control. En cada ciclo de reloj el procesador estara en uno de los 8 estados posibles. Y en el ciclo siguiente cambiara su estado segun el graco 2.6. En los estados donde existen varias transiciones posibles solo una se llevara a cabo, y se eligira de acuerdo al codigo de condicion que se encuentra en el RI , ya que ese valor indica que instruccion se esta ejecutando. 30 2.7 Implementaci on de la UC 2.7.1 Descripci on Conocemos todas las lnes de control que entran y salen de la UC (gura 2.7) Multiplexor M U X0 M U X1 Registros P Cin Lin I Rin Bin Ain F Zin ALU salida salida ALU1 salida salida salida salida salida salida C0 C1 FZ clock Memoria salida salida ALU0 R=W salida entrada entrada entrada entrada Figura 2.7: interfaz de la UC Conocemos todos los estados posibles de la UC (gura 2.6) y conocemos tambien por que y cuando se producira un cambio de un estado a otro. Sabemos la duracion de cada estado. Ya es el momento de implementar la UC. Implementar quiere decir en este caso dise~nar toda la circuitera necesaria para que la UC funcione tal cual la describimos. Para ordenar las lneas de control se armara una matriz con los estados en las columnas y las lneas de control en las las. De esta manera se resumiran todos los estados y las lneas de control que se activan en cada uno (gura 2.8). Esta matriz no es otra cosa que el resumen de informacion que ya tenamos anteriormente, no agrega nada nuevo. E0 M U X0 M U X1 ALU0 ALU1 R=W P Cin Lin I Rin Bin Ain F Zin 0 0 x x 1 0 1 1 0 0 0 E1 0 1 x x 1 1 0 0 1 0 0 E2 1 1 0 0 1 0 0 0 0 1 1 E3 1 1 x x 0 0 0 0 0 0 0 E4 1 1 1 1 0 0 0 0 0 1 1 E5 1 1 0 1 0 0 0 0 0 1 1 E6 x x x x 1 1 0 0 0 0 0 Figura 2.8: Matriz de lneas de cada estado 31 E7 1 1 x x 1 0 1 0 0 0 0 En la matriz de estados cuando aparece una x es porque el valor de esa lnea en ese estado no inuye y puede tomar cualquier valor. Veamos ahora en forma matricial los estados que usa cada instruccion. (gura 2.9). Pondremos en las columnas los estados y en las las las instrucciones. Esta matriz resume la gura 2.6 E0 ADD M OV CM P BE Q 0 0 0 0 E1 1 1 1 E2 2 E3 3 3 E4 2 E5 2 E6 E7 1,3 2 Figura 2.9: Matriz de estados de cada instruccion 2.7.2 Clock El reloj emite pulsos de igual duracion cada determinado lapso de tiempo. Podemos gracar el valor que toma la lnea del reloj como una funcion en el tiempo como muestra la gura 2.10. Figura 2.10: Clock Es simple desde un punto de vista electronico armar circuitera capaz de partir esta se~nal en 4 nuevas se~nales que tomen el valor 1 una por vez y en orden. Como se muestra en la gura 2.11. Esta particion del clock nos permitira realizar los 4 pasos del ciclo de instruccion de nuestra maquina. Tenemos una se~nal t0 que solo toma el valor 1 en el primer ciclo de reloj, una se~nal t1 que solo toma el valor 1 en el primer segundo ciclo de reloj, etc. Si logramos hacer que todas las lneas de control del estado 0 (E0 ) esten activas solamente cuando t0 esta en uno tendremos listo nuestro primer paso del ciclo de instruccion. 2.7.3 Implementacion Primero haremos un componente con la matriz de lneas por estado (gura 2.8) que tenga 8 lneas de entrada, una por cada estado y 11 lneas de salida, una por 32 Figura 2.11: Clock partido en 4 sub ciclos cada lnea de control. El funcionamiento es muy simple, cuando se activa una lnea de entrada correspondiente a un estado, las lneas de salida toman el valor que corresponde a ese estado. Nunca se deben activar dos lneas de entrada a la vez. Con este componente mas la division del clock nos alcanzara para implementar la UC. ADD Empecemos una vez mas armando la instruccion ADD con detalle. Supongamos ahora que tenemos una lnea que esta en uno siempre que estemos ejecutando la instruccion ADD. Esta lnea es muy simple de fabricar, alcanza con poner un multiplexor con las lneas C0 y C1 como entradas y 4 lneas de salida, una por cada instruccion. Este multiplexor que acabamos de agregar es el que esta decodicando la instruccion. Ver gura 2.12. Figura 2.12: Implemetacion del decodicador Usaremos la lnea que llamaremos add mas la matriz de estados mas las cuatro lneas del reloj para implementar la instruccion ADD. En el primer ciclo de cualquier instruccion debemos ejecutar el estado E0 correspondiente al fetch. Esto quiere decir setear todas las lneas de control como esta descripto en el estado 0. Para esto simplemente conectaremos la lnea t0 del reloj a la entrada E0 . Con esto logramos que cada vez que estemos 33 en el primer paso del ciclo de instruccion la UC este en el estado 0, es decir todas las lneas de control estan como corresponde al estado 0. El segundo ciclo ya depende de que instruccion estamos ejecutando as que conectaremos a E1 la linea t1 en conjunto con la lnea add para que el estado 1 sea activado cuando estamos ejecutando un ADD, pero no cuando ejecutamos otras instrucciones. Para esto hacemos un AND logico entre la lnea t1 y la lnea add y conectamos el resultado del AND a la l nea E1 . Usaremos de aqu en mas muchas veces este tipo de conexion Lo mismo ocurre con el tercer y cuarto ciclos de la instruccion ADD, estos no debe ejecutarse siempre y por eso los conectaremos usando un AND logico. En la gura 2.13 vemos como quedan |teniendo en cuenta solo la instruccion ADD | conectadas las l neas de control internas de la UC. Figura 2.13: Implemetacion de ADD en la UC M OV Ya implementamos la instruccion ADD a nivel de logica digital. Agregar la instruccion M OV sera simple ya que son muy parecidas. La unica diferencia entre las dos instrucciones es el codigo de operacion de la ALU. Esto lo podemos ver en la matriz de estados de cada instruccion (gura 2.9) donde el unico estado diferente es el del tercer ciclo en el paso de ejecucion. Teniendo esto en cuenta agregamos la circuitera necesaria a la UC para poder ejecutar un M OV y queda como la mostrada en la gura 2.14 34 Figura 2.14: Implemetacion de ADD y M OV en la UC. Las lneas que estan conectadas entre s se las marca con un punto negro. CM P La instruccion C M P diere de las anteriores ya que necesita solo 3 ciclos de reloj para ser ejecutada. Por la forma en que estamos armando la UC deberemos dejar el ultimo ciclo libre, es decir, cada vez que se ejecute un C M P tendremos un ciclo desperdiciado. Esto nos permitira tener un dise~no simple de la UC. El resto de la instruccion C M P es simplemente volver a utilizar un AND para ejecutar los estados solamente en el momento e instruccion indicados. En la gura 2.15 vemos la UC con la instruccion C M P BE Q La instruccion BE Q una vez mas diere de las anteriores. Para lograr la ejecucion condicional se debe tener en cuenta el valor de registro F Z y es por eso que esta es una de las lneas de entrada a la UC. Para activar las lneas solo en el momento indicado se utilirara una vez mas un AND, pero esta vez con el valor de la lnea FZ. Como los ciclos 3 y 4 del BE Q dependen del valor de F Z se hace un OR logico entre las lneas t2 y t3 . Con el agregado del BE Q la UC queda lista. En la gura 2.16 vemos toda la circuitera de la UC con su interface con el resto del procesador. 2.7.4 Comentario sobre la UC Este dise~no de la UC \paga" su simpleza con la perdida de algunos ciclos. Cuando un BE Q no salta porque el registro F Z esta en cero se desperdician 35 Figura 2.15: Implemetacion de ADD, M OV y C M P en la UC. Figura 2.16: UC completa con su interfaz con el resto del procesador. dos ciclos de reloj. Procesadores reales aprovechan al maximo todos los ciclos para acelerar la ejecucion. Obviamente sus dise~nos son mucho mas complicados. Se invita a los alumnos a hacer dise~nos mejorados de esta maquina para ser agregados a este apunte. 36 Ap endice A L ogica Digital A.1 Operaciones logicas Las operaciones logicas utilizadas en este apunte son las siguentes: Operacion Tabla Smbolo AND OR AND 0 1 OR 0 1 0 0 0 0 0 1 1 0 1 1 1 1 XOR XOR 0 1 0 0 1 1 1 0 NOT NOT 0 0 1 1 0 37 Indice de Figuras 1.1 1.2 1.3 1.4 estructura general de una computadora estructura general de un procesador . . Subsistema de Entrada/Salida . . . . . . Partes de un bus . . . . . . . . . . . . . . . . . 5 6 8 9 Memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . P C con su sumador . . . . . . . . . . . . . . . . . . . . . . . . . Unidad Aritmetico Logica . . . . . . . . . . . . . . . . . . . . . . Multiplexor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Organizacion de la Maquina Sencilla . . . . . . . . . . . . . . . . Estados de la UC . . . . . . . . . . . . . . . . . . . . . . . . . . . interfaz de la UC . . . . . . . . . . . . . . . . . . . . . . . . . . . Matriz de lneas de cada estado . . . . . . . . . . . . . . . . . . . Matriz de estados de cada instruccion . . . . . . . . . . . . . . . Clock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clock partido en 4 sub ciclos . . . . . . . . . . . . . . . . . . . . Implemetacion del decodicador . . . . . . . . . . . . . . . . . . Implemetacion de ADD en la UC . . . . . . . . . . . . . . . . . . Implemetacion de ADD y M OV en la UC. Las lneas que estan conectadas entre s se las marca con un punto negro. . . . . . . 2.15 Implemetacion de ADD, M OV y C M P en la UC. . . . . . . . . 2.16 UC completa con su interfaz con el resto del procesador. . . . . . 12 16 19 20 21 30 31 31 32 32 33 33 34 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 2.13 2.14 38 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 36 36 Indice de Tablas 2.1 2.2 2.3 2.4 2.5 Codigos de operacion de la MC . . . . . . . . Programa almacenado en memoria . . . . . . Codigos de operacion de la ALU . . . . . . . Conexiones del MUX en la maquina Sencilla . Ciclo de instruccion . . . . . . . . . . . . . . 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 15 18 20 23