Unidad 2: Sistemas Digitales de Programa Almacenado March 14, 2013 Temas Arquitectura de Von Neumann. Organizacin de una CPU: Registros: contador de programa, registro de instruccin, puntero de pila, acumulador, registros de propósito general, registros códigos de condición, ı́ndice y especiales. Unidad Aritmético-Lógica. Unidad de control: microprogramación. Representación de datos e instrucciones. Tipos de instrucciones. Ciclos de operación. Modos de direccionamiento: inmediato, implı́cito, extendido, paginado, relativo, indexado, indirecto memoria y registro, indexado indirecto, etc. 1 Introducción La computadora es tal vez el “invento” del Siglo XX que abrió las puertas a la modernidad. El desarrollo que tuvo a partir de la Segunda Guerra Mundial al presente fue vertiginoso e impactó sobre todas las actividades realizadas por el hombre, y todavı́a no se vislumbra un lı́mite en sus aplicaciones. Curiosamente, tamaño desarrollo carece de una patente y de un único creador que de haber existido se habrı́a hecho infinitamente rico. Las computadoras electrónicas se remontan a la Segunda Guerra cuando los aliados y en especial los ingleses desarrollan el Proyecto Colosus que quebraba la criptografı́a alemana de las máquinas Enigma. Detrás del proyecto estaba el matemático Alan Turing en cuya memoria la ACM entrega una distinción anual equivalente al Premio Nobel pero en computación. Las máquinas del Proyecto Colosus sin embargo no se pueden catalogar como computadoras en el sentido en que lo hacemos hoy dı́a pues solamente resolvı́an un problema, descifrar los mensajes escritos con Enigma. En 1945, en Estados Unidos, un grupo de cientı́ficos trabajaba en Pensylvania sobre el desarrollo de una computadora digital (Electronic Discrete Variable Automatic Computer). Entre los memorandums con los que trabajaban se filtro uno que llevaba la firma de uno de ellos que era Von Neuman. El impacto del memorandum fue tan grande que a partir de ese momento, la arquitectura presentada llevó ese nombre en 1 DIEC-UNS Sistemas Digitales de Programa Almacenado desmedro de los otros miembros del equipo que colaboraron con el desarrollo. La Arquitectura propuesta presentaba un Unidad Aritmético Lógica encargada de realizar las operaciones, un conjunto de registros de acceso rápido, una unidad de memoria en la que se almacenaban datos e instrucciones de manera indistinguible y una Unidad de Control que controlaba los distintos elementos, buscaba las instrucciones en memoria, las decodificaba y las ejecutaba. No fue hasta el 21 de junio de 1948 que por primera vez en la historia una computadora corrió un programa que estaba almacenado en memoria, este programa además podı́a cambiarse por otro y la computadora entonces realizaba tantas funciones o aplicaciones como programas se le pudieran escribir. Esta computadora se denominó “The Baby” y fue construida en la Universidad de Manchester. En el diseño participaron entre otros Alan Turing. En ese tiempo entre los problemas a resolver estaba la memoria. Esta era una limitante muy importante. El grupo de la Universidad de Manchester trabajaba sobre una memoria basada en un tubo de rayos catódicos y para probar la factibilidad de la misma desarrolló lo que finalmente serı́a el puntapié inicial de una carrera que todavı́a no ha concluido. Al año siguiente la computadora ya presentaba mejoras varias y se denominó Mark I. La empresa Ferranti comenzó la producción de computadoras de manera comercial y en 1951 vendı́a la Mark I. La primera computadora arribada a la Argentina apenas una década después era de la fábrica Ferranti y fue instalada en el Instituto de Cálculo de la Universidad de Buenos Aires a instancias del Prof. Sadosky. Se la llamó “Clementina”. “The Baby” era una máquina que tenı́a una palabra de 32 bits de longitud, utilizaba una ALU que operaba con aritmética serial en Ca2 y tenı́a un único modo de direccionamiento (modo de acceder a los datos en memoria). La RAM original era de 32 palabras pero era extendible a 8192. Requerı́a de 1.2 ms por instrucción. El primer programa que corrió fue el cálculo del factor más alto de un número, se probó con 218 y requirió 52 minutos de cálculo. Con motivo del 50 aniversario de esta computadora, la Universidad de Manchester, reconstruyó la misma y organizó una competencia de programación para que de todas partes del mundo escribieran aplicaciones. Como la memoria es un tubo de rayos catódicos hubo infinidad de programas que aprovecharon la parte visual para hacer animaciones. La computadora sólo tenı́a 7 instrucciones que se identificaban con 3 bits. La memoria era un tubo de 32 x32 bits y habı́a otro tubo para los registros que eran un acumulador y punteros hacia la instrucción actual y la siguiente. Más información sobre esto se consigue en: Computer50.org 2 Arquitectura Von Neumann La definición de Arquitectura de Computadora es un tema de discución todavı́a hoy en ciencias e ingenierı́a de computación. En su versión más tradicional, se afirma que la arquitectura está definida por el conjunto de instrucciones que se utilizan para su programación. La arquitectura además del diseño del conjunto de instrucciones contempla la organización y el hardware. En verdad hay máquinas con practicamente id́enticos lenguajes pero que difieren en su organización y otras que tienen organización similar Computadoras Digitales 2013 2 R. Santos DIEC-UNS Sistemas Digitales de Programa Almacenado pero hardware distinto. El término organización se refiere al sistema de memoria, la estructura de los canales, y la organización interna de la CPU (Unidad Procesadora Central) en donde las operaciones aritméticas, lógicas, de salto y transferencia de datos son implementadas. El hardware se refiere a las particularidades de implementación electrónica: diseño lógico, como se construye, etc. 1 La trabajo de Von Neumann se limitaba a las cuestiones de organización y no introducı́a las cuestiones relacionadas con el conjunto de instrucciones o su implementación electrónica. La realización de la “Baby” y posteriormente la “EDVAC” en Pennsylvania dieron forma real a una computadora. La organización propuesta por Von Neumman entonces contaba con 4 partes: • Unidad Aritmética Lógica. • Memoria. • Registros. • Unidad de Control. La particularidad que esconde esta organización y que determina su funcionamiento tanto en las instrucciones como en la parte de hardware es la existencia de una única memoria en la cual se almacenarán de manera indistinguible tanto datos como instrucciones. La determinación de si un determinado lugar de memoria contiene un dato o una instrucción responde a la manera en que el programador desarrolló su programa. 2.1 Memoria La memoria se describe como un arreglo lineal de palabras de la longitud que maneje el procesador. Habitualmente se utilizan memorias de 8 bits de palabra combinandose para obtener palabras más largas cuando es necesario en paralelo. La memoria se accede por medio de punteros que permiten leer los lugares adecuados. Para esto hay un registro especial que se llama contador de programa que mantiene el lugar donde se encuentra la siguiente instrucción. Los distintos tipos de memoria se estudiarán más adelante pero se pueden clasificar rápidamente en estáticas o dinámicas, siendo las primeras utilizadas para almacenar programas y las segundas para almacenar los valores cambiantes de las variables utilizadas. Las memorias en general tienen una gran cantidad de bytes y requieren entonces el uso de un canal de direcciones que permita acceder a los distintos elementos de manera aleatoria (no secuencial). Los accesos a memoria son entonces costosos desde el punto de vista temporal pues el procesador debe primero decodificar la dirección para luego acceder a la misma. 1 Para más información sobre este tema se puede consultar “Computer Architecture: A Quantitative Approach. J. Hennessy and D. Patterson, Morgan Kaufman” Computadoras Digitales 2013 3 R. Santos DIEC-UNS 2.2 Sistemas Digitales de Programa Almacenado Registros Los registros son elementos de memoria de acceso inmediato por parte de la unidad de control. Están junto a la ALU dentro de la CPU y pueden almacenar de manera temporal los valores de variables o el estado del procesador. Los procesadores se pueden definir aún dentro de la organización Von Neumann como orientados a registro o orientados a memoria. En la primera tendencia, se cuenta con una gran cantidad de registros que permite realizar operaciones rápidas. En la segunda las operaciones requieren los acceso a memoria y hacen al sistema en principio más lento. Sin embargo esta clasificación inicial va perdiendo valor a medida que los procesadores incorporan memorias en sus integrados y facilitan la operación sobre las mismas. Los registros que están presentes siempre son el acumulador, el contador de programa o puntero de instrucción y el registro de instrucción. El primero sirve para realizar las operaciones aritmético-lógicas y el segundo indica la siguiente instrucción a realizar. El último tiene la instrucción que se está ejecutando. Otros registro que se utilizan habitualmente son los registros de propósito general que sirven para almacenar valores intermedios, realizar operaciones contra el acumulador, ser contadores, etc. Los registros ı́ndices también son muy utilizados y sirven para manejar arreglos y estructuras de datos. Los registros de estado indican como está operando el procesador y dan información sobre las últimas operaciones realizadas. Argumentos tradicionales son las banderas Z (cero), P (paridad), O (overflow), S (signo). Los procesadores suelen implementar una pila que utilizan para almacenar información en memoria temporal, la pila se maneja por medio de un registro denominado puntero de pila presente en practicamente todos los procesadores modernos. Existen además registros especiales dedicados por ejemplo al refresco de memorias dinámicas, manejo de interrupciones o funciones especı́ficas de ciertas plataformas. En algunos casos, el manejo de la memoria es complejo y no lineal como se presentaba al inicio y esto incorpora entonces una serie de registros que permiten administrar la memoria en espacios lógicos y fı́sicos. Finalmente, en la actualidad muchos procesadores se manejan con bancos de registros. Es decir que hay varios conjuntos de registros iguales que permiten al programador mantener el contexto de distintos programas sin necesidad de almacenar el mismo en memoria. 2.3 Unidad Aritmético Lógica (ALU) La ALU es una parte fundamental del procesador. Es la encargada de realizar las operaciones aritméticas y lógicas. La ALU cuenta con un acumulador que es un registro que habitualmente es de entrada y de resultados también. Además, la ALU tiene un registro de estado en el que indica particularidades del resultado como si hubo acarreo, si la cuenta dio cero, el signo del resultado y si hubo overflow. Computadoras Digitales 2013 4 R. Santos DIEC-UNS 2.4 Sistemas Digitales de Programa Almacenado Unidad de Control (UC) Es la unidad más compleja. Coordina todas las acciones. La unidad de control se encarga de buscar la instrucción en memoria, decodificarla y ejecutarla. Para ello puede recurrir a los registros, la ALU y la memoria. Tiene un registro especial denominado Registro de Instrucción que es donde se almacena la instrucción en ejecución. La UC implementa una máquina de estados que puede evolucionar de manera sincrónica o asincrónica. Los procesadores comerciales son sincrónicos pues es más simple su construcción y funcionamiento. Las máquinas asincrónicas pueden lograr una mejor utilización o rendimiento pero son extremadamente difı́ciles de diseñar y ajustar. La UC determina entonces la secuencia de tareas a realizar y genera el temporizado de las señales de control necesarias para ejecutar una determinada instrucción. El procesador guiado por la UC realiza un ciclo de ejecución que requiere los siguientes pasos: 1. La UC requiere y busca de memoria la próxima instrucción. 2. La UC decodifica la instrucción. Esto significa que interpreta la instrucción y define las señales de control que intervienen y su temporizado. 3. De acuerdo al tipo de instrucción, la UC volverá a memoria una o dos veces más a buscar un operando. 4. Ejecuta la acción determinada por la instrucción. 5. Si corresponde almacena el resultado en memoria. 6. Regresa al punto 1. 2.5 Unidad de Entrada/Salida La unidad de entrada/salida es un tipo particular de memoria. En general estas unidades cuentan con un número limitado de registros de memoria que sirven para la programación de un dispositivo, para la lectura o escritura de un valor en dispositivos tales como controladores, conversores, etc. 2.6 Canales La CPU está formada por la UC, los Registros y la ALU. La memoria es externa al igual que las unidades de entrada/salida que son particulares de cada configuración. El modo en que la CPU se comunica con la memoria y los periféricos es por medio de canales. Como se vio en la Unidad anterior, los canales facilitan la interconexión de los dispositivos cuando estos son muchos. En una computadora hay tres canales básicos: datos, direcciones y control. Computadoras Digitales 2013 5 R. Santos DIEC-UNS 2.6.1 Sistemas Digitales de Programa Almacenado Datos Se utiliza para la transferencia de datos. Puede ser entre el procesador y la memoria, entre el procesador y una unidad de entrada/salida o entre memoria y dispositivos. La cantidad de bits del canal coincide en general con la palabra base de la ALU o el procesador. 2.6.2 Direcciones Se utiliza para direccionar y acceder a los lugares especı́ficos de memoria. La cantidad de bits del canal determinan la cantidad de memoria que puede manejar el procesador. 2.6.3 Control Contiene las lineas de sincronismo que permiten acceder a los dispositivos de manera segura. Complementa a los otros dos canales. Las lı́neas de control más usuales son: • Reset • Enable • Read • Write • Ready • Wait • Intr • Clock • Hold • Inta • Ack Algunas de estas lı́neas son manejadas por la UC y otras por los periféricos en las unidades de E/S, las memorias o incluso el usuario (botón de Reset). En una operación de lectura de memoria intervienen los tres canales. El de direcciones es el encargado de decodificar el lugar deseado de la memoria, el de control establecerá que la operación es de lectura colocando la linea Read en el estado adecuado y recien entonces la memoria pondrá disponible en el canal el dato almacenado para que pueda ser cargado por el procesador. Dentro de la CPU se cuenta también con canales que permiten trabajar sobre la ALU y los registros. Sin embargo este canal es cerrado en tanto no es posible acceder desde el exterior o modificarlo. Los canales disponibles del procesador en cambio, dejan la libertad al diseñador para trabajar. Computadoras Digitales 2013 6 R. Santos DIEC-UNS 3 Sistemas Digitales de Programa Almacenado Representación de Datos e Instrucciones La memoria almacena instrucciones y datos. Sin embargo, esta información siempre está guardada en forma de números binarios y la interpretación que de ella se haga la convierte en una instrucción, un número o un caracter. Para comprender que es lo que efectivamente está almacenado hay que poseer el conocimiento del objeto de la información. 3.1 Datos binarios Pueden ser números o estados. Se leen simplemente como números con o sin signo dependiendo de si se los considera en complemento a2 o no. Muchas veces la longitud de la palabra de memoria no alcanza para representar a un valor y se utilizan varios bytes para ello. Si el número está expresado en punto flotante entonces cada bit además tiene su propio significado dentro del número. 3.2 Datos codificados En este caso los números representados en la memoria representan algo diferente a un valor numérico. Quedan claramente libres a la interpretación del programador. Por ejemplo, la letra A mayúscula en ASCII se representa como 41h. Este número por si sólo no expresa más que un valor, sólo cuando el programa lo interpreta como la letra A, puede ser utilizado para alguna operación. Existen muchos códigos que se utilizan en computación pero los más corrientes son ASCII y BCD. 3.3 Instrucciones Las instrucciones como en los otros casos son datos binarios que el procesador interpreta como instrucción. Estas tienen formas pre-establecidas según el tipo de microprocesador de que se trate y longitud de palabra. Las instrucciones en microprocesadores de 8 bits pueden ser de un byte, dos o tres. La estructura general de una instrucción es una operación (suma, resta, división, salto, comparación, etc.) seguida de los operandos o datos sobre los que se debe actuar. Algunas instrucciones tienen a sus operandos implı́citos por lo que no requieren que estos se manifiesten. El conjunto de instrucciones es una de las caracterı́sticas de las arquitecturas. Algunas pocas instrucciones son suficientes para realizar gran cantidad de operaciones. Como se introdujo al principio de esta Unidad, la “Baby” solamente contaba con 7 instrucciones y su sucesora con 11. Los microprocesadores modernos cuentan con un conjunto mucho más completo pero no por esto pueden realizar especificamente más cosas. Surge entonces una clasificación de las arquitecturas que parte de dos conceptos antagónicos: • Un conjunto reducido de instrucciones simples que se ejecutan muy rápido porque la decodificación es simple. Estas máquinas son conocidas como RISC (Reduced Instruction Set Computer) Computadoras Digitales 2013 7 R. Santos DIEC-UNS Sistemas Digitales de Programa Almacenado • Un conjunto amplio de instrucciones que permite incorporar instrucciones complejas que realizan en un paso una operación complicada pero que su decodificación y atención es lenta. Estas máquinas son conocidas como CISC (Complex Instruction Set Computer). Una buena comparación de ambas aproximaciones puede ser encontrada en el siguiente enlace: RISC vs CISC Por otra parte es posible clasificar a los procesadores por el modo en que operan sus ALU. Existen tres tipos básicos que pueden estar o no combinados: • Pila. Los operandos son los dos primeros lugars de la pila. Esto se utiliza en la Notación Polaca Inversa que utilizan las calculadoras de HP. • Acumulador. Uno de los operandos siempre es el acumulador, por lo que hay que explicitar al segundo operando, sea este un registro o un lugar de memoria. • Registros de propósito general. En este caso se deben explicitar los dos operandos que pueden ser registros o lugares de memoria. De las tres variantes, la última es la más utilizada en la actualidad por su gran versatilidad. Sin embargo, en el ámbito de los microcontroladores es usual encontrar una CPU que opere sobre el acumulador. 3.4 Lenguajes El lenguaje de programación de un procesador está determinado por su conjunto de instrucciones. Estas no son más que números binarios que representan acciones que ejecuta el procesador. En este formato, se denomina lenguaje de máquina. Evidentemente escribir un programa enteramente en lenguaje de máquina requiere de muchisima paciencia, es factible cometer múltiples errores y por otra parte es de muy difı́cil comprensión. Para solucionar este inconveniente, cada instrucción es representada por una palabra o nemónico que en general indica el significado de la instrucción. Por ejemplo son comunes los nemónicos: • ADD indica la suma • SUB indica la resta • JMP o BRA indica un salto incondicional • JNZ Salto condicionado a la no existencia de la bandera de cero. • CALL llamada a una rutina que retorna usualmente con RET Los nemónicos serán más o menos intuitivos de acuerdo a la experiencia del programador y a la cantidad de instrucciones del conjunto. Computadoras Digitales 2013 8 R. Santos DIEC-UNS Sistemas Digitales de Programa Almacenado El conjunto de nemónicos se denomina Lenguaje Assembler y su función es expresar de manera simbólica al lenguaje de máquina. Como el microprocesador solamente comprende a este último, se precisa de un compilador que traduzca el assembler. La incorporación de un compilador permite la introducción de otros comandos que no son para el procesador sino para el compilador. Estos comandos que se denominan directivas permiten programar de manera relativa sin determinar los lugares de memoria de manera explı́cita, abreviar la escritura del programa mediante la incorporación de macros, establecer variables y constantes de manera segura, etc. Entre las directivas más comunes se encuentran ORG que apunta a un sitio de memoria indicando que todo lo que sigue deberá iniciarse en ese lugar, DB que sirve para definir una variable de tipo byte, EQU que sirve para identificar constantes, END que le indica al compilador hasta donde debe leer el assembler. Hay además directivas condicionales que permiten al compilador definir que porciones de código se compilan de acuerdo a caracterı́sticas particulares. 3.5 Tipos de Instrucciones Las instrucciones de un procesador tienen diferentes objetivos y están destinadas a operar sobre distintos operandos. Las instrucciones entonces se pueden clasificar como: 1. Aritméticas: son las que realizan operaciones aritméticas como sumas, restas, multiplicaciones, divisiones, incrementos, decrementos, etc. 2. Lógicas: son las que realizan operaciones de lógica booleana como AND, OR, XOR, Complementar, negar, comparar. 3. Desplazamiento: se encargan de rotar los bits de un registro o lugar de memoria en cualquier sentido, replicar un bit, utilizar o no el carry para la rotación. No están presentes en todos los procesadores. 4. Transferencia de datos: estas instrucciones mueven la información entre la memoria y los registros, entre registros o entre registros y memoria. Pueden además cargar datos en un registro de manera inmediata. La variedad de estas instrucciones depende del procesador. 5. Entrada/Salida: al igual que el tipo anterior, éste se dedica a la transferencia de datos pero se restrinje a las unidades de entrada/salida que suelen tener un acceso diferente al de las memorias. 6. Salto o Transferencia de control: estas instrucciones se utilizan para derivar el programa en base a condiciones o requerimientos. Pocas veces un programa se ejecuta de manera lineal de principio a fin sin requerir en algún punto establecer un lazo o realizar un llamado a una rutina particular. 7. Pila: estas son instrucciones especı́ficas para el manejo de la pila. Cuando hay una transferencia de control a una rutina sea por una llamada en el software o por una interrupción, los procesadores suelen almacenar el status del procesador en la pila. La pila sirve además para pasar parámetros entre funciones o rutinas Computadoras Digitales 2013 9 R. Santos DIEC-UNS Sistemas Digitales de Programa Almacenado dentro de un programa y eventualmente para almacenar de manera transitoria variables. 8. Control de Máquina: en general están presentes en todos los procesadores, son NOP y HALT. La primera no hace nada más que correr el tiempo mientras que la segunda detiene la ejecución del procesador. De acuerdo al procesador puede haber otros tipos de instrucciones pero las anteriores están presentes en practicamente todos. 4 Modos de Direccionamiento La potencia de un procesador se determina en gran medida con los modos de direccionamiento que es el mecanismo por el cual accede a la memoria para buscar datos o para almacenarlos. Los modos de direccionamiento se pueden clasificar como imı́citos cuando los operandos de la operación son determinados por el mismo código de operación y explı́citos cuando los operandos se manifiestan. A continuación se listan algunos de los modos más usuales. • Registro: se trata de un direccionamiento implı́cito. Dentro del código de operación un conjunto de bits identifican los registros sobre los que se opera. • Inmediato: en este caso el operando de la instrucción es una constante sobre la que se opera. Por ejemplo se carga de manera inmediata un valor en un registro, o se suma, resta, etc. Solamente hay un operando. • Inherente: actúan sobre la memoria en función del valor de puntero de pila. Son las operaciones de PUSH y POP sobre la pila. • Directo o Absoluto: se indica la dirección del operando de manera explı́cita. • Paginado: para los procesadores que pueden manejar la memoria de manera paginada, se indica únicamente el desplazamiento sobre la página. • Relativo: se conforma a partir de la dirección actual del contador de programa. En muchos casos las transferencias de control son relativas de modo que van 127 lugares hacia adelante o 128 hacia atrás. • Indexado: se usa un registro ı́ndice al cual e le suma un operando. Conceptualmente el operando es la dirección base y el ı́ndice el offset. Sirve para manejao de listas y arreglos. Son costosas en tiempo y tienen diferentes formas de implementarse. • Indirecto: se usa un elemento intermedio que contiene la dirección final. Puede ser un registro o un lugar de memoria. • Autoincremento/autodecremento: algunos procesadores poseen instrucciones que pueden operar sobre memoria incrementando/decrementando las instrucciones de manera automática. Computadoras Digitales 2013 10 R. Santos DIEC-UNS 5 Sistemas Digitales de Programa Almacenado Operación Interna de un Microprocesador La ejecución de un programa por parte de un microprocesador sigue una serie de operaciones que se encadenan secuencialmente siguiendo una máquina de estados. Básicamente la UC buscará una instrucción en la memoria y luego la ejecuta para volver a buscar una nueva instrucción. Por lo tanto las operaciones básicas de un procesador son: • Búsqueda (Fetch) • Ejecución La ejecución de una instrucción consta entonces de uno o más ciclos de máquina que se identifican como: • Fetch • Lectura de Memoria • Escritura de Memoria • Lectura de E/S • Escritura de E/S • Reconocimiento de interrupción Un ciclo de instrucción comprende entonces a uno o varios de los anteriores y su duración se mide desde el inicio del mismo hasta su finalización en periodos de reloj que se denominan estados. Cada ciclo de máquina está compuesto por un número entero de estados de reloj. En general un ciclo dura al menos tres estados ya que requiere uno para direccionar el canal, en el siguiente prepara la transferencia y en el último la realiza. La Figura 1 presenta un ciclo de instrucción completo 2 . 6 Control y Temporizado El microprocesador es una máquina de estados que evoluciona con un reloj. Éste puede ser de fase simple o doble. En el primer caso se cuentan con dos flancos y dos niveles mientras que en el segundo hay cuatro flancos y varias combinaciones posibles de niveles. Con esta segunda versión en un ciclo de reloj la máquina puede realizar más acciones. En la actualidad está practicamente en desuso. El 6500 de la familia Motorola tenı́a un reloj de fase doble. En la Figura 2 se presenta la evolución de una máquina de estados similar a la que implementa un microprocesador 8085. 2 Obtenida de Microprocessors, Interfacngs and Applications, pag 188 Computadoras Digitales 2013 11 R. Santos Sistemas Digitales de Programa Almacenado DIEC-UNS Figure 1: Ciclo de Instrucción Completo para STA (8085) Computadoras Digitales 2013 12 R. Santos DIEC-UNS Sistemas Digitales de Programa Almacenado Figure 2: Diagrama de transisición de estados de un procesador de simple fase Computadoras Digitales 2013 13 R. Santos