Académique Documents
Professionnel Documents
Culture Documents
Arquitecturas de Máquinas
Computadoras II
José L. Díaz Chow
Managua, Nicaragua
Arquitectura de Máquinas Computadoras II
Guía de estudio para el estudiante
Elaborado por
Ing. José Díaz Chow
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 16
2.5.3 MÁQUINA DE REGISTROS. 18
3 DISEÑO DEL CONJUNTO DE INSTRUCCIONES 21
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?
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.
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:
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 John Presper Eckert
unos de sus alumnos, propusieron construir un computador de uso general usando 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.
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ó
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.
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 el 77, 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).
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
ú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 los procesadores “solo” son
la excepción y el mercado se está orientando a 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. Era en que tenemos el privilegio de vivir.
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.
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.
Control Cálculo
Camino o Flujo de los Datos
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.
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 Mecanismo
datos de Control
Facilidad de
Procesamiento
de Datos
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 Mecanismo
datos de Control
Facilidad de
Procesamiento
de Datos
Periféricos Computadora
Memoria
Procesador
Computadora
Estructura de
Interconexión
E/S
Líneas de Comunicación
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
Mecanismo de
Organo de Cálculo
Control
Estructura de Interconexión
Sistema de E/S
1.4.2.1 P RO C ES AD O R O CP U
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.
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.
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.
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.
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
Cargar los operandos
Ejecutar la operación
Guardar el resultado
Verificar si hay solicitudes de interrupción
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).
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 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.
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.
CPU
R0 MAR
Entrada / Salida
R1 MDR
.
.
. SOURCE
Bus de Datos
Bus de Direcciones
TMP
Bus del sistema
Y SP
ALUsel PC
ALU
IR
Z
Memoria
Unidad de
Control
FLAGS
READ
WRITE
IO/M
INTACK INT
El control incluye a la unidad de control que se encarga de coordinar y realizar las acciones necesarias para que
se ejecuten las instrucciones.
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.
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.
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 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
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:
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.
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.
Instrucción Operación
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.
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 MA R MDR
Memoria e
Interf ace de
E/S
R0
R1 IR
R2
Unidad
de
Control
Rm-1
A LU F
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.
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
Instrucciones de 2 operandos
MOV Rd, Rf ; Rd Rf
MOV Rd, n ; Rd n | n es un número
MOV Rd, X ; Rd M(X) ; X es una variable en memoria
MOV Rd, (m) ; Rd M(m) ; m es una dirección en memoria
MOV X, Rf ; M(X) Rf ; X es una variable en memoria
MOV (m), Rf ; M(m) Rf ; m es una dirección en memoria
ADD Rf, Rd ; Rd Rf + Rd
SUB Rf, Rd ; Rd Rf - Rd
MUL Rf, Rd ; Rd Rf * Rd
DIV 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.
Un operando (Acumulador) :
LOAD B ; Acc= (B)
MULT C ; Acc= (A)*(C)
Máquina de Pila:
PUSH A
PUSH B
PUSH C
MUL ; calcula B*C
ADD ; suma A a B*C
POP D ; salva resultado
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:
3.1.2 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
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.
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.
Control de flujo de Permite modificar la secuencia del JP, JR, BRN, CALL,
Programa programa para implementar sentencias de RET
selección, ciclos y llamadas a subrutinas.
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).
RISC CISC
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.
IDENTIFICACION DIRECCIONAMIENTO
MD VALOR(ES)
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?
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.
CO O2 O1
0000 xxxxxx xxxxxx
… … … 15 inst. de 2 operandos
1110 xxxxxx xxxxxx
1111
Nótese que con este formato, no se requieren más bits para codificar las nuevas 30 instrucciones.
Ejemplo: Supongamos que se desea codificar el conjunto de instrucción hipotético mostrado en la tabla
siguiente:
Nemónicos de Contador de Frecuencia Relativo
Instrucciones
LOAD 1/4
STO 1/4
ADD 1/8
AND 1/8
NOT 1/16
RSHIFT 1/16
JUMP 1/16
HALT 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)
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” (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.
a) 1/8
1/8 1/8
b)
1 0 1 0 1 0 1 0
1 0
1/4
1 0
1/2
1 0
c)
1/2
Se puede apreciar que el procedimiento de Huffman codifica con menos bits las instrucciones mas
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 formula:
n
longitud CO med LA li . f i
i 1
=1+¾+1
= 2.75 bits.
Aplicando esta formula al esquema de codificación de bloque donde cada instrucción será codificada
con tres bits:
= 3/2 + ¾ + ¾
= 3 bits.
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%.
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.
MD V
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.
CO MD1 V1 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
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.
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 V = # ( operando )
El operando se encuentra en uno de los registros del procesador. En este caso el valor del operando es el
contenido del registro.
MD r Modo de direccionamiento
Directo o Directo de Registro
BANCO DE
REGISTROS DEL
PROCESADOR
Dirección
Efectiva
OPERANDO
Rr
Docente: Ing. José Díaz Chow 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 .
MD @ Modo de direccionamiento
Absoluto o Directo de Memoria
MEMORIA
Dirección
Efectiva
OPERANDO
MD r Modo de direccionamiento
Indirecto de Registro
BANCO DE
Página 32 REGISTROSDocente:
DEL Ing. José Díaz Chow
MEMORIA PROCESADOR
Rr
Dirección Efectiva
OPERANDO
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 .
Se pueden dar diferentes niveles de Indirección, según la arquitectura. Como ejercicio visualice el
diagrama gráfico para doble indirección.
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.
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 r Modo de direccionamiento
de Autoincremento
BANCO DE MEMORIA
REGISTROS DEL
PROCESADOR
Rr
Dirección Efectiva OPERANDO Celda A
Celda A + k
Operando = M([ Rr ])
Rr = [ Rr ] + k
MD r Modo de direccionamiento
de Autodecremento
BANCO DE MEMORIA
REGISTROS DEL
PROCESADOR
1 EA: Effective Address, Dirección Efectiva. OPERANDO Celda A - k
Rr
A Celda A
Página 34 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 .
Rr = [ Rr ] - k
Operando = M( [ Rr ] )
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.
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.
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.
BANCO DE MEMORIA
REGISTROS DEL
PROCESADOR
Rr
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.
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 Modo de direccionamiento
Base + Desplazamiento
BANCO DE MEMORIA
REGISTROS DEL Dirección Base
PROCESADOR
desplazamiento
Rr
Base
+ OPERANDO
Operando = M( [ Rr ] + desplazamiento )
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
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.
MEMORIA
(Area de programa)
+ próxima instrucción
realmente
desplazamiento
(negativo )
instrucción actual
próxima instrucción
PC originalmente
PC = [PC] + desplazamiento
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.
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 MD1 V1 MD2 V2
Formato de la instrucción
CO MD 1 V1 MD 2 V2
0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1
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.
4 UNIDAD DE EJECUCION
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.
n 1
A Valor ( N ) ai r
i
i 0
La computadora trabaja en binario es decir r = 2. Cualquier entero en decimal puede representarse en binario.
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 Hex.
y 3 para Octal) con lo cual es más fácil manipular y convertir datos.
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 S I G NO - M AG NI TU D
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:
0
A Valor ( N ) (1) a r
[ MSB]
i
i
i n2
Nótese que existen dos posibles ceros: -0 y +0, por cuanto el rango es: [– (2 n-1 –1), + (2 n-1 –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
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.
-128 64 32 16 8 4 2 1
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.
2n
En sistemas simétricos M y V(N) = A - M
2
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 FPU interna al procesador. Más adelante enfocaremos este tema
con más detenimiento.
Para representar los números reales se han usado diversas abstracciones. La más aceptada actualmente es el
formato de punto flotante que propone el estándar IEEE 754. Éste en realidad define dos formatos: uno en
simple precisión de 32 bits y otro en doble precisión de 64 bits. Un número real tiene una parte entera y otra
fraccionaria y puede ser tanto positivo como negativo.
El problema de representación consiste en saber dónde está la coma o punto decimal. Algunas aproximaciones
representan un punto fijo pero esto tiene limitaciones de rango. Para obtener más flexibilidad, se han
implementado también formatos en punto flotante que son las que se usan más hoy día. El estándar se basa
en la notación científica: mantisa*BASEexponente. La tira de bits, por tanto se organiza en dos campos lógicos:
mantisa y exponente. La base está predefinida (binaria). La mantisa se guarda en representación signo-
magnitud y el exponente en exceso a m. En este caso, se supone que la mantisa es el número que continua
inmediatamente después del punto. La posición real del punto, por tanto se obtiene del valor del exponente.
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
4.2.3.1 C AR AC TE R E S O DATO S AL F AN U M ÉR I CO S
Usan sistemas de codificación como el ASCII. Actualmente se emplean formatos más largos como UNICODE
que emplea 2 bytes por carácter.
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 E S TR U C TU R AS :
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.
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:
entonces: Si = ci Z + ci Z
Si = xi yi ci
Xi Yi Xi Yi Ci Si Ci+1
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
Ci+1 Ci 0 1 1 0 1
Sumador
Completo 1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
Si
Xi ' Xi
Yi '
Yi
Xi '
Xi
Yi
Ci+1
Ci Ci
Xi Yi
Yi '
Ci
Si = Xi Yi Ci
Xi
Yi
Implementación del Sumador
Se puede 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 X2 Y2 X1 Y1 X0 Y0 X3 Y3 X2 Y2 X1 Y1 X0 Y0
C4 C0
C3 C2 C1 C0
FA FA FA FA CPA
C4 S3 S2 S1 S0
S3 S2 S1 S0
Diagrama de bloque de un
sumador de 4 bits
Sumador de 4 bits con acarreo propagado
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:
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 mas
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:
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
X3 Y3 X2 Y2 X1 Y1 X0 Y0 C0
Este resultado muestra
que C1, C2, C3 y C4 pueden ser
generados directamente de C0 y C4
las entradas. Por esta razón, Carry Look Ahead Logic (o Calculator)
estas ecuaciones son llamadas
Ecuaciones de Acarreo
Adelantado. Estas ecuaciones C3 C2 C1 C0
pueden implementarse en un FA FA FA FA
bloque hardware y alimentar
con el las entradas de los carry
del sumador completo S3 S2 S1 S0
obteniendo un CLA. La figura 4.5
Figura 4.5. Un Sumador de acarreo adelantado o CLA de 4 bits.
muestra la implementación de
tal CLA.
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
16 F
Y CLA
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.
16 OR
S0
X
16
Unidad F
Y 16 Aritmética
Z
MUX
16
Unidad G
16 Lógica
S0
S1
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.
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.
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 0 1 2 3
s1
s0 0 1 2 3
s0 s1 s1
MUX
s0 s0
CLK CLK S
CLK CLK
CLR CLR
D
CLR CLR
Q
qi
Salida
qi
Salida
Organización interna de la celda Diagrama a bloque de la celda
básica S básica S
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.
X3 X2 X1 X0
R L
(Entrada (Entrada
derecha) izquierda)
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
s1 s1
s0 s0
S3 S2 S1 S0
CLK CLK
CLR CLR
q3 q2 q1 q0
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.
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 esta
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 ya emplean este tipo avanzado de registros.
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.
. . .
PC
realiza en un mismo pulso de reloj se denomina Paso Bus
de
de control. Dirección
MAR
MEMORIA
Para poder entender el funcionamiento de la unidad MDR Rn-1
de control, requerimos definir a detalle la estructura Bus
de
Datos
del procesador: ALU, registros de trabajo y de Y source
propósito general, así como la estructura de
interconexión de los componentes dentro del Y X
SP
Líneas
procesador. Para efectos didácticos vamos a recurrir de ALU
Control
ALU
nuevamente a nuestro modelo sencillo de procesador
con un sólo bus común, que se muestra en la figura Z
5.1. Nótese la existencia de registros auxiliares de
trabajo como Y, Z y SOURCE que son inaccesibles al Figura 5.1. Organización simple de Procesador con bus único
programador y se usan para almacenar datos
temporalmente entre pasos diferentes de control.
Existen también procesadores con múltiples buses internos que mejoran el desempeño de la ejecución.
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,
para lo cual emplearía las líneas de activación de tales PC R0 in in
Y X x
Es clave comprender que no es permitido activar dos ALU R2
compuertas de salida en el mismo instante de tiempo (o pulso x
de reloj del procesador), pues no tiene sentido, lo que Zin
x R2out
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:
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:
Paso Acciones
1 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:
Formalmente:
Paso Acciones
1 R2out, Yin
2 R1out, ADD, Zin
3 Zout, R1in
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 fuente y la tercera el 2000 del 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.
CO MD1 V
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.
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)
Al bus
Figura 5.4 Extensión de Signo
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:
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.
T N Z V C
Modo Modo Prioridad Banderas de Condición
Actual Anterior
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.
condición. ...
BANDERAS DE
...
CONDICION
El indicador del paso de control actual DECODIFICADOR /
...
IR
se puede implementar mediante un contador CODIFICADOR
...
CONDICION
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 D ECONTADOR
LA CU DE
CLCK PASO
de control. Si separamos estas funciones, DE CONTROL
...
podemos especificar mejor el diseño de la
CU en función de la función principal: DECODIFICA-
DOR DE PASO
generación de las señales de control para T1 T2
... Tn
I2
BANDERAS DE
enfoque más detallado, se hace evidente la
...
I3 CONDICION
DECODIFI-
necesidad de una señal de reset del CADOR DE
...
...
IR INSTRUCCIO-
CODIFICADOR
contador de paso que no es más que la NES
CODIGOS DE
señal End y la necesidad de otra señal de
...
Im CONDICION
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:
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.
BRN
N N
ADD BR ADD JR
T6 T5 T8 T7 T7 T4
T1 ... ...
... ...
Zin
END
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 ADD Generación de la
T4
me permite implementar estas condiciones, como el señal RUN
lector puede fácilmente comprobar.
WMFC WMFC
MFC
RUN
RUN MFC
D Q
T1 T2 T3
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.
ARREGLO ARREGLO
...
AND OR
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.
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.
MARi
Paso PCin PCout Yin READ MDRout IRin ClrY SetC ADD Zin Zout R1in R1out R2in R2out WMFC END …
n
1 0 1 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 …
2 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 …
… … … … … … … … … … … … … … … … … … … …
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.
SOURCEout
SOURCEin
CLEAR Y
MDRout
WMFC
… …
MARin
SET C
READ
PCout
R1out
R2out
ADD
End
PCin
R1in
R2in
CW
Zout
IRin
Yin
Zin
1 … 0 1 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 …
2 … 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 …
3 … 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 …
4 … 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 …
5 … 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 …
6 … 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 …
7 … 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 …
8 … 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 …
Figura 5.14 Microprograma para ADD R1, R2
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:
Banderas de
Generador de Condición
Dirección
IR inicial y de
ramificación Códigos de
Condición
PC
Memoria del cw
Programa
Antes de pasar a analizar la operación del secuenciador, necesitamos definir algunas reglas:
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.
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:
Dir MicroInstrucción
0 PCout, MARin, READ, Clear Y, Set C, ADD, Zin
1 Zout, PCin, WMFC
2 MDRout, IRin
3 Branch Dirección Inicial del Prog. adecuado
20 Si N entoncesBranch a 24
21 PCout, Yin
22 IR(V)out, ADD, Zin
23 Zout, PCin
24 End
N N
Figura 5.17. Modificación del PC en BRN
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:
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
IR y de ramificación
Códigos de
Condición
INC PC
cw Señales de
Control
Q' Generador de
...
MFC
CLK Memoria del
Señales de
Programa Control
D
WMFC 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 embargo se pueden hacer Ramificaciones para conducir la micro rutina por el camino
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 señales out en una misma Instrucción y sólo
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
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 BRin, BRout para su
manipulación.
F1 F2 F3 F4 F5 F6
...
(4 bits) (3 bits) (2 bits) (2 bits) (4 bits) (2 bits)
000:
0000:Nada 00: Nada 00: Nada 0000: Add 00: Nada
Nada
0001: PCout 001: PCin 01: MARin 01: Yin 0001: Sub 01: READ
0010: MDRout 010: IRin 10: MDRin 10: SOURCEin 0010: Div 10: WRITE
0011: Zout 011: Zin 11: TEMPin 11: DESTINEin 0011: Mult
0100: R0out 100: R0in 0100: And
0101: R1out 101: R1in 0101: Or
0110: R2out 110: R2in 0110: Xor
0111: R3out 111: R3in 0111: …
1000: SOURCEout 1000: …
1001: DESTINEout 1001: …
1010: TMPout 1010: …
1011: IR(V)out 1011: …
F7 F8 F9 F10
… …
(1 bit) (1 bit) (1 bit) (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.
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 13 12 11 10 9 8 7 6 5 4 3 2 1 0
CO MD1 R1 MD2 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.
START
000
001
PC <- [Z]
002
003
161 141 121 111
163
Y <- [MDR]
164
165
166
167 101
170
200
261 241 221 211
263
Y <- [MDR]
264
265
266
267 201
270
271
272 273
STOP
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 7 6 5 4 3 2 1 0
0 1 1 0 0 1 0 1 1 1 0 0 0 0 1 1
CO MD1 R1 MD2 R2
Figura 5.21 Codificación de Instrucción ADD (R7)+, R3
Dirección MicroInstrucción
(octal)
000 PCout, MARin, READ, Clear Y, Set C, ADD, Zin
001 Zout, PCin, WMFC
002 MDRout, IRin
003 Br {PC[PLA]; PC 101, PC5,4 [IR11,10], PC3 [IR11].[IR10]. [IR9]}
121 [IR3]}121[IR
R7out , MARin11, ].[IR
READ,10].[IR9]} Y, Set C, ADD, Zin
Clear
122 Zout, R7in
123 Br {PC 166; PC0 [ IR9 ]}, WMFC
166 MDRout, MARin READ, WMFC
167 MDRout, SOURCEin
170 Br {PC 201, PC5,4 [IR5,4], PC3 [IR5] . [IR4] . [IR3]}
201 R3out, Yin
202 Br {PC 270}
270 SOURCEout, ADD, Zin
271 Br {PC 272; PC0 [IR5] . [IR4] . [IR3]}
273 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 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.
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.
6. EL SISTEMA DE MEMORIA
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 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.
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 mas usadas.
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:
Óptica,
Magneto-Óptica (MO)
En este punto es importante mencionar los diferentes tipos históricos de ROM que fueron
evolucionando hacia formas de RW:
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.
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
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-flexibilidad-
coste. 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.
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
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.
Temporización y
control
Contador
de
refresco
Deco-
Buffer de difica-
direccione dor Matriz
s de filas de de celdas de
filas memoria
Buffer
Buffer de de entrada
direccione Amplificadores de datos
s de de lectura
columnas y puerto de E/S Buffer
de salida
Descodificador de datos
de columnas
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.
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.
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.
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í.
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é.
Se han desarrollado tres técnicas de mapeo o funciones de correspondencia de la memoria principal con la
caché:
6.5.3.1 M AP E O DI R EC TO :
- Cada bloque de memoria principal es asignado a una línea específica de caché. La correspondencia se
expresa como:
i = j % Bc
- 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 caché con correspondencia directa divide una dirección de la memoria principal en tres campos
diferentes:
- El identificador de línea especifica la línea física de la caché que asignará la dirección con referencia.
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.
Memoria
Cache principal
Etiqueta Datos
Dirección de memoria
Etiqueta Línea Palabra
Comparación
(Acierto de cache)
(Fallo de cache)
Se implementa fácilmente.
Bajos costos.
Es fácil determinar dónde se puede encontrar una referencia de la memoria principal en la caché.
6.5.3.2 C O R R ES PO N D EN CI A AS O C I ATI V A:
- 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.
Flexibilidad.
- Desventajas:
Memoria principal
Etiqueta Datos
Dirección de memoria
Etiqueta Palabra
Comparación
(Acierto de cache)
(Fallo de cache)
6.5.3.3 C O R R ES PO N D EN CI A D E C O N JU N TO S AS O CI ATI VO S :
- 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.
- Si un conjunto puede asignar x líneas, se dice de él que es o tiene correspondencia asociativa de x vías:
Memoria principal
Etiqueta Datos
Dirección de memoria
Etiqueta Conjunto Palabra
Conjunto 0
Comparación Conjunto 1
(Acierto de cache)
(Fallo de cache)
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).
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.
7 EL SISTEMA DE ENTRADA-SALIDA
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.
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.
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 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
Bus de Datos
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.
CPU +
Cache L2
Cache L1
Bus PCI
CD DD Controlador IDE
Controlador de DMA USB
DD DD Puente PCI a ISA
Bus ISA
LPT Disquete
Slot Slot
Super
Com 1 Teclado
I/O
Com 2 Ratón PS/2
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.
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.
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.
7.2.3.1 B U S I S A:
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.
Características Electricas:
+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)
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.
Las líneas de comando (C/BE3 to C/BE0) indican el tipo de transferencia durante la fase de direcció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.
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
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)
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 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.
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.
Lógica de Datos
interfaz
Registro de datos
con el E s tado
Líneas de dispositivo
datos
externo
..
Control
Registro de Estado/Control
Líneas de
Lógica de Datos
di rec c i ones
Líneas de
Lógica de
E/S
.. interfaz
con el
dispositivo
E s tado
Control
externo Control
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).
7.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.
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.
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
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.
7.5.3.2 U SO DE I D S E I N TE R R U P CI O NE S VEC TO RI Z AD AS :
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
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.
7.5.4.1 P RI O RI D AD E S
Á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
Circuito
INTA1 de arbitro
de
prioridad
INTAP
Á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 (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.
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 .
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
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
CPU
Dispositivo Dispositivo
Prioridad
INTA 1
INTR p
Dispositivo Dispositivo
INTA p
Comienza ISR
Desabilitar interrupciones
Codigo de la ISR
Habilitar interrupciones
Finaliza ISR
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.
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).
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.
Cuando un programa desea realizar una transferencia empleando DMA, el CPU inicializa los parámetros de la
misma e indica al Módulo DMA:
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.
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.
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 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:
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 entrada-salida (I/O
Bus)
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).
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).
7.8.1.1 I N TE RF AZ SE RI E R S - 23 2
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).
Programa para comunicación PC-PC mediante cable Null-Modem usando la función de C bioscom.
/* Ports */
#define COM1 0
#define COM2 1
#define COM3 2
#define COM4 3
/* ---------------------- */
/* Commands */
#define CONFIG 0
#define WRITE 1
#define READ 2
#define STATUS 3
#include "com.h"
#include <conio.h>
#define CRt 13
#define NLn 10
#define 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);
int mx, my, yx, yy ;
/* 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 );
/* 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 D-Sub 9
Receive Data 2 3 Transmit Data
Transmit Data 3 2 Receive Data
Data Terminal Ready 4 6+1 Data Set Ready + Carrier Detect
System Ground 5 5 System Ground
Data Set Ready + Carrier Detect 6+1 4 Data Terminal Ready
Request to Send 7 8 Clear to Send
Clear to Send 8 7 Request to Send
D-Sub 9 D-Sub 25
Receive Data 2 2 Transmit Data
Transmit Data 3 3 Receive Data
Data Terminal Ready 4 6+8 Data Set Ready + Carrier Detect
System Ground 5 7 System Ground
Data Set Ready + Carrier Detect 6+1 20 Data Terminal Ready
Request to Send 7 5 Clear to Send
Clear to Send 8 4 Request to Send
7.8.1.2 I N TE RF AZ U SB:
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.
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.
1 VCC Rojo +5 V
2 D− Blanco Data −
3 D+ Verde Data +
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.
1 VCC Rojo +5 V
2 D− Blanco Data −
3 D+ Verde Data +
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.
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.
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.
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.
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.
# include <stdio.h>
# include <dos.h>
void main()
{
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 :