El IPC-16A PACE de National Semiconductor , abreviatura de "Elemento de procesamiento y control", fue el primer microprocesador comercial de 16 bits en un solo chip , anunciado a fines de 1974. [1] Era una implementación en un solo chip de su arquitectura IMP-16 de cinco chips de principios de 1973 , que a su vez se había inspirado en la minicomputadora Data General Nova . Al IMP-16 básico, PACE agregó un nuevo modo operativo, el "modo byte", que era útil para trabajar con datos de 8 bits como texto ASCII .
Implementado en pMOS , como era común en la época, PACE requería tres voltajes de suministro y un reloj externo con suficiente señal para impulsar la lógica interna. Esto normalmente lo suministraba el chip STE. La mayoría de los sistemas PACE también requerían que el chip BTE convirtiera las señales de voltaje interno más altas a niveles TTL utilizados por el resto del sistema. Sus pines de dirección y datos multiplexados también requerían lógica adicional.
Aunque National Semiconductor tenía acuerdos de segunda fuente con Signetics y Rockwell Semiconductor , ninguna de las dos compañías produjo el diseño PACE. El PACE fue seguido por el INS8900 , que tenía la misma arquitectura pero se implementó en nMOS . Esta versión facilitó la interconexión eléctrica y también corrigió varios errores en la lógica PACE y aumentó la velocidad en un 50 %. [2] Cuando estuvo disponible, estaban apareciendo CPU de 16 bits de mayor rendimiento y la compañía comenzó a restar importancia a las ventas de la línea.
El PACE se encapsulaba en un encapsulado dual en línea (DIP) de 40 pines, originalmente de cerámica. Como se basaba en lógica pMOS , la serie PACE requería tres voltajes de suministro, +5 V (V SS , pin 20), +8 V (V BB , pin 23) y -12 V como nivel de tierra (V GG , pin 29). El nivel de +8 V se suministraba normalmente utilizando electrónica simple alimentada por la línea de +5 V, lo que reducía la complejidad de la fuente de alimentación .
El chip se controlaba normalmente mediante un reloj externo de 750 nanosegundos (1,33 MHz) que utilizaba el chip System Timing Element, STE, para producir señales de la intensidad de señal requerida. [2] Como estas señales también eran utilizadas por dispositivos externos, las señales del reloj estaban en niveles TTL , +5 V, en contraste con la mayoría de los pines que estaban en +8 V. [3]
Como las señales externas se presentaban a +8 V, la interconexión del sistema con dispositivos comunes que trabajaban a niveles TTL no era trivial. Por este motivo, los sistemas que utilizaban el PACE normalmente incluían un elemento transceptor bidireccional, BTE. Este funcionaba en conjunto con el PACE para producir un conjunto completo de señales de bus a voltajes TTL que luego se podían utilizar para interconectar fácilmente con la mayoría de los dispositivos contemporáneos como SRAM . [4]
Para poder incluir direcciones y datos de 16 bits en un DIP de 40 pines, se multiplexó el mismo conjunto de 16 pines entre la presentación de una dirección y la lectura y escritura de datos en ciclos separados. Esto requirió que los dispositivos externos, como la memoria principal , bloquearan la dirección entre ciclos. [5]
El IMP-16 de National Semiconductor se había inspirado en el Nova de Data General , pero tenía una serie de pequeñas diferencias en su ISA. Entre ellas estaba el manejo de los cuatro registros de procesador de 16 bits accesibles para el usuario. En el Nova, los dos primeros registros eran acumuladores de propósito general y se utilizaban para la mayoría de las operaciones aritméticas y lógicas básicas, mientras que los dos segundos podían utilizarse como operandos o como registros de índice . El IMP-16 siguió este modelo, [6] pero el PACE cambió una serie de instrucciones para que operaran solo en el primer acumulador, AC0. [2]
El Nova original no implementó una pila en hardware, aunque esto se agregó en los modelos posteriores Nova 3 a partir de 1975. PACE implementó un estilo diferente de pila utilizando un puntero de pila oculto que se incrementa y decrementa automáticamente cuando se encuentran instrucciones. El contador de programa (PC) se inserta o extrae automáticamente en la pila durante las llamadas PUSH
y retornos de subrutinas . Las instrucciones adicionales permiten que los cuatro registros y el registro de estado y bandera de control también se inserten y extraigan. [7]PULL
PACE tiene diez ubicaciones internas de 16 bits que contienen los valores de la pila más alta. Una característica única de PACE es que después de que la pila está casi llena y se intenta otra inserción, o está vacía después de que se intenta una extracción, se genera una interrupción . Esto se utiliza normalmente para llamar al código del controlador de interrupciones que copia algunos o todos los valores hacia o desde la pila en la memoria principal . Esto permite que los registros internos de la pila se utilicen como un caché de una pila basada en memoria más grande. [7]
El registro de indicadores de estado y control también tenía 16 bits de ancho. Los bits 0 y 15 están ambos configurados en 1 y normalmente no se utilizan, mientras que los catorce restantes se utilizan activamente. Esto incluía indicadores comunes como CRY para indicar que una adición resultó en un acarreo, OVF si se desbordaba y LINK, que indicaba que era necesario desplazar un bit durante las instrucciones de desplazamiento y rotación. [7] LINK normalmente se maneja utilizando el indicador de acarreo en la mayoría de los diseños de CPU de microcomputadoras, pero tener dos indicadores separados es más común en minicomputadoras donde hay suficientes bits de estado disponibles, ya que permite que los dos se rastreen por separado durante una serie de instrucciones de desplazamiento/rotación y adición, que es una secuencia común. El indicador IN EN, normalmente 1, permite habilitar o deshabilitar las interrupciones. [8] Una característica única del PACE, que no está presente en el IMP-16, es el indicador BYTE. Cuando esta opción está activada, se accede a los datos en palabras de 8 bits en lugar de 16. Esto permite un procesamiento más sencillo de datos de 8 bits, como texto ASCII . [8]
El resto de los bits del SCF se asignan directamente a los pines del exterior del chip. Los bits 1 a 5 son los indicadores IE1 a IE5, que se utilizan para controlar las interrupciones de forma prioritaria. IE1 se activa solo en caso de desbordamiento o subdesbordamiento de pila. Los otros cuatro se pueden utilizar para desactivar líneas de interrupción individuales o, más comúnmente, para generar un valor binario de 0 a 15 que los dispositivos externos utilizan para determinar si deben o no realizar una interrupción. Por ejemplo, si el valor de estos indicadores suma 5, cualquier dispositivo con un valor de interrupción de 5 o inferior (1 es la prioridad más alta) puede expresarlo; un dispositivo que desee llamar a una prioridad inferior, digamos 7, recibe instrucciones de mantenerla. [8]
De manera similar, los indicadores SCF F11 a F14 se utilizan como salidas para proporcionar control directo sobre dispositivos externos. Por ejemplo, se pueden utilizar para indicar que el dispositivo 6 debe presentar datos en el bus, lo que podría hacer asignando 128 bytes del búfer interno a la página base dividida mencionada anteriormente. [8]
A diferencia de la mayoría de los diseños de microcomputadoras de la época, el PACE no utilizaba instrucciones de longitud variable, todas las instrucciones utilizaban 16 bits. Las palabras de 16 bits se dividían en una serie de campos de bits para el formato de la instrucción. Los seis bits superiores, del 10 al 15, contenían el código de operación , mientras que los bits 8 (R para Relativo) y 9 (X para índice) indicaban el modo de direccionamiento. Los ocho bits restantes de la instrucción normalmente contenían una dirección de 8 bits. [9] Esto significaba que no se podía especificar directamente una ubicación de memoria arbitraria; se utilizaban varios sistemas diferentes para construir la dirección de 16 bits requerida a partir del valor de 8 bits. Había 43 instrucciones y 45 códigos de operación, con dos códigos de operación cada uno para LD
y ST
(ver más abajo). [10]
Cuando X era cero, los bits de dirección representaban una dirección directa en la memoria. Con R también establecido en cero, la dirección estaba dentro de la página base, [a] normalmente los primeros 256 bytes de memoria. Al establecer R en 1 y X en 0, se utilizaban los ocho bits restantes como desplazamiento desde la PC. Al establecer el bit X en 1, se activaba la indexación, utilizando los ocho bits además de los valores en los registros de índice; con R en 0, se sumaba el valor en AC2, y al establecerlo en 1, se utilizaba AC3 en su lugar. [9]
Normalmente, la página base eran los primeros 256 bytes de memoria, pero cuando BPS
se activaba el pin, en su lugar dividía la página base entre los primeros y los últimos 128 bytes. [9] La idea era que los dispositivos externos se asignaran a estas ubicaciones de memoria altas y pudieran observar fácilmente las escrituras y lecturas examinando la dirección en el bus y viendo si los nueve bits superiores eran todos 1. Curiosamente, no hay ninguna instrucción para cambiar la configuración del BPS
, en cambio, la mayoría de los sistemas conectaban el pin a uno de los pines de estado y luego usaban las instrucciones de cambio de estado para controlarlo. [11]
El direccionamiento indirecto en el PACE era limitado, apoyado principalmente por las instrucciones LD
y ST
, que cargan y guardan valores entre los registros y la memoria. La indicación de direccionamiento indirecto utilizaba códigos de operación separados, en lugar de utilizar los bits de indicación de direccionamiento. Cuando se utilizaba, la dirección se construía de forma normal, añadiendo los ocho bits de dirección a la página base o PC. A continuación, leía el valor de 16 bits en esa ubicación de memoria y luego cargaba o almacenaba desde esa dirección. Cuando se combinaba con el indicador X, el desplazamiento de 8 bits se sumaba o restaba primero del registro de índice indicado. [12]
Otro usuario del direccionamiento indirecto fue ISZ
y DSZ
. Estos incrementaban o decrementaban un valor en la memoria y se usaban comúnmente para implementar bucles, por lo que el direccionamiento indirecto era común ya que la variable de control para el bucle podía estar ubicada fuera del bloque de código. Otra característica interesante de estas instrucciones era que (en cualquier modo de direccionamiento) si el valor se cambiaba a cero, SK
se llamaba a la instrucción ip. Esto permitía salir de los bucles sin ninguna prueba adicional; típicamente la última instrucción en el bucle sería JMP
volver al principio del bucle, pero cuando el valor llegaba a 0, automáticamente SK
lo superaba JMP
y continuaba. [13]
Este estilo de control de bucle es común en los miniordenadores, pero no tanto en los diseños de microordenadores. En los microordenadores dedicados, este tipo de operación normalmente se logra con varias instrucciones, una que compara el índice del bucle con un valor dado (en este caso, cero), y luego vuelve al principio si no se cumple la condición. El salto en cero inherente del PACE era una característica común de los miniordenadores que aceleraba el rendimiento del bucle al evitar una prueba separada. Cuando no era apropiado, el incremento o decremento podía establecer el desplazamiento en cero para evitar activar esta característica. [13]
La mejora continua en la fabricación de semiconductores a principios de la década de 1970 condujo a la introducción del concepto de lógica NMOS , o nMOS. Este tipo de lógica tiene la importante ventaja de que sus transistores internos no requieren un gran voltaje en la capa de sustrato, como los pMOS. En términos prácticos, esto significa que un procesador nMOS puede funcionar con solo dos voltajes de entrada en lugar de tres, y la fuente de alimentación positiva se puede configurar a +5 V, lo que hace que la interconexión con circuitos TTL sea trivialmente fácil. [14]
National Semiconductor aprovechó esta técnica con un rediseño del PACE en nMOS para crear el INS8900. La nueva versión conservó gran parte del diseño original del chip, aunque, como era de esperar, algunos de los pines de la fuente de alimentación cambiaron sus entradas; el original V SS de +5 V ahora era tierra (GND), V BB cambió de -8 a +8 V y el antiguo V GG de -12 V se convirtió en el V DD de +12 V. Por razones desconocidas, otros dos pines no cambiaron de función pero sí de nombre; CLK se convirtió en V CC y NCLK se convirtió en CLKX. [3]
El cambio más importante en términos de uso fue que los diversos pines de señal ahora trabajaban con voltajes TTL, lo que les permitía comunicarse directamente con sistemas externos como la memoria. Este cambio no solucionó el problema de tener que bloquear la dirección en el bus compartido de datos/direcciones, pero sí hizo que dicho bloqueo fuera mucho más fácil. En lugar de requerir el relativamente complejo chip BTE, esta tarea ahora podía ser realizada por componentes TTL comunes, aunque National Semiconductor sugirió sus propios INS8208 e INS8212 para este propósito. [15] El bus ahora podía implementarse con un solo INS8208 que almacenaba en búfer las señales de control que indicaban si el bus estaba en modo de dirección o de datos (entre otras cosas), dos INS8208 más para cada búfer de 8 bits de datos y dos INS8212 para cada bloqueo de 8 bits de la dirección. [16]
Otro cambio que fue posible gracias a las menores cargas en nMOS fue que las señales de reloj ya no requerían tanta energía. Esto eliminó la necesidad del STE, que podía ser reemplazado por un cristal adecuado y un único inversor 7404 , disponible de muchos fabricantes. [16] Como el reloj externo ya no era de alta potencia, solo se necesitaba una entrada de reloj, el antiguo NCLK, ahora rebautizado como CLKX. La antigua segunda fase ahora se generaba a bordo de la CPU. Estos cambios también permitieron que el sistema funcionara a una mayor velocidad; se recomendó un cristal de 2 MHz, lo que aumentó de manera bastante significativa desde los 1,33 del PACE. Esto mejoró los tiempos de instrucción a entre 8 y 20 microsegundos. [2]
Otros cambios incluyeron una serie de correcciones a problemas encontrados en el PACE. Entre ellos, se destacaba un problema con la interrupción que se activaba cuando se llenaba la pila. En el PACE esto no funcionaba correctamente; si la interrupción llegaba exactamente al mismo tiempo que una NIR3 o NIR5, se invocaba el código de interrupción incorrecto desde la posición 0 en lugar de la 2. National Semiconductor sugirió no usar esta característica o colocar la misma dirección en ambas posiciones para que siempre invocaran el mismo código, que luego determinaría lo que había ocurrido realmente. [17] Hubo problemas similares cuando una interrupción de nivel 0 se producía dentro de 12 ciclos de otras interrupciones, lo que hacía que se invocara el código incorrecto. [18] Todos estos problemas se resolvieron en el 8900. [17]
Aunque el PACE funcionaba a una velocidad de reloj relativamente rápida para la época, la arquitectura del conjunto de instrucciones (ISA) se implementó utilizando microcódigo y el bus multiplexado requería dos ciclos para cada acceso a la memoria. Como resultado, una instrucción típica tardaba entre 12 y 30 microsegundos en completarse, lo que la hacía más o menos a la misma velocidad que los procesadores contemporáneos de 8 bits como el Intel 8080. [ 2] Esto todavía proporcionaba una ventaja al trabajar con datos más grandes, por ejemplo en una biblioteca de punto flotante , ya que esa única instrucción podía procesar el doble de datos en una sola operación. [4]