UNIVERSIDAD NACIONAL DE INGENIERIA FACULTAD DE ELECTROTECNIA Y COMPUTACION DEPARTAMENTO DE ARQUITECTURA Y SISTEMAS Arquitecturas de Máquinas Computadoras II José L. Díaz Chow Curso 2016 Managua, Julio de 2016 Arquitectura de Máquinas Computadoras II Guía de estudio para el estudiante Elaborado por Profesor José Díaz Chow Última Revisión: Julio 2016 Universidad Nacional de Ingeniería, UNI. Managua, Nicaragua. INDICE DE CONTENIDO 1 INTRODUCCION A LA ARQUITECTURA DE COMPUTADORAS 1 1.1 INTRODUCCION A LA ASIGNATURA 1 1.2 EVOLUCION DE LAS COMPUTADORAS. 1 1.3 MÁQUINA SECUENCIAL DE PROGRAMA ALMACENADO. 6 1.4 ORGANIZACION DE LA COMPUTADORA. 7 1.4.1 ENFOQUE FUNCIONAL 8 1.4.2 ENFOQUE ESTRUCTURAL 9 2 ORGANIZACION DEL PROCESADOR 11 2.1 EL PROCESADOR 11 2.2 INSTRUCCIÓN Y CICLO DE INSTRUCCIÓN 11 2.3 ELEMENTOS PARA ESTRUCTURAR EL PROCESADOR 12 2.4 ESTRUCTURA BÁSICA DEL PROCESADOR 13 2.5 ARQUITECTURAS DE ACUMULADOR, PILA Y REGISTROS. 15 2.5.1 MÁQUINA DE ACUMULADOR 15 2.5.2 MÁQUINA DE PILA 17 2.5.3 MÁQUINA DE REGISTROS. 18 3 DISEÑO DEL CONJUNTO DE INSTRUCCIONES 21 3.1 INSTRUCCIÓN Y CONJUNTO DE INSTRUCCIONES 21 3.1.1 CONJUNTO DE INSTRUCCIONES 21 3.1.2 INSTRUCCIÓN 21 3.1.3 CLASIFICACIÓN DE LAS INSTRUCCIONES 22 3.1.4 FILOSOFÍAS DE DISEÑO DEL CONJUNTO DE INSTRUCCIONES 23 3.2 FORMATO DE INSTRUCCIONES 23 3.3 CODIGO DE OPERACIÓN 24 3.3.1 CODIFICACIÓN DE BLOQUE FIJO 24 3.3.2 CODIFICACIÓN DE BLOQUE EXPANDIDO 25 3.3.3 CODIFICACIÓN HUFFMAN 26 3.4 CAMPOS DE DIRECCIONAMIENTO 29 3.5 MODOS DE DIRECCIONAMIENTO 30 3.5.1 MODO INMEDIATO 30 3.5.2 MODO DIRECTO O DE REGISTRO 31 3.5.3 MODO ABSOLUTO O DIRECTO DE MEMORIA 31 3.5.4 MODO INDIRECTO DE REGISTRO 32 3.5.5 MODO INDIRECTO DE MEMORIA 32 3.5.6 MODO DE AUTOINCREMENTO 33 3.5.7 MODO DE AUTODECREMENTO 33 3.5.8 MODOS DESPLAZADOS 34 3.5.9 MODO INDIZADO O DE ÍNDICE 34 3.5.10 MODO BASE-DESPLAZAMIENTO 35 3.5.11 MODO BASE-DESPLAZAMIENTO CON ESCALACIÓN 36 3.5.12 MODO DE DESPLAZAMIENTO RELATIVO 36 3.6 CODIFICACIÓN DEL MD 37 4 UNIDAD DE EJECUCION 38 4.1 LA FUNCION DE PROCESAMIENTO 38 4.2 REPRESENTACION DE DATOS 38 4.2.1 REPRESENTACIÓN DE ENTEROS CON SIGNO. 39 4.2.2 NÚMEROS EN PUNTO FLOTANTE 40 4.2.3 OTROS TIPOS DE DATOS: 41 4.3 LA UNIDAD ARITMETICA 42 4.4 LA UNIDAD LOGICA 45 4.5 DISEÑO DE LA ALU 46 4.6 EXTENSIONES DE LA ALU 47 4.7 REGISTROS DE PROPOSITO GENERAL 47 4.7.1 DISEÑO DE LOS REGISTROS DE PROPÓSITO GENERAL O GPR 47 4.8 ARITMETICA EN PUNTO FLOTANTE 50 5. LA UNIDAD DE CONTROL 51 5.1 LA FUNCION DE CONTROL 51 5.2 OPERACIONES BASICAS DE CONTROL 52 5.3 PASOS DE CONTROL PARA LA EJECUCION DE UNA INSTRUCCION 54 5.4 UNIDAD DE CONTROL FIJO 59 5.5 UNIDAD DE CONTROL MICROPROGRAMADA 62 5.6 MICROPROGRAMA Y MICRORRAMIFICACIONES 68 5.7 APLICACIONES DE LA MICROPROGRAMACION 71 5 EL SISTEMA DE MEMORIA 72 5.1 LA FUNCIÓN DE ALMACENAMIENTO 72 5.2 CARACTERIZACIÓN DE LA MEMORIA. 73 5.3 ORGANIZACIÓN DE LA MEMORIA PRINCIPAL. 75 5.4 JERARQUÍA DE MEMORIA. 77 5.4.1 BASES DE LA JERARQUÍA DE MEMORIA 77 5.4.2 CARACTERÍSTICAS DE LA JERARQUÍA DE MEMORIA 78 5.5 SISTEMA DE MEMORIA CON CACHÉ 78 5.5.1 INTERCONEXIÓN CACHÉ - MEMORIA PRINCIPAL 79 5.5.2 ELEMENTOS DE DISEÑO DE LA CACHÉ 79 5.5.3 TÉCNICAS DE MAPEO 80 5.5.4 ALGORITMOS DE SUSTITUCIÓN DE BLOQUE 83 5.5.5 POLÍTICA DE ESCRITURA 84 6 EL SISTEMA DE ENTRADA-SALIDA 85 6.1 LA FUNCIÓN DE TRANSFERENCIA EXTERNA 85 6.2 ESTRUCTURA DE INTERCONEXIÓN DE LA COMPUTADORA 85 6.2.1 INTERCONEXIÓN CON BUSES 85 6.2.2 DISEÑO DEL BUS 87 6.2.3 BUSES ESTÁNDARES 88 6.3 COMUNICACIÓN CON DISPOSITIVOS EXTERNOS 90 6.3.1 DIRECCIONAMIENTO DE DISPOSITIVOS EXTERNOS 90 6.3.2 MODOS DE TRANSFERENCIA Y SINCRONIZACIÓN 91 6.4 ESTRUCTURA DEL MÓDULO DE E/S 92 6.5 INTERRUPCIONES 93 6.5.1 TIPOS DE INTERRUPCIONES 93 6.5.2 DISEÑO SIMPLE DEL SISTEMA DE INTERRUPCIONES 93 6.5.3 MÚLTIPLES DISPOSITIVOS 94 6.5.4 CONCURRENCIA DE MÚLTIPLES INTERRUPCIONES: 95 6.5.5 HABILITACIÓN E INHABILITACIÓN DE INTERRUPCIONES 96 6.5.6 ENMASCARADO SELECTIVO DE INTERRUPCIONES: 97 6.5.7 INTERRUPCIONES NO ENMASCARABLES: 97 6.5.8 EJEMPLO DE ÁRBITRO DE INTERRUPCIONES 97 6.6 ACCESO DIRECTO A MEMORIA 99 6.6.1 TRANSFERENCIA DE DATOS DE ACCESO DIRECTO A MEMORIA 100 6.6.2 MODOS DE TRANSFERENCIA DE DATOS DMA 100 6.6.3 CONFIGURACIONES DE DMA 101 6.6.4 ACCESO AL BUS DE MÚLTIPLES CONTROLADORES DE DMA 102 6.7 PROCESADORES Y CANALES DE E/S 103 6.7.1 CANAL SELECTOR 103 6.7.2 CANAL MULTIPLEXADO 104 6.7.3 CANAL MULTIPLEXADO POR BLOQUES: 104 6.8 INTERFACES ESTÁNDARES 105 6.8.1 INTERFACES SERIE 105 6.8.2 INTERFACES PARALELAS 109 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 1 INTRODUCCION A LA ARQUITECTURA DE COMPUTADORAS 1.1 INTRODUCCION A LA ASIGNATURA El curso de Arquitectura de Máquinas Computadoras II incorpora tanto aspectos de Arquitectura como de Organización de Computadoras. En éste, estaremos estudiando elementos del diseño e implementación de las computadoras desde una perspectiva básica, orientada a conocer y comprender los principios de diseño y el funcionamiento de las computadoras, con énfasis en el procesador o unidad central de proceso (CPU). Dado que los conceptos de Arquitectura y Organización están íntimamente relacionados, es importante diferenciarlos. Para ello podemos partir de que: Arquitectura son los atributos de un sistema que son visibles para un programador. Es decir, aquellas características que determinan la ejecución lógica de un programa. Conjunto de instrucciones, número de bits usados para representar datos, modos de direccionamiento de los mismos, forma de codificación de las instrucciones, denominación de los registros, puertos y mecanismos de E/S, técnicas para mapeo y direccionamiento de memoria. Ejemplo: ¿Hay una instrucción de multiplicar? Organización se refiere a cómo se implementan las características estructuralmente. Estructura y funcionamiento de la ALU, Señales de control, buses e interfaces, tecnología de memoria. Ejemplo: ¿Hay una unidad de multiplicar o se hace por sumas repetidas? Podemos relacionar la Arquitectura con la Organización si tomamos en cuenta que la organización es la forma de implementar la Arquitectura. Por ejemplo, una Arquitectura puede tener diferentes implementaciones generando familias de máquinas que tienen la misma arquitectura pero diferente organización. Esto permite compatibilidad hacia atrás del software. Ejemplos claros de estas familias de máquinas son la IBM System/370 y la 80x86 de Intel. 1.2 EVOLUCION DE LAS COMPUTADORAS. Históricamente podemos definir dos grandes eras en la evolución de las computadoras. La primera denominada mecánica que comprende más o menos desde el año 1600 hasta 1943. En ésta se han registrado una serie de artefactos de cálculo mecánico como la Pascalina, el cilindro de pasos de Leibniz, culminando con una serie computadoras más o menos programables que empleaban relés electromecánicos. La mayoría de estas máquinas no son de mucho interés, dada su tecnología y la asignatura que nos atañe, sin embargo es importante anotar algunos hechos relevantes que fundaron los conceptos de la arquitectura de computadoras como la conocemos hoy día. Anotaremos algunos de estos hitos: Blaise Pascal (1642): Matemático. Pascalina: suma y resta. Docente: Ing. José Díaz Chow Página 1 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . Gottfried Leibniz (1673): Matemático e inventor. Mejora Pascalina: Sumar, restar, multiplicar y dividir. Antonius Braun (1727): Matemático Primera calculadora mecánica completa. Charles Babbage (1822): Matemático, “Padre del computador moderno”. Máquina diferencial: Cálculo automático de tablas matemáticas. Máquina analítica: Realiza cualquier operación matemática. (No se completó) George Boole (1847): Análisis matemático lógico. Investigación de las leyes del pensamiento, Algebra de Boole. Herman Hollerith (1889): Máquina de tarjetas perforada moderna. Constituyó la Tabulating Machine Company (IBM actual). Redujo tabulación del censo de EUA de 7.5 años a dos meses. Konrad Zuse (1938): Construyó el primer computador mecánico, el Z1. Máquina binaria. Sin apoyo del gobierno. No quedan vestigios. Howard Aiken (1943): Diseño el Harvard Mark 1. Computador electromecánico inspirado en la máquina de Babbage. En resumen, en la era mecánica se diseñaron computadores basados en dispositivos mecánicos para reducir el tiempo de cálculo y aumentar la precisión de los resultados. Esto tuvo dos grandes desventajas: la velocidad limitada debido a la inercia de los componentes móviles (engranajes y poleas) y un producto pesado, poco fiable y costoso. Destaca con especial connotación, la conceptualización de una máquina de propósito general, la máquina analítica de Babbage que ya presenta un diseño basado en unidades especializadas (Mill, control, entrada y salida) y el empleo de instrucciones para definir la operación a realizarse. Esta misma conceptualización fue la base del éxito del Mark I (aunque lo venció la tecnología) e ingrediente de la arquitectura de computadoras posterior. La segunda era, en la cual aún vivimos, se denomina electrónica y se inicia en 1946 con el lanzamiento oficial de la primera computadora electrónica de propósito general, el ENIAC. El ENIAC (Electronic Numerical Integrator And Calculator) fue completado hasta en 1946, bastante tarde para su propósito, pues el proyecto fue una respuesta a necesidades militares de los Estados Unidos en tiempos de la segunda guerra mundial. El laboratorio de Investigación de Balística (BRL) del Ejército, una agencia responsable del desarrollo de tablas de tiro y de trayectorias para nuevas armas, tenía dificultades para elaborar tales tablas con exactitud y dentro de un plazo de tiempo razonable. Sin estas tablas de tiro, las nuevas armas y piezas de artillería eran inútiles para los artilleros. El BRL empleó a más de 200 personas, la mayoría mujeres; las cuales, utilizando calculadoras de mesa resolvían las ecuaciones balísticas necesarias. La preparación de las tablas para una sola arma le habría llevado a una persona muchas horas, incluso días. John Mauchly, un físico catedrático de Ingeniería Eléctrica de la Universidad de Pensilvania, y Presper Eckert unos de sus alumnos de ingeniería eléctrica, propusieron construir un computador de uso general usando Página 2 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I tubos de vacío, para utilizarlo en las aplicaciones de la BRL. En 1943 esta proposición fue aceptada por el ejército y se comenzó a trabajar en el ENIAC. La máquina era enorme: pesaba 30 toneladas, ocupaba 1,5000 (unos 9 x 15 metros) pies cuadrados. Contenía más de 1,8000 tubos de vacío, unas 70,000 resistencias, 10,000 condensadores, 6, 000 conmutadores y consumía 140 kilovatios de potencia. Su ventaja era su velocidad, unas 1,000 veces más rápida que cualquier predecesor electromecánico, ya que era capaz de efectuar 5,000 sumas por segundo. Con el surgimiento del ENIAC se da la primera generación de Computadoras. Para hacer justicia a la historia, debe mencionarse que aparentemente antes del ENIAC, Konrad Suze en Alemania diseñó y construyó un computador electrónico completo y funcional, sin embargo éste fue destruido en la segunda guerra mundial y no existe evidencia que respalde el dato histórico. El ENIAC era una máquina decimal y no binaria. Es decir, los números estaban representados en forma decimal y la aritmética se hacía también en forma decimal. Su memoria consistía en 20 acumuladores cada uno capaz de mantener un número de 10 dígitos. Cada dígito estaba representado por una serie de diez tubos de vacío. En un momento dado sólo un tubo estaba en ON representando un dígito. Uno de los mayores inconvenientes del ENIAC era que tenía que ser programado mediante conmutadores e interconectando cables. Como hemos visto, la tarea de programar una máquina como el ENIAC era muy tediosa. Se llegó a la conclusión que la programación de la misma sería más fácil y práctica si se pudiera especificar el programa de alguna manera formal y sencilla que la máquina pudiera interpretar de la misma manera en que se interpretan los datos. Es más, si estas “instrucciones” se guardaran en alguna parte de la memoria, el procesador podría cargar y ejecutarlas secuencialmente desde allí. Esta idea conocida como Concepto de Programa Almacenado, se atribuye a John Von Neumann, Matemático Húngaro asesor del proyecto ENIAC. Paralelamente Turing, había propuesto la misma idea de una forma diferente basada en un autómata finito que lee la definición de su comportamiento desde una cinta perforada. La arquitectura de Von Neumann, especificada como modelo para la construcción de un computador de programa almacenado denominado IAS, fue Implementada en 1952. Los años 50 contemplaron el nacimiento de la industria de los computadores comerciales. Dos compañías dominaron el mercado: Sperry e IBM. En 1947 Eckert y Mauchly se asociaron y crearon la primera computadora con fines comerciales UNIVAC I que podía realizar tanto operaciones científicas como comerciales. A la UNIVAC I siguió una serie de computadores comercializados por la Sperry-Rand, con un predominante enfoque al campo científico. Un hecho importante es la invención de la memoria de ferrita en 1952 por Jay Forrester en el MIT. IBM por su parte sacó al mercado su primera máquina de programa almacenado en 1953: el 701, diseñado sobre todo para aplicaciones de gestión. La serie que sucedió al 701 de IBM en los 50 la puso a la cabeza del mercado de Computadores para negocios. También en 1953 Fujitsu lanza la primera computadora japonesa: Facom100. La segunda generación: Los transistores. El primer cambio importante en los computadores vino con la sustitución de tubos de vacío por transistores. El transistor es más pequeño, más barato, disipa menos calor, se puede conectar en placas discretas evitando las grandes masas de conductores y puede ser usado de la misma manera que los tubos en la construcción de computadores. Este fue inventado en 1947 en los laboratorios Bell y en los 50 provocó una gran revolución electrónica. Sin embargo las computadoras totalmente transistorizadas emergieron hasta finales de la década. Con la nueva tecnología, aparecieron nuevos nombres en el mercado cono NCR, RCA y la DEC, creadora de las populares PDP. IBM pronto consiguió Docente: Ing. José Díaz Chow Página 3 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . cerrar la brecha y se puso a la cabeza en ventas con la serie 7000 donde destacó la 7094, que introdujo un prefetch rudimentario y el multiplexor para organizar los accesos a memoria desde el CPU o los canales de datos. Emergen las supercomputadoras a principios de los sesentas. Tercera Generación: Circuitos integrados. Con la introducción de la microelectrónica a mediado de los 60 se pudo autocontener una cantidad de componentes discretos en un solo encapsulado, logrando mejoras en la velocidad de transferencia entre los dispositivos internos. A esta época corresponden máquinas con tecnología de pequeña y mediana escala de integración. La memoria, antes de núcleos de ferrita, es semiconductora ahora. Surge la línea 360 de IBM y las PDP-5 / PDP-8. La Cuarta Generación básicamente la pauta INTEL con la invención del chip microprocesador (P). Un procesador completo autocontenido en un integrado, gracias a las ventajas de la tecnología MOS. Debido al gran éxito de los microprocesadores Intel, pronto aparecen otros fabricantes en el terreno, como la National Semiconductor, Zilog y Motorola. El 4004. El primer P del mundo era de 4 bits y podía acceder a 4,096 palabras de 4 bits. Su repertorio consistía de 45 instrucciones que limitaban bastante su campo de aplicación. En 1971, Intel lanzó el 8008, un P de 8 bits, con 3 instrucciones nuevas y memoria direccionable de 16K x 8. Todavía muy limitado para aplicaciones grandes, el 8008 tuvo que ser reemplazado en 1973 por el 8080, el primer P moderno. El 8080 corría 10 veces más rápido que el 8008, podía direccionar más memoria y era TTL compatible lo que hizo al P viable para muchas otras aplicaciones. Tenía 7 registros de 8 bits, un puntero de pila de 16 bits y un PC de 16 bits también. Pronto las otras compañías empezaron la producción masiva de Ps de 8 bits. La explosión había comenzado. En 1977, Intel introdujo el 8085, que era sólo un poco más rápido que el 8080 e integraba el reloj y el controlador del sistema al chip. Zilog introdujo el Z80 de 8 bits, con 80 instrucciones más que el 8008, bus de direcciones de 16 bits (512K en RAM) y permitía interrupciones vectorizadas. El Z80 ha sido un procesador muy popular en la industria de controladores de hardware para mando de procesos productivos. Por este tiempo, también Motorola lanzó su procesador 6800 de 8 bits, 16 bits de direcciones, 2 registros de datos, 1 de índice y un SP, todos de 8 bits. Pronto lo siguieron el 6801, 6803 y el 6809 que duplicaba los índices y el SP y podía multiplicar. En 1978 se lanza el 8086 y un año después el 8088. Ambos eran dispositivos de 16 bits, con un tiempo de ejecución de unos 400 ns/instrucción. Además podían direccionar hasta 1MB de RAM o 512K palabras de 16 bits. Esto permitió al P poder ejecutar las aplicaciones que se corrían en minicomputadoras pequeñas. Se agregó hardware para multiplicar y dividir. La diferencia del 8088 con el 8086 era la búsqueda de compatibilidad hacia atrás. El 8086 tenía una ruta de datos de 16 bits en tanto el 8088 la tenía de 8, además su capacidad de prefetch variaba pues la cola del 8086 era de 6 y la del 8088 sólo de 4 bytes. Por ese tiempo, National Semiconductor presenta el PACE de 16 bits y Texas Instruments saca al mercado su TMS9900 que tenía todos sus registros en memoria (que para la época era más rápida que los registros). Un hecho de necesaria mención es el surgimiento de la PC o microcomputadora personal de IBM en 1981, que vino a revolucionar el mercado y las tendencias de la computación en los últimos años. Página 4 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Pronto la revolución de los 16 bits cobra auge con la aparición de grandes mejoras en los diseños. Aquí vale la pena mencionar el MC68000 de Motorola y el Zilog Z8000, el NS16032 de National, el i80286 y el MC68010. El Z8000 tenía 16 registros de 16 bits utilizables como registros de 8, 16, 32 y 64 bits. Incluía multiplicación y división de 32 bits. El 68000 era un procesador de 32 bits en realidad con empaquetado externo de 16. Su bus de direcciones era de 24 bits y no usaba registros de segmentos. Estos procesadores permitían el uso de dos modos de operación: usuario y supervisor o sistema operativo (protegido). Los 80 trajeron la producción de chips de 32 bits y los procesadores RISC. El 80386 de Intel apareció en el 85. Intel entró algo tarde a los productos de 32 bits. Sabemos que Motorola tenía procesadores de 32 bits internos que mantenía como de 16 para estar en la competencia. Los laboratorios Bell y Hewlett Packard habían lanzado ya procesadores de 32 bits al mercado al igual que la NS con el NS32032. Una serie de mejoras a los procesadores de 32 bits se incluyen a finales de los 80 con la aparición del 80486 que ya incluye características de paralelismo prestadas de RISC. Toman auge como competencia de Intel en la producción de P, las compañías Cyrix, IBM y AMD. El campo de mayor producción y venta es el mercado de las microcomputadoras del tipo IBM Compatibles, basadas en la familia 80x86 de Intel y sus competidores, con lo cual se lucha por darle al microprocesador toda la potencia de las maxicomputadoras. En el mundo del microprocesador, tan vasto, la ruta de los procesadores para IBM PC compatibles es más fácil de seguir y afín a nuestro entorno, por tanto en el resto de esta breve reseña histórica, nos centraremos en la evolución de estos procesadores. En 1993, al 80486 le sucede el Pentium, un procesador de 32 bits con ruta de datos de 64. El Pentium introduce mejoras grandes en su arquitectura, que se irán refinando con el tiempo. Los competidores lanzan el respectivo “Pentium relative” 5x86 de Cyrix y luego el 6x86. AMD por su cuenta presenta el K5. Al Pentium le siguió el Pentium-Pro de Intel, diseñado para sistemas de alto rendimiento. Integra muchas técnicas de paralelismo y una gran caché en el mismo chip. El uso de gran volumen de información gráfica y sonido en los últimos años hizo que los fabricantes pusieran especial interés en el paralelismo y los multimedios, con lo cual aparecen en escena el MMX y posteriormente el Pentium II de Intel. Por su lado Cyrix presenta el Media GX y 6x86MMX para competir con Intel. AMD presenta el K6 y el K6-2 con un nuevo repertorio gráfico “3D Now”. Con la introducción del Pentium II, Intel clasificó sus procesadores en tres categorías, según su capacidad y mercado destino: Celeron (inicialmente sin caché y luego con solo 128 KB a velocidad plena del CPU para una PC básica), Pentium II propiamente (de 512K de caché iniciales y orientado a estaciones de trabajo) y el Xeon que está especialmente diseñado para servidores y que contaba con cachés de hasta 2Mb y velocidades de hasta 450 MHz. Para evitar perder el liderazgo en el mercado, con la introducción del conjunto de instrucciones especializados para multimedios y juegos de AMD, Intel reposta con la introducción de su propio conjunto extendido SSE que integra en el Pentium III. La frecuencia del núcleo del procesador también es objeto de competencia y se logran procesadores Pentium III de hasta 1,13GHz de frecuencia del núcleo y 133MHz en el bus del sistema con la línea Coppermine. AMD introduce el Athlon, inicialmente de 1GHz y posteriormente Duron, de menor precio, para competir con el Celeron. Al Pentium III siguió el Pentium 4. Esta es una nueva y revolucionaria arquitectura que optimiza el paralelismo obtenido en procesadores de 32 bits. Su frecuencia de núcleo básica es de 1.4 GHz, Nuevos Athlon y Duron (este último, competencia del Celeron) de AMD han salido al mercado, Nuevas caras como Transmeta, han emergido en la competencia de las pc móviles (notebooks, palms, etc). El Pentium 4 ha mantenido las tres líneas de procesadores: Celeron con destino al mercado SOHO (Small Office and HOme) con frecuencias de más de 2 GHz y 256kB de caché L2, el Pentium 4 para estaciones de trabajo y el Xeon para servidores. Estos Docente: Ing. José Díaz Chow Página 5 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . últimos con frecuencias de hasta poco más de 4 GHz, nuevas técnicas paralelas como hiperthreading y cachés L2 de 256 y 512 en el primero y hasta 1MB en el segundo. Paralelamente al P4, Intel diseño y lanzó al mercado en el año 2001 una totalmente nueva arquitectura de 64 bits en un procesador denominado Itanium, orientado a estaciones de trabajo y servidores, que guarda compatibilidad con la arquitectura de 32 bits. Ante la dificultad de aceptación del Itanium en el mercado, y la introducción de procesadores de AMD de 64 bits, Intel lleva su arquitectura ix86 a un nuevo nivel expandiéndola a 64 bits con compatibilidad binaria a su arquitectura de 32 bits original. Así hoy día tenemos en la misma línea del procesador Pentium, sucesores del P4, dos opciones de arquitectura en el mismo CPU: la x86 tradicional y la nueva x64 que tiene un nuevo repertorio de instrucciones con espacio de direccionamiento de 264 bytes que remueve las barreras de 4GB de la arquitectura x86. Es ahora como nunca antes que el microprocesador ha competido con las grandes máquinas. Hoy día es posible encontrar una máquina de escritorio de menos de mil dólares con la misma capacidad de procesamiento, memoria y almacenamiento que una mainframe de antaño de varios millones de dólares. Actualmente la barrera de la frecuencia de núcleo se está ganando con paralelismo, por lo cual ya la oferta de microprocesadores actuales en el mercado está dominada por procesadores multinúcleo que contienen varios CPUs en un mismo chip. Podemos finalizar diciendo que la computadora ha evolucionado a pasos agigantados desde sus orígenes a la fecha, convirtiéndose probablemente, en la herramienta más versátil que haya inventado el hombre jamás. La computadora ha generado toda una revolución social, tan importante como la agrícola y la industrial. Las repercusiones de esta revolución se maximizan con las redes de computadoras, los dispositivos móviles y las telecomunicaciones digitales. Esto ha definido una nueva era en la historia de civilización humana, la era de la información o era del conocimiento. Era en que tenemos el privilegio de vivir. 1.3 MÁQUINA SECUENCIAL DE PROGRAMA ALMACENADO. En uno de los reportes del proyecto ENIAC, John Von Neumann, que fungía como asesor matemático, propone una nueva forma de diseñar y construir computadoras. Algunos de estos conceptos recogen ideas anteriores, pero lo revolucionario de la propuesta de Von Neumann era el concepto de máquina secuencial de programa almacenado. Este concepto establece que los principios de diseño de las computadoras deben contemplar tres aspectos básicos: a) Programa almacenado: Definición de instrucciones simples con las que se pueda programar cualquier tarea de cálculo de la máquina en forma de una secuencia de instrucciones y la posibilidad de cargar estos programas en la misma memoria que se cargan los datos. b) Máquina secuencial: Una vez cargados el programa y los datos en la memoria, para realizar la tarea de cómputo, basta lograr que la máquina realice el programa ejecutando instrucción tras instrucción desde la memoria gracias a un secuenciador o dispositivo de control. c) La implementación de tal máquina requiere cinco unidades funcionales (actualización del concepto de Babbage): Un órgano de cálculo que ejecute las instrucciones, la memoria, el control, y finalmente unidades de entrada y salida que permitan a la computadora obtener los datos y programas del mundo exterior y entregar los resultados de los cálculos. Página 6 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I A tal especificación de diseño de máquinas computadoras se denominó Arquitectura Von Neumann o de programa almacenado y constituyen hoy día la base de la arquitectura de computadoras modernas. Algunas ventajas y características de la arquitectura de Von Neumann sobre las implementaciones de su época son: Las secuencias de instrucciones o programas se podían guardar en la memoria y por tanto, alimentar la máquina con nuevos programas para nuevas operaciones, modificar el programa en tiempo de ejecución y tener un computador de verdadero propósito general. La máquina secuencialmente ejecuta un ciclo de instrucción, leyendo instrucciones y ejecutándolas una tras otra. El dispositivo de control recoge una instrucción desde la memoria, interpreta su significado, trae los datos necesarios desde la memoria al órgano de cálculo, instruye al mismo realizar la operación y luego almacena el resultado. Todas estas acciones implican traslado de datos e instrucciones entre las unidades funcionales. Para ello existe una estructura de interconexión. Los principales enlaces de ésta se muestran en la figura 1.1. Entrada Memoria Control Cálculo Salida Camino o Flujo de los Datos Señales de Control desde la UC . Solicitudes o señales hacia la UC . Figura 1.1. Unidades Funcionales de la Arquitectura Von Neumann 1.4 ORGANIZACION DE LA COMPUTADORA. La arquitectura Von Neumann, ha sido el punto de partida de la mayoría de las máquinas computadoras modernas. La organización de las unidades ha cambiado un poco hoy día con los avances en tecnología, sin embargo la esencia aún se mantiene. Se han introducido nuevos enfoques respecto a cómo se describe una organización y los términos aplicados. Adicionalmente, en la búsqueda de mejores prestaciones se han definido nuevas técnicas de diseño basadas en paralelismo y ejecución no secuencial, que no se ajustan a la arquitectura Von Neumann en algunas de sus características, pero éstas máquinas serán tratadas hasta en Arquitectura de Máquinas Computadoras III. La organización de una computadora puede definirse tanto de forma funcional como estructural. De manera funcional se expresa en términos de las operaciones que se realizan y el flujo de los datos entre los componentes funcionales. Estructuralmente, la organización se define en términos de los componentes físicos que conforman el todo y sus relaciones. En nuestro caso, decimos que un ordenador es un sistema que se compone de subsistemas, los cuales a su vez, se conforman de unidades o componentes. Los subsistemas se interconectan y comunican mediante una estructura de interconexión. Docente: Ing. José Díaz Chow Página 7 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . 1.4.1 Enfoque Funcional Las operaciones que una computadora es capaz de hacer son: Procesamiento de datos Almacenamiento de Datos Traslado de datos Operaciones de control Por tanto se requieren cuatro elementos que ejecuten estas funciones. La figura 1.2 muestra la definición funcional de una computadora con estos elementos. Facilidad de Almacenamiento de Datos Aparato de Traslado de datos Mecanismo de Control Facilidad de Procesamiento de Datos Figura 1.2. Vista funcional de la computadora Las flechas muestran la interacción entre los elementos funcionales y el camino que seguirían los datos para recibir servicio de las diferentes operaciones de la computadora. Por ejemplo, la operación de movimiento de datos que se efectúa desde el teclado a la pantalla, seguirá el camino mostrado en la figura 1.3. El camino de los datos se muestra con la flecha en color rojo. Facilidad de Almacenamiento de Datos Aparato de Traslado de datos Mecanismo de Control Facilidad de Procesamiento de Datos Figura 1.3. – Operación de traslado de datos Página 8 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 1.4.2 Enfoque Estructural Estructuralmente, podemos considerar que la computadora se compone de tres componentes: El sistema de procesamiento o procesador, el sistema de almacenamiento o memoria y el sistema de entrada / salida que permite la comunicación con dispositivos periféricos u otras computadoras. Interconectando los tres sistemas tenemos a la estructura de interconexión, que en las máquinas actuales se implementa mediante buses. Una visión general de esta propuesta se puede observar en las figura 1.4. Computadora Periféricos Memoria Procesador Computadora Estructura de Interconexión E/S Líneas de Comunicación Figura 1.4. Estructura General de una Computadora Las cinco unidades funcionales de la especificación original de Von Neumann, todavía son válidas, solo que algunas de ellas se han unido para crear un subsistema. El órgano de cálculo junto al controlador constituye el procesador o Unidad Central de Proceso (CPU). Por otro lado, la unidad de entrada y la de salida, son un mismo subsistema al cual se denomina sistema de entrada / salida o E/S. La figura 1.5 muestra estas relaciones. CPU Organo de Cálculo Mecanismo de Control Estructura de Interconexión Unidad de Entrada Unidad de Salida Sistema de Memoria Sistema de E/S Figura 1.5. Organización de la computadora orientada a partes o bloques constructivos. Docente: Ing. José Díaz Chow Página 9 A R Q U I T E C T U R A 1.4.2.1 D E M Á Q U I N A S C O M P U T A D O R A S I I . PROCESADOR O CPU Desde una perspectiva más estructural, requerimos definir cómo la máquina ejecutará las instrucciones. Estas instrucciones regularmente se traen de la memoria al CPU, donde se ejecutan. En este proceso, el CPU requiere algún almacenamiento temporal interno. Para suplir esta necesidad se emplean registros. Éstos no se muestran en la organización básica a bloques, ni tampoco el camino que los datos siguen dentro del CPU. Una organización más detallada, muestra estos detalles arquitecturales y por lo general define nuevas clasificaciones de unidades dentro del CPU. Hoy día el órgano de cálculo de Von Neumann se denomina Unidad de ejecución o unidad aritmética y lógica (ALU por sus siglas en inglés) y el mecanismo de control se denomina Unidad de Control. En el CPU, además de los elementos de cálculo (ALU y opcionalmente otros dispositivos de cálculo especializado), se encuentran los registros de almacenamiento temporal para manipulación de datos e instrucciones, las estructuras de interconexión internas del CPU y los elementos de acceso a la estructura de interconexión general del sistema. 1.4.2.2 SISTEMA DE MEMORIA El sistema de memoria permite el almacenamiento de los datos y programas con los cuales interactúa el ordenador. Podemos diferenciar, a groso modo, tres tipos de Almacenamiento: El Principal, el Secundario y el Intermedio. El primero, llamado memoria principal, consiste en un arreglo de celdas de almacenamiento de lectura /escritura donde deben residir los programas para que el procesador los pueda acceder. Generalmente esta memoria es volátil, es decir, que una vez que se completa la ejecución del programa o se apaga el ordenador los datos que no se almacenen en un medio permanente, se pierden. El almacenamiento secundario también llamado masivo, es por lo general, permanente y permite almacenar los datos y programas durante largo tiempo en forma de archivos. Está organizado de diferente manera que la memoria principal, en función de la tecnología de implementación. Actualmente se emplean tecnologías magnéticas y ópticas para implementar este tipo de almacenamiento en forma de discos y cintas. El almacenamiento intermedio, también llamado cachés, permite acelerar el acceso a programas y datos durante la ejecución. 1.4.2.3 SISTEMA DE ENTRADA / SALIDA Esta es la interfaz al exterior de la computadora. Le permite obtener los datos y programas desde el exterior y poder entregar los resultados del procesamiento o una copia de parte del almacenamiento secundario al exterior. Generalmente se denominan periféricos a todos los dispositivos que pueden conectarse al sistema de E/S y funcionar como dispositivos de entrada o salida de la computadora. Por ejemplo, el teclado es la unidad de entrada estándar o predeterminada de la computadora y la pantalla del monitor, la de salida. Página 10 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 2 ORGANIZACION DEL PROCESADOR 2.1 El Procesador Los procesadores tienen como misión ejecutar operaciones de cómputo que le indica el programador. Sabemos del modelo de Von Neumann que estas operaciones se definen como instrucciones. El procesador, desde que recibe energía hasta que se apaga ejecuta constantemente instrucciones. Esta función de procesamiento es la más importante en el funcionamiento de una computadora, por lo cual al procesador se le denomina Unidad Central de Procesamiento o CPU. En esta unidad analizaremos las estructuras que requiere un CPU muy sencillo para poder ejecutar una instrucción siguiendo los pasos del ciclo de Instrucción. 2.2 Instrucción y ciclo de instrucción Como hemos estudiado antes, una instrucción es una orden que emite el programador al procesador para que ejecute una de las operaciones que forman parte de su repertorio. La instrucción debe especificar la operación a realizar y cómo obtener los datos u operandos para realizarla. Para este fin, la instrucción debe tener una estructura lógica denominada formato de instrucción, que se estudiará más adelante. La secuencia de pasos que sigue el procesador para ejecutar una instrucción se denomina Ciclo de Instrucción. El Ciclo de Instrucción, se pueden organizar en dos bloques o fases de acuerdo a la acción que ocurre. La primera fase, denominada FETCH o de Carga. Corresponde a los pasos necesarios para cargar la instrucción desde la memoria al procesador. La segunda fase, denominada EXECUTE, corresponde a aquellos pasos que permiten ejecutar la operación en sí y almacenar el resultado: - FASE FETCH - Cargar la siguiente instrucción Incrementar el secuenciador Interpretar la Instrucción FASE EXECUTE Docente: Ing. José Díaz Chow Cargar los operandos Ejecutar la operación Guardar el resultado Verificar si hay solicitudes de interrupción Página 11 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . 2.3 Elementos para estructurar el Procesador Para poder realizar su función, el procesador, necesita una serie de estructuras. A continuación se expondrá qué tareas requiere llevar a cabo un procesador muy simple y deduciremos qué elementos constructivos se requieren para ejecutar estas tareas, siguiendo las pautas que nos brinda el ciclo de instrucción. Para estar preparado para realizar sus funciones, el procesador debe: Poder acceder a memoria para leer las instrucciones y los operandos así como escribir los resultados. Se necesita acceder a la dirección de memoria que apunta el PC para leer la próxima instrucción. De acuerdo a la instrucción, puede requerirse leer de memoria los operandos y/o escribir a memoria, los resultados de la operación. Para esto, el CPU debe tener un registro conectado al bus de direcciones donde poner la dirección a acceder. A este registro lo llamaremos registro de dirección de memoria o MAR por sus siglas en inglés. También requerimos otro conectado al bus de datos donde poner el valor a escribir o tomar el valor leído desde la memoria. Este lo llamaremos registro de datos de memoria o MDR por sus siglas en inglés. Por supuesto, se necesita una forma de indicarle a la memoria que realice la operación de lectura o escritura y además poder saber cuándo la memoria terminó la operación, sobre todo la de lectura. Hasta entonces el procesador puede asumir que en el MDR hay datos válidos. Estas señales se implementan en la unidad de control: READ, WRITE, (que puede ser una sola línea del Procesador R/W, 0 =R; 1 =W, además de alguna línea de habilitación de Memoria.) y MFC (Que en nuestro caso será parte de la lógica de control de Memoria y que indicará al CPU que la función de memoria se ha completado). Llevar control de la secuencia de instrucciones: Se necesita un secuenciador de instrucciones, es decir, un mecanismo que vaya indicando una a una las instrucciones a cargar desde la memoria. Para ello, todas las instrucciones del programa a ejecutar deben estar almacenadas de forma secuencial en la memoria. El secuenciador se implementa empleando un registro que inicialmente se hace apuntar a la primera instrucción del programa y luego se incrementará para apuntala a la siguiente y así en lo sucesivo. Este registro de llama contador de programa o PC por sus siglas en inglés. Este enfoque es muy flexible pues el PC, puede incrementarse dentro del procesador una vez cargada la instrucción para que apunte a la siguiente. Otra ventaja, es en el caso de la implementación de saltos o llamados a subrutinas, pues sólo se pone en el PC la dirección destino del salto o la subrutina y así controlamos el flujo de instrucciones en el programa. Guardar la instrucción en un lugar donde la unidad de control la pueda interpretar. Para que durante la ejecución de la instrucción, se pueda acceder a su contenido en cualquier momento, es necesario otro registro para almacenar la instrucción durante la fase de ejecución. Este registro se le denomina registro de instrucciones o IR por sus siglas en inglés. El IR está conectado directamente a los circuitos de la unidad de control. Poder realizar cálculos aritméticos y lógicos. Para esto el CPU requiere de una unidad de cálculos aritméticos y lógicos a la que llamaremos ALU por sus siglas en inglés. Realiza todas las operaciones aritméticas, como la suma y la resta. Y lógicas como AND, OR, XOR, NOT, etc. También realiza otras operaciones como comparaciones y operaciones a nivel de Bits. Obtener los operandos para realizar las operaciones. Estos pueden estar en memoria, ser definidos directamente en la instrucción o residir en un almacenamiento interno del CPU. Es ventajoso Página 12 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I mantener los operandos dentro del CPU. Para esto se pueden disponer de registros de propósito general con los cuales pueda la ALU realizar las operaciones. Mantener el estado de la máquina. Para esto se requieren tener banderas y códigos de condición. Por ejemplo, para comparar dos números se puede restar el primero del segundo y si el resultado fue cero, podemos asegurar que son iguales. Si el resultado de diferente de cero y positivo, el primero es mayor pero si es negativo, el segundo es mayor. Para llegar a estas conclusiones necesitamos almacenar las condiciones de resultados como cero (Z), Signo (S), etc. Estas banderas y códigos se almacenan en un registro llamado F o Flags. Interpretar la instrucción y luego controlar la ejecución de todos los pasos para ejecutarla. Para esto se requiere de una unidad de control o CU que tenga un decodificador capaz de interpretar los diferentes campos lógicos del formato de instrucciones. Además esta unidad debe poder generar las señales necesarias para que se realicen todos los pasos del ciclo de instrucción adecuadamente. 2.4 Estructura Básica del Procesador Los elementos constructivos del CPU se organizan de acuerdo al trabajo que realizan. Para estructurar coherentemente el procesador estos elementos se agrupan en unidades que se interconectan para estructurar un todo. Cada elemento se debe comunicar con los otros para poder realizar su función. Esto se logra a través de una estructura de interconexión. Existen dos formas de implementar esta estructura: Uso de conexión directa: Consiste en realizar la conexión cableada directamente de la salida de un elemento a la entrada del otro. En caso de requerirse lógica de enrutamiento, se emplean los elementos digitales adecuados como multiplexores. Uso de Buses: Consiste en definir un conjunto de líneas para interconectar múltiples elementos entre sí. Debe, sin embargo, implementarse la lógica de control que garantice el enrutamiento del dispositivo fuente al destino. Cabe mencionar que debe evitarse que dos dispositivos sean fuente en el bus de forma simultánea pues esto provocaría cortocircuitos en las líneas cuando esta esté sometida a dos valores lógicos diferentes. La figura a continuación muestra un ejemplo de estructura de CPU con una posible interconexión de los elementos mediante buses. Docente: Ing. José Díaz Chow Página 13 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . CPU R0 MAR R1 . . . Rn-1 MDR Entrada / Salida Bus Interno del Procesador TMP SP Bus de Direcciones ALUsel Bus de Datos Y SOURCE Bus del sistema PC ALU IR Z Memoria Unidad de Control FLAGS READ WRITE IO/M INTACK INT Figura 2.1 Elementos estructurales del procesador. Adicionalmente se suele separar la estructura del CPU en dos vistas: El camino de los datos o Datapath y el control. Conforman el Datapath todos los elementos por los que discurren los datos dentro del CPU, especialmente la ALU, los registros de propósito general, los registros de acceso a memoria y los registros adicionales. Dentro del Datapath se organizan los órganos de cálculo (ALU y Registros de datos) en una entidad lógica denominada unidad de ejecución. Los registros de acceso al bus y registros auxiliares se suelen organizar en una unidad denominada “de Interfaz y carga de instrucciones”. CPU Control Líneas de Control Unidad de Control Instrucciones Señales de Control Registros de Propósito General ALU Interfaz al Bus y Carga de Instrucciones Direcciones y Datos Flags Unidad de Ejecución Datapath Figura 2.2. Organización del CPU en Datapath y Control El control incluye a la unidad de control que se encarga de coordinar y realizar las acciones necesarias para que se ejecuten las instrucciones. Página 14 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Ejecución de la instrucción: Habiendo definido una estructura organizativa para nuestro procesador, estudiemos de forma general, los pasos para traer y ejecutar una instrucción basándonos en éstos elementos constructivos: El PC tiene siempre la dirección de la próxima instrucción (Cuando la máquina se enciende, éste se inicializa por hardware para apuntar la primera instrucción del programa de arranque). Primero el contenido del PC es transferido al MAR y la unidad de control envía una señal de lectura a la memoria. El PC es incrementado por el esquema de secuenciamiento para apuntar a la siguiente dirección. Después de un cierto tiempo correspondiente al tiempo de acceso de memoria, la palabra direccionada (la instrucción del programa) es leída de la memoria y cargada en el MDR. El contenido del MDR es transferido al IR Ahora la instrucción esta lista para ser decodificada y ejecutada. Si dicha instrucción involucra una operación que requiere operandos y estos residen en la memoria (ya que podrían estar en los registros generales del procesador) tienen que ser traídos enviando su dirección al MAR e iniciando un ciclo de lectura. Cuando el operando ha sido leído y trasladado de la memoria al MDR, entonces será transferido del MDR a la ALU o a algún registro de trabajo auxiliar para almacenarlo temporalmente mientras se traen otros operandos. La operación se repite para traer todos los operandos, normalmente dos. Se ejecuta la operación, mediante la ALU y el resultado es enviado al MDR si debe ser almacenado en memoria o al registro destino en el CPU. Si los operandos o el resultado requiere acceso al subsistema de E/S, se procese de igual forma que si se accede a Memoria, excepto que la UC se encarga de habilitar el dispositivo específico en lugar de la Memoria. 2.5 Arquitecturas de Acumulador, Pila y Registros. Dependiendo de la forma en que trae, almacena temporalmente y trata los operandos y el resultado, los procesadores se han clasificado en tres tipos de arquitecturas o estilos de procesador: De acumulador, de Registros y de Pila. Cabe mencionar que en la actualidad las máquinas más exitosas combinan características de las tres aunque predominan las máquinas orientadas a registros. 2.5.1 Máquina de Acumulador Este es el esquema típico de Von Neumann. En un procesador basado en un solo registro denominado acumulador, de acuerdo a su función. Se carece de registros de propósito general para manipular los operados dentro del CPU. Todo el trabajo se realiza el acumulador y la memoria. Hoy día esto parece contraproducente, sin embargo, en el tiempo que esta arquitectura se implementó, la memoria era más rápida que los registros del procesador y estos últimos eran extremadamente caros de producir. Para realizar una operación, el programador debe tomar el primer operando y llevarlo al acumulador, realizar la operación con el acumulador y el contenido de una dirección de memoria (el resultado se guarda en el acumulador) y Docente: Ing. José Díaz Chow Página 15 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . finalmente transferir el contenido del acumulador a memoria. La figura 2.3 nos muestra una arquitectura típica de acumulador. PC MAR MDR Memoria e Interface de E/S IR Acc Unidad de Control ALU F Figura 2.3. Ejemplo de estructura de una máquina de Acumulador. En este tipo de procesador tenemos dos instrucciones de acceso a memoria: la que carga un dato al acumulador y la almacena el acumulador en memoria. Las instrucciones binarias se realizan con el acumulador como primer operando y un operando en memoria o definido directamente como número. Por ejemplo: INSTRUCCION OPERACIÓN REALIZADA LOAD X LOAD (m) LOAD n STORE X STORE (m) ADD X ADD (m) ADD n Acc M(X) ; X es una variable de memoria Acc M(m) ; m es una dirección de memoria Acc n ; n es un número entero. M(X) Acc ; X es una variable de memoria M(m) Acc ; m es una dirección de memoria Acc (Acc) + M(X) ; X es una variable de memoria Acc (Acc) + M(m) ; m es una dirección de memoria Acc (Acc) + n ; n es un número entero. Ejemplos de procesadores basados en acumulador son el IAS de Von Neumann, el M6502 y el 6809 de Motorola. Este último cuenta con dos acumuladores A y B. Página 16 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 2.5.2 Máquina de Pila Una máquina de pila es una computadora en la cual el elemento primario de almacenamiento de datos para la CPU es una pila. Esta se implementa como un área de la memoria controlada por el CPU a la cual no tienen acceso los programas del usuario. En las primeras máquinas de pila, todos los operandos se manejaban mediante la pila, hoy día, sin embargo, la pila se emplea como una estructura de datos auxiliar para el CPU. La ventaja principal de esta organización es que las manipulaciones de las pilas pueden ser realizadas en una alta velocidad. La alta velocidad es una característica deseable en una computadora que va proporcionar un servicio rápido de interrupciones, por ejemplo la IBM-370. Las pilas más comunes son las de empuje hacia abajo, es decir, que inician en la dirección más alta de memoria y crecen en el sentido de las direcciones de memoria más bajas. La organización de la máquina de pila es mostrada en la figura 2.4. El registro SP es el puntero a Pila, es un registro que siempre tiene la dirección de la última palabra insertada en la pila: Tope de pila o TOS (Top of Stack). En función de este registro, también se puede obtener el elemento inmediato bajo TOS: Próximo en pila o NOS (Next on Stack). PC MAR SP Area de la memoria para pila Resto de la memoria IR Unidad de Control temp ALU F En el evento de una operación binaria, el primer operando será Figura 2.4 Ejemplo de estructura de una máquina de pila removido de la pila y mantenido en el registro TEMP. El segundo operando será directamente llevado de la pila a la entrada derecha de la ALU, que en nuestro ejemplo corresponde al puerto x o primer operando. El resultado de la operación es almacenado en la cabeza o tope de la pila. Instrucciones típicas para una máquina de pila son: Instrucción Operación PUSH X PUSH (m) PUSH n POP Z POP (m) ADD SUB MUL DIV TOS M(X) TOS M(m) TOS n M(Z) TOS M(m) TOS (TOS’) = (NOS) + (TOS’) = (NOS) (TOS’) = (NOS) * (TOS’) = (NOS) / NOS: Next on the stack Docente: Ing. José Díaz Chow (TOS) (TOS) (TOS) (TOS) TOS: Top of the stack. Página 17 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . En la actualidad no existen ejemplos de esta organización en forma pura, sin embargo existieron máquinas que se construyeron con esta arquitectura como las grandes computadoras Burroughs B5500, B6500 y B6700 y la minicomputadora HP3000. Una de las ventajas de esta arquitectura es que el compilador sólo necesita convertir a postfija las expresiones algebraicas y luego hacer una traducción directa a ensamblador, empleando PUSH por cada aparición de variable y la operación correspondiente con cada operando. El pop es un caso especial; que corresponde a la asignación y se evalúa al final y además arrastra consigo al miembro izquierdo de la expresión. 2.5.3 Máquina de Registros. La organización de un procesador de Registros Generales es mostrada en la figura 2.5. En este estilo de diseño respecto al manejo de los operandos, se promueve el uso de muchos registros de propósito general para almacenar los operandos temporalmente dentro del CPU. Esto tiene la ventaja que los datos más frecuentes sólo se cargan una vez desde la memoria. Una arquitectura típica consta de un banco o fichero de m registros de propósito general (Ro... Rm-1). Son llamados de esta forma porque en cualquiera de ellos se pueden mantener datos, direcciones de memoria o el resultado de alguna operación aritmética o lógica. El programador puede emplear estos registros para realizar las diferentes operaciones en un programa. Algunos procesadores tienen algún destino específico para algunos de ellos; el registro F (Flag) o PSW (Processor status Word) es un registro de banderas y/o códigos de condición que mantiene información importante del estado del procesador o del desarrollo del programa. Por ejemplo, cuando el resultado de una operación fue cero (bandera Z = 1) o cuando ocurrió un acarreo (bandera C = 1). PC MAR MDR Memoria e Interface de E/S R0 R1 IR R2 Unidad de Control Rm-1 ALU F Figura 2.5. Ejemplo de estructura de una máquina de Registros Generales Con procesadores de registros generales podemos tener instrucciones de dos y tres operandos. En máquinas 2 operandos, el destino o resultado de la operación está implícito en uno de los dos operandos. Página 18 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Este fenómeno se denomina lectura destructiva de operandos, pues el valor del registro que es a la vez operando y destino se pierde por sobre escritura del resultado. Instrucciones de 3 operandos Instrucción Operación ADD Rd, Rf1, Rf2 SUB Rd, Rf1, Rf2 MUL Rd, Rf1, Rf2 DIV Rd, Rf1, Rf2 ; Rd Rf1 + Rf2 ; Rd Rf1 - Rf2 ; Rd Rf1 * Rf2 ; Rd Rf1 / Rf2 Instrucciones de 2 operandos MOV Rd, Rf MOV Rd, n MOV Rd, X MOV Rd, (m) MOV X, Rf MOV (m), Rf ADD Rf, Rd SUB Rf, Rd MUL Rf, Rd DIV Rf, Rd ; Rd Rf ; Rd n | n es un número ; Rd M(X) ; X es una variable en memoria ; Rd M(m) ; m es una dirección en memoria ; M(X) Rf ; X es una variable en memoria ; M(m) Rf ; m es una dirección en memoria ; Rd Rf + Rd ; Rd Rf - Rd ; Rd Rf * Rd ; Rd Rf / Rd Procesadores del tipo de registros de propósito general son la mayoría de las máquinas grandes modernas y los procesadores RISC por excelencia. Ejemplos: IBM 370, VAX-11 de DEC, MC 68000 de Motorota, MIPS en todos sus modelos, SPARC, PowerPC, ARM. Los diseñadores modernos de computadoras, valorando las virtudes de cada estructura han adoptado maneras de implementar máquinas con todas las ventajas de cada una, eliminando las limitaciones que tenían cada una por separado. Por ejemplo, la familia 80x86 de INTEL, son máquinas orientadas a acumulador con una cantidad no muy abundante de registros de propósitos generales con una pila integrada además. Para entender mejor cómo varían las instrucciones respecto a cada estilo de CPU, se presenta a continuación un ejemplo que permite hacer comparaciones entre los diferentes tipos. Se tiene la siguiente sentencia en pascal: D:= A + B * C, Escriba la secuencia de instrucciones en lenguaje de máquina con tres, dos, una y una y cero direcciones. Tres operandos: (Suponer A está en R1, B en R2 y C en R3, R4 es D) MUL R4, R2, R3 ; D = (B) * (C) ADD R4, R1, R4 ; D = (A) + (B * C) Dos operandos: (Suponer A está en R1, B en R2 y C en R3, R4 es D) MOV R4, R3 ;D = ( C) MUL R2, R4 ;D = (B)*(C) ADD R1, R4 ;D = (A) + (D) Docente: Ing. José Díaz Chow Página 19 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . Un operando (Acumulador) : LOAD B ; Acc= (B) MULT C ; Acc= (A)*(C) ADD A ; Acc= (Acc) + (A) STORE D ; D = (Acc) Máquina de Pila: PUSH A PUSH B PUSH C MUL ADD POP D Página 20 ; calcula B*C ; suma A a B*C ; salva resultado Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 3 DISEÑO DEL CONJUNTO DE INSTRUCCIONES 3.1 INSTRUCCIÓN Y CONJUNTO DE INSTRUCCIONES La principal especificación arquitectónica de una computadora o su procesador es quizás el conjunto de instrucciones, pues éste define las operaciones que puede realizar el procesador y establece cómo el programador puede instruir su ejecución. Bien podría decirse que el repertorio de instrucciones es la “identidad” del procesador o su lengua, pues cada arquitectura de procesador diferente tiene un conjunto de instrucciones diferente. Solo aquellos procesadores que comparten el mismo conjunto de instrucciones pueden ejecutar los mismos programas, y por tanto se dice de ellos que pertenecen a una misma “familia de arquitecturas” 3.1.1 Conjunto de Instrucciones Podemos decir que las instrucciones son comandos que indican al procesador qué operación ejecutar en cada momento y con cuales operandos. Se denomina conjunto o repertorio de instrucciones a todas las posibles instrucciones para un procesador específico. El diseño del conjunto de instrucciones es el punto de partida de toda arquitectura de computadoras. Es deseable que el conjunto de instrucciones del CPU cumpla con las siguientes características: Completitud: Ortogonalidad: Eficiencia: 3.1.2 El conjunto de instrucciones debe permitir ejecutar todas las operaciones que es capaz de realizar el procesador. Debe permitir que todas las operaciones se realicen con todos los tipos de datos que aplican para la misma. Debe permitir ejecutar todas las operaciones del procesador pero sin redundancias. Si ya una operación puede realizarse con una instrucción x no es eficiente que exista una instrucción y para la misma operación. Instrucción Denominamos instrucción a un tipo especial de dato que se emplea para ordenar al CPU que ejecute una de las operaciones que puede realizar. En términos generales, la instrucción debe tener información acerca del tipo de operación a realizar, con qué operandos, dónde poner el resultado (si la operación genera alguno) y alguna forma de obtener la próxima instrucción. En las máquinas del tipo Von Neumann, que son máquinas secuenciales, se supone que la próxima instrucción está contigua en la memoria. En este caso, la información de próxima instrucción es implícita. Este esquema de secuenciamiento requiere de un puntero o contador de programa que se incremente de forma automática para que siempre señale a la próxima instrucción a ejecutar. Para estos propósitos se emplea un registro del CPU denominado normalmente PC (Program Counter). Una instrucción debe, por tanto determinar: la Operación a ejecutar y los Operandos (tanto fuentes como destino) a emplear en la misma. El secuenciamiento implícito se puede cambiar mediante instrucciones de Docente: Ing. José Díaz Chow Página 21 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . salto que permiten modificar el PC. Los Operandos pueden especificarse de forma explícita o implícita (cuando están sobreentendidos) en la instrucción. Por ejemplo, las instrucciones de salto no hacen referencia al PC pero está sobreentendido que éste es el destino de esas operaciones. Los operandos pueden residir en registros internos del procesador o en la memoria. Los operandos fuentes también se pueden especificar directamente en la instrucción. Las diferentes formas de obtener los operandos desde donde residan se denominan modos de direccionamiento. Los operandos que residen en memoria pueden especificarse mediante muchos diferentes modos de direccionamiento. 3.1.3 Clasificación de las Instrucciones Podemos clasificar las instrucciones en categorías o tipos de acuerdo a la operación que realizan. En la tabla a continuación se presenta un cuadro sinóptico con el detalle de esta clasificación. Tipo Propósito General Propósito Específico Privilegiadas Categoría Ejemplos Mover datos entre operandos ( puede ser R-R, R-M). * Cambios en los tamaños y extensión de Signo MOVE, LOAD, STORE Aritméticas Operaciones aritméticas. ADD, SUB, DIV, MULT, INC, DEC Lógicas y manejo de bits (bitwise) Operaciones lógicas, de comparación y corrimiento de bits. AND, OR RSHIFT, NOT De Comparación Operaciones que comparan los valores de los operandos. Sirven de base para las de saltos CMP Control de flujo de Programa Permite modificar la secuencia del programa para implementar sentencias de selección, ciclos y llamadas a subrutinas. JP, JR, BRN, CALL, RET E/S Permite el acceso a direcciones del espacio de E/S. (Más adelante se explicará que hay ordenadores que usan las de transferencia cuando el Mapa de E/S está Integrado a M) IN, OUT Tratamiento de Cadenas (Strings) Manipulación de cadenas COMSTR, CATSTR Polinomios y funciones científicas, Vectores y Matrices Para aplicaciones científicas. La instrucción implementada en Hardware acelera la ejecución. También se consideran datos especiales como Vectores, Listas y Matrices Solicitud de atención de los dispositivos de E/S y Tratamiento de condiciones anormales del procesador EVALUATEPOL, VADD Protección de Memoria, Detención del programa, reinicio o detención del ordenador, etc. HALT, NOP Interrupciones y Excepciones De control del Sistema Página 22 Uso Transferencia INT, Trap Docente: Ing. José Díaz Chow A R Q U I T E C T U R A 3.1.4 D E M Á Q U I N A S C O M P U T A D O R A S I I Filosofías de Diseño del Conjunto de instrucciones Existen básicamente dos filosofías en torno al diseño del conjunto de instrucciones. Al inicio, el diseño de las computadoras estaba orientado a proveer al programador con el mayor posible conjunto de instrucciones con muchas formas de obtener los operandos (modos de direccionamiento), lo cual iba haciendo el hardware cada vez más complejo y mayor el recargo de trabajo para la decodificación y ejecución de las instrucciones. Un estudio reveló que era muy reducido el conjunto de éstas que en realidad se utilizaban y se propuso una nueva filosofía de diseño, basada en el conjunto de instrucciones reducido que realmente era utilizado con frecuencia y simplificar los modos para reducir la complejidad del hardware y mejorar el desempeño. Esta corriente filosófica se denominó RISC (Computadora de conjunto reducido de instrucciones) y a las máquinas con la tendencia de conjunto muy amplio, anteriores a ella se llamó CISC (Computadoras con conjunto complejo de instrucciones). A continuación se presenta un cuadro comparativo de estas dos tendencias. RISC CISC Pocos formatos de instrucciones y sencillos permiten decodificador rápido y control cableado. Muchos formatos muy complejos que normalmente requieren unidad de control microprogramada. Las operaciones de cálculo son registroregistro. Instrucciones específicas de carga y almacenamiento. Las operaciones permiten operandos en memoria. Usan la mínima cantidad de modos de direccionamiento. Buscan permitir la máxima cantidad de modos de direccionamiento. Programas largos pero sencillos. Programas cortos pero complejos. Más fácil de segmentar por su sencillez. Más difícil de segmentar y controlar. Mayor rapidez de ejecución. Ejecución más lenta (complejidad + UC Prog) 3.2 FORMATO DE INSTRUCCIONES Una instrucción es un tipo de dato especial que se almacena en la misma memoria en que se almacenan los datos y de la misma forma, por tanto es una cadena de bits. Lo importante es que estos bits están organizados de cierta forma para almacenar la información que debe proveer la instrucción. Tal organización se denomina Formato de instrucción. Este define el tamaño de la instrucción y los campos de información de la misma. El formato de instrucción puede ser fijo o variable. En el primero, el tamaño de la instrucción es estático, por ejemplo, siempre de 32 bits. En el segundo el tamaño depende de la instrucción y puede ser de una palabra, dos o más. Por ejemplo, el Z80 tiene formatos de 1, 2 y 3 bytes. Docente: Ing. José Díaz Chow Página 23 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . El formato de instrucción, por lo general se organiza en campos. Cada campo posee un tipo de información, algunas arquitecturas, sin embargo, tienen campos compuestos y otras mezclan información en un mismo campo. Ejemplos: MIPS siempre mantiene un mismo código de operación para el tipo de instrucción y mantiene un campo fijo para cada operando, mientras la familia ix86 tiene un código de operación diferente por cada tipo y cantidad de operandos de la misma operación. El formato de instrucción debe contener toda la información de la instrucción o la forma de obtenerla, básicamente: - Operación a realizar - Fuente(s): Dependen del tipo de operación (unaria o binaria) - Destino: Dónde poner el resultado. A veces está implícito ( ADD A, B ; B A + B ) - Secuenciamiento: Necesidad de conocer la dirección de la próxima instrucción. Por lo general está implícito (en las arquitecturas de máquina secuencial) pero a veces se permite cambiar el flujo de programa afectando al PC mediante instrucciones de ramificación (en este caso el direccionamiento puede ser absoluto o relativo). Nominalmente, el Formato de instrucción, al cual llamaremos F, se compone de Dos partes: - Identificación de la operación: COP o CO: Código que identifica la operación. Direccionamiento: Operandos fuentes y destino. IDENTIFICACION DIRECCIONAMIENTO CO OP1 MD OP2 … OPn VALOR(ES) Estructura del Formato de Instrucción 3.3 CODIGOFigura DE 2.4 OPERACIÓN Es necesario codificar las instrucciones del conjunto de instrucciones a fin que la unidad de control pueda identificar de forma única cada instrucción y proceder de acuerdo a la especificación de la misma. La parte del formato de instrucción que mantiene esta información se denomina bloque de identificación y está conformado por lo general de un único campo llamado Campo de Código de Operación (CO o COP). 3.3.1 Codificación de bloque fijo ¿Cómo podemos proceder para asignar códigos a las instrucciones? es decir, ¿cómo podemos codificar el CO? Existen varias técnicas, la más simple consiste en asignar a cada instrucción una de las combinaciones posibles de un patrón binario. A esta técnica se le conoce como Técnica de Bloque fijo. Para codificar n instrucciones se requieren log2(n) bits. Por ejemplo, para codificar 13 instrucciones 4 bits son requeridos. nota: n = n (I); n es la cardinalidad del conjunto I o conjunto de instrucciones. Página 24 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Ventajas: Muy fácil de entender Decodificado fácil de implementar Desventajas: Cuando el número de instrucciones no es cercano a la potencia (5 bits para 18) Tenemos desperdicio o a veces diseños muy costosos (al integrar el resto del Formato) 3.3.2 Codificación de bloque expandido Otra técnica empleada es la Técnica de bloque expandido. Esta se basa en el hecho que no todas las instrucciones usan todos los campos de direccionamiento. Se pueden identificar grupos de 3, 2, 1 y 0 operandos, entonces, se pueden emplear pocos bits para el CO de las instrucciones de más operandos y en el nuevo grupo usar los bits del operando que no ocupará el anterior para “expandir” el CO a más bits. Ejemplo: ¿Cuántos bits ( L o longitud) se requieren para el formato de instrucciones de una máquina hipotética, si se tienen que codificar 15 diferentes instrucciones cada una de 2 operandos, donde el operando fuente 1 asume como destino de la operación y cada operando requiere 6 bits para codificarse? L (F) = ? n = 15 L (CO) = log2(15) = 4 bits L (F) = L (CO) + 2 * L (Op) = 4 + 2 * 6 = 16 bits *Nótese que aquí la longitud de los operandos es constante, existen máquinas donde no ocurre lo mismo. Suponga, ahora que además de las 15 de 2 operandos requiero 30 de 1 operando. ¿Cuántos bits se requieren? n = 15 + 30 = 45 L (CO) = log2(45) = 6 bits En este nuevo escenario, la instrucción pasa a tener un total de 18 bits. Note que esto genera un problema interesante, pues si la resolución de la memoria es de un byte y no de palabras de 18 bits, el tamaño de instrucción deberá escalar a 3 * 8 = 24 bits, desperdiciando 6 bits en el formato. Esto no siempre es malo, en términos de rendimiento, pero puede ser un inconveniente en cuanto a ahorro de espacio en disco y memoria. Para evitar el desperdicio del ejemplo anterior, se podría usar la técnica de bloque expandido, así los 6 bits que libera el segundo operando en este nuevo grupo, se pueden emplear para “expandir” el CO. Es importante que queden algunas combinaciones libres del primer formato para poderlas usar como llave que nos indique que esa combinación es expandida. En esta caso queda la combinación 1111. Así el decodificador sabrá que cuando aparezca ésta encabezando el CO, éste será de 4 + 6 = 10 bits. Docente: Ing. José Díaz Chow Página 25 A R Q U I T E C T U R A CO 0000 … 1110 1111 O2 xxxxxx … xxxxxx D E M Á Q U I N A S O1 xxxxxx … xxxxxx 1111 000000 … … … 1111 011101 xxxxxx 30 xxxxxx C O M P U T A D O R A S I I . 15 inst. de 2 operandos inst. de 1 operando Nótese que con este formato, no se requieren más bits para codificar las nuevas 30 instrucciones. * Asignación: Verifique cuántas instrucciones de 0 operandos podrían caber en el formato 3.3.3 Codificación Huffman La tercera técnica, se basa en la teoría estadística de la comunicación y está orientada a minimizar la longitud del CO de las instrucciones más frecuentes. Ésta de denomina Técnica de Codificación de Huffman. La técnica expandida asume que todas las instrucciones son usadas con la misma probabilidad, pero realmente en la práctica esto no es así, ya que en un programa de acumulador, el 40% de las instrucciones son LOAD y STORE, por ejemplo. La técnica de Huffman codifica el CO de las instrucciones usadas más frecuente con menos bits y las usadas menos frecuentemente con más bits. Esto permite que el número promedio de bits necesarios para codificar un programa típico sea óptimo. Ejemplo: Supongamos que se desea codificar el conjunto de instrucción hipotético mostrado en la tabla siguiente: Nemónicos de Instrucciones Contador de Frecuencia Relativo LOAD STO ADD AND NOT RSHIFT JUMP HALT 1/4 1/4 1/8 1/8 1/16 1/16 1/16 1/16 Los valores del contador de frecuencia relativa se obtienen inspeccionando la ocurrencia de cada Instrucción en un conjunto de programas representativos. En ésta técnica podemos especificar un algoritmo para crear los Códigos para cada CO de cada instrucción. Primero se ordenan las instrucciones en función de su frecuencia relativa o probabilidad de ocurrencia, de mayor a menor de izquierda a derecha. Segundo, se asigna a cada nemónico de Instrucción un nodo etiquetado con el contador de frecuencia relativa correspondiente (figura a continuación) Página 26 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A LOAD STO ¼ D E ADD ¼ M Á Q U I N A S AND NOT 1/8 1/16 1/8 C O M P U T A D O R A S I I RSHIFT JUMP HALT 1/16 1/16 1/16 Tercero: Asociar los nodos con el menor peso siempre, mediante la operación suma para genera nuevos nodos hasta que no queden posibles asociaciones. La figuras 2.8 a, b y c muestran este proceso. Cuarto: Las ramas derechas del árbol obtenido son etiquetadas con “0” y las izquierdas con “1”. Ver el resultado de este proceso en la Figura 2.8 c. Quinto: Para encontrar el código de operación correspondiente de determinada instrucción se hace un camino desde la raíz hasta el nodo del mnemónico correspondiente. Por ejemplo el CO de la instrucción RSHIFT es 0010. En la figura 2.8 se puede apreciar todos los pasos y en la taba que le sigue se resumen los CO para todo el Conjunto de instrucciones del ejemplo. LOAD STO ADD AND NOT RSH JUMP 1/4 1/4 1/8 1/8 1/16 1/16 1/16 a) HALT 1/16 1/8 LOAD STO ADD AND NOT RSH JUMP 1/4 1/4 1/8 1/8 1/16 1/16 1/16 1/8 b) STO ADD AND NOT RSH JUMP 1/4 1/4 1/8 1/8 1/16 1/16 1/16 1 0 1 0 1 1/4 1/16 1/8 LOAD 1/2 HALT 0 HALT 1/16 1 1/8 0 1/8 1 0 1/4 1 0 1/2 0 1 c) 1/2 Docente: Ing. José Díaz Chow Página 27 A R Q U I T E C T U R A D E MNemónico LOAD STO ADD NOT RSHIFT JUMP HALT M Á Q U I N A S CO C O M P U T A D O R A S I I . Camino desde la Raíz. 11 10 011 010 0010 0001 0000 izquierda-izquierda izquierda-derecha der-izq-izq der—izq—der der—der—izq—der der—der—der—izq der—der—der—der Se puede apreciar que el procedimiento de Huffman codifica con menos bits las instrucciones más frecuentes usadas y con más bits las menos usadas. El número promedio de bits necesarios por instrucción pueden ser calculados usando la fórmula: n longitud COmed LA li . f i i 1 Donde li es la longitud en bits de la instrucción i y fi es la frecuencia relativa de la instrucción i. Para nuestro ejemplo, entonces: longitud(CO)med = 2(1/4 )+2(1/4) + 3(1/8) +3(1/8) + 4(1/16) + 4(1/16 )+ 4(1/16) + 4(1/16) =1+¾+1 = 2.75 bits. Aplicando esta fórmula al esquema de codificación de bloque donde cada instrucción será codificada con tres bits: L (CO)med = 3(1/4 +1/4) + 3(1/8 + 1/8) +3(1/16 + 1/16 + 1/16 + 1/16) = 3/2 + ¾ + ¾ = 3 bits. El número óptimo de bits para la codificación de un conjunto de mensaje es: n longitud CO optima LO f i . log 2 f i i 1 Para nuestro ejemplo: LO = –[2(1/4) log2(1/4) + 2(1/8)log2(1/8) + 4(1/16)log2(1/16)] Página 28 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I LO = 2.75 bits. La diferencia entre la longitud promedio actual y la longitud óptima sobre la longitud actual es llamada Redundancia. Ésta mide el grado de desperdicio en el uso de bits para codificar el mensaje y se calcula así: R = LA - LO LA Calculando el desperdicio se nota que en el esquema de Huffman la redundancia es igual a cero, y para el esquema de código de bloque hay una redundancia de 8.33%. R = (2.75 - 2.75) / 2.75 = 0 Técnica de Huffman R = (3 - 2.75) / 3 = 0.083 (8.33%) Técnica de Bloque. El esquema de Huffman lleva a cabo un resultado óptimo manteniendo la redundancia a un valor mínimo sin embargo los códigos de operación son de tamaño variable, lo cual puede complejizar la construcción del decodificador. La codificación de código de bloque fijo toma espacio de memoria extra pero es ampliamente usado por su sencillo procedimiento de decodificación. La codificación de bloque extendido también es muy usada cuando tenemos formatos de instrucción variable. 3.4 CAMPOS DE DIRECCIONAMIENTO El bloque de direccionamiento en el Formato de Instrucción se compone de uno o varios campos de dirección. Estos campos de dirección, especifican cómo y dónde obtener los operandos y donde guardar el resultado. También se usan en instrucciones de saltos para definir la dirección de memoria de la próxima instrucción. Un campo de dirección se estructura de la forma: MD V MD: Modo de direccionamiento o forma de determinar la dirección efectiva del operando. V (Valor): Dato que se emplea en el cálculo de la dirección efectiva del operando. Frecuentemente V indica un registro, una dirección de memoria o un número. En los últimos casos, este valor puede ser bastante grande, incluso, podrían no caber en un formato de instrucciones pequeño, por lo cual se suelen emplear palabras adjuntas en la instrucción para dar cabida a estos valores. La figura abajo muestra una de estas variantes. Docente: Ing. José Díaz Chow Página 29 A R Q U I T E C T U R A D E M Á Q U I N A S Palabra de instrucción CO MD1 V1 C O M P U T A D O R A S I I . Palabra complementaria de V MD2 V2 El cálculo de la dirección efectiva del operando se obtiene combinando los valores del MD y V con el estado del procesador. Esquemáticamente: MD V CALCULO DE LA DIRECCION EFECTIVA DIRECCION EFECTIVA DEL OPERANDO ESTADO DEL PROCESADOR 3.5 MODOS DE DIRECCIONAMIENTO El modo de direccionamiento es la forma o procedimiento que sigue el procesador para expresar dónde se encuentra un operando y cómo obtenerlo. Un operando puede residir en memoria o en un registro del procesador, pero los operandos fuentes además pueden definirse directamente en la instrucción. Para los operandos en registros, la dirección efectiva del operando es el número, dirección o identificación del registro. Los operandos en memoria, se pueden obtener de diferentes modos. El objetivo final es obtener la dirección efectiva donde se almacena el operando en memoria. A continuación estudiaremos los modos de direccionamiento más comunes. 3.5.1 Modo Inmediato El valor del operando es especificado dentro de la misma instrucción. Realmente V es el valor mismo del operando. En este caso no es necesario calcular dirección efectiva. MD Página 30 V = # ( operando ) Ventajas: Desventajas: Uso: Forma sencilla de obtención del operando. Sólo permite operandos fuente y valores constantes. Inicialización de variables y declaración de constantes. Ejemplo: MOVE R10, 9 ; R10 9 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 3.5.2 Modo Directo o De Registro El operando se encuentra en uno de los registros del procesador. En este caso el valor del operando es el contenido del registro. MD Modo de direccionamiento Directo o Directo de Registro r BANCO DE REGISTROS DEL PROCESADOR Dirección Efectiva Ventajas: OPERANDO Rr Uso: Rapidez de acceso. El operando ya está dentro del procesador. Pocos bits para codificar los registros. Si se necesita estar intercambiando el valor constantemente con una variable en Memoria Almacenar datos que se utilizan con mucha frecuencia. Ejemplo: MOVE R10, R1 Desventajas: : R10 [R1] 3.5.3 Modo Absoluto o Directo de Memoria La dirección efectiva del operando se especifica directamente en la instrucción. Regularmente se emplea algún convencionalismo para diferenciar este modo del inmediato. Nosotros emplearemos paréntesis. MD Modo de direccionamiento Absoluto o Directo de Memoria @ MEMORIA Dirección Efectiva Ventajas: Desventajas: Uso: Ejemplo: Docente: Ing. José Díaz Chow OPERANDO Permite acceder a cualquier dirección de memoria. No se requiere de cálculo adicional. Requiere muchos bits para direccionamiento. Requiere soporte en uso de estructuras de datos y programas portables. Saltos absolutos, Rutinas fijas (sistema), paso de parámetros, puertos de E/S. MOV R10, (1800) MOV R10, A ; R10 M(1800) ; R10 M(A) Página 31 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . 3.5.4 Modo Indirecto de Registro El registro r contiene la dirección efectiva del operando. MD Modo de direccionamiento Indirecto de Registro r BANCO DE REGISTROS DEL PROCESADOR MEMORIA Rr Dirección Efectiva OPERANDO Se pueden dar diferentes niveles de Indirección, según la arquitectura. Como ejercicio visualice el diagrama gráfico para doble indirección. Ventajas: Uso: Permite acceder a cualquier dirección de memoria usando pocos bits. Flexibiliza el uso punteros, vectores y estructuras. Requiere que se cargue la dirección al registro. Limita el uso de registros para operandos. Datos estructurados y paso de parámetros a subrutinas. Ejemplo: MOV R10, (R1) Desventajas: ; R10 M (R1) 3.5.5 Modo indirecto de Memoria El valor de V especifica la dirección de memoria en cuyo contenido está la dirección efectiva del operando. MD @ Modo de direccionamiento Indirecto de Memoria MEMORIA Dirección Efectiva OPERANDO Este modo no es muy frecuente, ni eficiente en la actualidad, sin embargo fue usado en antiguas máquinas para automatizar punteros y acceso a estructuras de datos. Ejemplo: Página 32 MOV R10, ((1800)) ; R10 M( M(1800)) Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 3.5.6 Modo de Autoincremento Este es un modo particularmente útil para trabajar con estructuras de datos estáticas. Está presente en arquitecturas antiguas como la PDP/11. Son variantes del modo indirecto de registro. En el autoincremento, la EA1 es el contenido del registro Rr. Una vez que se obtiene tal dirección el contenido del registro Rr se incrementa en una constante k, que por lo general es 1. MD Rr r Modo de direccionamiento de Autoincremento BANCO DE REGISTROS DEL PROCESADOR MEMORIA Dirección Efectiva OPERANDO Celda A Celda A + k Operando = M([ Rr ]) Rr = [ Rr ] + k Por lo general k es el valor de la palabra o el tamaño de los operandos. Ventajas: Desventajas: Acceso eficiente a elementos consecutivos en arreglos. Cuando k es variable. Ejemplo: ADD (R1)+, R0 ; R0 M( [R1] ) + R0, R1 [R1] + k 3.5.7 Modo de Autodecremento Es muy similar al de autoincremento, con la variante que el contenido de Rr se decrementa en lugar de incrementarse y esta operación se hace antes de emplear la el contenido del registro en el cálculo de la dirección. Es decir que EA = [Rr] – k. 1 EA: Effective Address, Dirección Efectiva. Docente: Ing. José Díaz Chow Página 33 A R Q U I T E C T U R A MD r D E M Á Q U I N A S MEMORIA OPERANDO A Rr Operando Ejemplo: I I . Modo de direccionamiento de Autodecremento BANCO DE REGISTROS DEL PROCESADOR Rr C O M P U T A D O R A S Celda A - k Celda A = [ Rr ] - k = M( [ Rr ] ) ADD -(R1), R0 : R1 [R1] - k, R0 M( [R1] ) + R0 Cabe mencionar que estos modos también tienen sus indirectos. Como tarea, visualice las operaciones que se deber realizar para recuperar un operando en indirecto de autoincremento. 3.5.8 MODOS DESPLAZADOS Existe una serie de modos muy flexibles que permiten realizar direccionamiento dinámico, lo cual es muy útil para recorrer estructuras de datos, como arreglos de números o de estructuras. Estos modos obtienen la dirección efectiva del operando calculándola mediante suma de registros y/o valores numéricos. Por ejemplo, la dirección puede obtenerse sumando dos o más registros, o un registro y un valor numérico. Existen casos complejos donde se incluye también escalación, en el cual uno de los valores es multiplicado por una constante que normalmente representa el tamaño del elemento del arreglo que se desea recorrer. En nuestro curso sólo enfocaremos algunos de ellos. Especial interés debe ponerse en el modo relativo, donde el desplazamiento es relativo al valor de un registro. El desplazamiento relativo más útil es el relativo al PC que se emplea en las instrucciones de salto. 3.5.9 Modo Indizado o De Índice En este modo, el campo V tiene dos partes: Una dirección base (o registro base) y un registro índice. Para calcular la dirección efectiva, se toma la dirección base y se le suma el contenido del registro índice. Puede darse también el modo indirecto de índice. Se propone al lector interpretar el funcionamiento del indirecto de índice. Página 34 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A MD r D E M Á Q U I N A S I I Modo de direccionamiento de Indice @base BANCO DE REGISTROS DEL PROCESADOR Rr C O M P U T A D O R A S MEMORIA + Indice OPERANDO Operando = M( [ Rr ] + base ) Para que este modo sea eficiente se requiere tener facilidad de manipulación del registro de índice por aparte. Por ejemplo: incrementar y decrementar el registro por una constante arbitraria k para el recorrido de las estructuras de datos estáticas o por diferentes valores específicos para estructuras de datos variables. Ventajas: Acceso eficiente a arreglos y estructuras en la memoria. Es considerado uno de los modos más versátiles de acceso a memoria. Desventajas: Precisa cargar y actualizar el índice por aparte. Ejemplo: ; R0 M(1800 + [R1]) ; R0 M([R5] + [R1]) MOV R0, 1800(R1) MOV R0, R5(R1) 3.5.10 Modo Base-desplazamiento Este modo es similar al anterior, el direccionamiento requiere dos partes: Un registro base y un valor de desplazamiento. Para calcular la dirección efectiva, se toma la dirección contenida en el registro base y se le suma con el desplazamiento. El valor del desplazamiento puede ser negativo o positivo. La diferencia con el anterior es que éste último se usa cuando tenemos desplazamientos constantes, por ejemplo para acceso a estructuras de datos. MD r desplazamiento BANCO DE REGISTROS DEL PROCESADOR Rr Dirección Base Modo de direccionamiento Base + Desplazamiento MEMORIA desplazamiento Base + OPERANDO Operando = M( [ Rr ] + desplazamiento ) Docente: Ing. José Díaz Chow Página 35 A R Q U I T E C T U R A Ventajas: D E M Á Q U I N A S C O M P U T A D O R A S I I . Desventajas: Acceso a estructuras de datos más eficiente. Cambiando el contenido de la base se puede acceder al mismo elemento en cada estructura. Permite desplazarse en un área de memoria cuyo punto de referencia es la dirección base. Permite desplazamientos fijos relativos a un punto móvil. Precisa cargar y actualizar la base. Ejemplo: MOV R0, R1(10) ; R0 M([R1] +10) 3.5.11 Modo Base-Desplazamiento con Escalación Estos modos permiten involucrar varios registros y escalares en el cálculo de la dirección efectiva la cual se realiza nos solo con suma sino además por multiplicación. Estos modos eliminan la necesidad de cálculo del tamaño del operando en el índice por aparte. Así el índice solo se autoincrementa o decrementa por 1. Por ejemplo, el modo siguiente permite recorrer una estructura de datos de 8 bytes de tamaño con base en Rbase, usando Rindice para controlar el elemento a acceder: Rbase + Rindice * 8 3.5.12 Modo de Desplazamiento Relativo Este modo es una variante del modo base-desplazamiento. La principal diferencia radica en que el valor calculado no es la dirección de un operando sino el resultado de la operación. El modo relativo normalmente tiene por registro base al PC, permitiendo implementar los saltos, es decir, las instrucciones de control de flujo de programa, al modificar el secuenciamiento automático de la máquina. El registro base es implícito cuando se trata del PC. Algunas arquitecturas permiten tener desplazamientos relativos muy complejos, permitiendo además de una constante, un registro sumados al valor del PC. MD desplazamiento Modo de direccionamiento Relativo ( al PC ) MEMORIA (Area de programa) + próxima instrucción realmente desplazamiento (negativo ) instrucción actual PC próxima instrucción originalmente PC = [PC] + desplazamiento Ventajas: Nota: hacia atrás. Permite implementar ciclos fácilmente. Hay que tomar en cuenta el posible uso de números negativos cuando son saltos Por lo general, éstos se implementan en complemento a 2. Página 36 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 3.6 CODIFICACIÓN DEL MD La codificación del MD es similar a la del CO. Se prefiere emplear la técnica de bloque fijo por cuanto es más fácil de decodificar y los modos de direccionamiento suelen ser muy pocos. Es importante anotar aquí el uso del bit de indirecto en la arquitectura PDP, que sirve de base a nuestro curso. Este bit se emplea para diferenciar los modos directos de su correspondiente indirecto sólo en un bit (el LSB del campo de MD) Si este bit es 1 el modo en cuestión es indirecto. Por ejemplo, supongamos que se define la combinación 000 para el modo Directo de Registro, entonces la combinación 001 deberá corresponder al modo Indirecto de Registros. Esta técnica simplifica mucho la implementación de la Unidad de Control. Veamos ahora un ejemplo de Codificación basado en PDP-11. Supongamos que hipotéticamente la instrucción ADD tiene el CO 0010. Entonces la instrucción: ADD (R0), R1 Donde el primer operando se obtiene indirectamente del registro R0 y el segundo, que es a la vez destino, se obtiene directamente de R1. Si el código de MD directo de registro es 000, entonces el formato de la instrucción se vería así: CO MD 1 V1 MD 2 V2 Formato de la instrucción CO MD1 V1 MD2 V2 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 Indirecto en 0 = modo directo CO de ADD Modo de Registro Bit de indirecto en 1 > Modo indirecto 000 = 0 -> R0 001 = 1 -> R1 Contenido de la Instrucción Finalmente, para concluir nuestra discusión acerca del formato de la Instrucción. Anotaremos que los modos de direccionamiento dependen de la estructura y organización del procesador. Recordemos que existen tres diferentes: Máquina de registros, de Pila y de Acumulador. Las primeras enfatizan en el uso de instrucciones de 2 y 3 direcciones. Las segundas poseen básicamente sólo instrucciones de 0 direcciones (o de 1 en caso de transferencia) y la de acumulador básicamente solo de 1. Docente: Ing. José Díaz Chow Página 37 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . 4 UNIDAD DE EJECUCION 4.1 LA FUNCION DE PROCESAMIENTO La función de procesamiento en la computadora es realizada por la unidad de ejecución. Esta unidad está constituida por la unidad aritmética y lógica (ALU), los registros de propósito general (GPR) y todo hardware adicional que esté destinado a realizar cálculos (por ejemplo, una unidad de punto flotante o FPU). La ALU es la responsable de la ejecución de los cálculos dentro del procesador. Para tal cometido necesita almacenamiento interno temporal dentro del CPU por lo cual se le provee de tales almacenamientos por medio de registros de propósito general (GPR) que permiten almacenar operandos. Recordemos que en la forma en que se proveían estos almacenamientos ha definido históricamente los diferentes tipos de arquitectura: Acumulador, Pila y Registros. También la ALU puede contar con sus propios registros auxiliares que almacenan o retienen los datos sobre los que opera. 4.2 REPRESENTACION DE DATOS Todos los datos, independientemente de su naturaleza se representan como patrones binarios dentro de una computadora digital binaria. Es necesario, por tanto, definir un formato de representación que permita establecer una equivalencia de patrones binarios con los diferentes tipos de datos del mundo real. Los datos que más nos interesan son los números enteros. En nuestro paradigma matemático, empleamos el sistema de numeración posicional basado en un alfabeto de diez símbolos (sistema decimal) como codificación numérica. La computadora usa codificación binaria, sin embargo la representación genérica de un número en función de su base nos permite encontrar equivalencia entre cualquier sistema de codificación de tipo posicional. Otro aspecto a considerar es el tamaño del número. En el mundo real, los números pueden crecer hasta el infinito. En la computadora tienen un límite debido al espacio de almacenamiento (cantidad de bits) que se elija para el formato del número. El valor de un número entero positivo en cualquier base (radix) se representa como: n 1 A Valor ( N ) ai r i i 0 La computadora trabaja en binario es decir r = 2. Cualquier entero en base decimal puede representarse en base binaria. Otras bases importantes en arquitectura de computadoras son la Hexadecimal y la Octal. La gran ventaja de éstas es que su base es potencia de 2 y por tanto tienen un número exacto de bits para cada dígito (4 para Hexadecimal y 3 para Octal) con lo cual es más fácil manipular y convertir números a binario y viceversa. Página 38 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 4.2.1 Representación de enteros con signo. El sistema binario debe representar todos sus datos con tiras de ceros y unos. No dispone de signos especiales como el menos (-) que usamos en nuestra representación matemática. Por tanto, en la notación binaria de las computadoras necesitamos definir un convencionalismo para representar los números negativos que esté comprendido en la misma tira de bits. Para solucionar esta necesidad se han empleado varias técnicas: 4.2.1.1 SIGNO-MAGNITUD El bit más significativo o MSB se destina para representar el signo (1 = negativo, 0 = positivo) y el resto de bits para representar la magnitud. En este caso el valor del número está dado por: A Valor( N ) (1) [ MSB] 0 a r i n2 i i Nótese que existen dos posibles ceros: -0 y +0, por cuanto el rango es: [– (2 n-1 –1), + (2 n-1 –1)]. 4.2.1.2 COMPLEMENTO A R-1: O simplemente el complemento. Como nuestra base binaria es 2, esta técnica se denomina complemento a 1. Resulta de la complementación del número bit a bit. En este caso, se entiende que el signo está integrado al número. Por la misma convención, el valor del MSB indica el signo del número. En las operaciones siempre se debe sumar el acarreo al resultado. Rango: [– (2 n-1 –1), + (2 n-1 –1)]. En complemento a 1, al igual que en signo-magnitud, también tenemos 2 ceros, uno positivo y otro negativo. 4.2.1.3 COMPLEMENTO A R En binario: Complemento a dos. Un número se niega en complemento a dos desplazándolo un módulo de su posición. Esto es equivalente a complementar el número y sumarle 1. En las operaciones se desestima el acarreo sobrante. Esta representación es la más directa al momento de implementar las operaciones en la ALU. El rango es: [– 2 n-1, +2 n-1 –1] pues solo existe un cero y es considerado positivo. Una técnica muy útil para calcular el valor de un número binario en complemento a 2 es el uso de la caja de valores. En ésta, cada posición representa su valor en positivo excepto la posición más significativa que representa su valor en negativo. Docente: Ing. José Díaz Chow Página 39 A R Q U I T E C T U R A -128 D E 64 M Á Q U I N A S 32 16 8 C O M P U T A D O R A S 4 2 I I . 1 Figura 4.1. Caja de valores para un número con signo de 8 bits 4.2.1.4 EXCESO A M Las representaciones en complemento son muy apropiadas para agilizar los cálculos aritméticos por cuanto las operaciones aritméticas entre números de distinto signo no requieren operaciones extras para el manejo del signo. Sin embargo, adolecen del efecto de corrimiento de rango, con lo cual los números no son fácilmente comparables si queremos establecer una relación de orden. Para datos cuyo orden debe ser comparable, se propone otra técnica llamada Exceso a M. En ésta, el valor del número es el exceso de su valor positivo respecto a M. M representa el límite de corrimiento o el cero del sistema. Aunque M puede ser cualquier valor positivo dentro del rango, si deseamos un conjunto simétrico, M debe ser la mitad del alcance del rango. Por ejemplo, en números de 4 bits, M sería 8 de forma tal que 0000 equivaldría a –8 y 1111 a +7. En esta representación, los números quedan ordenados según nuestros ejes coordenados. En sistemas simétricos (igual cantidad de posiciones enteras positivas y negativas) se cumple que: M 2n 2 y V(N) = A - M 4.2.2 Números en punto flotante Además de los números enteros, son de gran uso los números reales, sin embargo la ALU normalmente no puede operarlos directamente. Para poder realizar cálculo de punto flotante, se han desarrollado una serie de algoritmos que se implementa en librerías matemáticas o directamente en hardware, mediante un coprocesador matemático asociado o una unidad de punto flotante (FPU por sus siglas en inglés) que se implementa interna al procesador. El problema para realizar cálculos con estos números inicia desde su representación. Son difíciles de representar por cuanto en su forma decimal se dificulta saber dónde está la coma o punto decimal. Para evitar ese problema, se maneja el número como si tuviera siempre el punto decimal después del primer dígito significativo. Al proceso de transformación de cualquier número real a esta representación se le denomina Normalización, y del número resultante se dice que está normalizado. Por ejemplo: Consideremos el número 13.56. Este no está normalizado porque su punto decimal está después del segundo dígito significativo. Para que esté normalizado se debe expresar como 1.356 x 101. Página 40 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Eso significa que se debe recurrir a la notación científica para poder representar estos números normalizados. La notación en punto flotante es una representación de números reales en forma normalizada que se basa en la notación científica de la siguiente manera: valor = mantisa*BASEexponente. Se denomina mantisa o significado a la cadena de dígitos significativos del número. La representación en punto flotante en binario más aceptada actualmente es el formato que propone el estándar 754 de la IEEE. Éste en realidad define dos formatos: uno en simple precisión de 32 bits y otro en doble precisión de 64 bits. El formato estructura la tira de bits (de 32 o 64 bits), en tres campos lógicos: signo, mantisa y exponente. La base está predefinida (binaria). La mantisa y el signo se almacenan en representación signo-magnitud y el exponente en exceso a m. 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 S Exponente Mantisa Figura 4.2 Formato IEEE 754 en Simple precisión 4.2.3 Otros Tipos de Datos: 4.2.3.1 CARACTERES O DATOS ALFANUMÉRICOS Usan sistemas de codificación como el ASCII. Actualmente se emplean formatos más largos como UNICODE que emplea 2 bytes por carácter. 4.2.3.2 FECHA Y TIEMPO: Puede emplearse diferentes formatos. Por ejemplo, para llevar solo fechas, se suele usar un número de 32 bits (4 Bytes) y emplear el formato YYYYMMDD o hacerlo con 8 caracteres. Para llevar además el tiempo, se suele emplear números más largos (64 o más bits) para llevar un contador de segundos o milésimas de los mismos. En este caso el valor del número representa los segundos transcurridos desde una fecha inicial de ventana, por ejemplo 01/01/1900 a las 00:00. 4.2.3.3 ESTRUCTURAS: Se construyen en base a los tipos de datos simples o primitivos, que se almacenan contiguos en la memoria. Son de interés especial las estructuras estáticas como las cadenas de caracteres y los arreglos. Docente: Ing. José Díaz Chow Página 41 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . 4.3 LA UNIDAD ARITMETICA La unidad de ejecución debe poder realizar tanto operaciones aritméticas como lógicas. La suma es la operación aritmética más importante. Esta operación es muy versátil, ya que de ella pueden derivar el resto de operaciones aritméticas fundamentales. Por ejemplo, la resta de A - B es equivalente a sumar el valor de A más el complemento a dos de B (recordemos la definición matemática de resta o sustracción: se suma al minuendo el inverso aditivo del sustraendo). Asimismo, la multiplicación no es más que una acumulación de sumas sucesivas. El producto C * A puede ser obtenido sumando A, C veces, o viceversa. Por ello, comprender el proceso para la implementación de un sumador es clave para comprender cómo implementar una unidad aritmética. Una unidad de hardware que suma dos números de 1 bit con acarreo, es llamado un “sumador completo”. El diagrama de bloques, tabla de verdad e implementación de un sumador completo son mostrados en la figura 4.3. De la tabla de verdad, mediante la técnica de términos mínimos, se puede obtener la ecuación lógica de Si y Ci+1 que corresponde a la suma de las entradas y el acarreo resultante, respectivamente. Luego de aplicar transformaciones algebraicas se obtienen las expresiones minimizadas cuya implementación se muestra en la figura 4.3. Abajo se muestran las transformaciones algebraicas en cuestión: Si = xiyici + xiyici + xiyici + xiyi ci = ci(xiyi + xiyi) + ci (xiyi + xiyi) siendo Z = xiyi + xiyi = xi yi entonces: Si = ci Z + ci Z Si = xi yi ci Por otro lado: ci+1 = xiyici + xiyici + xiyici + xiyici ci+1 = yici + xici + xiyi Página 42 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A M Á Q U I N A S C O M P U T A D O R A S Yi Xi Ci+1 D E Ci Sumador Completo Si Diagrama de bloque de un Sumador Completo de 1 bit I I Xi Yi Ci Si Ci+1 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 Tabla de Verdad del Sumador Completo Xi ' Xi Yi ' Yi Xi ' Xi Ci+1 Yi Ci Ci Xi Yi Yi ' Si = Xi Yi Ci Ci Xi Implementación del Sumador Yi Figura 4.3 Sumador completo de 1 bit. Se pueden implementar sumadores completos para n bits, conectando en cascada n sumadores completos de 1 bit. La figura 4.4 presenta el esquema a bloques y la estructura de un sumador de 4 bits. Este tipo de sumador es también llamado “Sumador de Acarreo propagado” (CPA), dado que el acarreo en este circuito es propagado serialmente a través de cada sumador completo. Cuando se suman dos números, el acarreo inicial C0 siempre es 0 excepto en caso de substracción con operandos complementados a 2. Con el CPA, este acarreo necesita ser transmitido de un sumador a otro haciendo el proceso bastante lento. X3 Y3 FA X2 C3 Y2 FA X1 C2 Y1 FA X0 C1 X3 Y3 X2 Y2 X1 Y1 X0 Y0 Y0 FA C0 C4 S3 C4 S3 S2 S1 S0 C0 CPA S2 S1 S0 Diagrama de bloque de un sumador de 4 bits Sumador de 4 bits con acarreo propagado Figura 4.4 Sumador de acarreo propagado de 4 bits. Docente: Ing. José Díaz Chow Página 43 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . Como se puede apreciar en la figura 4.4, para generar el Ci+1 de Ci, se incurre en el retardo de tiempo de propagación de dos niveles de compuertas lógicas en serie. Para generar Si, se gasta el tiempo de retardo de tres compuertas. Aunque el diseño de un CPA de n bits es directo, el tiempo de propagación del acarreo en un CPA limita la velocidad de operación. Por ejemplo; en un CPA de 16 bits, la operación de suma es completada solamente cuando la suma del 15avo bit está disponible. Para ello, se debe contar con la suma en el 1er bit y su acarreo, luego la del 2do, tercero, etc. Supongamos que el tiempo de retardo de una compuerta es t, entonces el tiempo requerido para la suma de dos números de 16 bits es: 15 * 2t (retraso de c0 hasta c15) + 3t (tiempo para generar s15 de c15) 33t Si t = 10 ns, entonces se deberá esperar un total de 330ns para obtener una suma, lo cual es prohibitivo en las computadoras donde el tiempo de respuesta de la ALU se espera por debajo de los 100ns. Esto crea la necesidad de pensar en una técnica que incremente la velocidad de operación. Tal técnica es conocida como Carry Look Ahead (acarreo adelantado) y permite acelerar la suma en un factor de 3. En esta técnica se emplea hardware extra para generar cada acarreo (Ci, i> 0) directamente de C0. Para ser más práctico, considere el diseño de un sumador de acarreo adelantado de 4 bits (CLA: Carry Look Ahead) a partir de nuestro diseño original de CPA. Inicialmente recordemos que en un sumador completo, la salida de acarreo Ci+1 está relacionada al acarreo de entrada Ci , de la siguiente manera: Ci + 1 = XiYi +XiCi +YiCi Este resultado puede ser escrito así: C i+1 = Gi + PiCi donde Gi = XiYi y Pi = Xi+Yi La función G es llamada la Función Generadora del Acarreo, puesto que un acarreo es generado cuando Xi *Yi es 1. Si Xi o Yi es un 1, entonces el acarreo de entrada Ci es propagado al próximo sumador. Por esta razón, la función Pi es a menudo referida como Función de Propagación de Acarreo. Usando Gi y Pi; C1, C2, C3, y C4 pueden ser expresados como siguen: C1 = G0 + P0C0 C2 = G1 + P1C1 C3 = G2 + P2C2 Estas ecuaciones son recursivas, y la recursión puede ser removida como se indica a continuación: C1 = G0 + P0C0 C2 = G1 + P1C1 = G1 + P1(G0 + P0C0) = G1 + P1G0 + P1P0C0 C3 = G2 + P2C2 = G2 + P2(G1 + P1G0 + P1P0C0) = G2 + P2G1 + P2P1G0 + P2P1P0C0 C4 =G3 + P3C3 = G3 + P3(G2 + P2G1 + P2P1G0 + P1P1P0C0) = G3 + P3G2 + P3P2G1 + P3P2P1G0 + P3P2P1P0C0 Página 44 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A Este resultado muestra que C1, C2, C3 y C4 pueden ser generados directamente de C0 y las entradas. Por esta razón, estas ecuaciones son llamadas Ecuaciones de Acarreo Adelantado. Estas ecuaciones pueden implementarse en un bloque hardware y alimentar con el las entradas de los carry del sumador completo obteniendo un CLA. La figura 4.5 muestra la implementación de tal CLA. D E M Á Q U I N A S X3 Y3 C O M P U T A D O R A S X2 Y2 X1 I I Y1 X0 C0 Y0 C4 Carry Look Ahead Logic (o Calculator) C3 C1 C2 C0 FA FA FA FA S3 S2 S1 S0 Figura 4.5. Un Sumador de acarreo adelantado o CLA de 4 bits. En función de un bloque CLA de n bits podemos implementar una unidad aritmética de n bits de suma y resta como muestra la figura 4.6 X 16 CLA Y 16 F 16 MUX MUXsel Cin S0 Figura 4.6. Unidad Aritmética de Suma y Resta Parte importante de la unidad aritmética son las banderas de resultado o condición de las operaciones. Estas banderas se unen en una palabra de estado del procesador PSW o un registro de banderas FLAGS que es accesible bit a bit, pues se implementa como un conjunto de Flip Flops independientes. La implementación de tales banderas se relaciona mucho con la ALU. Por ejemplo, la bandera Signo o Negativo, toma su valor del MSB o bit de signo del resultado en ALU. La bandera Zero, vale 1 cuando el resultado es 0 por tanto su implementación es la operación AND de todos los bits de resultado negados. La bandera Carry es el acarreo de salida del CLA. 4.4 LA UNIDAD LOGICA El objetivo de la unidad lógica es proveer operaciones lógicas bit a bit. Esto se logra implementar fácilmente empleando arreglos de n compuertas para los i-ésimos bits de la palabra (0 hasta n-1). Otros Docente: Ing. José Díaz Chow Página 45 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . objetivo requerido es la implementación de operaciones a nivel de bits tales como desplazamiento, negación, verificación del valor de un bit en específico y establecimiento de un valor para un bit en específico. Estas operaciones, se pueden implementar como redes de desplazamiento combinacionales o como parte de las funciones de los Registros de Propósito General. La figura 4.7 nos muestra la implementación de una unidad lógica que ofrece dos simples operaciones AND y OR., tomando como base un integrado de 16 compuertas AND y otro de 16 OR. X 16 16 Y AND MUX G 16 OR 16 S0 Figura 4.7 Unidad lógica de dos funciones. 4.5 DISEÑO DE LA ALU Finalmente, si unimos nuestra unidad aritmética con la lógica podemos obtener una ALU completa. La figura 4.8 nos muestra cómo lograr este objetivo, mediante la selección adecuada de la salida en base a las líneas de selección. X Y 16 16 Unidad Aritmética F MUX Z 16 16 Unidad Lógica G S0 S1 Figura 4.8 Diseño a Bloques de la ALU Página 46 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 4.6 EXTENSIONES DE LA ALU Se pueden implementar mejoras y ampliaciones a nuestra ALU sencilla, por ejemplo implementando la multiplicación y la división en Hardware. Algunas implementaciones se resumen a continuación: Operación Multiplicación División Algoritmo / Técnica de implementación Algoritmo de Braun Algoritmos basados en CSA y árboles de Wallace Algoritmo de Booth Usar una ROM como tabla Algoritmo Restoring Divide Algoritmo Non-Restoring Divide SRT (Algoritmo de Sweeney, Robertson y Tochter) 4.7 REGISTROS DE PROPOSITO GENERAL Los registros de propósito general del CPU son una parte importante de la unidad de ejecución pues son el origen y destino de las operaciones. Además, algunas operaciones a nivel de bits se pueden implementan en el seno de estos registros. 4.7.1 Diseño de los Registros de Propósito General o GPR La tarea principal de un GRP es almacenar datos para las operaciones aritméticas. Algunas implementaciones de GRP les permiten manipular los datos almacenados por operaciones de desplazamiento (hacia la izquierda o derecha) a estos se les denomina Registros con capacidad de desplazamiento o Shifting (Shift Register). En el desplazamiento lógico un bit que es desplazado será perdido y la posición vacante será llenada de cero. Ejemplo: Desplazamiento a la derecha. Antes del desplazamiento 0 0 0 0 1 0 11 Después del desplazamiento 00010110 Un desplazamiento lógico de n posiciones a la derecha o a la izquierda de un número sin signo implica multiplicación o división del número por 2n, respectivamente. Docente: Ing. José Díaz Chow Página 47 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . En el caso de desplazamiento aritmético, el bit de signo del número a ser desplazado debe ser retenido para asegurar que el signo del número se mantendrá. Esto es necesario cuando se implementa desplazamiento aritmético a la derecha. En el caso de desplazamiento hacia la izquierda, no hay diferencia entre el lógico y el aritmético. La rotación es útil para la serialización de datos paralelos. Dispositivos periféricos tales como lectoras de casetes esperan datos seriales de 8 bits. En esta situación, la CPU transfiere el contenido de un registro de 8 bits del CPU a la lectora rotando el registro 8 veces. También se emplea la rotación para algunas operaciones de conteo aritmético. Muchos CPUs permiten la rotación con Carry lo que significa que la bandera de Carry forma parte de la rotación. Si la rotación es a la izquierda, el carry entra al bit menos significativo o lsb en tanto que el bit más significativo se almacena en el acarreo. En caso de rotación derecha sucede lo inverso, el carry se almacena en el bit más significativo y el menos significativo pasa al acarreo. Para diseñar un registro de propósito general con capacidad de desplazamiento, vamos a proponer una celda básica S. La organización de esta celda es mostrada en la figura 4.6. En este diseño, un multiplexor de 4 entradas selecciona una de las entradas externas para que sea la entrada D del flip-flop, y la entrada seleccionada aparecerá en la salida del Flip-Flop Q después del pulso del reloj. La entrada CLR es una entrada asincrónica de clear, y limpia el FF en el instante que ésta es puesta en nivel bajo (cero). Entradas Externas Entradas Externas s1 s0 0 1 2 3 MUX CLK s1 s0 CLK 0 1 2 3 s1 s0 s1 s0 S CLK CLK CLR CLR D CLR CLR Q qi Salida qi Salida Organización interna de la celda básica S Diagrama a bloque de la celda básica S Figura 4.9. Celda básica para implementar un Shift Register. Podemos diseñar un GPR completo usando la celda básica S, mediante conexión en cascada, como muestra la figura 4.10. En esta figura, R (Right Shift Serial Input) y L(Left Shift Serial Input) son entradas que permiten implementar el desplazamiento y la rotación según el valor que tengan en cada momento. Página 48 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S X3 C O M P U T A D O R A S X2 I I X1 X0 R (Entrada derecha) L (Entrada izquierda) 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 s1 s1 s0 s0 CLK CLR S3 S2 S1 S0 CLK CLR q3 q2 q1 q0 Registro de Propósito General (GPR) de 4 bits Figura 4.10 Implementación de un GPR de 4 bits con capacidad de Shifting. La tabla de verdad con las operaciones de este registro se presenta en la figura 4.11. Esta tabla muestra que la manipulación de las entradas de selección S1 y S0 pueden causar tres operaciones distintas: Carga Paralela, Desplazamiento a la Izquierda y desplazamiento a la derecha. Si S1S0 = 11, la entradas externas X’s son seleccionadas como las entradas D a los flip-flops. Escogiendo los valores correctos para desplazamiento serial, con las entradas, R y L se pueden realizar operaciones de rotación y desplazamiento lógico y aritmético. Modifique esta tabla para que refleje los valores que deben de tomar R y L para implementar los desplazamientos lógicos y aritméticos y la rotación. D Q CLK CLR Q' Diagrama de bloque del FF tipo D CLR 0 1 1 D X 0 1 Q 0 0 1 Tabla de Funciones del FF tipo D S1 X 0 0 1 1 S0 X 0 1 0 1 CLR CLK 0 X 1 1 1 1 Operación Clear GPR Ninguna Despl. Der. Despl. Izq. Carga Paral. Tabla de Funciones del GPR de 4 bits Figura 4.11 Tablas de operación para el FF tipo D y para el GPR de 4 bits. El registro puede ser cargado con cualquier dato en una forma serial. Por ejemplo, después de cuatro operaciones sucesivas de desplazamiento a la derecha, el dato X será cargado en el registro si el registro está establecido en el modo desplazamiento a la derecha y el dato X requerido es aplicado serialmente a la entrada R. Para algunas aplicaciones, este retardo de n períodos de reloj para la ejecución de una operación, no es permisible, por cuanto se aplican otros métodos asíncronos para diseñar registros que no dependan de un reloj y por lo tanto sean más rápidos. Esos tipos de registro combinacionales se denominan Barrel Shift Registers. El 68020 de Motorola y el 80386 de Intel emplean este tipo avanzado de registros. Docente: Ing. José Díaz Chow Página 49 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . 4.8 ARITMETICA EN PUNTO FLOTANTE Hasta el momento hemos presentado la aritmética de enteros, que es el alcance de la mayoría de los procesadores sencillos como nuestro modelo. Para realizar cálculos en punto flotante, en formato binario, se han desarrollado algoritmos. Muchas máquinas, como el Z80, tienen librerías se software para emular las operaciones en punto flotante sobre su aritmética de enteros. Otras máquinas incluyen procesadores especializados para estos cálculos (llamados coprocesadores matemáticos) como el 8086 de Intel (el coprocesador es el 8087) y finalmente otras, incluyen unidades de cálculo en punto flotante FPUs dentro del mismo CPU, como el 80486, también de Intel. No nos ocuparemos en este curso en profundizar en la aritmética en punto flotante. Solamente anotaremos que las máquinas que la implementan en hardware usan formatos especiales para representar un número en punto flotante. Un número en punto flotante se compone de una mantisa multiplicada por una base elevada a un exponente, por ejemplo: -34.89 * 1012. En formato binario, la base está implícita, por tanto podemos almacenar solamente la mantisa y el exponente. El formato más reconocido es el estándar IEEE 754 que usa mantisa en notación signo-magnitud y el exponente en exceso a M. Existe en simple precisión (32 bits) y doble precisión (64 bits). La figura 4.2 muestra el formato de simple precisión donde el exponente se representa en exceso a 127 (8 bits) y la mantisa en signo-magnitud (1 + 23 bits) Página 50 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 5. LA UNIDAD DE CONTROL 5.1 LA FUNCION DE CONTROL Todas las operaciones del procesador son coordinadas por la unidad de control. Aunque este objetivo puede resultar muy complejo, los diseñadores enfrentan esa complejidad, simplificando el trabajo de la unidad de control a sincronizar la ejecución de pequeñas operaciones denominadas operaciones de control (la antigua táctica de divide y vencerás). El trabajo del CPU consiste en ejecutar instrucciones y por tanto el trabajo de la unidad de control consiste en ejecutar las operaciones de control requeridas para ejecutar cada instrucción. La unidad de control o CU (por sus siglas en inglés), realiza estas operaciones mediante la activación y desactivación de señales, que se transmiten a través de líneas de control. Por ejemplo, para realizar una lectura en memoria, la CU debe activar una señal habilita la memoria y además otra señal que indique el tipo de función de memoria desea realizar, la cual puede ser Lectura o Escritura. En este caso específico: lectura. Cuando la lectura se ha realizado (se ha completado el ciclo de máquina de lectura), la memoria (o más bien su controlador o el controlador del bus) debe activa una señal que permita al procesador detectar la completación de dicha función de memoria. Para efectos de nuestro curso, la llamaremos MFC (Memory Function Completed). Cuando MFC se activa, el procesador puede tener la certeza que el dato solicitado a la memoria, está disponible en el MDR, en nuestro modelo de procesador. Es necesario notar que la CU tiene tanto señales de entrada como de salida, por ejemplo la señal READ es de salida y la señal MFC es de entrada. Otro ejemplo más conocido de señal de entrada puede ser la solicitud de interrupción (INT) que se activa cuando un dispositivo requiere la atención del procesador. Como la unidad de control debe sincronizarse con todos los elementos del CPU que son síncronos (por ejemplo, los registros), requiere de un reloj que genere una base de tiempo para activar o desactivar estas señales en cada pulso de reloj. El conjunto de acciones u operaciones de control que la unidad de control realiza en un mismo pulso de reloj se denomina Paso de control. DECODIFICADOR Bus de Dirección IR R0 PC MAR . . . Para poder entender el funcionamiento de la unidad de control, requerimos definir a detalle la estructura del procesador: ALU, registros de trabajo y de propósito general, así como la estructura de interconexión de los componentes dentro del procesador. Para efectos didácticos vamos a recurrir nuevamente a nuestro modelo sencillo de procesador con un sólo bus común, que se muestra en la figura 5.1. Nótese la existencia de registros auxiliares de trabajo como Y, Z y SOURCE que son inaccesibles al programador y se usan para almacenar datos temporalmente entre pasos diferentes de control. CU MDR Rn-1 Y source MEMORIA Bus de Datos Y Líneas de Control ALU X SP ALU Z Figura 5.1. Organización simple de Procesador con bus único Existen también procesadores con múltiples buses internos que mejoran el desempeño de la ejecución. Docente: Ing. José Díaz Chow Página 51 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . En tal arquitectura de bus común, las salidas de los componentes deben estar aislados galvánicamente del bus para evitar corrupción de los datos. Por ejemplo, dos registros que tengan algún n-ésimo bit con valores lógicos opuestos podrían exponer la línea n del bus a voltajes con diferente potencial provocando pérdida del valor escrito, nótese que esto es técnicamente un cortocircuito que perfectamente podría dañar componentes. Para evitar esto, los registros del procesador están aislados del bus mediante compuertas de alta impedancia o buffers tri-estado. El funcionamiento de tales buffers puede concebirse como compuertas direccionales que permiten el paso de la corriente en una sola dirección cuando su línea de control se activa. Cuando la línea de control del buffer está inactiva, separa la salida del circuito gracias a su muy alta impedancia. Imaginemos que funciona como una especie de switch que permite al dato salir al bus o no, en dependencia del valor de la entrada de control. Un esquema de tales compuertas se ilustra en la figura 5.2. Cada registro, en un sistema de interconexión por buses debe contar, por tanto, con un mecanismo para controlar su entrada y su salida. Normalmente para la salida se emplean las compuertas de alta impedancia mencionadas en el párrafo anterior. En la entrada puede usarse un MUX (recordemos de la unidad anterior la construcción del GPR) en lugar de una compuerta de alta impedancia. La unidad de control, tendría a su cargo, el coordinar las entradas y las salidas de cada registro, PC R0 para lo cual emplearía las líneas de activación de tales x x compuertas. Por ejemplo, para un registro Ri, La compuerta de entrada se activa mediante la señal Riin. Supongamos que PC R0 nuestras compuertas se activan con lógica positiva, entonces, si x x esta señal Riin está en 0 lógico, la compuerta está bloqueada o PC R0 R1 en alta impedancia, evitando cambios en el contenido del Y x x registro, pero cuando está en 1 lógico, permite que el contenido del bus se cargue al registro Ri. La compuerta de salida es R1 Y activada por la señal Riout, Si esta señal está en un 0 lógico, aísla x la salida del registro del bus, pero si está en 1 lógico escribe el R1 R2 contenido de Ri en el bus. x X Y in in out out in in out in Es clave comprender que no es permitido activar dos compuertas de salida en el mismo instante de tiempo (o pulso de reloj del procesador), pues no tiene sentido, lo que lograríamos es corromper los datos como hemos expuesto anteriormente. Por otro lado, sí podemos “copiar” el contenido del bus en diferentes registros a la vez, es decir, podemos activar las señales Riin de varios registros en un mismo paso de control, pero sólo una señal Riout sobre un mismo bus. ALU Zin x R2 x R2out Z Zout x Figura 5.2. Manejo de Registros por compuerta 5.2 OPERACIONES BASICAS DE CONTROL En nuestro modelo sencillo de procesador y en muchos procesadores reales, una instrucción no puede realizarse de una sola vez en un único pulso de reloj, por limitaciones de diseño u otras razones físicas como las comentadas en el párrafo anterior respecto al bus; sino que se requiere de varios pasos de ejecución. En cada uno de estos pasos se realiza una o más operaciones básicas. Para que se realice cada una de estas Página 52 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I operaciones se deben activar una serie de señales de control (como las de las compuertas de los registros) y apagar otras, de forma que la acción deseada se logre en ese instante. Cada uno de estos pasos se ejecuta en un ciclo de reloj y se denomina “paso de control”. Como hemos dicho: una instrucción se ejecuta en varios pasos de control. En cada paso de control se ejecutan una serie de operaciones básicas. La CU debe poder controlar todas estas operaciones básicas en función de los pasos de control. Ejemplos de las operaciones básicas primordiales de la unidad de control, son: Transferir el contenido de un registro a otro. Leer o escribir una palabra en la memoria. Ejecutar una operación de la ALU. Incrementar el PC. Modificar el PC. Verificar el estado de las solicitudes de interrupción. Verificar / establecer el estado de las banderas y códigos de condición. Limpiar, verificar o establecer bits específicos de registros auxiliares (como Y) Decodificar una instrucción. Veamos ahora, por ejemplo, qué acciones o pasos de control se deben realizar para transferir valores entre registros. En el caso específico de dos registros, supongamos que deseamos trasladar el contenido del registro R1 a R2, para esto se requieren las siguientes acciones que se ejecutan en un solo paso de control: Habilitar la compuerta de salida de R1 para poner su contenido en el bus Habilitar la compuerta de entrada de R2 para permitir que el contenido del bus se copie en él. De forma simbólica podemos escribir: Paso 1 Acciones R1out, R2in Otra tarea típica durante la ejecución es la realización de una función de la ALU, por ejemplo, sumar R1 + R2 (R2 R1 + R2). Para esto se necesita: Poner el valor de R2 en el bus mediante R2out Leer el valor del bus en el registro auxiliar de ALU “Y” conectado al puerto Y de la misma. Poner el valor de R1 en el bus mediante R1out Activar la operación suma (ADD) de la ALU y activar Zin para guardar en este registro auxiliar de la ALU el resultado Poner el valor de Z en el bus mediante Zout Copiar el valor del bus en R2 Formalmente: Docente: Ing. José Díaz Chow Página 53 A R Q U I T E C T U R A Paso Acciones 1 2 3 R2out, Yin R1out, ADD, Zin Zout, R1in D E M Á Q U I N A S C O M P U T A D O R A S I I . 5.3 PASOS DE CONTROL PARA LA EJECUCION DE UNA INSTRUCCION Anteriormente en nuestro curso se ha mencionado que la tarea de un procesador secuencial como el nuestro, es ejecutar constantemente un ciclo de instrucción. En este ciclo de instrucción existen dos fases: carga (fetch) y ejecución (execute). En la primera se trae la próxima instrucción a ejecutar desde la memoria y en la segunda se ejecuta. Nótese que la fase fetch es idéntica para todas las instrucciones pero la fase execute difiere para las distintas instrucciones. Una tarea importante en el diseño de la CU de todo procesador es establecer la estrategia de ejecución, es decir, qué pasos generales seguirá el procesador para ejecutar las instrucciones. Esta estrategia está íntimamente ligada con la arquitectura y la organización de cada procesador, por lo cual en nuestro curso, nos ajustaremos a nuestro modelo de procesador secuencial sencillo. Desde el punto de vista de arquitectura, debe definirse el conjunto de instrucciones, enfatizando en los modos de direccionamiento y cómo se calcula la dirección efectiva y obtiene el operando, así como el diseño del formato de instrucción y forma de almacenamiento en la memoria. Desde el punto de vista organizativo, interesa definir qué registros de trabajo se emplearán para auxiliar en las operaciones y en qué orden se realizarán éstas. Nuestro conjunto de instrucciones, debe definir los modos de direccionamiento que serán soportados. Para efectos del curso consideraremos solamente: Inmediato, de registro (directo e indirecto), de memoria (absoluto), autoincremento y autodecremento (con sus indirectos), el modo de índice (con su indirecto) y el relativo al PC. Sin embargo nuestro mayor énfasis estará en los modos basados en registros. Continuando la definición de nuestra arquitectura, definimos nuestra palabra de procesador en 16 bits, y éste será también el tamaño de los registros, direcciones de memoria y las instrucciones. Asimismo, para simplificar el acceso a memoria, consideraremos que ésta es direccionable por palabra y no por byte. De esta forma, cuando un valor no quepa dentro de los 16 bits del formato de instrucción, se empleará la palabra siguiente a la instrucción para almacenar tal valor. Por ejemplo, la instrucción Add R1, (1000) que suma el valor de R1 con el contenido de la celda de memoria 1000 y guarda su resultado en la celda de memoria 1000, debe almacenarse como programa en lenguaje de máquina en dos palabras, la primera de ellas almacena la instrucción en sí y la segunda almacena el 1000. Otro ejemplo más complicado es: ADD 1000(R1), (2000). En este caso, se emplea modo de índice en el operando fuente y modo absoluto en el destino. Esta instrucción se almacena en tres palabras, la primera almacena la instrucción en sí, la segunda almacena el 1000 del operando fuente y la tercera el 2000 del operando destino. Sin embargo, obsérvese que en algunos casos, el operando cabe dentro del formato de instrucciones y por tanto no se requiere de una palabra adjunta para él. Por ejemplo algunas instrucciones con modo inmediato o relativo que tienen un valor numérico de 8 bits, como muestra la figura 5.3. Página 54 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S 6 Bits 2 Bits 8 Bits CO MD1 V I I Figura 5.3. Ejemplo de formato inmediato - relativo En base a lo anterior, note que los operandos pueden requerir operaciones ALU para el cálculo de la dirección efectiva (EA) y varios accesos a memoria para traer el valor del operando. Por este motivo, al traer el operando fuente hay que guardarlo en un registro temporal, en nuestro caso en source. Ahora, podemos pasar a definir los pasos de la estrategia de ejecución: Fase Fetch: o Poner el valor del PC en el MAR y mandar a leer o Incrementar el PC y esperar MFC o Pasar el contenido del MDR al IR y Decodificar. Fase Execute o Calcular EA del primer operando, si necesario o Trasladar el primer operando a SOURCE o Calcular EA del segundo operando, si necesario o Traer el segundo operando al CPU si no está en él y ponerlo en Y(ALU) si necesario. o Efectuar la operación ALU (si pertinente) o Trasladar el resultado al destino o Verificar Solicitudes de Interrupción. A continuación se ilustrarán los pasos de control para traer la próxima instrucción, cuya dirección siempre debe estar en el PC (Fase Fetch) Paso Acción u Operaciones de Control 1 2 3 PCout, MARin, READ, Clear Y, Set C, ADD, Zin Zout, PCin, WMFC MDRout, IRin Otros ejemplos de Ejecución de instrucciones se listan a continuación. Docente: Ing. José Díaz Chow Página 55 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . Secuencia de Control para la instruccion de ADD R1, R2 Paso Acción u Operaciones de Control 1 2 3 4 PCout, MARin, READ, Clear Y, Set C, ADD, Zin Zout, PCin, WMFC MDRout, IRin R1out, SOURCEin 5 6 7 8 R2out, Yin SOURCEout, ADD, Zin Zout, R2in End Secuencia de Control para la instruccion de ADD (R1), R2 Paso Acción u Operaciones de Control 1 2 3 4 5 6 6 7 8 PCout, MARin, READ, Clear Y, Set C, ADD, Zin Zout, PCin, WMFC MDRout, IRin R1out, MARin, READ, WMFC MDRout, SOURCEin R2out, Yin SOURCEout, ADD, Zin Zout, R2in End Un tipo de instrucción especial son las de salto. Las de salto condicional y relativo, son especialmente complicadas. Veamos unos ejemplos de nuestro procesador modelo: Br o Salto relativo incondicional. Esta instrucción tiene un formato como el de la figura 5.3. El valor V de 8 bits debe extenderse a 16 bits. Para obtener el operando basta sacarlo de los 8 bits menos significativos del IR, que se denota como campo de bits como IR[7…0] o más simplificadamente, IR(V). A continuación detallamos los pasos de control que se requieren para ejecutar esta instrucción. La figura 5.4 muestra la unidad de extensión de signo que se requiere para permitir llevar al bus de 16 bits los 8 lsb del IR. IR 7 0 8 Sign Extension IRout Al bus Figura 5.4 Extensión de Signo Página 56 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Secuencia de Control para una instruccion de Ramificación Incondicional Paso Acción u Operaciones de Control 1 2 3 4 5 6 7 PCout, MARin, READ, Clear Y, Set C, ADD, Zin Zout, PCin, WMFC MDRout, IRin PCout, Yin IR(V)out, ADD, Zin Zout, PCin End Docente: Ing. José Díaz Chow Página 57 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . Un ejemplo más completo es el caso del BRN (Branch on Negative) que modifica el valor del PC sólo si la bandera de condición N está establecida a 1. Los pasos de control necesarios son los mismos que para BR excepto que el paso 4 debe modificarse como se muestra: Caso de la Ramificacion Condicional "Branch On Negative" BRN El paso 4 se cambia por: 4 IF N Then IF N Then END PCout, Yin Las banderas de condición así como muchos códigos de condición se almacenan en un registro especial, llamado Processor Status Word en muchas máquinas, por ejemplo la PDP-11 que tiene una instrucción BRN, como la de nuestro procesador modelo, tiene la PSW que se muestra en la figura 5.5. La bandera N o Negative se establece a 1 si el resultado de una operación aritmética fue negativo. En muchos procesadores, como el Z80 y el i8086, esta bandera se denomina S o Sign. PSW (Processor Status Word ) en la PDP-11 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 T N Z V C Modo Actual Modo Anterior Banderas de Condición Prioridad Trap Figura 5.5 Palabra de Estado de la PDP-11 Continuando con la implementación de nuestra CU, debe ponerse especial interés en la espera a que la memoria (que normalmente es más lenta que el CPU) nos entregue la palabra que estamos leyendo. Esto se logra mediante la señal WMFC activada para esperar un dato a leer desde la memoria. Cuando esta señal se activa, no se debe continuar la generación de nuevas señales de control, es decir, las señales quedan “congeladas” hasta que el control de la memoria active la señal MFC indicando que se completó su función. Recuerde que la Memoria es un dispositivo asíncrono respecto al reloj del procesador y por tanto, la implementación de esta señal debe sincronizar el próximo paso de control con el reloj principal del procesador. Una vez que hemos especificado la función y los procedimientos que debe seguir la unidad de control, la próxima pregunta es cómo implementarla. Existen dos formas, implementarla directamente en hardware, como una máquina de estados o empleando microprogramación. Página 58 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 5.4 UNIDAD DE CONTROL FIJO ... IR ... El indicador del paso de control actual se puede implementar mediante un contador de los pulsos del reloj base que se restablezca a cero con cada señal End a fin de volver al primer paso de la fase de carga fetch. La figura 5.6 muestra la organización a bloques de tal unidad de control. BANDERAS DE CONDICION ... En términos generales, la unidad de control puede verse como una caja negra que recibe una serie de entradas y genera una serie de salidas en un instante de tiempo. Las entradas son : a) El tipo de instrucción que se está ejecutando (IR), b) un indicador del paso de control actual y c) el ORGANIZACION DE LA UNIDAD DE CONTROL estado de la máquina que se obtiene en CONTADOR DE PASO CLCK DE CONTROL función de las banderas y códigos de condición. ... CODIGOS DE CONDICION DECODIFICADOR / CODIFICADOR ... Señales de Control En este caso, la CU actúa como un gran Figura 5.6 – Organización de la unidad de control decodificador/codificador que decodifica la instrucción en el IR, el paso de control y el 1.1.1.1 FIGURA 5.6 DIAGRAMA A BLOQUES estado de la máquina y codifica las señales de control. Si separamos estas funciones, podemos especificar DE LA CU mejor el diseño de la CU en función de la función principal: generación de las señales de control para cada paso de cada instrucción. En este enfoque más detallado, se hace evidente la necesidad de una señal de reset del contador de paso que no es más que la señal End y la necesidad de otra señal de habilitación de conteo que llamaremos RUN. Esta última señal puede ser muy útil en la implementación de la espera efectiva de MFC. Cuando RUN está en 1, el contador incrementa, en caso contrario no avanza. La figura 5.7 muestra en detalle esta organización. CONTADOR DE PASO DE CONTROL CLCK ... DECODIFICADOR DE PASO ... T1 T2 Tn I1 DECODIFICADOR DE INSTRUCCIONES ... BANDERAS DE CONDICION CODIGOS DE CONDICION CODIFICADOR Im ... IR ... I3 ... I2 ... El bloque codificador o generador de señales de salida tiene ahora como entrada señales Ii que le indican la instrucción y señales Tj que le indican el paso actual así como las banderas y códigos de condición. Ahora bien, cómo se genera cada señal de salida. Un enfoque bastante simple consiste en realizar un inventario de todas las señales de control necesarias y luego determinar las expresiones algebraicas lógicas para cada una de ellas, por ejemplo, la señal Zin, se activa siempre en el paso 1 de la fase fetch, independientemente de la instrucción que sea, también en el paso 6 de la instrucción ADD, el 5 de BRN, etc; por tanto la expresión de Zin sería: RUN END Señales de Control Figura 5.7 Organización detallada de la CU Zin = T1 + ADD.T6 + BRN.T5 + .... Docente: Ing. José Díaz Chow Página 59 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . End, por su parte sería: End = T8.ADD + T7.BR + T4.(~N).BRN + T7.N.BRN+ … Así se obtienen las de todas las señales de control y la generación se señales de la CU se reduce a implementar los circuitos combinacionales de estas expresiones como se muestra en la figura 5.8 con los ejemplos Zin y End. Generación de la señal de control END Generación de la señal de control Zin N T5 T8 ADD JR T7 ... ... Zin BRN T7 ... T1 T6 BR N T4 ... ADD END Figura 5.8 Implementación de algunas señales de control Ahora estamos en posición de implementar la espera efectiva iniciada por la señal WMFC, lo cual se hace mediante el auxilio de la señal RUN. Sabemos que la señal RUN nos puede permitir “enfriar” el contador de pasos de control hasta que se establezca MFC y por tanto ésta debe ser 1 cuando no hay espera a MFC y 0 cuando sí la hay. El simple circuito de la figura 5.9 me permite implementar estas condiciones, como el lector puede fácilmente comprobar. ADD Generación de la T4 ... T2 señal RUN ... Sin embargo, debido a la asincronía entre Memoria y CPU, dicha señal podría establecerse en un momento inadecuado, como muestra el diagrama de temporización de la figura 5.10, por tanto se requiere sincronizar la señal MFC para que “espere” al reloj base, lo cual se logra anexando un elemento sincrónico como un FF tipo D. Esta solución se muestra en la figura 5.11 WMFC RUN MFC Figura 5.9 Implementación de WMFC y RUN. Página 60 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Sincronización de MFC con el Reloj Base MCLK WMFC CLK WMFC RUN MFC MFC D Q RELOJ BASE RUN READ T1 T2 T3 Temporización de las señales de control durante la traída de las instrucciones Figura 5.10 Necesidad de sincronización de MFC. Figura 5.11 Sincronización MFC con el reloj base Finalmente, podemos acotar que para simplificar la circuitería, en procesadores reales, todas las señales de control se implementar en bloques PLA, como muestra la figura 5.12. Existen otras formas y técnicas más complejas y refinadas para implementar tales unidades de control alambrado. PLA ( PROGRAMABLE LOGIC ARRAY ) ... ARREGLO AND ... IR ... CONTADOR DE PASO DE CONTROL ... BANDERAS Y CODIGOS DE CONDICION ARREGLO OR ... Señales de Control Figura 5.12 Implementación de un controlador de secuencia con un chip VLSI Ejercicio: 1. Investigue qué tipo de unidad de control predomina en máquinas RISC y cuál en máquinas CISC. Argumente las razones. 2. Establezca ventajas y desventajas de la CU alambrada. Docente: Ing. José Díaz Chow Página 61 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . 5.5 UNIDAD DE CONTROL MICROPROGRAMADA Hemos estudiado la función y diseño general de una unidad de control y definido una técnica sencilla para implementar una CU Fija o alambrada. Ahora estudiaremos otro enfoque, la CU microprogramada. Si hacemos un recuento de la función de nuestra CU como caja negra, se evidencia que solamente requerimos activar en cada lapso de tiempo o paso de control, las señales de control adecuadas para ejecutar la instrucción. Estas señales de control, en realidad son responsables de ejecutar una serie de operaciones de control o micro-operaciones que ejecutan la instrucción. Al agrupar y organizar el conjunto de señales de control, puede visualizarse que en cada paso de control, algunas de ellas están activadas (en 1 lógico) y el resto desactivadas (0 lógico) Si anotamos los estados de estas señales con ceros y unos, veremos que forman un patrón binario, como nos muestra la figura 5.13. A este arreglo de estados de las señales de control en un paso de control se le denomina palabra de control o cw. Paso PCin PCout Yin 1 2 0 1 1 0 0 0 … … … … MARi READ MDRout IRin ClrY SetC ADD Zin Zout R1in R1out R2in R2out WMFC END … 1 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 … … … … … … … … … … … … … … … … … n … Figura 5.13 Correspondencia Señal de control-bit de cw Así, ejecutar una instrucción se limitaría a cargar secuencialmente las Cw en cada paso y activar las señales en uno y desactivar las señales en cero, o más bien “cargar” el valor de la Cw en la salida de la CU. La secuencia de Cws para cada instrucción se llamaría Microprograma o programa y cada Cw se llamaría instrucción. Claro que necesitamos entonces, almacenar los programas en una memoria permanente de muy alta velocidad (generalmente una ROM) dentro de la CU. A esta memoria se le llama memoria de control. Página 62 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I PCin PCout Yin MARin READ MDRout IRin CLEAR Y SET C ADD Zin Zout R1in R1out R2in R2out SOURCEin SOURCEout WMFC End La figura a continuación muestra el microprograma para la instrucción ADD R1, R2. 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 CW … 1 2 3 4 5 6 7 8 … … … … … … … … … … … … … … … … … Figura 5.14 Microprograma para ADD R1, R2 Para implementar la Unidad de Control microprogramada, se requiere entonces de todos los microprogramas de todas las instrucciones del CPU almacenados en una memoria de control y un mecanismo que permita cargar el microprograma adecuado para la instrucción que se carga en el IR y ejecutar dicho microprograma. Este mecanismo se denomina secuenciador de microprograma o microinstrucciones. El secuenciador de microprograma necesita determinar la dirección inicial del microprograma de la instrucción en el IR, lo cual se logra mediante un decodificador/codificador que permite obtener dicha dirección en función del CO de la instrucción. También requiere recorrer el microprograma, para lo cual se provee un microPC (PC) que apunta siempre a la próxima instrucción a ejecutar. El secuenciamiento entre instrucciones se puede lograr de varias formas, la más sencilla es que éstas estén almacenadas secuencialmente en la memoria el PC tenga la capacidad de auto-incrementarse. Otra técnica muy empleada consiste en agregar a la instrucción un campo de próxima instrucción, que hace más sencilla la implementación pero deja bastante trabajo al programador del sistema. Nosotros seguiremos la primera opción. La figura 5.15 muestra el diagrama a bloques de nuestro secuenciador de microinstrucciones. Muchas instrucciones, sin embargo, requieren verificar códigos y banderas de condición, así como modificar el flujo del programa. Entonces, debe agregarse a las Instrucciones la capacidad de Verificar tales códigos y banderas así como poder ramificarse, es decir, no continuar en la próxima instrucción sino en otra (recordemos el caso de BRN). A este cambio en el flujo de microinstrucciones se denomina microrramificación (ramificación o Branch). Docente: Ing. José Díaz Chow IR Generador de Dirección inicial PC Memoria del Programa cw Figura 5.15 Secuenciador de microinstrucciones Página 63 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . Para permitir microrramificaciones, deben agregarse algunos campos de bits extra en la palabra de control Cw que permitan definir si la ésta es una Ramificación o si puede ramificarse en función de alguna condición. También deben definirse qué códigos o banderas de condición se evalúan y alguna forma de obtener la dirección de salto o modificación al PC. A partir de esto, podemos rediseñar nuestro secuenciador de forma más detallada: IR Generador de Dirección inicial y de ramificación Banderas de Condición Códigos de Condición PC Memoria del Programa cw Figura 5.16 Secuenciador de microinstrucciones más detallado Antes de secuenciador, necesitamos definir algunas reglas: pasar a analizar la operación del La fase fetch, que es común a toda instrucción, será definida como un programa independiente que comienza en la primera celda de la memoria de control, así al encender la máquina el PC se inicializa en 0 de forma tal que cargue la instrucción que está en el PC. La señal End debe poner el PC a 0. Al cargarse una nueva instrucción en el IR, el generador de direcciones debe cargar en el PC la dirección inicial de la rutina que ejecuta dicha instrucción. Las Ramificaciones podrán modificar el valor del PC, ya sea cargando un nuevo valor o cambiando algunos bits del mismo, como se estudiará más adelante. Ahora, con este detalle sí es posible explicar cómo se implementa la ejecución de instrucciones que requieren verificar el estado de las banderas de condición, ejemplo clásico es la instrucción BRN estudiada anteriormente. El paso de control 4 de su desarrollo requiere de una Ramificación condicional que cambie el flujo del programa en función del valor de la bandera N, pasando al paso 8 con End, si no habrás salto o continuando en el paso 5 si debe modificarse el PC. Supongamos que el microprograma de la instrucción BRN comienza en la celda 20 de la memoria de control, entonces, la implementación de ésta instrucción podría realizarse escribiendo un microprograma de la siguiente manera: Página 64 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I MicroPrograma Para la Instrucción BRN Dir MicroInstrucción 0 1 2 3 PCout, MARin, READ, Clear Y, Set C, ADD, Zin Zout, PCin, WMFC MDRout, IRin Branch Dirección Inicial del Prog. adecuado 20 21 22 23 24 Si N entoncesBranch a 24 PCout, Yin IR(V)out, ADD, Zin Zout, PCin End Es importante notar que la PC microinstrucción de la dirección 3 se encarga de modificar el PC con la salida del generador de dirección inicial que bien puede estar 0 0 0 0 0 0 0 1 0 0 0 1 implementado en PLA, en la práctica en esta Instrucción lo que ocurre es PC = 20. También la 11 10 9 8 7 6 5 4 3 2 1 0 Instrucción en la celda 20 es una Ramificación que cambia el valor del PC, pero con un valor fijo en función de una condición. En la práctica esto se N N logra modificando los bits del PC selectivamente. La figura 5.17 nos puede ayudar a comprender Figura 5.17. Modificación del PC en BRN esto mejor. Durante la ejecución de la instrucción 20, el PC vale 21 pues se auto incrementó. Supongamos que el PC es de 12 bits y que se codifica en octal (3 bits por dígito), entonces el valor 21 del PC, se codificaría como muestra la figura. Si N es 0 no debe haber salto y por tanto el PC debe modificarse para valer 24, sino debe conservar su valor de 21. Esto se logra estableciendo el valor del bit 2 PC a ~N y el bit 0 del PC a N (PC2 ~N, PC0 N) como muestra la figura 5.17. Un caso de necesario estudio es la señal WMFC. Aunque el control programado sea más lento de ejecutar que el alambrado, las memorias de control suelen ser muy pequeñas y mucho más rápidas que la principal, por lo cual siempre será necesario inhibir la generación de las señales de control de la Instruccióni+1 si la Instruccióni activó la señal WMFC, hasta que la memoria principal complete su ciclo de lectura y se active la señal MFC. Existen dos enfoques: Polling de la señal MFC (Ciclo que verifica el estado de la señal) Hardware de Inhibición con un FF establecido por WMFC y Restablecido por MFC. Docente: Ing. José Díaz Chow Página 65 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . La Figura abajo muestra un posible implante del segundo acercamiento, empleando un FF tipo D. El esquema propuesto hasta el momento es sencillo sin embargo se presta a desperdicio que podrían Banderas de Condición Generador de Dirección inicial y de ramificación IR Códigos de Condición INC PC cw CLK D WMFC Q' Memoria del Programa Generador de Señales de Control ... MFC Señales de Control Q E Figura 5.18 Implementación de la espera efectiva de WMFC hacer crecer mucho la memoria de control, por ejemplo, note que por regla general todas las instrucciones han dejado el último paso de control sólo para la señal END. La tarea de esta señal es restablecer el PC e indicar la finalización de la instrucción actual. Se puede ahorrar una instrucción, activando esta señal de último en el paso anterior. Otro caso es el posible desperdicio cuando una instrucción posee múltiples modos, pues el diseñador puede estar tentado a escribir un microprograma para cada combinación posible de operandos, sin embarg indicado dentro del mismo microprograma. Otro aspecto a considerar es la longitud de Cw. En realidad, tener un bit por cada señal de control, es un gran desperdicio. En el esquema de CPU de un solo bus de nuestro modelo, se requiere de algunos Registros auxiliares como SOURCE, DESTINE, TMP, SP, Y y Z; se tienen 8 GPR: R0…R7 lo cual nos da unas 29 señales in/out de registros. Por otro lado, las señales de los registros propios del CPU, suman otras 7 señales de manejo por compuerta. Si adicionamos las de Memoria READ/WRITE, las 16 funciones ALU, Set/Reset C, Clear Y, Set Y(0, 1, 2 ) y algunas 16 Funciones además de las señales y banderas, nos da unas 60 señales, con lo cual el tamaño de palabra es bastante grande. Si observamos, muchas señales no se emplean al mismo tiempo y bastantes de ellas son mutuamente excluyentes. Por ejemplo, sólo se activa una función de ALU a la vez. Según el esquema de bus único, no se pueden dar dos puede activarse una función de memoria a la vez, READ o WRITE. Podemos agrupar las señales mutuamente excluyentes en grupos donde en lugar de haber in bit por señal, hay un código o patrón binario indica qué señal se activa en un momento dado. Obviamente, es necesario designar una combinación neutra que implique no activar ninguna señal del grupo (excepto para las funciones de la ALU). Por ejemplo, para las 16 funciones de la ALU, sólo son necesarios 4 bits (ahorro de 12 bits) de código. Todas las señales de salida al bus son excluyentes y pueden formar un solo grupo, donde el código 0 signifique que no hay salida al bus en ese paso de control. Así sucesivamente, se pueden agrupar las señales según sea posible. El ejemplo a continuación nos muestra el agrupamiento parcial de señales de Página 66 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I control en campos (Fi) en función de algunos de los ejemplos anteriores. Note que aquí se consideran sólo cuatro GPR en lugar de ocho. Los GPR pueden organizarse en un Banco o archivo de Registros (BR) con lo cual, solo se requerirían 3 bits de selección (R0 ... R7) de registros y 2 señales de control BR in, BRout para su manipulación. F1 (4 bits) F2 (3 bits) 000: Nada 001: PCin 010: IRin 011: Zin 100: R0in 101: R1in 110: R2in 111: R3in 0000:Nada 0001: PCout 0010: MDRout 0011: Zout 0100: R0out 0101: R1out 0110: R2out 0111: R3out 1000: SOURCEout 1001: DESTINEout 1010: TMPout 1011: IR(V)out F7 (1 bit) … F3 (2 bits) F4 (2 bits) F5 (4 bits) F6 (2 bits) 00: Nada 00: Nada 0000: Add 00: Nada 01: MARin 10: MDRin 11: TEMPin 01: Yin 10: SOURCEin 11: DESTINEin 0001: Sub 0010: Div 0011: Mult 0100: And 0101: Or 0110: Xor 0111: … 1000: … 1001: … 1010: … 1011: … 01: READ 10: WRITE F8 (1 bit) F9 (1 bit) F10 (1 bit) 0: Nada 0: C = 0 0: Nada 0: Continue 1: Clear Y 1: C = 1 1: WMFC 1: End ... … También se podría llegar a un máximo nivel de codificación, agrupando todas las señales en un solo grupo, y codificando todas las posibles combinaciones. En teoría, tal arreglo daría menos líneas necesarias para la Cw, por lo cual a tal arreglo se le denomina organización vertical de microinstrucciones, por otro lado, cuando deparamos un bit por señal de control tenemos una organización horizontal. El ejemplo anterior, con agrupaciones parciales se denomina organización híbrida o mixta. A mayor grado de agrupamiento, el hardware de decodificación se hace más complejo. Una buena técnica de diseño consiste en comenzar con una organización horizontal e iterar la creación de agrupamientos hasta obtener la mejor relación entre tamaño de la Cw, complejidad del hardware y desempeño. Docente: Ing. José Díaz Chow Página 67 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . 5.6 MICROPROGRAMA Y MICRORRAMIFICACIONES Los diseñadores de máquinas CISC aprecian mucho la técnica de microprogramación porque puede permitir que una misma instrucción emplee varios modos de direccionamiento dando flexibilidad en el manejo de los operandos, lo cual es difícil de hacer en RISC dado que se desea mantener lo más simple y rápida posible a la CU, empleando control fijo. A mayor cantidad de modos de direccionamiento, mayor cantidad de microprogramas para la misma instrucción, veamos el ejemplo la instrucción ADD de nuestro modelo de procesador sencillo, en el formato “R” que se muestra en la figura 5.19 puede tener para ambos operandos modo directo e indirecto de registro, directo e indirecto de índice, directo e indirecto de autoincremento y autodecremento; dando por resultado ocho modos en cada operando y por consiguiente 64 microprogramas sólo para esa instrucción, con lo cual el número de microrrutinas a almacenar vuelve a ser otra vez enorme. 15 14 CO 13 12 11 10 MD1 9 8 6 7 5 R1 4 MD2 3 2 0 1 R2 Figura 5.19 Formato R del procesador X Notemos, sin embargo, que mucho del código de estos microprogramas sería redundante. Por ejemplo, la fase fetch es idéntica en todas las instrucciones y podría implementarse como un microprograma aparte iniciando en la dirección 0 de la memoria de control. Las instrucciones comenzarían en la traída del primer operando. Aprovechando las microrramificaciones, podríamos hacer un único programa para todas las instrucciones que comparten código común y agregar las micro ramificaciones que permitan seleccionar el camino correcto en cada caso, por ejemplo el ADD mencionado podría tener un camino para cada modo y luego unirse en un tronco común. Podemos valernos de un diagrama de flujo de datos para apreciar de forma clara la estructura del microprograma con micro ramificaciones para cada modo, como se muestra en la figura 5.20 para nuestro ejemplo. Cada rectángulo equivale a una microinstrucción de acciones de control y cada intersección a una microinstrucción de micro ramificación. A veces es requerido que una microinstrucción de acciones de control también pueda modificar el PC, lo cual es permitido. Todas las microinstrucciones se rotulan con su dirección en la memoria de control (sobre la esquina superior derecha). El ejemplo de la figura 5.20 emplea direcciones octales y un PC de 12 bits. Página 68 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I START 000 MAR <- [PC]; READ; Z <- [PC] + 1 001 PC <- [Z] 002 PLA, IR <- [MDR] PC, AR <-[PLA] 003 161 MAR <- [PC]; READ; Z <- [PC]+1 141 162 142 MAR, Rsrc <- [Z]; READ PC <- [Z] 121 MAR <- [Rsrc];READ; Z <-[Rsrc] + 1 Z <- [Rsrc] - 1 111 MAR <- [Rsrc]; READ 122 Rsrc <- [Z] 163 Y <- [MDR] 164 Z <- [Y] + [Rsrc] 165 MAR <- [Z]; READ 166 MAR <- [MDR]; READ 167 101 SOURCE <- [MDR] SOURCE <- [Rsrc] 170 200 261 MAR <- [PC]; READ; Z <- [PC]+1 241 262 242 MAR, Rdst <- [Z]; READ PC <- [Z] 221 MAR <- [Rdst];READ; Z <-[Rdst] + 1 Z <- [Rdst] - 1 211 MAR <- [Rdst]; READ 222 Rdst <- [Z] 263 Y <- [MDR] 264 Z <- [Y] + [Rdst] 265 MAR <- [Z]; READ 266 MAR <- [MDR]; READ 267 201 Y <- [MDR] Y <- [Rdst] 270 Z <- [Y] + [SOURCE] 271 272 MDR <- [Z]; WRITE 273 Rdst <- [Z] STOP Figura 5.20 Diagrama de flujo de la Instrucción ADD Docente: Ing. José Díaz Chow Página 69 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . Haciendo un recuento del tipo de micro ramificaciones tenemos: 1. 2. 3. 4. Ramificaciones de dirección amplia ( Selección de dirección inicial) Ramificaciones de asignación de PC ( Modifican el PC: PC nn) Ramificaciones de modificación de bits del PC (PCi [0|1] ) Ramificaciones mixtas ( Mezclan el comportamiento de varios tipos anteriores) En base al DFD de la instrucción ADD, que define el microprograma genérico para la misma, podemos simular la ejecución de la instrucción ADD (R7)+, R3. El microprograma se representa de manera similar a los pasos de control, representando en lugar de pasos, la dirección de la microinstrucción ejecutada como se muestra en el ejemplo. La figura 5.21 muestra el contenido del IR para esta instrucción. Note que las interrupciones de las líneas del DFD son activaciones de la señal WMFC. CONTENIDO DEL IR 15 14 13 12 11 10 9 8 6 7 5 4 3 2 0 1 0 1 1 0 0 1 0 1 1 1 0 0 0 0 1 1 MD1 CO R1 MD2 R2 Figura 5.21 Codificación de Instrucción ADD (R7)+, R3 Dirección MicroInstrucción (octal) 000 001 PCout, MARin, READ, Clear Y, Set C, ADD, Zin Zout, PCin, WMFC 002 MDRout, IRin 003 121 Br {PC[PLA]; PC 101, PC5,4 [IR11,10], PC3 [IR11].[IR10]. [IR9]} [IR 3]}121[IR 10].[IR 9]} Y, Set C, ADD, Zin R7out , MARin11, ].[IR READ, Clear 122 Zout, R7in 123 166 Br {PC 166; PC0 [ IR9 ]}, WMFC MDRout, MARin READ, WMFC 167 MDRout, SOURCEin 170 Br {PC 201, PC5,4 [IR5,4], PC3 [IR5] . [IR4] . [IR3]} R3out, Yin 201 202 270 271 273 Br {PC 270} SOURCEout, ADD, Zin Br {PC 272; PC0 [IR5] . [IR4] . [IR3]} Zout, R3in, End. Es interesante notar las modificaciones al PC vía los bits del IR para la selección del camino correcto según el modo. Como el lector podrá notar, la traída del primer operando está en secciones de la memoria de control con direcciones que inician con 1 y los del segundo en direcciones que inician con 2. El modo de registro directo está en un camino definido por el segundo dígito de la dirección Página 70 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I en 0 y el indirecto en 1. El modo de autoincremento está en 2 y el auto decremento en 4. El modo de índice está en la línea del segundo dígito en 6. Es interesante que precisamente estos son los códigos del modo de direccionamiento del procesador. El bit menos significativo de los tres que conforman el campo de MD es el bit de indirección, si está en 1 el modo es indirecto. En instrucciones complejas como BRN, la modificación de bits del PC se hace también en función de las banderas y códigos de condición, como N. La traída de las microinstrucciones desde la memoria de control puede ralentizar mucho el desempeño, por lo cual la memoria de control debe ser lo más rápida posible. En algunos procesadores se acelera este proceso haciendo traída previa de una o varias microinstrucciones y guardándolas en una cola. El problema con esto son las micro ramificaciones, por lo cual habría necesidad de agregar circuitería extra para verificar si la instrucción traída es válida. 5.7 APLICACIONES DE LA MICROPROGRAMACION La microprogramación es una técnica muy poderosa de diseño de la CU porque permite a programadores de sistema y a los fabricantes modificar el conjunto de instrucciones del CPU sin tener que hacer cambios de hardware. Veamos unos ejemplos: El fabricante podría fácilmente, agrandar el repertorio de instrucciones con solo agrandar la memoria de control, copiar en ella los nuevos microprogramas y actualizar la tabla de decodificación de dirección base de microprogramas. La modificación de una instrucción podría realizarse fácilmente desde software si la memoria de control fuera una EEPROM o una RAM con energía permanente. Estas modificaciones podrían hacerlas tanto el fabricante como el programador del sistema. Otra utilidad sería, permitir a una aplicación escribir en algún área especial de la RAM de control un nuevo conjunto de instrucciones de forma temporal para Emular otra máquina completa, de esta forma nuestra computadora X podría ejecutar software de cualquier otra computadora Y si pudiéramos reproducir sus instrucciones en microcódigo. La aplicación de emulación sólo necesitaría poder definir cómo el generador de direcciones iniciales acceder a este nuevo conjunto de instrucciones. Docente: Ing. José Díaz Chow Página 71 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . 5 EL SISTEMA DE MEMORIA 5.1 La Función de Almacenamiento La función de almacenamiento en la computadora la desempeñan todos los dispositivos que retienen datos para su procesamiento. Históricamente se ha considerado como la función de mantener las instrucciones y los datos disponibles al procesador durante la ejecución, por tanto solo el Sistema de Memoria se reconocía como la estructura organizacional de la computadora que cumple esta función, aunque haya otros elementos de memoria en otras partes de la computadora (como los registros del CPU). En las arquitecturas modernas, se ha evidenciado que esta función de almacenamiento no solo implica el mantener datos y programas durante la ejecución sino que también es necesario almacenarlos masivamente en un soporte de forma permanente para evitar los inconvenientes de tener que cargarlos cada vez desde el exterior. Esta función, que se identifica como secundaria, requiere de dispositivos de gran capacidad por cuanto la cantidad de datos y programas que pueden requerir ser almacenados puede ser bastante alta. De los dispositivos que se emplean para tales fines se dice que son “de almacenamiento secundario”. La interacción del procesador con los dispositivos de memoria se implementa mediante dos operaciones: Lectura y Escritura. La operación de lectura permite recuperar el valor almacenado en una localidad específica del dispositivo y la operación de escritura permite establecer un nuevo valor en una localidad determinada. El desempeño o rendimiento de los dispositivos de almacenamiento se puede caracterizar mediante dos medidas: La Capacidad y el Tiempo. De estos derivan indicadores de desempeño como tiempo de acceso, tiempo de ciclo, velocidad de acceso y velocidad de transferencia. La capacidad es la cantidad de datos o instrucciones que es capaz de mantener simultáneamente el dispositivo. Hoy día la capacidad se mide en bytes (octetos de bits) y sus múltiplos: KiloByte (KB) que se compone de 210 bytes, MegaByte (MB) que equivale a 220 bytes, GigaByte (GB) que son 230 bytes y TeraByte (TB) que corresponde a 240 bytes. El tiempo de acceso mide el tiempo transcurrido desde que se activa una operación de lectura de memoria hasta que se obtiene el resultado. La velocidad de acceso es una medida proporcionalmente inversa al tiempo de acceso y se mide en bytes por segundo. El tiempo de ciclo, aunque muy relacionado al tiempo de acceso, está más ligado a la arquitectura global del sistema al caracterizar la cantidad de ciclos de reloj que se requieren para completar un ciclo de máquina de lectura o escritura en memoria. Esto es de gran importancia al calcular el tiempo de ejecución de una instrucción, por ejemplo. Por su parte, la velocidad de transferencia considera además otros aspectos como la frecuencia, ancho y modo de operación del bus del sistema. Se mide en bytes por segundo. En la evolución del sistema de memoria se ha identificado los grandes beneficios que puede proveer la jerarquía de memoria, que es una forma de organización de memoria que nos permite reducir la brecha de velocidad entre los diferentes dispositivos logrando que el sistema de memoria sea más eficiente y veloz. En esta unidad, pondremos especial interés en la jerarquía de memoria. Página 72 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Si observamos bien el sistema de memoria y la función de sus diferentes dispositivos, podremos verificar que de manera natural, existen diferentes niveles de función de memoria de acuerdo a su cercanía con el CPU. Si recordamos que la función de almacenamiento se concibe principalmente, como la retención de los datos requeridos para la ejecución, podemos identificar que dentro del CPU, los registros tanto de trabajo (IP, PC, etc.) como de propósito general, cumplen esta función, lo cual podríamos considerar como nivel interno al CPU o nivel cero (L0). Continuando nuestra identificación, nos encontramos con la memoria principal, que es quien cumple la función a cabalidad, a la que notaremos como nivel 1 (L1). Finalmente, los dispositivos de almacenamiento secundario, como el disco duro, los podemos considerar de nivel 2, pues es de donde cargamos los datos y programas a memoria para la ejecución. Si observamos mejor, veremos que cada nivel más bajo se aleja del CPU. A medida que bajamos en la jerarquía se reduce la velocidad pero se incrementa la capacidad. Se ha demostrado que el desempeño del sistema de memoria, se mejora mucho al integrar memorias intermedias (nuevos niveles en la jerarquía) entre CPU y memoria principal, denominadas caches. Estas memorias caches son más rápidas que la memoria principal, reduciendo así el tiempo de espera del CPU por los datos o instrucciones durante la ejecución. Para que los sistemas con cache sean efectivos, es necesario que en ellas se mantengas los datos e instrucciones más usadas. 5.2 Caracterización de la Memoria. Existen una serie de criterios que se pueden emplear para caracterizar, categorizar y clasificar la memoria, puesto que en la definición, diseño y construcción de los diferentes dispositivos que cumplen la función de almacenamiento, se aplican diferentes conceptos que diferencian a los mismos. Estos son muy diversos y van desde el nivel de la función hasta la tecnología de fabricación. Es de suma importancia manejar dichos conceptos a fin de poder definir y categorizar con propiedad cada dispositivo de memoria. A continuación abordaremos los más relevantes: Por el nivel de la función: Memoria interna (al CPU) Memoria intermedia o Cache Memoria Primaria o Principal Memoria Secundaria Por la tecnología de construcción: Semiconductora Estática: Esta memoria mantiene el valor mientras no se cambie el estado y tenga energía. Se fabrica básicamente con Flip-Flops de tecnología Bipolar por lo cual son rápidas pero bastante caras. En la actualidad se han empleado algunas familias MOS con bastante éxito. Dinámica: Esta memoria se basa en el principio de inercia de las capacidades (condensadores) a los cambios de tensión. Básicamente, retiene el valor escrito en ellas por un tiempo específico y por tanto requiere refrescamiento periódico. Se fabrica principalmente en tecnología MOS que permite gran densidad de integración, y por eso pueden ser de mayor capacidad y bastante más baratas que la memoria estática. Sin embrago, la necesidad de refrescamiento y su modo de operación las hace más lentas que las estáticas. Magnética Óptica, Magneto-Óptica (MO) Docente: Ing. José Díaz Chow Página 73 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . Por la capacidad de retención del dato: Memoria Volátil Memoria totalmente volátil: Retiene los datos mientras exista suministro de energía eléctrica. Memoria Volátil con respaldo de energía: Es una memoria volátil que cuenta con una batería de respaldo que le suministra energía cuando se interrumpe la energía principal. Memoria Permanente: Dispositivos con soporte de los datos a muy largo plazo. Los datos no se pierden cuando se suspende la alimentación. Por la operación soportada Memoria de lectura y escritura o RW: Admite lectura y escritura. Memoria de solo lectura o ROM: Solo admite lectura. En este punto es importante mencionar los diferentes tipos históricos de ROM que fueron evolucionando hacia formas de RW: ROM: El contenido de la memoria grabado por fábrica PROM: Memoria que se podía programar mediante un dispositivo. EPROM: Esta memoria se podía borrar con luz ultravioleta y volver a programar. EEPROM: Memoria que se podía borrar eléctricamente y volver a programar. FLASH: Memoria que se diseño como alternativa a EEPROM. Permite borrado selectivo. Hoy día este tipo de dispositivo es prácticamente RW Método de acceso: cómo acceden los contenidos de la memoria: Memoria de Acceso aleatorio (RAM: Random Access Memory): Cada posición direccionable de memoria tiene un único mecanismo de acceso, cableado físicamente. Cualquier posición puede seleccionarse aleatoriamente y el tiempo de acceso es el mismo. Ejemplo: memorias semiconductoras. Acceso secuencial: El acceso se realiza leyendo en secuencia todos los datos hasta que se encuentra el elemento deseado. El tiempo de acceso es función de la posición del elemento accedido. Ejemplo: unidades de cinta. Acceso semisecuencial: Aplica a los dispositivos cuyo soporte posee geometría circular. El acceso se lleva a cabo mediante la realización de una combinación de movimientos en un “área” de la memoria general (tiempo de latencia), seguido de un acceso secuencial hasta alcanzar la posición deseada (tiempo de búsqueda). Ejemplo: unidades de disco. Modo de direccionamiento Memoria direccionable por posición: Memorias cuyas operaciones determinan la localidad específica a afectar mediante una dirección de memoria que corresponde a la posición de la localidad. Memoria asociativa o direccionable por contenido: Memorias cuyas operaciones determinan la localidad específica a afectar mediante comparación del contenido de la localidad con una clave de búsqueda. Estas memorias implementan la búsqueda de forma paralela en todas las celdas. Existen otros criterios que no consideramos como clasificadores pero que pueden ser muy importantes en materia de organización. Uno de ellos es el Costo. El costo se emplea para decidir el mejor conjunto de Página 74 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I características, como la filosofía de construcción, a elegir a un costo permisible. El indicador más usado es el de coste por bit. Otros criterios son el tamaño. El tamaño tiene varias implicaciones tanto en desempeño como coste. Normalmente memorias más grandes requerirán mayor red de decodificadores, requiriendo mayor tiempo de acceso. Además de la capacidad de la memoria, tenemos otros indicadores para caracterizar una memoria como la unidad de acceso, unidad de transferencia y la relación de ésta con la palabra del procesador. La unidad de acceso, direccionabilidad o resolución indica el conjunto mínimo de bits que puede accederse como un todo. En las primeras máquinas, donde se construía la memoria a la medida del CPU, la unidad de acceso coincidía con la palabra del CPU. En las computadoras modernas, en cambio, se ha definido una unidad de acceso estándar (el Byte) que permite mayor flexibilidad en el diseño y construcción tanto de memorias como de CPUs. Obviamente esto impone una restricción al arquitecto de CPU: la palabra del procesador debe ser múltiplo del byte. Recordemos las consideraciones que tuvimos que hacer al respecto en la unidad 2, para el diseño del formato de instrucciones. La unidad de transferencia, indica la cantidad de bytes que se pueden transferir de una vez desde la memoria al CPU. Puede ser tan pequeña como la unidad de acceso o tan grande como el ancho del bus de datos, todo depende del diseño que haya realizado el arquitecto sobre la base del compromiso desempeño-flexibilidadcoste. Obviamente una mayor unidad de transferencia permite mayor velocidad de transferencia. La unidad de transferencia es un atributo de arquitectura que debe ser considerada seriamente por los programadores y constructores de ensambladores a fin de garantizar una alineación correcta de las instrucciones y los datos en la memoria para evitar que una instrucción tenga que consumir más ciclos de lectura en memoria de los estrictamente requeridos. Por ejemplo, suponga que el formato de instrucciones es variable en 2 y 4 bytes y que la unidad de transferencia es de 4 bytes. Si tenemos instrucciones contiguas de 2 y 4 bytes, existe la posibilidad que alguna instrucción de 4 bytes no se transfiere en un mismo ciclo de máquina retardando su inicio de ejecución y el desempeño global del sistema. Para evitar este inconveniente, algunas arquitecturas consideran en su ensamblador la directiva Alineación (Alignment o implemente ALIGN) para definir en qué multiplicidad se almacenan los datos y programas en la memoria. Esto aplica no solo a los datos e instrucciones sino a bloques de memoria también. 5.3 Organización de la Memoria Principal. La memoria principal se implementa en base a dispositivos de memoria semiconductora organizados en circuitos integrados o chips. Cada chip de memoria contiene un número determinado de celdas de 1 bit. Las celdas se organizan lógicamente en una matriz bidimensional de r filas x c columnas. El acceso externo a tales celdas puede estar estructurado en acceso a una celda de 1 bit (Chips con organización C x 1, por ejemplo 1K x 1 bits) o a conjuntos de celdas de c bits por cada localización (Chips con organización C x c, por ejemplo 1K x 4 bits). La unidad básica de memoria es, por tanto, el bit. Para fines prácticos se define la unidad de acceso a memoria o resolución de memoria. Casi todas las computadoras modernas usan como unidad de acceso el byte, es decir, son direccionables por byte. Muchos buses de datos son más anchos que la unidad de acceso (byte) y por tanto permiten la transferencia de más de una localidad a la vez, por lo cual la unidad de transferencia puede ser de más de un byte. Internamente los chips de memoria cuentan con una colección de celdas de 1 bit que se organiza en una matriz de r filas x c columnas. Para poder realizar una operación con las celdas, necesitamos activarlas, para Docente: Ing. José Díaz Chow Página 75 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . lo cual se requiere una lógica de selección de filas y columnas que seleccionen todas las celdas que componen la localidad referida en la dirección. La interconexión de varios chips de memoria permite obtener una memoria total organizada en celdas de 1 byte o más. Para reducir la cantidad de terminales del chip, las líneas de dirección pueden estar multiplexadas con datos. Mediante la interconexión controlada de chips de memoria se puede implementar también bancos de memoria que permite realizar múltiples operaciones de memoria en simultáneo, incrementando el desempeño del sistema de memoria. Además de las líneas de dirección, la memoria debe tener acceso a las líneas de control para realizar la transferencia de datos. Son necesarias también algunas líneas de control de transferencia y operaciones de la memoria: W*: Escritura habilitada. Acepta cambios en las celdas direccionadas. OE*: Salida activada. Permite al exterior acceder al resultado de la lectura. CS*: Selección de chip. Si está habilitado (en bajo), permite la operación del chip, caso contrario, el chip queda desactivado. RAS*: Selección de dirección de filas CAS*: Selección de dirección de columnas. A continuación se muestra la organización interna de un chip de memoria dinámica de 4M x 4 bits. Nótese la presencia de componentes para el control de refrescamiento. Temporización y control Contador de refresco Buffer de direccione s de filas Buffer de direccione s de columnas Decodificador de filas Matriz de celdas de memoria Amplificadores de lectura y puerto de E/S Descodificador de columnas Página 76 Buffer de entrada de datos Buffer de salida de datos Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Normalmente, el CPU requiere de un dispositivo auxiliar que le apoye en la gestión del acceso a memoria. Este dispositivo se denomina controlador de memoria y facilita la estandarización del diseño del sistema de memoria. 5.4 Jerarquía de Memoria. Los principales objetivos en el diseño de cualquier sistema de memoria son: Ofrecer la capacidad de almacenamiento adecuada. Proporcionar un nivel de prestaciones aceptable. El coste debe ser razonable. El diseño tradicional del sistema de memoria, establece límites físicos y tecnológicos que dificultan la consecución de tales objetivos. Hoy día, prácticamente todos los sistemas operativos son multitareas y multiusuario, evidenciándose en su operación la necesidad de más y más capacidad de memoria. Gracias a la gran capacidad de miniaturización de las memorias dinámicas ha sido posible ir incrementando esta capacidad a un coste bastante razonable, sin embargo, al incrementar el tamaño de la memoria, el tiempo de respuesta se ha incrementado, reduciendo el nivel de prestaciones. Lo ideal sería poder emplear la mayor cantidad de memoria estática posible en el sistema, sin embargo ésta es muy costosa. Adicionalmente, los estudios de ejecución de los programas han revelado que en la mayoría de los programas la ejecución se centra el un 10% del código el 90% del tiempo. Esto se debe al principio de localidad de referencia en gran parte, que depende de la forma en la cual se escriben los programas y se almacenan éstos y los datos en la memoria. Si se clasifican los diferentes dispositivos de memoria en una computadora, y se les ordena de acuerdo a su velocidad, podremos observar que se establece una jerarquía entre ellos, en la cual la velocidad de acceso aumenta a medida que subimos en la jerarquía pero la capacidad disminuye. Por ejemplo, en el más alto nivel se encuentran los registros del CPU que son los más rápidos pero tienen muy limitada capacidad de almacenamiento, pasamos por la memoria principal que tiene gran capacidad pero un tiempo de acceso mucho mayor. Finalmente, los dispositivos de memoria secundaria almacenan muchísima más cantidad de información pero su velocidad de acceso es muy limitada. A tal ordenamiento de los diferentes dispositivos de memoria se denomina jerarquía de memoria. La jerarquía de memoria y sus propiedades han sido decisivas en la mejora del rendimiento de los sistemas de memoria. Dadas las brechas de ancho de banda entre los diferentes niveles, no conviene que un dispositivo de un nivel muy alto acceda directamente uno de un nivel bastante más bajo. El mejor desempeño se obtiene si se limitan las transferencias entre dispositivos de niveles adyacentes. 5.4.1 Bases de la jerarquía de memoria Registros internos a la CPU para obtener un almacenamiento temporal de datos (cuantitativamente pequeños, pero muy rápidos). Almacenamiento externo de datos y programas (relativamente extenso y rápido). Almacenamiento permanente externo (mucho más amplio, pero más lento). Docente: Ing. José Díaz Chow Página 77 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . 5.4.2 Características de la jerarquía de memoria Consiste en distintos “niveles” de los componentes de memoria. Cada nivel está caracterizado por su capacidad, tiempo de acceso y coste por bit. Según se vaya ascendiendo por los niveles de la jerarquía, se encontrarán módulos de mayor capacidad, un tiempo de acceso más lento y menor coste por bit. Un gran avance en la construcción del sistema de memoria consistió en la introducción de las memorias intermedias o cachés. Una Caché es una memoria pequeña muy rápida que provee los datos y las instrucciones más usadas. Regularmente las cachés tienen una ganancia de 10 a 1 sobre la memoria principal en materia de velocidad de acceso. 5.5 Sistema de Memoria con Caché Un sistema de memoria con caché tiene un desempeño mejorado debido a las altas tasas de eficiencia de la memoria cachés. Las cachés como dispositivo de almacenamiento intermedio, están destinadas a almacenar las instrucciones y los datos más usados durante la ejecución. Si la velocidad de acceso de la caché es 10 veces mayor que la de la memoria principal, entonces, se tendrá esta ganancia en el sistema siempre que el datos o la instrucción buscada se encuentre en caché. La figura muestra la configuración de un sistema con caché donde el CPU accede a caché a nivel de palabra. Entre caché y memoria se realizan transferencia s nivel de bloques, a fin de mejorar la eficiencia. Gracias al principio de localidad de referencia, que caracteriza la forma en que se escriben los programas y la forma en que se almacenan éstos y los datos en memoria, la caché es efectiva entre un 80% y 95% del tiempo. La eficiencia de la jerarquía se incrementa al agregar nuevos niveles siempre que el nivel introducido tenga mayor velocidad de acceso que el mínimo de los niveles y se cumpla que las transferencias se realicen solo entre niveles adyacentes. En los sistemas con cachés que tienen memorias principales muy grandes y caches muy pequeñas, es de vital importancia definir una función de mapeo o correspondencia de memoria Principal a memoria caché que permita al procesador acceder una dirección de memoria en la caché si esta está residiendo allí. Página 78 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 5.5.1 Interconexión caché - memoria principal A fin de establecer una interconexión entre caché y memoria principal, se define una unidad común de correspondencia que denominamos bloque. El bloque es un conjunto de K localidades consecutivas de memoria principal. Cada bloque en memoria principal debe corresponder a un bloque de K localidades consecutivas en memoria caché. El bloque transferido desde la memoria principal se almacena en la caché como una sola unidad llamada ranura, línea, bloque o página. Una vez copiado en la caché, el CPU puede tener acceso a palabras individuales dentro de un bloque. Cada línea de datos o bloque de la caché debe ser etiquetada de algún modo para identificar qué bloque de memoria principal es. La línea de datos y su etiqueta se almacenan en la caché. Si existen 2m palabras en la memoria principal, entonces habrá Bm = 2m/K bloques en la memoria principal. De igual manera, si existen 2c palabras en la memoria caché, entonces habrá Bc =2c/K bloques en la memoria caché. Siempre la memoria principal es mucho mayor en tamaño que la caché, por tanto a cada bloque de caché pueden corresponder muchos bloques de memoria principal. Al mecanismo u algoritmo que permite definir en qué bloque de caché se alojará un determinado bloque de memoria principal se le conoce como función de correspondencia o mapeo de caché. Debido a las velocidades tan altas de la caché, el manejo de la transferencia de datos y el almacenamiento en ella se realizan en el hardware. El sistema operativo no reconoce la caché. La figura a continuación muestra una configuración típica de un sistema con caché. El control de lectura o escritura a memoria principal solo se activa si se da un fallo de caché. 5.5.2 Elementos de diseño de la Caché Técnica de mapeo o función de correspondencia entre la memoria principal y la caché. Algoritmo de sustitución de línea. Política de escritura. Tamaño de bloque. Cantidad y tipo de caches. Docente: Ing. José Díaz Chow Página 79 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . 5.5.3 Técnicas de Mapeo Se han desarrollado tres técnicas de mapeo o funciones de correspondencia de la memoria principal con la caché: 5.5.3.1 - MAPEO DIRECTO: Cada bloque de memoria principal es asignado a una línea específica de caché. La correspondencia se expresa como: i = j % Bc Donde i es el número de bloque de caché asignado al bloque j de memoria principal y % es el operador de módulo. - Por ejemplo, si los bloques de memoria son 64 y van del 0 al 63 y los de caché son sólo 4 y van de 0 a 3, entonces : La línea de caché 0 tiene asignados los bloques de memoria principal 0, 4, 8, 12,... La línea 1 tiene asignados los bloques 1, 5, 9, 13,... La línea 2 tiene asignados los bloques 2, 6, 10, 14,... La línea 3 tiene asignados los bloques 3, 7, 11, 15,... - La caché con correspondencia directa divide una dirección de la memoria principal en tres campos diferentes: Identificador de etiqueta (t). Identificador de número de bloque (b). Identificador de palabra (w). - El identificador de palabra determina la palabra específica (o unidad direccionable) en una línea de caché que va a ser leída. - El identificador de línea especifica la línea física de la caché que asignará la dirección con referencia. - La etiqueta se almacena en la caché junto con los datos de la línea: Para cada referencia de memoria que realiza la CPU se determina la línea específica que asignará la referencia (cuando ésta ha sido previamente copiada en la caché). Se revisa la etiqueta asignada en dicha línea para comprobar si en la caché está el bloque correcto. Página 80 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S Cache Etiqueta Dirección de memoria Etiqueta Línea I I Memoria principal Datos Palabra Comparación (Acierto de cache) (Fallo de cache) - Ventajas de la correspondencia directa: Se implementa fácilmente. Bajos costos. Es fácil determinar dónde se puede encontrar una referencia de la memoria principal en la caché. - Desventajas de la correspondencia directa: Cada bloque de memoria principal se corresponde a una única línea de caché. A través de la localidad de la referencia es posible hacer referencia a bloques que corresponden al mismo número de línea. Estos bloques serán intercambiados dentro y fuera de la caché, provocando que el nivel de aciertos sea más bajo. 5.5.3.2 CORRESPONDENCIA ASOCIATIVA: - Permite que un bloque sea almacenado en cualquier línea de caché que no está en uso. Supera los fallos fundamentales de la correspondencia directa. Examina cada línea de la caché para encontrar el bloque de memoria correcto. Se analizan todas las etiquetas de líneas para encontrar una coincidencia. Para que esto sea eficiente, la caché debe contar con una memoria asociativa donde almacenar las etiquetas. - Ventajas: Rapidez. Docente: Ing. José Díaz Chow Página 81 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . Flexibilidad. - Desventajas: Coste en la implementación por uso de memorias asociativas Memoria principal Etiqueta Dirección de memoria Etiqueta Datos Palabra Comparación (Acierto de cache) (Fallo de cache) 5.5.3.3 CORRESPONDENCIA DE CONJUNTOS ASOCIATIVOS: - Esta técnica recoge lo mejor de las correspondencias directa y asociativa. La caché se implementa como una serie de cachés asociativas de c bloques cada una. A cada caché asociativa se le denomina conjunto asociativo. - Un bloque de memoria principal se corresponde a un único conjunto asociativo, de tal manera que: s = j % Sc Donde s es el número del conjunto asociativo de caché asignado al bloque j de memoria principal, Sc es la cantidad de conjuntos asociativos de la caché y % es el operador de módulo. Internamente, cualquier bloque de memoria principal j puede almacenarse en cualquiera de las k líneas o bloques del conjunto asociativo al cual corresponde según la correspondencia bloque a conjunto definida anteriormente. Página 82 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A - D E M Á Q U I N A S C O M P U T A D O R A S I I Si un conjunto puede asignar x líneas, se dice de él que es o tiene correspondencia asociativa de x vías: La mayoría de los sistemas caché existentes utilizan conjuntos asociativos de 2, 4 u 8 vías. Memoria principal Etiqueta Dirección de memoria Etiqueta Conjunto Datos Palabra Conjunto 0 Comparación Conjunto 1 (Acierto de cache) (Fallo de cache) 5.5.4 Algoritmos de sustitución de bloque Cuando se busca una dirección de memoria principal en la caché y el bloque correspondiente a la misma no se encuentra en la caché, ocurre un fallo de caché. En este caso, la lectura no puede proceder hacia el CPU. Se genera una excepción y controlador de memoria debe transferir el bloque correspondiente de memoria principal a caché. Si no hay un bloque de caché disponible (vacío) para alojar el nuevo bloque, habrá que sustituir uno de los que se encuentran en caché por este otro. En caso de mapeo directo no tenemos elección. Con el mapeo asociativo y el de conjunto asociativo, es necesario decidir cuál de los bloques se sustituirá tratando que sea aquel con menor probabilidad de ser requerido en el futuro cercano. Para realizar esta decisión de forma eficiente se han desarrollado diferentes algoritmos de sustitución: LRU, FIFO, utilizado menos frecuentemente” (LFU) y Aleatorio (uno al azar). Docente: Ing. José Díaz Chow Página 83 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . 5.5.5 Política de Escritura Cuando se escribe un dato en caché, la localidad correspondiente queda más actualizada que su imagen en la memoria principal. A fin de evitar incoherencias, es necesario sincronizar los valores de las palabras que se han escrito en la caché. Para esto se implementan dos políticas de escritura: Escritura directa o write throug: Cada vez que se actualiza una palabra en caché se actualiza el bloque correspondiente en memoria principal. Esto garantiza siempre la consistencia del mismo pero puede provocar retrasos en la operación de la caché Escritura posterior o write back: Cuando se modifica una palabra en la caché no se actualiza el bloque en la memoria principal sino hasta que éste tiene que ser removido de la caché. A fin de poder implementar esta política, se llevan bits de estados en cada bloque. Uno de éstos, denominado dirty bit indica si se ha escrito en él, de forma que sea necesario actualizarlo en la memoria antes de sustituirlo. Página 84 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 6 EL SISTEMA DE ENTRADA-SALIDA 6.1 La función de Transferencia Externa En las unidades anteriores, hemos estudiado la función de transferencia de datos a lo interno de la computadora. En esta unidad nos concentraremos en la función de transferencia de datos al exterior. Esta función básicamente tiene dos sub-funciones: la Entrada que consiste en traer datos desde el exterior hacia el interior de la computadora y la Salida que va en el sentido contrario. El sistema de entrada/salida es la estructura de la computadora que tiene a cargo esta función que es de suma importancia, porque una computadora incapaz de comunicarse con el mundo exterior y más específicamente, con el hombre, es totalmente inútil. ¿Cómo podría obtener los programas a ejecutar y los datos sobre los cuales trabajar?, y ¿Cómo entregaría los resultados de dichos programas? Por otro lado, la variedad de dispositivos con que la computadora es capaz de comunicarse, hoy día la hacen más flexible y potente, como “máquina de propósito general”, sin embargo esto entraña una dificultad para el diseñador del sistema de Entrada - Salida (E/S o I/O) por la diversidad de tecnologías con la cual lidiar. Por ejemplo, tenemos dispositivos de entrada salida de tipo electromecánico, electrónico, electromagnético, óptico, y en general, para adquisición de datos de variados sistemas, tenemos sensores y actuadores de muy diversa naturaleza. El crear un sistema integral que permitiera manejar todas estas tecnologías sería imposible e impráctico a la vez, por cuanto lo que se ha hecho es un sistema general que establece normativas para que los fabricantes de los diferentes dispositivos creen módulos controladores o interfaces que sean capaces de comunicarse con el sistema de Entrada/Salida mediante un bus o interfase de entrada/salida. En este capítulo, estudiaremos los requisitos para este diseño genérico y las diferentes técnicas que hacen a estas interfaces viables y eficientes. 6.2 Estructura de interconexión de la computadora Hemos estudiado que las computadoras se componen básicamente de un Procesador, Memoria y Unidades de E/S. Arquitecturas complejas pueden componerse de varias instancias de cada parte. Un tema de arquitectura de Computadoras de gran importancia es la forma de interconectarlos. A tal sistema de enlace se denomina estructura de interconexión. Las diferentes arquitecturas a través del tiempo han empleado diferentes enfoques para el diseño de la estructura de interconexión. El más aceptado ha sido el de buses. Además de los datos que se transfieren entre las diferentes unidades, es necesario especificar alguna dirección para tales datos así como una serie de señales de control que deben sincronizar el tránsito de los mismos, habilitación y des-habilitación de componentes del sistema y verificación del estado del procesador, entre otros. El bus del sistema debe contener todas estas señales. 6.2.1 Interconexión con Buses Un bus se concibe como un conjunto de líneas conductoras que transportan datos o señales entre las diferentes partes del computador. Característica clave del bus es que se trata de un medio de transmisión compartido. Al bus del sistema se conectan varios dispositivos: CPU, módulos de Memoria, diferentes controladores de E/S, etcétera. Cualquier señal que transmita uno de ellos está disponible para ser accedida Docente: Ing. José Díaz Chow Página 85 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . por el resto. Si dos dispositivos escriben en el bus durante el mismo período de reloj, sus señales pueden solaparse y destruirse, por ende sólo un dispositivo puede transmitir con éxito durante un momento dado. Un aspecto importante en el diseño del bus es el tipo de transferencia que se elige. La transferencia serie nos permite enviar secuencias binarias a través de una sola línea en diferentes períodos de tiempo. Transmitir un dato de 1 byte tomaría al menos 8 períodos de reloj. Por otro lado, la transferencia paralela requiere de tantas líneas como bits de datos o señales se necesiten transmitir. Para el caso anterior, se requieren 8 diferentes líneas y la transmisión tarda un solo período. En un computador se requiere la máxima velocidad de transmisión entre los diferentes componentes por lo cual el bus el sistema emplea transferencia paralela. EL bus del sistema se constituye usualmente por un conjunto de entre 50 y 150 líneas. Aunque existe gran diversidad en los diseños, la mayoría divide el bus en tres buses funcionales: bus de datos que consta de las líneas que transfieren los datos, bus de direcciones, empleado para seleccionar el dato en la memoria y bus de control se conforma por el conjunto de señales de control externas al procesador. Además, suele añadirse las líneas de alimentación eléctrica. La Figura 1 muestra esquemáticamente estas líneas de interconexión. Bus de Direcciones Líneas de Control CPU Entrada/ Salida Memoria Bus de Datos Figura 1. Arquitectura de buses Figura 7.2.1. Arquitectura de Buses de la Computadora La anchura del datos define cuántas palabras de memoria pueden transferirse de una vez. bus de Algunas líneas de control importantes son: WRITE, READ, IOW, IOR, Transfer ACK (en el bus), Bus Request, Bus Grant, Interrupt Request, Interrupt ACK, CLCK y RESET. Como el bus es un recurso compartido, llega a ser cuello de botella en el desempeño del sistema por lo cual, se han adoptado arquitecturas con jerarquía de buses múltiples. Las microcomputadoras PC AT compatibles hoy día tienen diversos buses que se muestran en la Figura 2. Página 86 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S CPU + Cache L1 Controlador de vídeo "Bus" AGP Controladores del sistema (Chipset) Controlador de Memoria y Puente PCI C O M P U T A D O R A S I I Cache L2 Memoria Principal Bus del Sistema Bus PCI SCSI Dispositiv os IDE CD DD DD DD Controlador IDE Controlador de DMA Puente PCI a ISA LAN Slot USB Bus ISA Slot Slot LPT Com 1 Disquete Super I/O Com 2 Teclado Ratón PS/2 Figura 2. Jerarquía de buses de E/S de la PC moderna 6.2.2 Diseño del bus Tipos de líneas: Existen dos tipos de líneas de bus: dedicadas y multiplexadas. En el primero, cada conjunto de líneas tiene una función específica, por ejemplo D0 – D31: líneas de datos correspondientes a los bits 0 al 31. En el segundo, un mismo conjunto de líneas puede emplearse para diferente fin, únicamente debe definirse la naturaleza de la información en el bus en ese momento mediante líneas de control de selección. Por ejemplo, en un período del bus puede ponerse la dirección de los datos y cuando tal dirección se ha reconocido, la memoria activa una línea de control de asentimiento. Entonces puede ponerse los datos en el bus. Esta es una forma de multiplexación por división de tiempo. Modo de arbitraje: Puede haber un controlador del bus encargado del arbitraje y control del mismo o bien un algoritmo de asignación del bus. Un caso interesante es el bus cycle stealing en DMA. Temporización: El bus puede ser síncrono o asíncrono. En el primero se cuenta con un reloj que sincroniza todas las actividades del bus y todos los módulos conectados al mismo deben supeditarse a él. Esto suele mermar el rendimiento de módulos de alta velocidad con buses de baja velocidad. El segundo enfoque requiere de señales de reconocimiento de inicio y finalización de eventos. Anchura: Tamaño del bus y Velocidad de transferencia máxima. Tipos de transferencias de datos: Puede ser para lectura, escritura, cualquiera de ellas por bloque y diferentes combinaciones de las mismas. Esto no tiene gran importancia en buses dedicados pero sí en buses multiplexados, donde cierto tipo de transferencias puede mejorar el desempeño del bus o limitarlo. Docente: Ing. José Díaz Chow Página 87 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . 6.2.3 Buses Estándares Cada fabricante solía diseñar su propio bus para cada arquitectura. De hecho, algunos fabricantes implementaban buses específicos para cada máquina diferente que diseñaban. Hoy día se ha avanzado mucho en el establecimiento y especificación de estándares de la Industria, lo cual ha traído consigo grandes beneficios: compatibilidad, arquitecturas abiertas, intercambiabilidad de dispositivos, facilidad de actualización, etc. La familia PDP y la VAX empleaban el UNIBUS para E/S. Este es un bus no estándar de 72 líneas. Muchos buses especializados como interfaces de E/S han llegado a reconocerse como estándares de la industria. La IEEE es uno de los organizamos de estandarización más reconocidos en el campo de la Computación. El Multibus desarrollado para el MDS de Intel es hoy un bus existente en casi todas las minicomputadoras modernas. Este es un bus multiplexado asíncrono de 86 líneas, reconocido por la IEEE como el estándar 796. IBM diseñó un bus muy sencillo, no estándar, para su IBM PC original. Para el lanzamiento de la XT, adoptó el bus estándar de la industria ISA. Este es un bus de 8 bits de datos que logra frecuencias de reloj de hasta 8MHz. En la AT se empleó una versión mejorada del ISA de 16 bits que lograba frecuencias de hasta 10MHz. Con la introducción del Personal System (PS), IBM trató de frenar a los fabricantes de Compatibles introduciendo un bus propietario patentado de altas prestaciones de 32 bits con configuración por programa denominado microcanal. Esta decisión de IBM, lejos de beneficiarla, la perjudicó puesto que la competencia se organizó y diseñaron un bus estándar, compatible con el ISA, de 32 bits que también era configurable por programa. A este bus se le denominó EISA. Las limitaciones del ISA y la complejidad de configuración del EISA, así como el surgimiento de nuevas especificaciones de la industria como PNP trajeron consigo al PCI. PCI (Periferal Interconnect Interface) es un bus que tiene varias versiones. Su surgimiento ha sido clave en la mejora de prestaciones del sistema de E/S de las computadoras modernas. La especificación PC97 recomienda su uso exclusivo (sobre los buses descontinuados ISA, EISA y MC) para periféricos. 6.2.3.1 BUS ISA: Este es el bus que usan los IBM PC y Compatibles. Soporta tanto tarjetas para XT como AT. Se le hizo una extensión llamada EISA que soporta PNP. La frecuencia del bus varía desde 4.7 MHz hasta los 8MHz típicamente, aunque algunas implementaciones modernas logran confiablemente frecuencias de hasta 12MHz. Página 88 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Características Eléctricas: +12V a 1.5A -12V a 0.3A +5V a 4.5A -5V a 0.2ª Connector Pinout (Disposición de las señales en el conector) 6.2.3.2 BUS PCI: El Peripheral Component Interconect o Bus PCI es una estructura de interconexión reciente de alto ancho de banda (33, 66, 100 y hasta 133 MHz en últimas versiones –PCI Express– ) Usa hasta 64 líneas de datos lo que combinado a su frecuencia permite altas tasas de transferencia. Por ejemplo, se alcanza una tasa de 264MB/s a 33 MHz. Su construcción es bastante económica. Brinda soporte para dispositivos PCI (tarjetas de expansión) tanto de 5V (como la mayoría de los ISA) como de 3.3V. En el PCI se codifican los slots para que se puedan insertar tanto tarjetas de 5 V como de 3.3V sin preocupación del cliente. Tarjetas de voltaje dual también son posibles. Es un bus multiplexado. Trata todas las transferencias en modo de ráfaga. Cada ciclo comienza con una fase de dirección seguido de una o más fases de datos. Las fases de datos se pueden repetir indefinidamente pero su duración está controlada por una temporizador que define la máxima cantidad de tiempo que el dispositivo PCI puede controlar el bus. Muchas líneas se solapan o multiplexan en el tiempo, tales como las de datos y direcciones. Docente: Ing. José Díaz Chow Página 89 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . Las líneas de comando (C/BE3 to C/BE0) indican el tipo de transferencia durante la fase de dirección: C/BE 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Command Type Interrupt Acknowledge Special Cycle I/O Read I/O Write reserved reserved Memory Read Memory Write reserved reserved Configuration Read Configuration Write Multiple Memory Read Dual Address Cycle Memory-Read Line Memory Write and Invalidate Existen tres tipos básicos de transferencia: I/O, Memoria y Configuración. El controlador de interrupciones, reconoce y actúa de manera automática ante el comando INTA (interrupt acknowledge). En la fase de datos, transfiere el vector de interrupciones a las líneas de dirección. 6.3 Comunicación con Dispositivos Externos Para comunicarnos con los dispositivos externos necesitamos básicamente poder establecer una forma de localizarlos e identificarlos, así como una forma de enviarles o recibir información. Lo más práctico es emplear el mismo esquema de acceso a la memoria y asignarle a cada dispositivo una dirección dónde leer o escribir los datos. De esta forma, el diseño del sistema de E/S es consistente con nuestro modelo simple de computador formado de tres partes (CPU, M y E/S) enlazadas mediante la estructura de interconexión que está representada por el bus del sistema. 6.3.1 Direccionamiento de dispositivos externos Se puede emplear el bus de direcciones para escribir la dirección del dispositivo al cual queremos acceder, los datos en el bus de datos y algunas líneas de control podrían ayudar a realizar la sincronización necesaria. Este esquema simple trae un problema a colación: ¿Cómo puedo diferenciar si una dirección es de Memoria o de un dispositivo de E/S? Para atacar este problema se han desarrollado dos técnicas. La primera, adoptada por muchas máquinas grandes, con mucho espacio de direccionamiento para E/S, opta por tratar en lo posible el espacio de E/S como direcciones en el mismo mapa de memoria (Mapa Integrado M-E/S), diferenciando entre ellos mediante rangos o dominios de direcciones. Esto se implementa, por lo general, usando el bit más significativo de la dirección para definir la naturaleza de ésta. Por ejemplo, si el MSB es 1, se refiere a una Página 90 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I dirección de E/S y si es 0 se refiere a una localidad de memoria. De esta manera, los programas del usuario pueden usar cualquier instrucción y modo pertinente con los dispositivos de E/S. La segunda técnica consiste en separar físicamente el espacio de E/S del de memoria, empleando Mapas Separados, con lo cual una dirección dada puede referirse tanto a Memoria como a E/S. Este esquema lo emplean máquinas más pequeñas y permite limitar fácilmente el espacio de direccionamiento de E/S. Este último esquema requiere, sin embargo poder especificar la naturaleza de la dirección. Esto regularmente se implementa como una señal de control de salida del CPU (IO/M) que indica que la dirección es de E/S si la señal es 1 y M si es 0. Esta señal se emplea para activar o desactivar los dispositivos de M o ES, según el caso. En este esquema se requieren además instrucciones especiales para acceder a la E/S, por ejemplo IN y OUT. La primera transfiere una palabra desde un puerto de datos de E/S hasta un registro del CPU y la segunda transfiere el dato del registro a una dirección de E/S. Puede notarse que por eficiencia, estas instrucciones por lo general solo tienen modo directo de registro y absoluto (para E/S) 6.3.2 Modos de Transferencia y Sincronización Una vez definida la forma de localizar los dispositivos de E/S, es necesario definir cómo se realiza la transferencia de datos entre el dispositivo de E/S y el CPU. Se entiende por transferencia, el hecho mismo de llevar una palabra de datos hasta un dispositivo de E/S o desde el dispositivo al CPU o la memoria de la Computadora. Se entiende por sincronización, la forma de coordinar las actividades entre la computadora y los dispositivos externos conectados a fin que se proceda con la transferencia solamente si ambos interlocutores están listos. La forma más simple de transferencia consiste en escribir un programa que continuamente, en un ciclo, realice la transferencia de los datos, palabra a palabra con el dispositivo. Este tipo de transferencia se denomina transferencia dirigida por programa. En este caso, para implementar la sincronización, el dispositivo de E/S debe contar con un registro de estado o control (o ambos) en el cual se pueda verificar si el dispositivo está listo para enviar o recibir datos. Además del estado de ocupado se podría determinar si está en una condición de error que lo inutiliza para establecer comunicación de datos lo cual es además útil en sistema de monitoreo. El programa debe verificar continuamente el registro de estado del dispositivo para determinar si hay existencia de datos que leer o anuencia para recibir nuevos datos. Este esquema simple, tiene la ventaja de ser fácil de implementar pero requiere sincronización constante con el dispositivo de E/S, por tanto necesita un procesador dedicado (monotarea) lo que lo hace impropio para sistemas operativos multiusuario / multitarea. A este esquema de sincronización se le denomina polling, encuesta o escrutino Una segunda forma más flexible de transferencia consiste en emplear interrupciones. Las interrupciones permiten al dispositivo externo indicarle al CPU que requiere atención. Por ejemplo, para imprimir un archivo, se puede enviar un bloque completo de datos y dejar que la impresora trabaje. Cuando esta termina, puede generar una Interrupción para alertar al programa que está lista para aceptar el siguiente bloque. De esta manera, la transferencia es fácil de implementar en sistemas operativos multiusuario / multitarea, pues el proceso de impresión se bloquearía cuando el buffer de impresión está lleno y cuando la impresora genere su interrupción, podría ponerse activo nuevamente. Note que el uso de interrupciones es tanto un modo o forma de transferencia como de sincronización. Finalmente existen modos avanzados de transferencia, que permiten transferir bloques completos de datos a gran velocidad desde el dispositivo de E/S hasta la Memoria principal o viceversa. Estos modos son el Docente: Ing. José Díaz Chow Página 91 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . DMA (Acceso Directo a Memoria) y los “Procesadores y Canales de E/S” (IO Channels e IO Processors) y que serán expuestos luego. La sincronización se hace en dos niveles, tanto a nivel de dispositivo como a nivel del bus del sistema. 6.4 Estructura del Módulo de E/S Las diferentes tecnologías de los dispositivos de E/S son transparentes al Sistema de E/S gracias a los Controladores de Dispositivos (Módulos de E/S o Interfaces de E/S). Estos se encargan por un lado de lidiar con la tecnología constructiva del dispositivo (interfaz con el dispositivo externo) y por el otro de proveer una interfaz al Sistema de E/S según las normativas de éste (Interfaz con el bus del sistema). Independientemente de cómo se implementa el dispositivo de E/S, el controlador o módulo de E/S debe disponer de: Un Decodificador de Direcciones que active la circuitería del módulo cuando en el bus de direcciones se haga una referencia al dispositivo de E/S controlado, trabajando en correspondencia con las líneas de control pertinentes (Como IO/M), a este bloque lo llamaremos Lógica de Entrada/Salida. También forman parte de este bloque, otras líneas de control para sincronización (Solicitud de Interrupción, Solicitud de Canal de DMA, etc.) Memoria intermedia (Latches de retención, buffers o BR) conectados al bus de datos, capaz de almacenar información temporalmente a fin de aligerar la transferencia y evitar pérdidas de datos por diferencias de velocidades. Registros de Control y/o de Estado, conectado al bus de datos que permita al programa (o al manejador de dispositivo, en muchos sistemas operativos) saber el estado del dispositivo. Finalmente. Debe tener un bloque que encapsule la lógica de interfaz con el dispositivo externo. Esta lógica debe coordinar la transmisión de datos, verificación de estado y establecimiento de la estrategia de control. Página 92 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S Interfaz con el bus del sistema I I Interfaz con el dispositivo externo Registro de datos Líneas de datos Datos Lógica de interfaz con el dispositivo externo Datos .. Registro de Estado/Control Líneas de direcciones Lógica de E/S Líneas de Control Lógica de interfaz con el dispositivo externo .. Estado Control Estado Control Figura 3. Estructura del módulo de E/S. Nótese en la Figura 3, que el módulo de entrada salida mostrado es capaz de atender a varios dispositivos de E/S, lo cual es bastante típico, por ejemplo en Interfaces de Almacenamiento Secundario (SCSI, IDE y SATA). 6.5 Interrupciones Son mecanismos de coordinación y sincronización mediante el cual los dispositivos de E/S pueden solicitar servicio del CPU. Al final del ciclo de instrucción, se verifica si existe alguna solicitud de interrupción. El CPU da servicio al dispositivo solicitante mediante una RTI o ISR. En este momento se verifica un cambio de contexto. El CPU suspende la ejecución actual y carga la ISR. Es evidente que para poder regresar al punto de ejecución, es necesario guardar el estado del procesador ( PC, Status, Valores intermedios, etc). No todas las arquitecturas guardan el estado automáticamente (Registros alternos, conmutación de BR o uso de pila) debiendo hacerlo la ISR. 6.5.1 Tipos de Interrupciones Síncronas (Excepciones - Software): Sincrónicamente a la ejecución de la instrucción (consecuencia de ésta). Asíncronas (Hardware): En el momento que el dispositivo lo solicita. 6.5.2 Diseño Simple del Sistema de Interrupciones Docente: Ing. José Díaz Chow Página 93 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . El CPU provee una señal de control de entrada INT para aceptar interrupciones de los dispositivos y una señal de salida INTACK para indicar que concede al dispositivo atención a su solicitud y ejecutando la ISR. 6.5.3 Múltiples Dispositivos En el diseño simple mostrado anteriormente, enfrentamos varios problemas si consideramos que la computadora soporta múltiples dispositivos de E/S. Es posible conectar todos los dispositivos a una misma línea de Solicitud INT y a una misma línea INTACK, sin embargo eso trae dos tipos de problemas cuando múltiples dispositivos emiten solicitudes al unísono: Identificación fiable de los Dispositivos que solicitan y Determinación de a quien se atiende en cada momento . Para el problema de Identificación existen dos técnicas: 6.5.3.1 ESCRUTINIO DE DISPOSITIVO: Se emplea una organización en colector abierto como el que se simula en la Figura 4, lo cual permite dar servicio a varios dispositivos utilizando una sola línea de solicitud de interrupción. En este ejemplo INTR es activa en bajo. Vcc CPU R INTR INTR INTR 1 INTR 2 ... INTR n Figura 4. Conexión de múltiples dispositivos a una línea de solicitud de interrupciones única con Identificación por escrutinio Si todas las señales de solicitud de interrupción de la INTR1 a la INTRn no están activadas (estado cero), el resistor R mantendrá la línea de solicitud de interrupciones en el estado 1. Al solicitarse una interrupción, el interruptor correspondiente se cierra cambiando la línea al estado cero, lo cual se invierte en la CPU. La solicitud de interrupción INTR es igual a INTR1 + ... + INTRn. Si se verifica que INTR vale cero, entonces al menos un dispositivo está solicitando atención y el CPU interroga a cada dispositivo para determinar quienes solicitan atención. La determinación del orden del servicio se logra mediante algoritmos de priorización o por un árbitro serial. Este sistema tiene la desventaja de que se requiere mayor gasto de tiempo para interrogar los bits de estado de los dispositivos. 6.5.3.2 USO DE IDS E INTERRUPCIONES VECTORIZADAS: Se requiere que cada dispositivo tenga asignado un código de identificación ID. La competencia entre múltiples dispositivos se resuelve normalmente empleando un árbitro paralelo. Cuando un dispositivo es Página 94 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I seleccionado para recibir atención, el árbitro envía el código de identificación del dispositivo a la CPU mediante el bus de datos. Regularmente los IDs de dispositivos se asocian a las líneas de solicitud de interrupción (entrada del árbitro), Para atender las interrupciones vectorizadas, se mantiene en memoria una tabla de “vectores de interrupción” que tiene una entrada por cada ISR de interrupción (también de las excepciones). Cada entrada de la tabla es un vector o puntero que tiene la dirección de inicio de la ISR o RTI, de forma que la CPU puede emplear el ID recibido por el bus de datos para calcular el vector correspondiente. 6.5.4 Concurrencia de Múltiples Interrupciones: 6.5.4.1 PRIORIDADES Ante la presencia de múltiples solicitudes de servicio de interrupción concurrentes, se requiere poder definir a qué dispositivo se dará servicio. Para resolver esta situación de competencia se emplean esquemas de prioridades. Durante la ejecución de una ISR, es posible que ésta deba interrumpirse para dar servicio a un dispositivo de mayor prioridad. La implantación de un esquema de prioridad múltiple, se realiza fácilmente mediante líneas separadas de solicitud de interrupción y de reconocimiento de interrupción para cada dispositivo. A cada línea de solicitud de interrupción se le asigna un nivel diferente de prioridad que es manejado por un circuito de prioridad denominado árbitro o controlador de interrupciones. Árbitro Paralelo: En este caso, el circuito controlador de interrupciones tiene una línea de entrada de Solicitud de Interrupciones INTR y una línea de reconocimiento INTA para cada dispositivo. El circuito se implementa como un decodificador de prioridades que concede el servicio al dispositivo con mayor prioridad. Este tipo de árbitro da soporte al manejo de IDs de las Interrupciones vectorizadas. INTRP INTR1 Dispositivo p .. Dispositivo 2 Dispositivo 1 INTA1 Circuito de arbitro de prioridad INTAP Figura 5. Priorización de Interrupciones con árbitro paralelo Árbitro Serial: Cuando varios dispositivos utilizan una sola línea de solicitud de interrupción, como en el caso de los sistemas de identificación por escrutinio, la forma en que los dispositivos están conectados a la CPU, determina la prioridad del dispositivo. En este caso el árbitro se implementa distribuido entre los mismos controladores o módulos de E/S y el sistema de escrutinio. A este árbitro se le denomina serial por su forma de conexión: la línea de interrupción (INTR) es común a todos los dispositivos y la línea de reconocimiento Docente: Ing. José Díaz Chow Página 95 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . (INTA) está conectada en forma de cadena de margaritas. Cuando el CPU activa la línea INTA como reconocimiento a una o más solicitudes sobre INTR, cada módulo debe proceder según ciertas reglas: Si recibe un 0 en su entrada INTA, significa que no recibe reconocimiento y lo pasa también a la salida INTA que se conecta al siguiente dispositivo. Si recibe un 1 en su entrada INTA, significa que tiene reconocimiento y será atendido si está en espera de un servicio de interrupción: o Si requiere servicio: Pone un 0 a su salida INTA. o Si no requiere servicio: Pasa el 1 a su salida INTA Nótese, por tanto, que el dispositivo que se encuentre eléctricamente más cercano a la CPU tendrá la mayor prioridad. La ventaja del arreglo de margarita es que no se requiere un circuito separado de decodificación de las prioridades. Cuando el CPU encueste los dispositivos, sabrá quién es inequívocamente. INTR CPU INTA Dispositivo 1 Dispositivo 2 Dispositivo n Figura 6. Priorización de Interrupciones con árbitro Serial Otra posibilidad es un esquema combinado como el que se muestra en la figura 7.6.4 donde tenemos un esquema jerárquico de niveles de prioridad permiten controlar varios dispositivos. Teóricamente este enfoque permite solicitar una interrupción con el nivel de prioridad que corresponda con la urgencia de la función que se está realizando lo que lo hace flexible, pero contiene una circuitería compleja de control. INTR 1 Prioridad CPU INTA 1 Dispositivo Dispositivo INTR p INTA p Dispositivo Dispositivo Figura 7. Árbitro Paralelo-Serie o multinivel 6.5.5 Habilitación e Inhabilitación de Interrupciones El esquema de prioridades de Interrupciones permite resolver situaciones de concurso o race conditions cuando tenemos solicitudes simultáneas, sin embargo introduce una nueva dificultad: una nueva interrupción del mismo dispositivo o una interrupción de mayor prioridad podrían interrumpir la ejecución del ISR. La solución de esta situación depende de la naturaleza de las interrupciones. En caso de interrupciones de mayor prioridad sería lógico permitir la interrupción de la ISR de turno (proceso de Disco Duro versus Refrescamiento de Memoria principal) sin embargo, a veces es imperioso completar la ISR sin interrupciones porque de otro modo el procesador podría quedar en un estado no fiable. En caso de Página 96 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I anidamiento de la misma ISR, deberá tratarlo el programador de la Rutina (Ejemplo del teclado y orden de tratamiento de caracteres tecleados). Para tratar estos casos, se provee de un mecanismo que permite la Inhabilitación (enmascaramiento) de las interrupciones (Disable – Enable) que regularmente se maneja mediante una bandera o código de condición en la palabra de status del CPU. Así el programador de la ISR puede deshabilitar todas las otras interrupciones y dar el servicio a la interrupción y nuevamente habilitar las interrupciones: Comienza ISR Desabilitar interrupciones Codigo de la ISR Habilitar interrupciones Finaliza ISR 6.5.6 Enmascarado selectivo de Interrupciones: Si queremos tratar solamente el anidamiento de ISR del mismo dispositivo, es requerido hacer un enmascaramiento solo de éste y no deshabilitar todas las interrupciones dentro del esquema de prioridades. Para tal fin, los árbitros suelen contar con un Flip-Flop de máscara que inhabilita el tratamiento anidado de cada interrupción por separado. La gran ventaja de esto es que tal comportamiento es programable. 6.5.7 Interrupciones no enmascarables: Algunas interrupciones no deben enmascararse debido a su importancia (Fallo de Energía, por ejemplo) y por tanto no se pueden bloquear (Son denominadas Interrupciones No Enmascarables o NMI). 6.5.8 Ejemplo de árbitro de Interrupciones A continuación se presenta un ejemplo de un árbitro de interrupciones, el Controlador Programable de Interrupciones (PIC) 8259 A de Intel. 6.5.8.1 EL PIC INTEL 8259A Las interrupciones son enviadas al procesador a través del controlador programable de interrupciones 8259A, el cual provee al sistema con ocho interrupciones de hardware priorizadas. Cuando el 8259A recibe una solicitud de interrupción, típicamente de un dispositivo periférico, el controlador conduce su salida en alto (INT), el cual está conectado a la línea de entrada al procesador (INTR). La línea INTR es utilizada por el procesador para señalar la ocurrencia de una interrupción enmascarable. Si el bit I está activo en el registros de banderas, el procesador envía una señal de reconocimiento al controlador 8259A. Después de recibir una señal de reconocimiento (INTA) del procesador, el controlador de interrupciones ubica el vector de interrupciones apropiada en el bus del sistema. Las ocho interrupciones de hardware (IRQ0 a IRQ7) en el 8259A son correspondidas por el controlador al vector de interrupciones del 8 al 15 (0Fh). Las interrupciones son priorizadas, la IRQ0 tiene la más alta prioridad y la IRQ7 la más baja prioridad. Muchas de estas fueron asignadas por los diseñadores de la PC a periféricos particulares. Ver Tabla. Docente: Ing. José Díaz Chow Página 97 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . Asignaciones de las interrupciones en la IBM PC XT/AT Interrupción IRQ0 IRQ1 IRQ2 IRQ3 IRQ4 IRQ5 IRQ6 IRQ7 IRQ8 IRQ9 IRQ10 IRQ11 IRQ12 IRQ13 IRQ14 IRQ15 Indice del vector 08h 09h 0Ah 0Bh 0Ch 0Dh 0Eh 0Fh 70h 71h 72h 73h 74h 75h 76h 77h Acción PC Pulso del reloj (18.2 por segundo) Entrada al teclado Reservado para interrupciones en cascada COM2 COM1 Controlador de disco fijo Controlador de disco flexible Controlador de impresora Reloj de tiempo real Redirección de cascada Reservado Reservado Dispositivo auxiliar Excepción del coprocesador matemático Controlador de disco fijo Reservado XT/AT XT/AT XT/AT XT/AT XT/AT XT/AT XT/AT XT/AT AT AT AT AT AT AT AT AT La PC AT está diseñada con un segundo controlador de interrupciones para ocho niveles adicionales de IRQ. La línea INT del segundo controlador (el esclavo) es conectado a la línea IRQ2 del primer controlador (el maestro) para formar el diseño en cascada como se muestra en la figura 7.6.5. Las ocho interrupciones (IRQ8 al IRQ15) del segundo controlador se corresponden a los vectores de interrupciones 112 (70h) al 119 (77h). Dado que las interrupciones adicionales están efectivamente conectadas a la línea IRQ2 del controlador maestro, ellas toman la prioridad sobre las líneas IRQ3 a la IRQ7 del controlador maestro. Un dispositivo de E/S como una tarjeta adaptadora que se conecta al bus de expansión ISA, puede emitir una interrupción al causar una transición de alto a bajo en una de las líneas IRQ del bus. En la mayoría de las tarjetas adaptadoras se puede seleccionar cual línea IRQ utilizar, usualmente configurando a través de jumpers o mediante lógica programable. Muchas tarjetas adaptadoras son capaces de producir interrupciones bajo más de una condición, por lo tanto la rutina de servicio de interrupción debe determinar la causa de la interrupción, usualmente examinando el registro de estado contenido en la tarjeta adaptadora. Bus de Direcciones/Datos/Control de la CPU INTA* INTA* INT Esclavo 8259A Control IRQ8 IRQ10 IRQ12 IRQ14 IRQ9 IRQ11 IRQ13 IRQ15 INT Master 8259A IRQ0 IRQ2 IRQ4 IRQ6 IRQ1 IRQ3 IRQ5 IRQ7 Bus ISA (AT) Figura 8. Conexión en cascada de dos PIC 8259A Página 98 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Figura 9. Organización Interna del Intel PIC 8259A 6.6 Acceso Directo a Memoria Este método de transferencia avanzado, se implementó con el objetivo de mejorar la velocidad de transferencia de datos, sobre todo para dispositivos y aplicaciones de E/S muy rápidos (Adquisición de sonido, discos duros de alta velocidad y video). Consiste en proveer un procesador auxiliar denominado “Controlador de Acceso Directo a Memoria” o DMAC (por sus siglas en inglés) en el módulo de E/S, capaz de hacer transferencia por programa directamente a la memoria, relevando al CPU de esta tarea. El acceso directo a memoria o DMA (por sus siglas en inglés) se aprovecha cuando los dispositivos son capaces de transferir gran cantidad de datos de una vez. Docente: Ing. José Díaz Chow Página 99 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . 6.6.1 Transferencia de datos de Acceso Directo a Memoria Cuando un programa desea realizar una transferencia empleando DMA, el CPU inicializa los parámetros de la misma e indica al Módulo DMA: Dirección de la Operación (E/SM o ME/S). Se indica la dirección base del dispositivo de E/S. Se indica la posición inicial de memoria. Se indica el número de bytes que se van a transferir Acto seguido, el CPU se desentiende de la transferencia. El procesador de DMA coordina el acceso al dispositivo y realiza la transferencia. Para realizar la transferencia el Controlador de DMA requiere usar el bus del sistema, por tanto debe coordinarse con el CPU para tomar control del bus, a través de algún protocolo de puesta en acuerdo (handshaking) mediante señales de control. Por ejemplo, el DMAC solicita acceso al bus activando la señal HOLD o BUS_REQUEST del CPU. El CPU concede el bus activando la señal HLDA o BUS_GRANT y se aísla eléctricamente del bus. Cuando DMAC recibe la autorización, procede a usar el bus y realiza la transferencia sincronizándose con el dispositivo de E/S mediante líneas del DMAC denominadas canal de DMA. Cuando finaliza la transferencia, el DMAC desactiva la señal HOLD o BUS_REQUEST, regresando el control al CPU. Finalizada la transferencia, el DMA reporta al programa (CPU) a través de una interrupción de Fin de Transferencia. 6.6.2 Modos de Transferencia de datos DMA Una ventaja de DMA sobre interrupciones es que la transferencia en DMA puede hacerse en cualquier ciclo, en tanto en Interrupciones, la verificación de solicitudes de interrupción se hace hasta al final de la fase de ejecución. DMA puede emplear además, diferentes modos de transferencia: a) Por ráfaga: Cuando requiere transferir bloques completos de datos a gran velocidad. En este modo el CPU es bloqueado hasta que se realiza la transferencia. b) Por robo de ciclos (cycle stealing): En este modo, el DMAC toma un ciclo para transferencia al final de la ejecución de cada instrucción, permitiendo así solapamiento entre las operaciones de CPU y la E/S. c) Transparente: Se emplea el bus durante las etapas del ciclo de instrucción en que el CPU no accede al bus, básicamente, durante la decodificación y ejecución de la operación. A continuación se muestra un esquema comparativo de los diferentes modos: Página 100 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Figura 10. Modos del DMA 6.6.3 Configuraciones de DMA Son posibles diversas configuraciones en la implementación de DMA. La más simple consiste en tener un solo controlador de DMA (DMAC Desacoplado) y los dispositivos de E/S conectados directamente al bus del sistema a través de su módulo controlador. En este diseño, el DMAC realiza dos transferencias a través del BUS: Dispositivo a DMAC y DMAC a Memoria (o viceversa). El CPU es suspendido dos veces cada vez. La figura a continuación esta configuración con DMAC desacoplado: Figura 11. DMAC desacoplado La siguiente configuración es la más difundida y consiste en tener integrado el DMAC en el módulo de E/S. El DMAC mediaría entre el bus del sistema y el dispositivo directamente, eliminando la necesidad de dos transferencias sobre el bus del sistema. Asimismo el CPU solo es suspendido una vez. La figura a continuación muestra gráficamente un esquema ejemplo de esta configuración: Docente: Ing. José Díaz Chow Página 101 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . Figura 12. DMAC integrado al módulo de E/S. La última configuración propone el empleo de un bus de E/S que es coordinado por el DMAC. El DMAC media entre el bus del sistema y el bus de entrada-salida. Los dispositivos se conectan al bus de entradasalida (I/O Bus) Figura 13. DMAC con bus de E/S. 6.6.4 Acceso al bus de múltiples Controladores de DMA En configuraciones que contienen múltiples DMACs es requerido coordinar adecuadamente el acceso al bus. Para esto se requiere el empleo de árbitros. Se pueden emplear árbitros paralelos o seriales. La figura a continuación muestra el ejemplo de una configuración de múltiples controladores de DMA coordinados mediante un arbitraje serial. Asimismo se muestra el diagrama de sincronización de las señales (timing diagram) para garantizar el uso exclusivo ordenado del bus del sistema. En este diagrama, la Señal BR se emplea para solicitar el bus y –BBSY indica que está ocupado. BG1 y BG2 son las señales de concesión de permiso al bus. Nótese el empleo de esquema en cadena de margaritas para el arbitraje. Página 102 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Figura 14. Sincronización de múltiples DMACs. 6.7 Procesadores y Canales de E/S Son una evolución de DMA. Consisten en procesadores inteligentes de tratamiento de E/S, capaces de atender a múltiples dispositivos a la vez. A diferencia de DMA que empleaba el bus del Sistema para realizar la transferencia, cuando se usa un IO Processor, IO Channel o Canal de E/S, los dispositivos se conectan directamente al canal de E/S. Actualmente, los módulos DMA emplean Procesadores de E/S y pueden ofrecer las mismas características que ofrecen los canales. Estos Procesadores de E/S se implementaron en computadoras grandes (Supercomputadoras,, mainframes y en algunas Minicomputadoras) permitiendo jerarquizar el sistema de E/S reduciendo la brecha de velocidades entre los diferentes dispositivos. De acuerdo a su modo de operación, existen tres tipos de Canales de E/S: 6.7.1 Canal Selector Canal dedicado a un dispositivo a la vez. Permite realizar transferencias de grandes bloques de datos. Propio para dispositivos de muy alta velocidad como discos duros e impresoras de línea. Docente: Ing. José Díaz Chow Página 103 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . Figura 15. Canal Selector. 6.7.2 Canal Multiplexado Permite atender muchos dispositivos de mediana y baja velocidad a la vez en un esquema de round-robin. Permite dos modos: Entresacado de Bytes y modo ráfaga. En el primero la transferencia es byte a byte y en el segundo es por bloques. Cada dispositivo tiene un quantum de tiempo asignado para transferencia. Si no hay transferencia pendiente, se pasa la oportunidad al siguiente. Toda transferencia comienza en modo de entresacado de bytes. Cuando un dispositivo termina su quantum inicial y aún tiene datos cuantiosos que transferir, se conmuta a modo ráfaga y se le brinda un segundo quantum. 6.7.3 Canal Multiplexado por bloques: Este canal multiplexado siempre opera en modo ráfaga. Figura 16. Canal multiplexor Página 104 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I 6.8 Interfaces Estándares Con el objetivo de simplificar la conexión de periféricos comunes como módems e impresoras, los fabricantes de computadoras han ido acordando el uso de interfaces estándares que provean un conector y un conjunto de características predefinidas de forma tal que cualquier dispositivo externo pueda implementar comunicación con el sistema de entrada-salida, mediante el uso de tales interfaces. En función de la cantidad de bits que se transmiten simultáneamente, tenemos dos grupos de interfaces estándar: Las paralelas (n bits a la vez) y las Serie (1 bit a la vez). 6.8.1 Interfaces Serie Este grupo de interfaces, transmiten un solo bit a la vez, ya sea simplex (en una sola dirección), semiduplex o duplex. La más reconocida es la interfaz serial TIA RS-232 que aún se encuentra disponible en la mayoría de las PC y que se empleaba para comunicaciones asíncronas. En la actualidad ha cobrado mucho auge la interfaz USB (Universal serial bus) que mejora grandemente las tasas de transferencia y el IEEE 1394 o Firewire (solo disponible de base en computadoras de alto desempeño para multimedia pero se puede contar con ésta mediante tarjetas de extensión). 6.8.1.1 INTERFAZ SERIE RS-232 Esta interfaz disponible en la mayoría de las PC tiene el conector en dos presentaciones, de 25 y 9 pines. Provee comunicación serial asíncrona y opciones de sincronización por hardware y software (a través del protocolo XON/XOFF). Tiene un modelo de comunicación desbalanceado (una línea de transmisión y una de recepción con tierra o retorno común). A continuación se muestra la distribución de pines y un programa de ejemplo en C para lograr comunicación PC a PC estilo talk de unix, mediante un cable NULL-MODEM. Distribución de pines de los conectores DB25 y DB9: Figura 17. Distribución de Pines de conectores serie DB9 y DB25. Programa para comunicación PC-PC mediante cable Null-Modem usando la función de C bioscom. Archivo COM.H (Definición de constantes de bioscom) #include <bios.h> /* Ports */ #define COM1 #define COM2 #define COM3 0 1 2 Docente: Ing. José Díaz Chow Página 105 A R Q U I T E C T U R A #define COM4 D E M Á Q U I N A S C O M P U T A D O R A S I I . 3 /* some HandSk Signal */ #define #define #define #define DATA_READY OVERRUN_ERR PARITY_ERR FRAME_ERR 0x100 0x200 0x400 0x800 #define #define #define #define BREAK_DONE HOLD_EMPTY SHIFT_EMPTY TIME_OUT 0x1000 0x2000 0x4000 0x8000 /* ---------------------- */ #define #define #define #define CHGE_CLR2S CHGE_DS_RDY TRAIL_ERING CHGE_RX_LIN 0x1 0x2 0x4 0x8 #define #define #define #define CLR_2_SEND DATA_SET_RDY RING_IND RX_LINE 0x10 0x20 0x40 0x80 /* Commands #define #define #define #define /* CONFIG WRITE READ STATUS */ 0 1 2 3 Comm Parameters: n Bits, stop Bits, Parity, Baud Rate */ #define BITS_7 #define BITS_8 0x02 0x03 #define STOP_BIT_1 #define STOP_BIT_2 0x00 0x04 #define PARITY_NONE #define PARITY_ODD #define PARITY_EVEN 0x00 0x08 0x18 #define #define #define #define #define #define #define #define 0x00 0x20 0x40 0x60 0x80 0xA0 0xC0 0xE0 BAUD_110 BAUD_150 BAUD_300 BAUD_600 BAUD_1200 BAUD_2400 BAUD_4800 BAUD_9600 Archivo: TERMINAL.C ( Programa simple de comunicación PC-PC) #include #include #define #define #define "com.h" <conio.h> CRt 13 NLn 10 ESC 27 main () { /* Variables para manejo de ventanas de interlocutores */ int meLeft = 1, meTop = 13, meRight = 80, meBottom = 24; int meAttribute = BLACK + ( CYAN << 4); int youLeft = 1, youTop = 1, youRight = 80, youBottom = 12; int youAttribute = LIGHTGRAY + ( BLUE << 4); Página 106 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I int mx, my, yx, yy ; /* Variables para manejo del puerto y sus datos int comPort = COM1; int settings; int register in, out, status; */ /* Parámetros de la comunicación */ settings = ( BAUD_9600 | PARITY_EVEN | STOP_BIT_1 | BITS_7 ); mx = my = yx = yy = 1 ; /* Se configura el puerto */ bioscom( CONFIG, settings, comPort ); /* Limpiar las ventanas para los interlocutores */ window( meLeft, meTop, meRight, meBottom ); textattr( meAttribute ); clrscr(); window( youLeft, youTop, youRight, youBottom ); textattr( youAttribute ); clrscr(); /* Proceso de Talkin' */ while( 1 ) { status = bioscom( STATUS, 0, comPort ); if( status & DATA_READY ) /* Hay datos que leer */ { if(( out=bioscom( READ, 0, comPort ) & 0x7F ) != 0 ) { if ( out == ESC ) return( 0 ); textattr( youAttribute ); window( youLeft, youTop, youRight, youBottom ); gotoxy( yx, yy ); putch( out ); if (out == CRt) putch(NLn); yx = wherex(); yy = wherey(); } } if( kbhit() ) { in = getch(); bioscom( WRITE, in, comPort); if(in == ESC) return( 0 ); textattr( meAttribute ); window( meLeft, meTop, meRight, meBottom ); gotoxy( mx, my ); putch(in); if (in == CRt) putch(NLn); /* Manejar Nueva línea en Retorno de carro */ mx = wherex(); my = wherey(); } } } Asignación de Pines de los conectores Seriales y Esquema de conexión para elaborar cable NULL MODEM para comunicación PC-PC. D-Sub 9 Receive Data Transmit Data Data Terminal Ready System Ground Data Set Ready + Carrier Detect Docente: Ing. José Díaz Chow 2 3 4 5 6+1 3 2 6+1 5 4 D-Sub 9 Transmit Data Receive Data Data Set Ready + Carrier Detect System Ground Data Terminal Ready Página 107 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . Request to Send Clear to Send 7 8 8 7 Clear to Send Request to Send D-Sub 9 Receive Data Transmit Data Data Terminal Ready System Ground Data Set Ready + Carrier Detect Request to Send Clear to Send 2 3 4 5 6+1 7 8 2 3 6+8 7 20 5 4 D-Sub 25 Transmit Data Receive Data Data Set Ready + Carrier Detect System Ground Data Terminal Ready Clear to Send Request to Send 6.8.1.2 INTERFAZ USB: El Universal Serial Bus o USB por sus siglas en inglés es una interfaz para dispositivos externos que emplea comunicación serial. El estándar, que actualmente va en su tercera versión (USB 3.0), especifica los cables o interfaces, conectores y protocolos usados en un bus para conectar, comunicar y proveer de alimentación eléctrica a computadoras con otras computadoras, periféricos y dispositivos externos. La Figura 18, muestra el símbolo internacional del conector de USB en las computadoras. Figura 18. Símbolo del USB. El USB fue diseñado para economizar y estandarizar la conexión de periféricos. Originalmente las computadoras empleaban diferentes interfaces para cada dispositivo. Por ejemplo, el teclado usaba dos posibles interfaces DIN y PS/2 (esta última era propiedad de IBM, lo que limitaba su uso), el ratón usaba el puerto serial RS-232 o el PS/2 para ratón, y la impresora empleaba la interfaz paralela centronics. La idea de USB fue proporcionar una única interfaz a través de la cual poder conectar cualquier dispositivo periférico a la computadora. Fue desarrollado a mediados de los años 1990. En 1996, se completó la primera especificación USB 1.0 que tuvo dificultades para su implementación. Ésta no fue totalmente estable sino hasta en 1998 cuando se lanzó la especificación USB 1.1.4. Una de las ventajas del USB respecto al RS-232 es su alta velocidad de transferencia que le permite trasladar datos masivos, haciéndola apropiada incluso para dispositivos de almacenamiento. Asimismo, su capacidad de proporcionar energía a los dispositivos externos (hasta 500 mA) facilita la implementación y operación de estos dispositivos. La tabla a continuación muestra la descripción de líneas de la interfaz para la especificación USB 2.0 en sus variantes de conectores A y B, que son los más usados en computadoras de escritorio y servidores. Pin Página 108 Nombre Color de cable Descripción 1 VCC Rojo +5 V 2 D− Blanco Data − 3 D+ Verde Data + Docente: Ing. José Díaz Chow A R Q U I T E C T U R A 4 GND D E M Á Q U I N A S Negro C O M P U T A D O R A S I I Tierra Esta otra tabla muestra la descripción de líneas de la interfaz para la especificación USB 2.0 en sus variantes de conectores mini y micro A y B, que son los empleados en dispositivos móviles. Pin Nombre Color de cable Descripción 1 VCC Rojo +5 V 2 D− Blanco Data − 3 D+ Verde Data + Permite la distinción de Micro-A y Micro-B 4 ID 5 GND Ninguno Negro Tipo A: conectado a tierra Tipo B: no conectado Tierra y retorno o negativo Como puede comprobarse de las descripciones de las líneas físicas, una característica interesante de USB que lo hace superior a sus antecesores seriales y paralelos en la computadora, es que no tiene líneas para las funciones de control (solo tiene líneas de datos), éstas son realizadas mediante protocolos de comandos, no mediante líneas físicas, lo cual facilita la especificación, aunque complejiza la lógica de control. La Figura 19 muestra las diferentes tipos de conectores USB. Figura 19. Tipos de Conectores USB 6.8.2 Interfaces paralelas Estas interfaces trasmiten n bits simultáneamente. Las líneas de transmisión pueden ser unidireccionales o bidireccionales. Además de las líneas de transferencia se requieren líneas de sincronización y control. Docente: Ing. José Díaz Chow Página 109 A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I . La más reconocida es la interfaz Centronics de 8 bits que se ha usado en las PCs para la comunicación con las impresoras, antes de la introducción masiva de USB. Determinacion de la cantidad de puertos paralelos y su dirección base: La PC puede tener de 1 a 4 puertos paralelos denominados LPTx. Se puede determinar la cantidad y la dirección base de éstos por varios métodos: Debug: la asignación de puertos paralelos en la estructura del BIOS comienza en la dirección 0040:08H. En debug la instrucción –d 0040:08 L8 muestra los valores para estos posibles 4 puertos. En una máquina de prueba el resultado fue: 0040: 0008 78 03 78 02 00 00 00 00 Lo que indica que en ésta existen sólo dos puertos con las direcciones que se muestran en la tabla abajo. Nótese que la PC usa ordenamiento de palabra “little endian”, es decir que el entero se almacena en la memoria poniendo el byte menos significativo en las dirección más baja, así los bytes 78 03 representan el entero 0378H. Puertos paralelos existentes en la PC Designación LPT1 LPT2 Registros del Puerto (Datos = Dirección Base) Datos Estado Control 0378H 0278H 0379H 0279H 037AH 027AH Usar programas utilitarios como MSD.EXE, Norton Utilities, Las rutinas de información del sistema de Microsoft (accesibles desde el About Box de Programas como Microsoft Word o Excel) u otros. Crear programas propios: Por ejemplo, el código en C que aparece abajo: # include <stdio.h> # include <dos.h> void main() { unsigned int far *ptraddr; unsigner int address; int a; ptraddr = (unsigned int far *) 0x00000408; for(a = 0;a <= 3; a++) { address = *ptraddr; if (address == 0 ) printf(‘‘Puerto no encontrado para LPT%d \n’’,a+1); else printf(‘‘Puerto LPT%d - Dirección base: %Xh \n’’, a+1, address); *ptraddr++; } } Página 110 Docente: Ing. José Díaz Chow A R Q U I T E C T U R A D E M Á Q U I N A S C O M P U T A D O R A S I I Asignación de Pines del Conector y su conexión interna a los registros del Puerto: L Í N E A S Ú T I L E S : - 8 salidas en el puerto DATA. - 5 entradas (1 invertida) accedidas vía el registro de STATUS. - 4 salidas (3 invertidas) en el puerto de CONTROL. - Los 8 pines restantes estan puestos a tierra. Figura 20. Distribución de Pines del conector de interfaz paralela DB25 Señales del Conector Registros Internos del puerto paralelo Figura 21. Descripción de señales y puertos de la interfaz paralela. Docente: Ing. José Díaz Chow Página 111 A R Q U I T E C T U R A Página 112 D E M Á Q U I N A S C O M P U T A D O R A S I I . Docente: Ing. José Díaz Chow