Circuitos Electrónicos. Final de junio curso 2004-2005 Problema 2 (sólo 1º parcial) Se desea diseñar un sistema electrónico que implemente una pila LIFO. Una pila LIFO consiste en un conjunto de registros de almacenamiento en los que se pueden almacenar y recuperar datos de uno en uno. El dato a recuperar siempre es el último introducido. Cuando se recupera un dato, se saca de la pila, y el siguiente a recuperar es el que se introdujo antes de éste. La pila estará compuesta de un conjunto de registros que almacenarán los datos (REG), de un puntero que guardará la dirección del registro donde se guardará el próximo dato que se introduzca (PUNT), de dos comparadores C1 y C2 para el valor de PUNT, de una lógica de direccionamiento que selecciona un registro para obtener su valor (M) o para introducir un valor nuevo (D), y de una máquina de estados que controla el funcionamiento del sistema, como se puede ver en la figura. El sistema tiene como entradas las señales PUSH y POP y los bits del dato a introducir (Di), y como salidas los bits del dato a leer (Do), y las señales de error EMPTY y FULL. Cuando se activa la señal PUSH, se debe introducir un dato en la pila. La máquina de estados debe comprobar que hay sitio en la pila mirando la salida de los comparadores de PUNT. Si hay sitio, debe seleccionar el registro apropiado y activar la señal L, que le dice a los registros que capturen la entrada, y luego incrementar el puntero PUNT con la señal INC. Si no hay sitio, se activa la señal de error FULL, que debe permanecer activa al menos un ciclo de reloj. El funcionamiento es similar cuando se activa la entrada POP. En este caso, se saca un dato de los registros y el puntero se decrementa. Si no había ningún dato, se activa la señal EMPTY. Las señales externas PUSH y POP nunca se dan a la vez, y se supone que se mantienen activas el tiempo suficiente para realizar todas las operaciones. El tamaño de los datos es de 8 bits, y el número de registros en la pila es 16. Todos los subsistemas son SÍNCRONOS y comparten la misma señal de reloj. En todas las cuestiones se pueden usar biestables tipo D (con salida normal y negada), puertas estándar de cualquier tipo con dos entradas, e inversores. Se pide: 1) Diseño de uno de los registros REG, de forma que se pueda colocar en el esquema de la figura. No se admitirán señales externas no previstas en dicho esquema. Obsérvese que hay una sola señal L, común para todos los registros, y 16 señales de salida de D, una para cada registro. (2 puntos) 2) Diseño de los bloques D y M de direccionamiento de registros para que cumplan con las especificaciones dadas. En este apartado se pueden usar bloques MSI. (1 punto) 3) Diseño del registro PUNT. (1 punto) 4) Diseño de la tabla de transiciones de la máquina de estados y de los comparadores C1 y C2, que indicarán a la máquina de estados cuando la pila está llena o vacía. Para la máquina de estados se recomienda considerar sólo las combinaciones de las señales de entrada que tienen sentido y que son relevantes (3 puntos). 5) Dibujo del cronograma a partir de que se activa la señal PUSH. Dibujar todas las señales importantes. Suponer que la pila no está llena. (2 puntos) 6) A partir del cronograma anterior, ¿cuántos ciclos de reloj debe mantenerse activa la señal PUSH para asegurar el correcto funcionamiento del sistema? (1 punto) Tiempo: 1h15min Circuitos Electrónicos. Curso 2004-2005 Solución al problema 2. Final de Junio El problema pedía el diseño de una pila LIFO. Para ello se dispondrá de una serie de registros en los que se almacenarán los datos de la pila, y de una lógica de control externa que lleva la cuenta del número de registros ocupados, y selecciona un registro concreto para extraer o introducir un dato. Lo primero que hay que saber es que si hay 16 registros, el tamaño del puntero que guarda la dirección del primer registro libre debe ser 5 bits. Esto es así porque el rango va de 0 a 16, inclusive, para poder considerar los estados de “pila vacía” y “pila llena”. 1) El primer apartado pide el diseño de cada uno de los registros que componen el conjunto REG, de forma que se pueda cargar un dato cuando se activa la señal L y el registro está seleccionado por D. Un registro de este tipo es un registro de captura normal, con la particularidad de que la captura se produce cuando L y D están activas simultáneamente. El diseño se muestra en la figura. En el enunciado se decía que se podían utilizar puertas de dos entradas, con lo que el multiplexor 2:1 hay que definirlo en función de las puertas que contiene 2) Los bloques D y M se usan para seleccionar un registro concreto para escribir o leer. Puesto que el bloque D tiene como entrada un número de 5 bits que representa el registro al que se quiere escribir, y 16 salidas conectadas a cada uno de los registros, su funcionamiento es el de un decodificador 4:16 al que se conectan los 4 bits menos significativos de PUNT. El bloque M, en cambio, tiene 16 entradas que seleccionan el registro, y 8 salidas que se conectan a las salidas Do. También necesitará leer los contenidos de los registros. Las 16 entradas pueden ser las provenientes del bloque D, ya que ahí está seleccionado el registro que corresponda. Se trata de un conjunto de 8 multiplexores 16:1 (uno para cada bit del dato), que no tienen 4 bits de entrada, sino que la entrada ya está decodificada en las 16 líneas de control. Se puede construir a base de un codificador y 8 multiplexores, o también se puede hacer a base de puertas lógicas: En la figura anterior, REGi_j representa el bit j del registro i-ésimo, y Do_i es el bit de los datos de salida Do. El esquema debe repetirse 8 veces, una para cada bit de los datos. 3) El registro PUNT es un contador ascendente/descendente síncrono de 5 bits. La única particularidad es que si no están activos ni INC ni DEC el contador debe permanecer en reposo. La celda básica tiene la siguiente estructura: Y la forma de encadenar las celdas es la que se muestra en la figura: 4) En este apartado se pide la tabla de transiciones de la máquina de estado que controla la pila, y el diseño de los comparadores C1 y C2. Para hacer la tabla de transiciones sólo vamos a tener en cuenta las entradas posibles, y no todas las combinaciones. El funcionamiento del sistema es el siguiente, según las órdenes de entrada: • Se activa la señal PUSH y la pila no está llena. La máquina activa la señal L (estado 1), para capturar el dato. A continuación desactiva L y activa INC (estado 2). Después vuelve al estado de reposo (estado 0). Como se supone que las entradas están activas el tiempo suficiente, no tenemos que considerar cambios en las entradas durante este proceso. La única señal que ha podido cambiar será C2 (pila llena), ya que la pila ha podido llenarse después del incremento de PUNT, pero eso no nos afecta. • Se activa la señal POP y la pila no está vacía. Como las señales de salida estána activas siempre, no hay que hacer nada con ellas. Lo único que hay que hacer es activar DEC durante un ciclo de reloj y volver al reposo. Igual que antes, si después de activar DEC la pila se vacía no importa. • Se activa PUSH y la pila está llena. Se activa la señal FULL y se mantiene activa hasta que externamente se desactive la señal PUSH. Como no se especificaba, también es correcto activar FULL sólo durante un ciclo de reloj y volver al reposo. • Se activa POP y la pila está vacía. Igual que antes, se activa EMPTY hasta que se desactive la señal POP o durante un ciclo de reloj. Con esta explicación, la tabla de transición de estados queda como: Entradas: PUSH POP C1 C2, Salidas: L EMPTY FULL INC DEC Estado 10x0 010x 0110 1001 0000 Salidas 0 1 4 2 3 (0) 00000 1 5 - - - - 10000 2 - - (2) - - 01000 3 - - - (3) - 00100 4 - 0 - 0 0 00010 5 0 - 0 - 0 00001 Los comparadores C1 y C2 dicen a la máquina de estados cuando la pila está llena y cuándo está vacía. Se trata, por tanto, de comparar el valor de PUNT con 0 y con 16 (no con 15, porque 15 significa que aún queda un sitio libre en la pila). 5) Una vez que se activa PUSH, y siguiendo las indicaciones dadas en el enunciado, debe activarse la señal L para que se capture el dato en Di. Esto se produce, según la tabla de transición de estados del apartado anterior, en 1 ciclo de reloj. Una vez se ha capturado el dato, se pasa al siguiente estado, en el que se desactiva L y se activa INC, también durante un ciclo de reloj. Un ciclo de reloj después el contador se incrementa, y es seguro desactivar la señal PUSH. Todo esto se representa en el cronograma siguiente: 6) Como se puede ver en el cronograma, es necesario mantener la señal de PUSH durante 3 ciclos de reloj. Después del primer ciclo, se activa la señal L, un ciclo después se activa la señal INC, un ciclo más y se incrementa el contador PUNT, y ya se puede desactivar la señal PUSH, ya que la máquina de estados ha vuelto al inicio.