Operacion interna de un procesador
Transcripción
Operacion interna de un procesador
CAPITULO 4 4.1 OPERACION INTERNA DE UN MICROPROCESADOR 4.1.1 Ejecución de un Programa Hasta ahora se estudiaron la arquitectura de una CPU, el formato de las instrucciones y los distintos tipos de instrucciones. Veremos ahora cómo se ejecuta un programa almacenado en memoria. Un programa almacenado en memoria está listo para ser ejecutado por el microprocesador (no nos importa cómo fue cargado el programa, por ahora). Para ser ejecutado, es necesario cargar el PC con la dirección de la primera instrucción a ser ejecutada. Luego, el PC se incrementa automáticamente recorriendo secuencialmente los sucesivos lugares de memoria donde se halla el programa. Veamos el siguiente programa: mnemónico 1000 PATO : binario hex. LDA A, DATO1 A<--DATO1 LDA A : 10 LDA B, DAT02 B<--DATO2 LDA B : 15 ADD B A<--A+B ADD B : 27 JNZ : 7A JNZ PATO Describamos el funcionamiento del programa anterior: PC <-- 1000H 1. Trae el código LDA A; PC <-- PC + 1; comienza decodificación de la instrucc. 2. Lee DATO1; PC <-- PC + 1; almacena DATO1 en el registro A. 3. Trae el código LDA B; PC <-- PC + 1; comienza decodificación de la instrucc. 4. Lee DATO2; PC <-- PC + 1; almacena DATO2 en el registro B. 5. Trae el código ADD B; PC <-- PC + 1; comienza decodificación de la instrucción, suma A + B y lo almacena en A. 6. Trae el código JNZ; PC <-- PC + 1; comienza decodificación de la instrucc. 7. Lee dirección baja de salto; PC <-- PC + 1; almacena en temporario1. 8. Lee dirección alta de salto; PC <-- PC + 1; almacena en temporario2; si z = 0 : PC <-- temporario1.temporario2. 4.2 CICLOS DE OPERACION Hay dos operaciones fundamentales que realiza un procesador: 1- búsqueda de la instrucción: en la cual el instrucción: en la cual el procesador busca el código de operación(FETCH); 2- ejecución de la procesador ejecuta la operación determinada por la instrucción. Un procesador se encuentra siempre haciendo una de las dos operaciones anteriores. A continuación daremos una serie de definiciones: Ciclo de instrucción: es el tiempo total, medido en números de períodos de reloj, de duración de un ciclo de búsqueda más uno de ejecución de la instrucción teniendo en cuenta los sucesivos accesos a memoria en el caso de ser una instrucción de más de un byte. Ciclo de máquina: es el tiempo, medido en números de períodos de reloj de duración de una operación de lectura, de escritura o de búsqueda (Fetch) de una instrucción. Un ciclo de instrucción está compuesto por uno o varios ciclos de máquina (M1, M2, M3, M4), dependiendo del tipo de instrucción. Se denomina M1 al ciclo de búsqueda, pues siempre es el primero de cada ciclo de instrucción. Los ciclos de máquina más comunes son: Fetch, Memory Read, Memory Write, I/O Read, I/O Write, INA, etc. Estado de Reloj: es el período del reloj (clock) del microprocesador (T1, T2, T3, T4). Cada ciclo de máquina esta compuesto por un número entero de pulsos de reloj, pero no todos los ciclos de máquina tienen el mismo número de estados. El reloj determina los instantes de la secuencia del flujo de información y el temporizado de las líneas de control. Un estado o período de reloj es la unidad más pequeña de actividad, es decir que realiza la ejecución de una o más "micro-instrucciones". Debido a que un ciclo de máquina requiere 3 actividades básicas como son: - enviar direcciones al canal de direcciones, - preparar transferencias en el canal de datos, - realizar la transferencia propiamente dicha (es decir, copiar en un registro o en memoria), es que se requiere, al menos, de 3 períodos de reloj o estados para su desarrollo. Eventualmente, un cuarto o más ciclos adicionales son necesarios para el caso de un ciclo de máquina Fetch. FIGURA 4.1 La mayoría de los microprocesadores, al comienzo de cada ciclo de máquina (T1), envían señales de control que identifican qué tipo de ciclo de máquina será ejecutado. En la fig. 4.1 se muestran los distintos ciclos para el caso de una instrucción de 3 bytes, como es la de almacenar el acumulador A en un lugar de memoria. Incluye un ciclo de búsqueda del código de operación, 2 ciclos de lectura y uno de escritura (STA DIRECCION). En conclusión, podemos decir que la ejecución de una instrucción (ciclo de instrucción) consiste de una secuencia de operaciones de lectura y/o escritura de memoria llamadas ciclos de máquina. En particular, la búsqueda del OP CODE es un ciclo de lectura (M1) especial. 4.2.1 Ciclo de Búsqueda y de Ejecución Ahora se describirá en detalle cada uno mencionados, y se dará una forma de notación. de los ciclos fundamentales antes Búsqueda de la instrucción Las tareas realizadas durante esta operación son las siguientes: 1. El Contador de Programa (PC) se transfiere al buffer de direcciones (AB), durante el tiempo T1. 2. El contenido de memoria apuntado por AB se transfiere al buffer de datos (DB), y simultáneamente se incrementa el PC en 1. Esto se realiza en T2 y parte de T3. 3. El buffer de datos (DB) se transfiere al registro de instrucciones IR. Esto ocurre durante T3. 4. Durante T4 comienza a decodificar la instrucción. En este estado determina si son necesarios otros accesos a memoria (de acuerdo al número de bytes de la instrucción), calcula el tipo de direccionamiento, y en el caso que sea la instrucción de 1 byte, debe determinar el número de estados (Ti) necesarios para completar la ejecución de la instrucción (instrucciones del tipo incrementar registro de 16 bits). La notación que se usará para indicar esto es: M1: - AB <-- PC - DB <-- [AB]; PC <-- PC+1 : lectura de memoria (R/W=1) - IR <-- DB : comienza decodif.de instrucción - Comienza a ejecutar inst. : descripción de la operación Durante un ciclo de búsqueda, la dirección a la cual va a acceder siempre proviene del PC, y el registro destino es el IR. Ejecución de la instrucción Como sabemos, si la instrucción es de un byte, ésta se podría ejecutar durante el ciclo de máquina M1. Si es de varias palabras, la instrucción comienza a ejecutarse durante este ciclo y será necesario para terminar la ejecución realizar nuevos accesos a memoria para traer los operandos. Para ello es necesario: 1. Transferir el PC al buffer de direcciones (AB), durante el tiempo T1. 2. El contenido de memoria de AB se transfiere al buffer de datos (DB) y se incrementa el PC en 1. Esto se realiza en T2 y parte de T3. 3. Almacena el dato leído de memoria en un registro temporario o en un registro la CPU (acumulador, XR, etc.), y se realiza la ejecución de acuerdo a la instrucción. M2: - AB <-- PC - DB <-- [AB]; PC <-- PC+1 - TEMP <-- DB / Ri <-- DB / EJECUTA INSTRUCCION. Como después de M1 se ha decodificado parcialmente la instrucción, la unidad de control (por un mecanismo de interpretación) sabe que está en el ciclo M2 y debido a que en el IR se mantiene presente el código de operación, el decodificador de instrucciones determina cuáles son las señales de control a activar y los sucesivos pasos a seguir en los restantes ciclos de máquina. La instrucción de la fig. 4.1 (STA DIR) sería: M1: - AB <-- PC - DB <-- [AB]; PC <-- PC+1 (R/W =1) - IR <-- STA PC = 2001 M2: - AB <-- PC - DB <-- [AB]; PC <-- PC+1 (R/W = 1) - TEMP1 <-- 10 PC = 2002 M3: - AB <-- PC - DB <-- [AB]; PC <-- PC+1 (R/W = 1) - TEMP2 <-- 1A PC = 2003 M4: - AB <-- Temp1.Temp2 - DB <-- A - [AB] <-- DB FIGURA 4.2 Durante un ciclo de ejecución la dirección de accesos de datos puede provenir de otras fuentes que no sea el PC y el destino de la información nunca es el IR. 4.2.2 Operaciones Realizadas por cada Instrucción de Programa FIGURA 4.3 4.2.3 Diagrama de Estado de una CPU Una instrucción se puede dividir en uno o más ciclos de máquina (M1, M2,..., etc.), y cada ciclo de máquina se compone de un número de estados (períodos de Reloj t1, t2,...etc.). Durante cada estado se llevan a cabo un conjunto de microoperaciones u operaciones internas, como se representa en la fig. 4.4. Dichos estados se representan por círculos con Ti en su interior. En esencia, este diagrama trata de describir las operaciones de un ciclo de máquina particular. Un diagrama de estado es un esquema donde se muestra "aproximadamente" cuáles son las operaciones internas (microoperaciones) realizadas por el microprocesador en cada estado. La transición entre estados se representa por flechas, y la transición se produce cuando la condición indicada en cada flecha es verdadera. FIGURA 4.4 T1: durante este estado, el procesador emite las señales de estado (status), para identificar el tipo de ciclo de máquina, y además establece las direcciones válidas sobre el canal de direcciones para identificar a la memoria o dispositivo I/O. T2: durante este estado, la CPU emite las señales de control apropiadas para sincronizar un ciclo de lectura o de escritura (/RD o /WR). Además, en este estado, incrementa el PC siempre y cuando sea un ciclo FETCH o un ciclo READ en el cual se lean datos (operandos) que forman parte de la instrucción. Por último, se muestrea la señal WAIT. Twait: el microprocesador entra en este estado en respuesta a una señal wait activa. Este estado mantiene las mismas condiciones (señales de control, direcciones y datos) que el estado T2. Por lo tanto, se prolonga el tiempo de acceso a un lugar de memoria o dispositivo de I/O. T3: durante este estado se produce, realmente, la transferencia de datos entre la CPU y el elemento seleccionado. Si el ciclo es FETCH, el registro destino es el IR. Si es READ, el registro destino es cualquier Ri distinto de IR; si es un WRITE, el dispositivo seleccionado o la memoria seleccionada, lee del canal de datos. IF FETCH, THEN IR <-- DB ELSE IR no<-- DB y Ri <-- DB o DB <-- Ri Al final de T3, se deshabilitan las líneas de control del ciclo de máquina correspondiente, y se des-selecciona la memoria o dispositivo de I/O seleccionado. Si es un ciclo FETCH, la CPU entra en el estado T4, en el cual comienza la decodificación de la instrucción. El resto de los estados serán necesarios en los casos de instrucciones complejas o de varios períodos de ejecución. Esto lo determina en T4. Si no es un ciclo FETCH, o termina de reconocer los distintos estados del FETCH, determina si es el último ciclo de máquina de la instrucción. Si no lo es, vuelve nuevamente a T1, en caso contrario, debe examinar si hubo alguna interrupción. Si no la hubo, retorna a T1 para comenzar un nuevo ciclo M1, en caso contrario, inhibe futuras interrupciones, guarda el PC en la pila y establece en el PC el vector de interrupción (dirección de salto), comenzando un nuevo ciclo M1-T1. 4.3 CONTROL Y TEMPORIZADO Un microprocesador es, esencialmente, una máquina secuencial sincrónica cuyos estados son determinados por las distintas instrucciones, la lógica interna de control y, en algunos casos, por eventos externos como interrupciones. El temporizado de un microprocesador se lleva a cabo por circuitos de reloj que proveen salida de simple fase o múltiple fase. Como las micro-operaciones está sincronizada con el reloj maestro, la secuencia de eventos se suceden a intervalos regularmente espaciados de tiempo, usando para ello los flancos ascendente y descendente. Un reloj simple provee 2 estados y 2 flancos por período (fig. 4.5A). Un reloj bifásico provee 3 estados y 4 flancos de reloj (fig. 4.5B). FIGURA 4.5A FIGURA 4.5B Por lo tanto, con reloj de simple fase se necesitan más períodos de reloj que con un reloj multi-fase. 4.4 OPERACIONES DE LOS CANALES En esta sección se verá el temporizado necesario para realizar una transferencia de datos entre la CPU y la memoria o dispositivo de I/O. Es necesario conocer el temporizado del canal para realizar la conexión de los módulos de memoria e I/O (con sus diferentes tiempos de acceso) con la CPU. Un ciclo de bus se define como el proceso por el cual una secuencia fija de señales digitales efectúan una transferencia de datos entre módulos del sistema (CPU, memoria, disp. I/O). La CPU genera un ciclo de bus y responde el módulo direccionado por ésta. Un ciclo de bus puede ser dependiente o independiente del ciclo de máquina. En algunos microprocesadores, los ciclos de máquina corresponden a ciclos de bus (8085). En otros, como el 8086, operan asincrónicamente, ya que la unidad de ejecución es independiente de la unidad de interfaz con el bus. 4.4.1 Funcionamiento del Canal de una CPU El intercambio de información entre una CPU y los módulos de memoria e I/O se realiza en los ciclos de buses, y está sincronizado por el reloj de la CPU. Los ciclos de buses pueden ser de acuerdo a la CPU: - Reloj de simple fase, de canal no multiplexado (ejemplo: Z-80), - Reloj de simple fase, de canal multiplexado (ejemplo; 8085), - Reloj bifásico (ejemplo: 6800). 4.4.2 Reloj de Simple Fase, de Canal no Multiplexado FIGURA 4.6 En la figura 4.6 se muestra el diagrama para un microprocesador de reloj simple fase para el caso de una instrucción del tipo ADI BYTE (A<--A+BYTE). En el ciclo M1: durante T1 se presenta la dirección de memoria. En T2 y T3 trae el código de operación (ADI), incrementa el PC y transfiere el código de operación al IR. En T4 transfiere el registro A al registro temporario de la ALU. En el ciclo M2: durante T1 presenta dirección de memoria. En T2 y T3 trae el byte a memoria y lo almacena en Y, incrementa el PC, realiza la suma. FIGURA 4.7 En la figura 4.7 se muestra una instrucción del tipo salto condicional en la cual la duración del ciclo de instrucción depende de la condición. En el caso que sea verdadera tiene 3 ciclos de máquina; en caso contrario, únicamente 2. Tal como se desarrolla la ejecución de la instrucción en la fig. 4.7, la condición determina la longitud de la instrucción. Se podría haber hecho de manera tal que durase el mismo intervalo de tiempo. 4.4.3 Reloj de Simple Fase, de Canal Multiplexado Dentro de los sistemas de reloj de simple fase se encuentran implementaciones con canales multiplexados; es decir, se comparten físicamente algunas líneas, como son las del canal de datos con las líneas correspondientes a la parte baja de las direcciones. En este caso, es necesario demultiplexarlas para poder obtener el canal de direcciones completo. Esto se logra agregando un latch en el canal de datos, capturando las direcciones con la señal MUX, y la salida del mismo corresponde a las líneas de direcciones (para el caso particular del microprocesador 8085, la señal MUX se denomina ALE Address Latch Enable). FIGURA 4.8 4.4.4 Reloj Bifásico de fases no solapadas Un concepto diferente en la forma de operación es el de los microprocesadores de 2 relojes Ø1 y Ø2. Estos relojes deben tener la forma de onda de la figura 4.9, por lo tanto, requieren circuitos generadores de clock especiales. En una arquitectura de reloj bifásico, el uso del bus de datos se realiza con el Ø2=1, es decir que una operación de lectura o escritura de memoria se lleva a cabo en un único período de reloj. Veremos los dos tipos de operaciones: Operación de Lectura: En la figura anterior se muestra una operación de lectura de memoria. El flanco ascendente de Ø1 (1) inicializa la operación activando la línea R/W y dejando las direcciones estables, hasta el próximo período. (2) El flanco creciente de Ø2 indica el momento donde comienza la selección de la memoria, señala el momento en que comienza una transferencia de información en el bus de datos según indique la línea E. Si ninguna transferencia es necesaria, E será igual a cero para Ø2=1 y Ø1=0. (Cuando la ejecución de la instrucción lleva más de un ciclo de reloj). Con Ø1=0 y Ø2=1 el bus de datos sale de tres estados. Con el flanco descendente de Ø2, los datos se almacenan en la CPU (3). El tiempo de Ø2=1 determina el tiempo de acceso máximo de la memoria. Operación de Escritura: FIGURA 4.10 La figura 4.10 muestra una operación de escritura. La secuencia es similar a la anterior con la diferencia de la línea R/W=0. La memoria debe almacenar el dato con el flanco descendente de Ø2. Tanto en la figura 4.9 como en la 4.10, la línea E coincide con Ø2, por lo tanto en este caso se puede eliminar E. Sin embargo, en el caso de eliminar E, es necesario agregar una (VMA) señal de dirección válida pues puede haber ciclos de ejecución en el cual no se debe seleccionar a ningún dispositivo y usar a Ø2 como una línea de control y sincronización de las operaciones de R/W. Por lo tanto, para habilitar una memoria o un dispositivo de I/O, es necesario sincronizar la habilitación con Ø2 (fig. 4.11). Generalmente, cuando se piensa en conectar dispositivos de I/O a un sistema, se le colocan buffers para proteger al interior del sistema. FIGURA 4.11 4.5 MODOS DE DIRECCIONAMIENTO Los distintos modos de direccionamiento determinan las distintas formas de acceder a datos en celdas de memorias del espacio total de direcciones del procesador. Normalmente, Modos de Direccionamiento, se refiere a los mecanismos de formación de la dirección efectiva (EA). La EA es la dirección usada para acceder a un elemento, en memoria principal, dentro de los registros del microprocesador o de un dispositivo de I/O (o sea, dentro del espacio total de direccionamiento del microprocesador). Los modos de direccionamiento pueden ser: - explícitamente especificados por la instrucción, - implicados por la instrucción. La "potencia" (la riqueza del conjunto de instrucciones) de un microprocesador depende, en gran medida, de los distintos modos de direccionamiento provistos. Un mismo tipo de instrucción puede usar distintos modos de direccionamiento para acceder a un determinado elemento. No todos los microprocesadores proveen todos los modos de direccionamiento. El espacio de direccionamiento de un procesador se puede dividir en 3 clases: 1- Registros del procesador. 2- Memoria principal. 3- Dispositivos externos. 4.5.1 Registros del Procesador Un método de direccionamiento de registro consiste en dedicar un pequeño campo dentro del OP CODE de la instrucción para seleccionar el registro. Este tipo de direccionamiento involucra operaciones internas al microprocesador (operaciones entre registros internos de la CPU). La dirección efectiva es el número de un registro que emplea la unidad de control para seleccionar el registro deseado (fig. 4.12). Este método de direccionamiento se llama implícito o inherente. Incluye las instrucciones del siguiente tipo: CLEAR A, las de desplazamiento (SHIFT), las de transferencia entre registros (MOV A,B o TAB), las de comparaciones CMP R (A-R), operaciones lógicas, las de incremento de registro, INC A; operaciones aritméticas entre registros A<--A+B (ADD B). Estas son instrucciones de 1 byte de longitud. Al emplear registros internos como operandos (en lugar de memoria), las ejecuciones resultan más rápidas. FIGURA 4.12 4.5.2 Direccionamiento de Memoria Principal Se refieren a los distintos modos de acceder a lugares de la memoria principal. 4.5.2.1 Direccionamiento inmediato Este direccionamiento no constituye un direccionamiento propiamente dicho, pues la instrucción no contiene ninguna dirección. En el lugar de la dirección figura el operando sobre el cual se va actuar (fig. 4.13). En este caso, el operando forma parte de la instrucción, y tanto OP CODE como el operando se buscan de memoria, usando el PC. Este direccionamiento es útil cuando se desea introducir fácilmente constantes en un programa. Un símbolo muy usado como inmediato es #. Se pueden cargar registros de 16 bits en forma inmediata para inicializar punteros de tablas LDX #AAAA. En algunos microprocesadores se utiliza la letra I para indicar inmediato: MVI A,A0H; LXI H,2800H; LXI SP,28C3H. etc. FIGURA 4.13 Este tipo de direccionamiento puede constar de 2 o de 3 bytes de instrucción. FIGURA 4.14 4.5.2.2 Direccionamiento inherente o implícito Vimos lo que era direccionamiento implícito para registros internos a la CPU. Un caso particular muy importante de este direccionamiento lo constituyen las instrucciones del manejo de pila (stack). En el caso de inserción (PUSH) de datos en la pila, el operando de origen está en un registro y la dirección de destino en el puntero de pila (stack Pointer): A-->(SP); SP<--SP-1. En el caso de extracción (PULL O POP) es en el sentido inverso. Son instrucciones del tipo de 1 byte de logitud. 4.5.2.3 Direccionamiento extendido o absoluto Este modo de direccionamiento consiste en poder acceder a cualquier palabra contenida en la memoria principal, por medio de la dirección absoluta de memoria explicitada como bytes en el operando de la instrucción. Es el método más fácil para direccionar un lugar de memoria. La instrucción contiene la dirección del operando (dirección absoluta de memoria) directamente especificada en 2 bytes de memoria (microprocesadores de 8 bits de datos y 16 bits de direcciones), permitiendo acceder al espacio total de direcciones memoria (64K). Estas son instrucciones de 3 bytes de longitud. Este tipo de direccionamiento incluye instrucciones del tipo LDA A, DIR; STA A, DIR. Muy útil en el direccionamiento de variables individuales, o para el manejo de información con dispositivos de I/O conectados al mapa de memoria. Es un método de direccionamiento relativamente lento en tiempo de ejecución. FIGURA 4.15 4.5.2.4 Direccionamiento directo o página cero Una forma de acelerar el direccionamiento extendido, sería usar el direccionamiento paginado, donde la EA se forma de la siguiente manera: el byte más significativo de la dirección se obtiene de un registro, llamado de página y el byte menos significativo de la dirección se especifica por un byte que se da como operando de la instrucción. Para esto se hace necesario un registro extra: el registro de página, que indica el número de página a emplear. Cada página tiene 256 bytes. FIGURA 4.16 Un caso especial lo constituye un direccionamiento de página 0 en el cual los lugares de memoria a acceder van desde la dirección 0000 hasta la 00FFH, es decir que el byte más significativo es 00 (EA=00.DIR) El método de direccionamiento directo es una poderosa herramienta, pues reduce el número de bytes de algunas instrucciones. Además, debido a la facilidad en el acceso son muy usados como medios de acceso a variables o registros temporarios. La limitación son los extremos de direccionamiento (256 bytes). Son instrucciones de 2 bytes de logitud. Los tipos de instrucciones son las equivalentes a direccionamiento extendido: LDA B,28H (B<-(0028)); ADD A,0CEH (A<--A+(00CE). FIGURA 4.17 las del 4.5.2.5 Direccionamiento relativo En este modo el operando se encuentra en una dirección relativa a la instrucción ejecutada, es decir, la dirección efectiva se forma sumando al contenido del PC actual, un número (dato) denominado desplazamiento (u "offset"), que para nuestro caso será de 8 bits, que se da como operando en la instrucción. El desplazamiento se interpreta como un número binario con signo (en complemento a 2), por lo tanto, el desplazamiento será -128 a +127 lugares del PC. FIGURA 4.18 Es muy usado en las instrucciones de salto (condicional o incondicional). Este modo es muy importante distintos lugares cuando de memoria se (es escriben decir, que programas un que programa pueden se puede utilizarse en trasladar en memoria). Su alcance es limitado. Ejemplo BRA F0 BNZ 37 4.5.2.6 Direccionamiento indexado En este modo de direccionamiento, la EA se genera por la suma de un registro, llamado registro índice con un valor que está contenido como uno de los operandos en la instrucción. Conceptualmente, el valor dato en la instrucción es la dirección base de una tabla o arreglo, y el registro índice es el desplazamiento de la base. FIGURA 4.19 Hay microprocesadores donde el contenido del registro índice es de 8 bits, y la dirección (offset) que se va a indexar es de 16 bits. LDA DIR,Y A <-- (HHHH + YY) La implementación del direccionamiento indexado es muy variado, puede ser: XR : 16 bits XR : 8 bits DIR : 8 bits s/signo DIR : 16 bits s/signo XR : 16 bits XR : 16 bits DIR : 8 bits c/signo DIR :16 bits s/signo Este modo de direccionamiento se usa para el acceso a tablas o arreglos de datos, especialmente cuando éstos son accedidos en forma secuencial, ascendente o descendente. Por ejemplo, se usa a menudo para acceder a los elementos de un arreglo. El desplazamiento localiza el comienzo del arreglo y el valor del registro índice selecciona un elememto del arreglo (si XR = 0 --> primer elemento del arreglo). Como todos los elementos del arreglo son iguales (es decir, tienen igual longitud), a través simples operaciones aritméticas es posible seleccionar cualquier elemento. FIGURA 4.20 Las instrucciones con direccionamiento indexado son muy poderosas, pero demoran mucho tiempo de procesamiento. Son, por lo general, de 2 bytes. Hay variantes de direccionamiento indexado, en las cuales el contenido del XR se autoincrementa o autodecrementa en 1: XR-1 --> XR ; (XR+offset) --> A Auto decremento (XR+offset) --> A ; (XR+1) --> XR Auto incremento 4.5.2.7 Direccionamiento indirecto En este modo de direccionamiento, se da una referencia intermedia donde se halla la dirección efectiva del operando. Esta referencia puede ser: 1) A través de una dirección de memoria (fig. 4.21a). Este es más flexible pero más lento. 2) Por medio de un registro de la CPU (fig. 4.21b). FIGURA 4.21a FIGURA 4.21b En el segundo caso (fig. 4.21b), la instrucción es de 1 byte (OP CODE), el cual direcciona el registro cuyo contenido apunta a un lugar de memoria donde se halla el operando. En el primer caso, se hace necesario usar 3 bytes por instrucción. Son muy útiles en el manejo de tablas. 4.5.2.8 Direccionamiento indirecto - indexado Este modo de direccionamiento consiste en realizar, primero, una indirección, y luego, indexar la dirección para hallar la dirección efectiva. Generalmente, se usan en página 0. Es muy útil para llevar punteros de tablas. La dirección del operando es una dirección, cuyo contenido junto al siguiente lugar de memoria da una dirección que será indexada por el registro Y, ésta dirección contiene el dato a operar. FIGURA 4.22 4.5.2.9 Direccionamiento indexado-indirecto Este método consiste en realizar, primero, operando (en pág.0), y luego, una indirección. una indexación de la dirección del FIGURA 4.23 Ejemplo Supongamos que se desea acceder a un elemento determinado de cada tabla (por ejemplo el tercero), entonces basta con cambiar el contenido de lugar de indirección (01, 02) y, con el valor del puntero a la tabla correspondiente e Y, obtengo el desplazamiento del principio de dicha tabla. FIGURA 4.24 4.5.2.10 Direccionamiento basado En este modo de direccionamiento, la dirección efectiva se obtiene como resultado de la suma entre el contenido de un registro (llamado registro base) y un valor de desplazamiento que se da como operando en la instrucción. Este modo provee una forma sencilla de direccionar estructuras, las cuales se pueden ubicar en cualquier lugar de memoria. Por ejemplo: el registro base apunta a la base de la estructura y los elementos de la misma se direccionan por el desplazamiento respecto a la base. Diferentes copias de la misma estructura se pueden acceder simplemente cambiando el registro base. FIGURA 4.25 4.5.2.11 Direccionamiento basado - indexado En este modo de direccionamiento, la EA se genera de la suma de un registro base, un registro índice y un desplazamiento. Este modo es muy flexible ya que 2 componentes de direcciones pueden ser variados en tiempo de ejecución. Ejemplos típicos son: - Aquellas estructuras de datos cuyos elementos son arreglos. - Direccionamiento de matrices. FIGURA 4.26 Ejemplo Una estructura de datos que contenga un arreglo como elemento. FIGURA 4.27 4.5.2.12 Direccionamiento de bits Algunos microprocesadores tienen instrucciones que direccionan bits individuales de registros o de lugares de memoria, especificándolo en la instrucción. SET B A.2 pone bit 2 de A=1 CLR A.3 pone bit 3 de A=0 JB A.1,dir Jump if bit set JBC A.1,dir Jump if bit set and clear bit MOV A.i,C A.i <-- C 4.5.3 Dispositivos Externos En los microprocesadores en los que el espacio de dirección de I/O no está separado del espacio de direcciones de memoria principal, no es posible utilizar todos los lugares de memoria microprocesadores cuando que se tienen direccionan ambos dispositivos espacios separados. de I/O. Esto En cambio, permite manejar hay el espacio de direccionamiento de los dispositivos de I/O independiente del espacio de direccionamiento de memoria principal. Una de las ventajas más importantes es que hay menos peligro de cometer errores de programación que causen una operación de I/O no deseada o catastrófica, debido a que únicamente por medio de instrucciones especiales de entrada/salida es posible acceder a los dispositivos externos. En cambio, si estuvieran dentro del mapa de memoria, con cualquier instrucción se podría tener acceso a dicho dispositivo. Las desventajas más importantes son: .- El espacio de I/O se maneja por medio de instrucciones especiales que hacen uso de un único registro, no pudiendo emplear otros tipos de instrucciones o registros para esos dispositivos. Esto le quita flexibilidad y rapidez para el manejo de I/O. .- Limitación en la capacidad de direccionamiento. FIGURA 4.28 4.5.3.1 Direccionamiento indirecto de I/O Este modo de direccionamiento es similar al de registro indirecto de memoria. El número del port se toma de un registro, pudiendo acceder a cualquier dirección del espacio de I/O. Ejemplo Para el microprocesador 8086: IN AX,DX AX <-- (DX) OUT DX,AX (DX) <-- AX 4.6 UNIDAD DE CONTROL La unidad de control es un hardware digital que debe realizar un conjunto de acciones secuenciales que permitan controlar el flujo de información dentro y fuera del procesador. Hay tres técnicas para realizar dichas secuencias: a) Control a nivel de compuertas (lógica clásica). b) Arreglos lógicos programables (PLA). c) Microprogramación. 4.6.1 Lógica Clásica Diseñar una unidad de control a nivel de compuertas involucra el cálculo y la realización de una expresión Booleana completa por cada variable de control. Ya que un microprocesador puede tener más de 30 variables de control, se debe realizar un esfuerzo considerable para computar dichas expresiones. Dentro del problema del cálculo de las expresiones Booleanas, se halla el problema del secuenciamiento. Es decir, decidir cuándo una variable de control debería activarse, es probablemente la tarea más difícil del diseño de una unidad de control a nivel de compuertas. Es posible de realizar dicho temporizado en forma sincrónica o asincrónica, pero por un problema de costo y confiabilidad, la técnica más usada es la sincrónica. Si cada acción elemental dura un múltiplo entero de períodos de un reloj, el temporizado de control es sincrónico. Si la próxima acción secuencial se realiza inmediatamente después del fin de la anterior acción, se dice que el temporizado de control es asincrónico. Tal vez, la mayor dificultad de la técnica asincrónica es determinar cuándo una acción ha finalizado. Históricamente, esto se resolvió por medio de retardos y monoestables, lo cual es poco confiable. La técnica más usada para generar una deseada secuencia de tiempos de pulsos y niveles es la de eventos temporizados sincronizados con contadores en base a un cristal. 4.6.2 Arreglos Lógicos Programables Un PLA es un circuito que puede ser programado para implementar funciones lógicas en la forma "suma de productos". Un PLA provee una forma conveniente y sistemática para realizar una lógica combinacional 'irregular'. Una lógica irregular se caracteriza por tener un gran número de expresiones Booleanas. Realizar dicha lógica con compuertas resultaría costoso y extremadamente difícil. El objeto de los PLA es realizar lógicas irregulares en una forma simple y económica. Un PLA típico se muestra en la figura 4.29. Un PLA puede completar un número determinado (no el total posible) de términos productos. Un PLA ayuda al diseñador a realizar una Unidad de Control en una forma más sistemática y económica que la lógica a nivel de compuertas. Una PLA toma del hecho que el control de una variable dependerá de un subconjunto de todas las condiciones de entrada. A pesar de que el PLA ayuda al diseño de unidades de control, aún persiste el problema del secuenciador que determina el temporizado. FIGURA 4.20 4.6.3 Microprogramación Para ejecutar un programa, se obtienen las instrucciones de memoria, dando a la unidad de control el código de operación y los datos se rutean entre la ALU, registros y dispositivos de I/O. La unidad de control se encarga de realizar el "control" de las operaciones a través de una lógica adecuada y además realiza el 'temporizado', de las distintas operaciones de cada instrucción por medio de una lógica de temporizado, siendo el tiempo de ejecución un múltiplo de períodos de reloj. Una unidad de control microprogramada difiere de las unidades anteriores en que la lógica de control fija se reemplaza por elementos de programa almacenados (instrucciones) de control, y la lógica de temporizado, por secuenciamiento de dichas microinstrucciones. Por supuesto que un mínimo de lógica es necesaria, pero ella se refiere al control del microprograma. Un microprocesador microprogramado es un micro cuyas señales de control necesarias para buscar y ejecutar las instrucciones son generadas por el secuenciamiento de un conjunto de instrucciones almacenadas en una memoria (ROM) de control (usualmente se denominan macroinstrucciones a las instrucciones, para diferenciarlas de las microinstrucciones de control). Es decir que los bits de las palabras (muchos bits) de control deben ser capaces de manejar las señales (enables, clock, etc.) de control de los registros internos, de la ALU, buffers de direcciones y datos, las señales de R/W, E, etc., a través de un secuenciamiento de las mismas (microinstrucciones). Wilke's definió (1951) un esquema que puede realizar lo anteriormente descripto (fig. 4.30). La figura 4.30 microinstrucciones. muestra El que campo a de partir una de un OP CODE microinstrucción se se genera divide en una serie de un campo de direcciones de la próxima microinstrucción y un campo de señales de control. FIGURA 4.30 La figura 4.31 muestra una unidad de control microprogramada. La unidad está formada por un registro IR en el cual se almacena el OP CODE, una RAM (PLA o decodificador) de dirección de comienzo de instrucción, un selector de dirección de comienzo de instrucción, un selector de direcciones para la ROM de microprograma, la ROM de microprograma donde se hallan las microinstrucciones, un selector de datos el cual se usa para operaciones de salto condicionales. FIGURA 4.31 La instrucción se carga en el IR al comienzo del ciclo de instrucción y el OP CODE genera a través de la ROM decodificadora el comienzo de dirección donde se halla la primera de la serie de microinstrucciones en la ROM de microprograma que ejecutará la instrucción completa. Por medio de (I), se hace más eficiente el uso de la (III). Cada microinstrucción se divide en 3 campos fundamentales: 1) el control de ALU+Registros internos; 2) el de próxima dirección de microinstrucción; 3) el selector de condición. La microinstrucción provee un bit más, el cual maneja al selector de dirección de ROM de microprograma (II), y unos pocos bits más para hacer la interfaz con la lógica de temporizado e interrupciones y señales de control del bus de control externo del microprocesador (R/W, E, etc.). Para cada nueva instrucción, primero se selecciona la dirección proveniente de (I), y luego el bit selector selecciona la dirección de próxima microinstrucción proveniente de (IV). de (II) La última microinstrucción en la secuencia cambia al selector (II) para obtener la dirección de comienzo de microprograma de la próxima instrucción del bloque (II). La salida del selector de datos (V) es un bit de la dirección de la próxima microinstrucción (suministrada por (IV)) de manera que cuando la próxima microinstrucción es seleccionada, su dirección dependa de la condición seleccionada. Como se puede observar de la figura 4.31, el ancho de la palabra de una microinstrucción puede ser bastante considerable (32-48 bits). La longitud de la memoria puede ser de 1K a 2K. Se denomina microprogramación horizontal a la cantidad de acciones secuenciales que se realizan dentro de una única microinstrucción. La microprogramación vertical es la ejecución secuencial de las operaciones a través de la ejecución de las microinstrucciones mismas. Evidentemente, la primera requiere menos memoria, pero adiciona costos y complejidad de la lógica de control. 4.6.3.1 Mejoras a la unidad de control microprogramada Es deseable que el ancho de la memoria de microprogramación sea reducido, no sólo por razones de costo, sino por razones de interconexión. Existen varios métodos. Uno de los más comunes es que la mayoría de las microinstrucciones se realicen por medio de una secuencia de microinstrucciones, las cuales son usualmente almacenadas en direcciones adyacentes en la ROM de miroprograma. Por lo tanto, es adecuado generar la dirección de la próxima microinstrucción simplemente sumando "1" al contador de direcciones de microinstrucciones. En consecuencia, se ahorra memoria de microprograma al no tener que poner en la ROM de microprograma la dirección de la próxima microinstrucción a ejecutar. Sin embargo, al final de la ejecución de la instrucción, es usual tener un salto incondicional a un conjunto de microinstrucciones, las cuales testean la presencia de una interrupción antes de buscar la próxima instrucción. Para generar la próxima dirección se utilizan otros bits, tales como los bits de selección de condición. Muchas instrucciones tienen módulos comunes de microprogramas. Para aprovechar los módulos que son comunes y ahorrar memoria es muy ventajoso tener la capacidad de usar microprogramas en base a subrutinas. Esto se hace proveyendo a la unidad de control de microprogramas con una pila (stach) para almacenar las direcciones de retorno de subrutina. A veces se usa un contador adicional para repetir un grupo de microinstrucciones (cuando son necesarias). Para ello, se carga al contador con el número de veces a repetir, y se decrementa hasta llegar a cero. En la figura 4.32 se muestran las 4 fuentes de la próxima instrucción: 1) del registro de microinstrucciones, 2) de un incrementador que adiciona 1 a la dirección de microprograma corriente, 3) de la ROM de dirección de comienzo de microinsrucción, 4) de la Pila (stack) usada para almacenaje subrutinas de microinstrucciones. FIGURA 4.32 de las direcciones de retorno de 4.7 MICROPROGRAMACION vs. LOGICA CLASICA 1) La microprogramación permite al diseñador programar, más fácilmente, la secuencia de acciones a realizar que resolviendo expresiones Booleanas. 2) La microprogramación ofrece al diseñador la flexibilidad de realizar cambios en las operaciones con sólo alterar el contenido de la ROM, en contraste con los cambios de hardware (lógica + cableado) necesarios en el diseño con lógica clásica. 3) La microprogramación ofrece definir nuevas instrucciones o realizar cambios en las instrucciones, con sólo alternar la ROM. Hay máquinas que usan RAM, permitiendo emular un procesador por otro. 4) La mayor ventaja de la lógica clásica es que se pueden diseñar sistemas de menos tiempo de ejecución que con microprogramación. La mayoría de los microprocesadores actuales usan una combinación de ambas técnicas para lograr mayor eficiencia. 4.8 ARQUITECTURA BIT-SLICE Algunos microprocesadores utilizan varios chips para realizr la CPU. Ello se debe a que se definen chips que proveen 1, 2 o 4 bits del total de la máquina; por ejemplo, hay módulos que contienen una ALU y registros de 4 bits, denominados RALU, siendo necesario usar arquitectura 4 módulos bit-slice es, para por realizar lo tanto, un microprocesador una arquitectura de 16 bits. particionada. Una Para completar el microprocesador es necesario la unidad de control; en estos casos se utiliza la microprogramación. 4.8.1 Diagrama de Estado Para un Procesador Elemental Estado D: la microinstrucción selecciona el selector de condición para determinar el estado de la línea de interrupción. Si no hay interrupción, el selector de dirección de microinstrucciones selecciona la próxima dirección de microinstrucción consecutiva para ir al estdo A. Si hay interrupción, la próxima dirección de microprograma se toma de la microinstrucción corriente para ir al estado E. Estado A: el contenido del PC se envía al bus de direcciones y el dato leído se carga en el IR. La microinstrucción selecciona la próxima dirección consecutiva para la próxima dirección. Estado B: el PC se incrementa en 1. La microinstrucción selecciona la dirección de la ROM decodificadora como dirección de próxima microinstrucción. Estado C: ejecuta la instrucción. Después de ejecutar la instrucción, la unidad de control de microprograma salta incondicionalmente al estado D. FIGURA 4.33