Los microprocesadores 80186 y 80188

por Dario Alejandro Alpern

Estos microprocesadores altamente integrados aparecieron en 1982. Por "altamente integrados" se entiende que el chip contiene otros componentes aparte de los encontrados en microprocesadores comunes como el 8088 u 8086. Generalmente contienen, aparte de la unidad de ejecución, contadores o "timers", y a veces incluyen memoria RAM y/o ROM y otros dispositivos que varían según los modelos. Cuando contienen memoria ROM, a estos chips se los llama microcomputadoras en un sólo chip (no siendo éste el caso de los microprocesadores 80186/80188).

Externamente se encapsulaban en el formato PGA (Pin Grid Array) de 68 pines.

Los microprocesadores 80188/80186 contenían, en su primera versión, lo siguiente:

Generador de reloj

El 80186/80188 contiene un oscilador interno de reloj, que requiere un cristal externo o una fuente de frecuencia con niveles TTL. La salida de reloj del sistema tiene una frecuencia de 8 MHz con 50% de ciclo de trabajo (la mitad del tiempo en estado alto y la otra mitad en estado bajo) a la mitad de frecuencia de oscilación del cristal (que debe ser de 16 MHz). Esta salida puede utilizarse para atacar las entradas de reloj (clock) de otros componentes, haciendo innecesario tener un chip externo dedicado a la generación de reloj.

Temporizadores

En estos microprocesadores se incluyen dos temporizadores / contadores programables para contar o medir tiempos de eventos externos y para generar formas de onda no repetitivas. El tercero, que no está conectado al exterior, es útil para implementar demoras y como un prescaler (divisor) para los otros dos que están conectados exteriormente. Estos temporizadores son muy flexibles y pueden configurarse para contar y medir tiempos de una variedad de actividades de entrada/salida.

Cada uno de los tres temporizadores está equipado con un registro contador de 16 bits que contiene el valor actual del contador/temporizador. Puede ser leído o escrito en cualquier momento (aunque el temporizador esté corriendo). Además cada temporizador posee otro registro de 16 bits que contiene el máximo valor que alcanzará la cuenta. Cada uno de los dos temporizadores conectados exteriormente posee otro registro de cuenta de 16 bits que permite alternar la cuenta entre dos valores máximos de cuenta (lo que sirve para generar señales con ciclo de trabajo diferente del 50%) programables por el usuario. Cuando se alcanza la cuenta máxima, se genera una interrupción y el registro que lleva la cuenta (el primero mencionado) se pone a cero.

Los temporizadores tienen modos de operación bastante flexibles. Todos pueden programarse para parar o poner la cuenta a cero y seguir corriendo cuando llegan al valor máximo. Los dos temporizadores conectados externamente pueden seleccionar entre el reloj interno (basado en la señal generada por el generador de reloj, explicado en el apartado anterior) y externo, alternar entre dos cuentas máximas (primero se usa una y después la otra) o usar una cuenta máxima (siempre el mismo valor), y pueden programarse para volver a disparar cuando ocurre un evento externo.

Canales de DMA

La unidad controladora de DMA (Direct Memory Access, lo que indica que no se utiliza la CPU para realizar la transferencia) integrada en el 80186/80188 contiene dos canales independientes de DMA de alta velocidad. Las transferencias de DMA pueden ocurrir entre los espacios de memoria y la de entrada/salida (M - I/O) o entre el mismo espacio (M - M, I/O - I/O), lo que permite que los dispositivos de entrada/salida y los buffers de memoria puedan ubicarse en cualquiera de los espacios. Cada canal de DMA posee punteros fuente y destino de 20 bits que pueden ser incrementados, decrementados o sin cambiar después de cada transferencia (el último caso es útil para I/O). El usuario puede especificar diferentes modos de operación de DMA utilizando el registro de control de 16 bits.

Controlador de interrupciones

Este controlador resuelve las prioridades entre pedidos de interrupción que arriban simultáneamente. Puede aceptar interrupciones de hasta cinco fuentes externas (una no enmascarable (NMI) y cuatro enmascarables) y de fuentes internas (temporizadores y canales de DMA). Cada fuente de interrupción tiene un nivel de prioridad programable y un vector de interrupción predefinido. El hecho de que el tipo de vector (ver discusión sobre esto en el apartado "Estructura de interrupciones" del microprocesador 8086/8088) sea fijo incrementa la velocidad de respuesta a interrupciones en un 50%. Además tiene varios de los modos de operación del circuito integrado controlador de interrupciones 8259A.

Generación de Chip Select y Ready

El microprocesador 80186/80188 contiene una lógica de selección de chip programable para proveer señales de chip select para memorias y periféricos y también posee una lógica programable de generación de estados de espera (wait state) para componentes lentos. El resultado de esta lógica es una menor cantidad de circuitos integrados externos ya que se pueden ahorrar alrededor de diez chips TTL. Aparte del menor costo que esto significa, el rendimiento del sistema aumenta como resultado de la eliminación de demoras de propagación externas (las demoras de las señales en el interior de un chip son significativamente menores que las demoras en el exterior). Otra ventaja se refiere a la flexibilidad en la elección del tamaño y velocidad de acceso de las memorias. Pueden programarse tres rangos de memoria (menor, medio y mayor) con longitudes variables (1K, 2K, 4K, ..., 256K). Pueden programarse entre cero y tres estados de espera para poder utilizar memorias de alta velocidad o memorias de bajo costo (y más lentas). Con respecto a la selección de periféricos, pueden direccionarse hasta siete que pueden estar en la zona de memoria y/o de entrada/salida. También pueden programarse los estados de espera para los periféricos.

Unidad Central de Proceso (CPU) del 80186/80188

La funcionalidad agregada del 80186/80188 (temporizadores, DMA, controlador de interrupciones y selección de chip) utiliza registros de control de 16 bits por cada dispositivo integrado. Estos están contenidos en un bloque de control de 256 bytes incluido en la arquitectura de registros del 80186/80188. Este bloque de control puede estar en la zona de memoria o en la de entrada/salida, basado en la inicialización de un registro especial de reubicación. Exceptuando estos agregados, el resto de los registros son los mismos que los del 8086/8088.

Nuevas instrucciones del 80186/80188

El conjunto de instrucciones está ampliado con respecto al del 8086/8088. Las nuevas instrucciones son:

PUSHA: Almacena los registros de uso general en la pila, en el siguiente orden: AX, CX, DX, BX, SP, BP, SI, DI.

POPA: Extrae los registros de uso general de la pila, retirándolos en el sentido inverso a PUSHA (pero descarta la imagen de SP).

PUSH inmed: Ingresa un valor inmediato a la pila.

INSB: Operación: ES:[DI] <- Port DX (Un byte), DI<-DI+1 (si DF=0) o DI<-DI-1 (si DF=1).

INSW: Operación: ES:[DI] <- Port DX (Dos bytes), DI<-DI+2 (si DF=0) o DI<-DI-2 (si DF=1).

OUTSB: Operación: Port DX <- DS:[SI] (Un byte), SI<-SI+1 (si DF=0) o SI<-SI-1 (si DF=1).

OUTSW: Operación: Port DX <- DS:[SI] (Dos bytes), SI<-SI+2 (si DF=0) o SI<:-SI-2 (si DF=1).

Shift dest,inmed. Se puede especificar directamente (sin cargar primero el valor en el registro CL) la cantidad de bits del desplazamiento. Shift es una de las siguientes instrucciones: ROL, ROR, RCL, RCR, SHL, SAL, SHR, SAR.

IMUL reg16,inmed realiza reg16 <- reg16 * inmed

IMUL reg16,mem16,inmed reg16 <- mem16 * inmed

En los dos últimos casos el resultado debe entrar en 16 bits. Si se desea el resultado de 32 bits, debe utilizarse la versión que aparece en el conjunto de instrucciones del 8086/8088.

BOUND reg16,mem32. Verifica que el valor contenido en el registro se encuentre entre los dos valores indicados en la memoria (un valor está dado por los dos primeros bytes, y el otro por los dos últimos). Si está fuera de rango se ejecuta una interrupción interna de tipo 5. De esta manera se puede observar que BOUND es una instrucción de interrupción condicional, como INTO.

ENTER local_variables_size, nesting_level y LEAVE son instrucciones que sirven para facilitar a los compiladores de alto nivel la codificación de subrutinas o procedimientos. Para ello utilizan la pila para almacenar los parámetros y las variables locales. Estos valores se acceden mediante direccionamiento indirecto usando el registro BP. Al principio de la subrutina se deberá indicar, mediante la instrucción ENTER, el tamaño total (en bytes) de las variables locales de la subrutina (local_variables_size) y cuántos punteros a variables locales (estos se accederán usando [BP-xxxx] donde xxxx es la posición relativa de la variable local) y parámetros (los valores que se almacenaban en el registro BP) de subrutinas de nivel superior se necesitan ver (nesting_level) (en general, este valor debe ser cero) (en [BP] está almacenado el puntero a las variables locales y parámetros de la subrutina que llamó a la actual, en [BP+2] se obtienen los de la subrutina que llamó a la anterior (esto sólo si nesting_level > 0), y así sucesivamente. Al final de la subrutina, antes de la instrucción RET deberá haber una instrucción LEAVE. Cuando se usan estas instrucciones, el programa no debe manejar el registro BP.

Hay dos nuevas interrupciones internas en este microprocesador que se agregan a los del 8086/8088.

- Tipo 5 (BOUND): Ocurre cuando en la instrucción BOUND el registro está fuera de rango.

- Tipo 6 (Código de operación inválido): En procesadores anteriores, al ejecutar instrucciones no definidas en el manual del circuito integrado, el resultado es impredecible. En este microprocesador y los siguientes se ejecuta esta interrupción cuando el código de operación no corresponde a ninguna instrucción.

El 80186 y 80188 tienen las mismas capacidades, excepto que el 80186 trabaja con un bus de datos externo de 16 bits, mientras que el 80188 opera con ocho. Ambos procesadores operan con un bus de datos interno de 16 bits y generan un bus de direcciones de 20 bits para poder acceder a 220 = 1.048.576 bytes (1 MB).

Con lo que se pudo observar, es obvio que estos microprocesadores pueden reemplazar unos 30 circuitos integrados convencionales, con la consiguiente reducción de espacio físico, precio, y requerimientos de potencia, lo que permite utilizar fuentes de alimentación más sencillas, con el consiguiente beneficio económico. De esta manera, es posible encontrarlos en aplicaciones industriales y en algunas plaquetas que se conectan a las PC.

Con el avance de la tecnología CMOS, era necesario un nuevo 80186. Por ello en 1987 apareció la segunda generación de la familia 80186/80188: los microprocesadores 80C186 y 80C188. El 80C186 es compatible pin a pin con el 80186, y agrega nuevas características: una unidad para preservar energía (disminuye el consumo del microprocesador cuando no se necesita utilizar todos los recursos que brinda), una unidad de control de refresco de memorias RAM dinámicas y una interfaz directa al coprocesador matemático 80C187 (esto último no existe en el 80C188). La tecnología CHMOS III utilizada (la misma que para el 80386) permite que el 80C186 corra al doble de velocidad que el 80186 (con el proceso de fabricación HMOS).

En 1990 Intel puso en el mercado el 80C186Ex, con diseño de 1 micrón y velocidad de 25 MHz. Existen actualmente tres modelos: 80C186EA, 80C186EB y 80C186EC. El anterior 80C186 pasó a llamarse 80C186XL.

Nedstat Counter