Arquitectura de Computadores Tema 3 - Bloques lógicos Los bloques lógicos son combinaciones de puertas lógicas (AND, OR, NOT …) que realizan distintas funciones lógicas. Los distintos bloques lógicos que vamos a describir son formalizaciones que realizan diversas operaciones lógicas más o menos frecuentes en el diseño de los dispositivos electrónicos digitales, y en concreto de los microprocesadores. Partimos, por tanto, de puertas lógicas elementales, para acabar describiendo, aunque sea a grandes rasgos, los componentes que forman la organización de un procesador. Básicamente los bloques lógicos se dividen en dos categorías principales: - Bloques combinacionales: Son aquellos en los que el valor de salida del bloque depende únicamente de los valores de entrada del mismo, en cada instante de tiempo, con la salvedad del retardo que impone la electrónica, es decir, el tiempo que tarda en reaccionar el sistema, y ofrecer una salida a partir del momento en el que efectuamos una entrada determinada en el mismo. Su comportamiento quedá perfectamente descrito mediante una tabla de verdad. - Bloques secuenciales: Son aquellos en los que el valor de salida del bloque depende de las entradas, y del estado del propio sistema en el instante o instantes anteriores. Estos sistemas nos van a permitir construir módulos sícronos, elementos de memoria, máquinas de estados, y otros muchos componentes que requieren un comportamiento determinado a lo largo del tiempo. Para describir su funcionamiento, no nos bastará, en general con una tabla de verdad, sino que necesitaremos realizar un cronograma. Bloques combinacionales Multiplexor Permite seleccionar una de entre muchas líneas de entrada, y conectarla con una única salida. La selección se realiza mediante una serie de líneas de dirección. Con n bits en la dirección, podemos seleccionar una de entre 2n líneas de entrada. Las líneas de entrada y de salida pueden ser de 1 o de varios bits. Diagrama Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas Arquitectura de Computadores Función lógica Implementación lógica de un multiplexor de 1 bit Demultiplexor Realiza la operación inversa al multiplexor, es decir, conecta una única entrada a una de entre 2n líneas de salida. Diagrama Comunicación serie utilizando multiplexores y demultiplexores Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas Arquitectura de Computadores Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas Arquitectura de Computadores Unidad Aritmético Lógica (ALU) Consiste en un solo bloque combinacional capaz de realizar distintas operaciones aritméticas y lógicas. Necesita dos entradas de n bits (operandos) y una salida, también de n bits (resultado). Además, necesitará una entrada adicional que permita seleccionar la operación a realizar, así como otras entradas y salidas auxiliares de las operaciones: acarreo de entrada para conexiones en cascada, acarreo de salida y otros flags (cero, desbordamiento, signo…). ALU de 1 bit conectable en cascada Las señales F1F0 seleccionan la operación deseada. El decodificador selecciona la salida procedente de la puerta AND, OR, NOT o del sumador. F1 F0 Operación 0 0 S = A AND B 0 1 S = A OR B 1 0 S = NOT A 1 1 S = A + B + Cin Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas Arquitectura de Computadores Esquema de la ALU de 4 bits SN74181 de Texas Instruments Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas Arquitectura de Computadores Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas Arquitectura de Computadores Decodificador El decodificador es un circuito muy similar al multiplexos. Tiene una entrada binaria de n bits, y 2n salidas. Cuando introducimos un valor por la entrada, se activa la línea de salida correspondiente al valor introducido, y se desactivan todas las demás. Se añade una línea adicional de “permiso” (grant). Si la línea de permiso está desactivada, no se activará ninguna línea en la salida. Los decodificadores que se activan en alto, ponen en nivel de tensión alto (1 lógico) la línea activada, y a 0 todas las demás. Un decodificador que se activa en bajo, pone a 0 la línea activada, y a 1 todas las demás. Z0 X0 Z1 Z2 X1 Z3 P Tabla de verdad de un decodificador activado en bajo G A B Y0 Y1 Y2 Y3 1 X X 1 1 1 1 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 1 1 0 Yi = 0 si X=i y G=0 ; 1 en caso contrario (X=AB) Un decodificador activado en alto, tendría la tabla de verdad inversa a esta. Esquema de implementación Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas Arquitectura de Computadores Codificadorconprioridad X0 Realiza la función inversa al decodificador. A partir de 2n líneas de entrada, devuelve a la salida en binario el número de la línea de entrada más alta que esté activa (nivel lógico 1). Una línea adicional (Bloque Activo) nos indicará si hay alguna línea activa, o están todas inactivas (nivel lógico 0). Z0 X1 X2 Z1 X3 Tabla de verdad de un codificador con prioridad BA X3 X2 X1 X0 Z1 Z0 BA 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 X 0 1 1 0 1 X X 1 0 1 1 X X X 1 1 1 BA = Bloque Activo = 1 cuando alguna entrada está activa Conversor de código utilizando un codificador y un decodificador (¿cuál es su funcionamiento? ¿cómo será su tabla de verdad?) X0 Z0 X1 Z1 MemoriaROM Permite recuperar información binaria almacenada dir de forma “permanente”. La memoria está configurada como un conjunto de 2p unidades de n bits cada una. El bloque tendrá, por tanto una dato ROM OE Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas Arquitectura de Computadores entrada de p bits, que indice una dirección o ubicación concreta de memoria, y una salida de n bits, por la que obtendremos el dato solicitado. Una entrada adicional (Output Enable) permite activar o desconectar la salida mediante un buffer tri-estado. Implementación básica de una ROM mediante diodos y un decodificador activado en bajo (como el visto anteriormente). Aquellos enlaces en los que hay colocado un diodo, presentarán un bit 0 en la salida, y los que no tienen diodo, presentarán un bit 1. Síntesis de funciones lógicas mediante ROM Una forma muy sencilla de implementar una funión lógica cualquiera consiste en utilizar para ello una memoria ROM. Ló único que necesitamos para ello es una memoria con tantos bits de dirección como variables de la función lógica, y tantos bits por dirección (anchura de la memoria) como salidas necesitemos. En la memoria ROM habrá que almacenar, para cada posible entrada (cada dirección de memoria) el resultado que se espera de la función a implementar. Ejemplo: Implementación de un sumador de dos bits, salida con acarreo. Tenemos 4 bits de entrada (dos por cada operando) y tres de salida (resultado más acarreo). Necesitaremos, por tanto, una ROM de 16 direcciones, y cada una de ellas de 3 bits (por lo menos). Si las líneas de direccionamiento son d0, d1, d2 y d3, y las salidas son z0, z1 y z2, asociamos d0=x0, d1=x1, d2=y0, d3=y1, y z3=C (acarreo) Valor de la memoria: D3 (Y1) 0 0 0 0 0 0 0 0 1 D2 (Y0) 0 0 0 0 1 1 1 1 0 D1 (X1) 0 0 1 1 0 0 1 1 0 D0 (X0) 0 1 0 1 0 1 0 1 0 Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas Z3(c) 0 0 0 0 0 0 0 1 0 Z1 0 0 1 1 0 1 1 0 1 Z0 0 1 0 1 1 0 1 0 0 Arquitectura de Computadores 1 1 1 1 1 1 1 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 1 1 0 0 1 0 0 1 1 0 1 1 0 1 1 Bloques secuenciales Los bloques secuenciales son aquellos en los que la salida en un tiempo T depende de los valores de la entrada en T y en los instantes anteriores. Tienen “memoria histórica”, en el sentido de que su valor depende de cuánto ha valido la entrada anteriormente. X F Z Pueden ser: - asíncronos: Z(T) = F(X(t=0..T)) - síncronos : Z[k] = F(X[k], X[k-1], X[k-2] …) donde X[k] es la entrada en el ciclo k. El tiempo se va desarrollando en instantes discretos o “ciclos”, que vienen determinados por un reloj, un dispositivo que genera una onda cuadrada, y va marcando el paso del tiempo. t Registro El elemento secuencial básico es el registro. Es un bloque que permite almacenar un valor introducido por la entrada del mismo (escritura), y mantener dicho valor en la salida (lectura), incluso en ausencia de nuevo valor en la entrada. El circuito base de los registros es el biestable R-S, cuyo comportamiento es el siguiente: R S Q R Q Q- 0 0 Q Q- 0 1 0 1 1 0 1 0 Q S Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas Arquitectura de Computadores 1 1 0 0 En este circuito, si la entrada S está a 1 y R a 0, la salida Q valdrá 1 (Q- en modo normal tiene el valor complementario de Q). S cumple la función de SET (establecer a 1). Con S=0 y R=1, Q valdrá 0 (modo RESET). Si tanto R como S valen 1, la salida será 0 tanto en Q como en Q-, y si ambas entradas están a 0, Q y Q- mantienen el valor que tenían de forma indefinida. Tenemos así un elemento básico de memoria, que podemos establecer a 1 (S=1) o a 0 (R=1), y luego mantener indefinidamente para lectura, mientras mantenemos R y S en nivel bajo. Para conseguir que el elemento funcione de forma síncrona, basta con que agregemos una etapa previa controlada por un reloj. R clear Q clock S Q preset Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas Arquitectura de Computadores En los biestables síncronos, las entradas sólo se pueden transmitir a las salidas (y por tanto, quedar “almacenadas” en el dispositivo) cuando la señal del reloj está en alto, quedando las salidas desconectadas de la entrada cuando el reloj está en bajo (un reloj en bajo hace que ambas entradas a las puertas NOR estén también en bajo). Así conseguimos sincronizar el dispositivo, de forma que lea los datos sólo en instantes determinados. Aunque aquí no vamos a entrar en más detalles técnicos, es posible modificar las estructuras anteriores, de forma que consigamos registros que respondan sólo durante el flanco de subida del reloj, o durante el flanco de bajada. A título meramente descriptivo, presentamos algunas variaciones del mismo. Biestable J-K, con lectura en flanco de bajada. Biestable tipo T Cambia su estado con cada ciclo de reloj. Permite construir contadores. ¿Cuáles serían las salidas de Q0, Q1, Q2 y Q3 a medida que va funcionando el reloj? Registros Un registro es una combinación de n biestables, que permiten almacenar de forma síncrona n bits. X clock clock Z X 8 15 30 Z ? 8 15 t Para que una señal presentada en la entrada del registro pase correctamente a la salida del mismo, se deben cumplir ciertas restricciones temporales en torno al instante del flanco ascendente del reloj (el momento en el que el reloj pasa de 0 a 1). Esto es debido a que, aunque conceptualmente digamos que las señales son cuadradas (pasan instantáneamente de 0 a 1), en la realidad esto no es así. Ni el reloj pasa Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas Arquitectura de Computadores instantáneamente de 0 a 1, ni las señales se transmiten de la entrada a la salida de las puertas lógicas instantáneamente. Estos tiempos de retardo imponen restricciones temporales en la transmisión de las señales, y condicionarán en definitiva la máxima frecuencia de reloj a la que puede funcionar el sistema. Los principales parámetros temporales a tener en cuenta son: - Setup (o tiempo de “calentamiento”). Es el mínimo tiempo que una señal tiene que estar en la entrada de un registro antes del flanco ascendente del reloj, para que la carga del registro se efectúe correctamente. - Hold. Es el tiempo mínimo que debemos mantener la señal en la entrada después de la señal de reloj, para garantizar que el dato haya sido correctamente escrito. - Delay. Es el máximo tiempo que tarda la señal de entrada en transmitirse a la salida. A partir de ese tiempo, podemos estar seguros de que la salida es correcta, y los biestables del registro están debidamente estabilizados, pero antes de dicho retardo, no podemos tener total seguridad, por lo que no podemos dar por buena la salida obtenida. En el siguiente cronograma, suponemos que hemos introducido por la entrada un valor 1, estando el registro anteriormente a 0. tPFF es el delay o tiempo de retardo. clock X 3 8 15 tsu th Z 8 15 tdelay Si aumentamos la frecuencia del reloj, y por tanto, vamos estrechando el tiempo del ciclo (tw) podemos encontrarnos con la siguiente situación al enlazar la salida de un elemento con la entrada de otro: En este caso, el tiempo de retardo más el tiempo de setup sumados son menores que el ciclo de reloj. Por tanto, el sistema nos obliga a tener estabilizada una señal en la entrada del segundo dispositivo (setup) antes de tener la seguridad de que el primer dispositivo nos está dando una señal correcta (delay), comportándose el circuito de forma imprevisible. Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas Arquitectura de Computadores Registro con permiso Es una variante del registro antes descrito. Simplemente se le añade una entrada de “permiso” (enable), que deberá estar activa antes del flanco del reloj para que se produzca en el registro la escritura del dato introducido. Si la entrada de permiso está inactiva, el registro no cambia su estado. X clock Enable Z ¿Cuál podría ser su implementación utilizando puertas lógicas? Los registros con permiso pueden tener varias aplicaciones. Por ejemplo, imaginemos que tenemos en un procesador un banco de registros donde almacenar los resultados de operaciones aritméticas o lógicas que efectúa una ALU. Podemos conectar las entradas de todos los registros a la salida de la ALU, y mediante un decodificador, activar únicamente la línea de permiso del registro en el que queremos guardar el resultado, dejando los demás registros como estaban. Memoria RAM La memoria RAM, es funcionalmente muy similar a una memoria ROM, con la diferencia de que además de leer datos, podemos escribirlos. Por tanto, además de las líneas de dirección y de salida, que ya teníamos en la ROM, necesitaremos líneas de control que nos permitan indicar al dispositivo si lo que queremos es leer un dato almacenado en la RAM, o escribir en la memoria un dato que introducimos por el bus de datos. Así, mientras en la ROM el bus de datos era unidireccional (salida), en la RAM es bidireccional (entrada y salida). Las celdas básicas de una RAM, dado que necesitamos leer y escribir, no serán elementos preconfigurados por hardware (como en la ROM), sino que serán esencialmente biestables como los vistos hasta ahora. Celda básica de una memoria RAM Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas Arquitectura de Computadores Esquema de una memoria RAM Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas Arquitectura de Computadores Introducción a las máquinas de estados Entre los automatismos, en ocasiones nos encontramos con situaciones en las que la salida de un sistema no es función exclusivamente del valor de la entrada del mismo, sino que depende también del estado en el que se encuentre en ese momento el sistema, es decir, de su “historia dinámica”. Veamos un ejemplo. Supongamos un sistema que controla el encendido y apagado de un motor mediante un pulsador. Pulsando una vez el botón de encendido, el motor se pone en marcha. Soltamos el botón y el motor sigue en marcha. Si queremos apagar el motor, volvemos a pulsar el botón, y el motor se para. Soltamos el pulsador, y el sistema queda como al principio. La señal de entrada que tenemos es el pulsador, que puede estar pulsado (X=1) o no pulsado (X=0). Pero sólo viendo la señal de entrada (la posición del pulsador) no podemos saber si el motor está en marcha o no. Necesitamos conocer las distintas veces que el interruptor se ha pulsado y soltado. No pulsar Mantener pulsado Pulsar No pulsado / apagado Pulsado / Encencido Soltar Soltar Pulsado / Apagado Mantener pulsado No pulsado / Encencido Pulsar No pulsar Como podemos deducir del diagrama, tendremos una entrada (pulsador) con dos valores posibles, una salida con dos valores posibles (motor encendido / apagado), y cuatro estados posibles. Las máquinas de estados se pueden implementar electrónicamente mediante una combinación de bloque secuencial (registro que guarda el estado del sistema) y bloque combinacional, que calcula en cada ciclo el valor de la salida, y el nuevo estado del sistema. Los autómatas secuenciales son las implementaciones electrónicas de las máquinas de estados, y pueden ser: - síncronos: Las salidas y el estado cambian automáticamente con cualquier modificación de las entradas, estabilizándose el sistema en un estado tal que el “siguiente estado” es él mismo. - Asíncronos: Las salidas y el estado del sistema cambian sólo en instantes de tiempo predeterminados, marcados por un reloj de sincronización. Existen dos formalizaciones para describir e implementar las máquinas de estados: Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas Arquitectura de Computadores - - Autómatas de Mealy: La salida depende de la entrada y del estado del sistema. Para un mismo estado del sistema, la salida puede variar de forma asíncrona con una variación de las entradas, aunque el estado sólo cambie de forma síncrona. Autómata de Moore: Las salidas dependen exclusivamente del estado del sistema, de forma que tanto el estado del sistema como las salidas cambiarán de forma síncrona. En general, un autómata de moore requiere más estados para modelar una máquina de estados, por lo que utilizará más memoria, aunque suelen ser más fáciles de modelar que los autómatas de Mealy. Sin embargo, ambos modelos son equivalentes. Cualquier máquina de estados se puede modelar mediante un autómata de Moore o de Mealy, y hay normas para transformar un modelo en otro. entrada salida Lógica combinacional entrada Lógica combinacional Registro (estado) Calculo salidas Registro (estado) Modelo de autómata de Mealy salida Modelo de autómata de Moore Implementación electrónica Existen muchas formas de implementar un autómata. A modo de ejemplo, veremos cómo implementar el problema del motor y el pulsador, utilizando como lógica combinacional una ROM. Como nuestro problema tiene cuatro estados, necesitamos dos bits para codificar los estados. Necesitamos también un bit para codificar la entrada, por lo que el bloque combinacional tendrá tres entradas, y ocho combinaciones posibles. Las salidas serán dos bits para codificar el nuevo estado (modelo de Moore). La salida la podemos obtener directamente de uno de los bits del estado. Necesitaremos, por tanto una ROM de ocho palabras de dos bits por palabra. Los estados los codificaremos de la siguiente forma: - Apagado / no pulsado = 00 - Apagado / pulsado = 01 - Encendido / no pulsado = 10 - Encendido / pulsado = 11 La salida al control de encendido del motor será, por tanto el bit más significativo del estado. La programación de la ROM será: S1 0 0 0 S0 0 0 1 Entrada 0 1 0 Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas S’1 0 1 0 S’0 0 1 0 Arquitectura de Computadores 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 1 1 1 1 1 (S1S0 es el estado actual. S’1S’0 es el siguiente estado del sistema) Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas Arquitectura de Computadores Lasmáquinasde estadosy los microprocesadores Hemos visto distintos bloques lógicos, combinacionales y secuenciales, necesarios para el diseño de distintos elementos de la organización de los microprocesadores: registros para almacenar la información temporal en los procesadores, ALUs para realizar operaciones aritméticas y lógicas, ROMs y RAMs como almacenes de información estática y dinámica, y otros componentes como los multiplexores y codificadores, que permiten implementar, entre otras cosas, todas las señales de control necesarias para activar o desactivar los distintos componentes necesarios para la ejecución de las instrucciones. Nos falta por describir, aunque sea mínimamente, un componente: la unidad de control. La unidad de control es un dispositivo capaz de, a partir de una instrucción leída desde la memoria, ejecutar toda una secuencia de acciones necesarias para la ejecución de la misma. Por ejemplo, para ejecutar la lectura de un dato desde la memoria, y guardarlo en un registro, deberá activar la escritura desde un registro de dirección al bus de direcciones, activar la señal de lectura en la RAM, activar la señal de “permiso de escritura” en el registro destino, para que el dato pase desde el bus de datos al registro, etc. La ejecución ordenada de todas estas operaciones se modela mediante una máquina de estados, y se implementa dentro del microprocesador mediante un autómata como el descrito en este tema (aunque, evidentemente, un poco más complejo que el ejemplo propuesto). Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas