Facultad de Ingeniería Departamento de Electrónica y...

57
UNIVERSIDAD NACIONAL DE SAN JUAN Facultad de Ingeniería Departamento de Electrónica y Automática Microprogramación Autor: Dr. Ing. Armando D. Assandri Versión 3.0 - 2008

Transcript of Facultad de Ingeniería Departamento de Electrónica y...

UNIVERSIDAD NACIONAL DE SAN JUAN

Facultad de Ingeniería Departamento de Electrónica y Automática

Microprogramación

Autor: Dr. Ing. Armando D. Assandri

Versión 3.0 - 2008

1

1. INTRODUCCIÓN Existen diversos métodos para implementar las funciones de próximo estado y de salida de una Máquina de Estados Finitos (MEF), sea ésta de tipo Moore o Mealy. Siguiendo el método tradicional, que recibe el nombre de lógica aleatoria o cableada, se usan compuertas lógicas para implementar dichas funciones booleanas (ver la Figura 1.1). Estas ecuaciones se obtienen por minimización de las funciones booleanas utilizando alguno de los métodos descritos en la bibliografía.

Figura 1.1 – Implementación tradicional de una MEF.

Siguiendo la evolución de la tecnología de los circuitos integrados digitales, se desarrollaron otros métodos para implementar la lógica de próximo estado y de salida de las MEFs. Entre ellos se pueden mencionar el método del contador de salto, basado en tecnología MSI. En este método se utiliza un contador binario para implementar el registro de estado de la MEF y multiplexores, decodificadores y/o compuertas lógicas para implementar las funciones de con-trol del contador, de la dirección de salto y de salida (ver la Fig. 1.2). Estos dos métodos permiten realizar las implementaciones más rápidas de una MEF a costa de perder flexibilidad. Como cada diseño requiere de conexiones específicas de acuerdo a las ecuaciones obtenidas, una vez terminado el proyecto resulta bastante complicado introducir modificaciones o ampliaciones al circuito. En el caso que se encuentren problemas en el dise-ño una vez que se ha lanzado el producto al mercado, cualquier cambio llega hasta el nivel del circuito impreso, con un costo bastante alto en la reingeniería. Otro método para implementar las MEF, denominado lógica programada o microprograma-ción, se basa en aprovechar la capacidad de las memorias de lectura (ROMs) para realizar funciones combinacionales (ver la Fig. 1.3). En este caso no se realiza minimización alguna y en la ROM simplemente se carga la tabla de verdad de las funciones de próximo estado y de salida. Si bien el circuito resulta algo más lento que los casos mencionados anteriormente, se tiene la gran ventaja que los diseños son más fáciles de depurar, modificar y ampliar.

2

Lógica del Estado de SaltoLógica de Control del Contador

Registro de EstadoContador Sincrónico

LimpiarCargarContar

Entradas

Reloj

Lógica de Salida Salidas

Figura 1.2 – Implementación de una MEF con un contador de salto.

PROM

D QX0

D QX1

D QX2

D QX3

A0

A1

A2

A3

A4

A5

E1

E2

D0

D1

D2

D3

D4

D5

D6

D7

D8

S1

S2

S3

S4

S5

Salidas

PróximoEstado

Reloj

Entradas

Figura 1.3 – Implementación de una MEF por microprogramación.

Este método de diseño de las MEFs fue propuesto por M. V. Wilkes en 1951 y fue amplia-mente utilizado para el diseño de la mayor parte de las computadoras y controladores de pe-riféricos hasta la aparición del microprocesador. Un microprocesador, a su vez, es una máqui-na microprogramada en la mayoría de los casos. Lo que se hizo en los ‘70s fue integrar en un solo chip, la Unidad Aritmético Lógica (ALU), los registros generales y específicos, el cami-no de datos (datapath) y la unidad de control. En una arquitectura de procesamiento clásica tipo CISC (Computadora con Conjunto de Instrucciones Complejo), la unidad de control casi siempre es una MEF microprogramada. La ejecución de una instrucción de máquina (también llamada macroinstrucción) desencadena una serie de microinstrucciones que están almacena-

3

das en la memoria de la unidad de control, y que tienen como resultado final la operación que se quiere realizar. Debido a que el diseño se transformó en el almacenamiento de unos y ceros en una memoria, recibió el nombre de lógica programada (o microprogramada) . También se acuñó el término firmware para identificar la información que se guarda en la memoria, ya que la misma no era propiamente un software en el sentido clásico, aunque en algunos casos, si se usa un mi-croassembler, se parece bastante.

2. ESTUDIO DE CASO A continuación se describe el funcionamiento de un sistema digital simple que se tomará co-mo ejemplo para describir distintas técnicas de microprogramación que se pueden plantear. Sea un sistema para el cálculo de la velocidad de un eje que gira (o tacómetro), sobre el cual se ha montado un dispositivo optoelectrónico, cuyo haz es interrumpido por una lámina soli-daria al eje. El sistema consta en un contador que cuenta estos pulsos durante un cierto tiempo de duración fija, el que se usa como base de tiempo. El valor final de cuenta del contador debe ser cargado en un registro temporario (cerrojo o latch) que está conectado al bus de datos de un microprocesador. La ventana de tiempo también es detectada por el microprocesador, por lo que éste puede obtener el valor final de la cuenta con posterioridad al flanco descendente de la base de tiempo. Al terminar cada ciclo de cuenta, el sistema de control debe cargar el cerrojo y después poner en cero el contador, a los efectos de que se inicie una nueva cuenta. Si bien es evidente que esta tarea puede ser realizada directamente con el microprocesador, como hipótesis se plantea que este subsistema funcione como un periférico del microprocesa-dor, ya que éste estará ocupado en otras tareas de mayor relevancia y urgencia. El contador tiene una capacidad de 16 bits, pero puede ocurrir que durante la ventana de tiempo su capa-cidad sea rebosada. Esta situación debe ser tomada en cuenta por el microprocesador, por lo que debe generarse una señal de interrupción de tipo flanco cada vez que esta situación se produce. Internamente en el microprocesador se deberá llevar la cuenta de la cantidad de ve-ces que se rebosó el contador antes de finalizar la ventana de tiempo, a los efectos de tener el valor correcto de la cuenta. En la Fig. 2.1 se tiene un diagrama en bloques del sistema planteado, y en la Fig. 2.2 la des-cripción algorítmica del problema. La máquina consta de 5 estados, los que se denominan a, b, c, d, y e. El estado a, es considerado el estado inicial de la máquina, al cual se llega accio-nando sobre las entradas de limpiar (clear) de los flip-flops que conforman el registro de esta-do, durante la inicialización del sistema. La MEF permanece en dicho estado esperando que la señal VENT (de “Ventana”) se active, es decir que pase de 0 a 1. Durante este tiempo, el con-tador debe permanecer inhibido de contar, lo cual se realiza poniendo en cero la señal HABCNT. Una vez que la señal de la ventana de tiempo (VENT) pasa a su estado activo, se pasa al esta-do b, en el cual se habilita la cuenta del contador con la señal HABCNT. En dicho estado se permanece hasta que finalice la ventana de tiempo o bien que el dígito más significativo del contador se ponga en 1, indicando que la cuenta ha sobrepasado la mitad del valor máximo.

4

BUS DE DATOS DELMICROPROCESADOR

LATCH

CONTADOR

CONTROL

Pulsos

Q15

VENT

HABCNTLIMPCNTCRGLTCH

INT

Figura 2.1 – Diagrama en bloques del sistema de ejemplo.

Figura 2.2 – Descripción del sistema mediante una carta ASM.

5

En el caso de que el dígito más significativo del contador se ponga en 1, la máquina pasa al estado c, en el cual espera que VENT pase a 0, o bien que el dígito más significativo del con-tador se ponga nuevamente en 0. En este último caso, el contador ha sobrepasado su máxima capacidad de cuenta, por lo que se debe generar una interrupción al microprocesador, para que tome en cuenta esta situación. Esto se realiza con la salida condicional INT, que se activa cuando la entrada Q15, que es el dígito más significativo del contador, pasa de 1 a 0. Debido a que la interrupción a generar necesita un flanco, el cual es retenido por el microprocesador, no es necesario mantener esta salida en alto para que el microprocesador reconozca la interrup-ción. Mientras la máquina está en el estado c, la salida HABCNT debe mantenerse activa, ya que el contador debe seguir contando los pulsos de entrada mientras la ventana permanece en 1. El estado c tiene dos próximos estados: el estado b se alcanza en el caso de que se rebose el contador antes de que la ventana de tiempo pase a 0, y el estado d, al que se llega si se termina el tiempo indicado por la señal VENT. Desde el estado b también se puede llegar al estado d en la misma situación. Es decir que cualquiera sea el camino seguido por la MEF para alcan-zar el estado d, indica que el tiempo de cuenta ha terminado y que debe cargarse el registro temporario con el valor de cuenta que tiene el contador. Esto se realiza activando la salida CRGLTCH en el estado d. Dado que la señal VENT también es detectada por el microproce-sador, en cada ciclo el valor del contador se ingresa al sistema de nivel superior a través del bus de datos. Del estado d se pasa al estado e en el cual se procede a limpiar el contador con la salida LIMPCNT. Posteriormente se pasa al estado a para iniciar otro ciclo de cuenta. Debido a que el problema planteado es al solo efecto de mostrar la técnica de diseño con me-morias ROM, se prescindirá del análisis de carreras de salida para realizar la asignación de estados. En los casos reales, deberán tomarse en cuenta las recomendaciones que a tal fin existen en la bibliografía, para realizar una asignación de estados libre de carreras.

3. ESTRUCTURAS DE MICROPROGRAMACIÓN Una MEF microprogramada es aquélla que está estructurada mediante una secuencia de pa-sos o microinstrucciones que tienen como finalidad ejecutar las acciones o realizar las tareas que tiene definidas. Si la MEF es la unidad de control de una computadora, cada secuencia de microinstrucciones tiene por finalidad la ejecución de una instrucción del repertorio de ins-trucciones de la máquina. Cada una de las microsecuencias en que se divide una instrucción de la computadora (ADD, MOVE; COMP; etc.) se denomina microinstrucción. Las microinstrucciones se almacenan en una memoria de m palabras de n bits. Cada palabra de memoria se divide en campos, cuya función dependerá del esquema que se utilice. El número de campos y la cantidad de bits de cada uno dependen de cada problema. A la tarea de conformar los campos de las microinstrucciones se le da el nombre de formatear (formatting) la palabra de memoria. La Fig. 3.1 muestra un formato de 13 bits.

6

Dire

ccio

nes

Figura 3.1 – Formato en campos.

El formato de la palabra depende del esquema que se elija para la MEF. En función de la complejidad del circuito y de las tareas que el mismo realiza se podrá elegir el esquema que más convenga a la aplicación. El costo del dispositivo y el rendimiento del mismo dependerá de una adecuada selección del esquema y de los campos de las microinstrucciones. El esquema más simple que se puede configurar es el conformado por una memoria y un con-tador binario conectado a las líneas de dirección de la memoria. Conectando una señal de reloj que haga avanzar el contador, se irán direccionando todos los lugares de memoria y cuando se llegue al último, se vuelve a ejecutar la secuencia desde el principio. En la Fig. 3.2 se tiene un diagrama de este sistema. La desventaja evidente es que la secuencia a realizar es fija y no se puede alterar el flujo de ejecución de las instrucciones. Como aplicación de un esquema de este tipo, puede mencionarse el sistema de control del encendido de un cartel luminoso para publicidad, que normalmente sigue una secuencia fija que se repite cada cierto tiempo

Con

tado

r

Figura 3.2 – Esquema de secuenciador con un contador y memoria.

7

3.1 DIRECCIONAMIENTO POR PASOS DE ENLACE

En el esquema descrito en parágrafo anterior, el próximo estado de la máquina queda definido por la secuencia binaria del contador. Es decir que si se está en el estado n, donde n es cual-quier número binario, el próximo estado es siempre el n+1, con la salvedad del último que tiene como próximo estado al primero. El formato de la palabra es totalmente utilizado para guardar instrucciones o salidas de la máquina, ya que la determinación del próximo estado la realiza la lógica de próximo estado del contador (incrementar el contador en 1). Dicho sistema no permite implementar una MEF tipo Moore o Mealy, ya que no se puede definir más de un próximo estado. Una alternativa es usar un campo de la palabra de la ROM para definir el próximo estado, el que debe ser retenido en un registro externo a la memoria. Dicho registro se conforma con tantos flip-flops tipo D como variables de estado tenga la MEF. A este registro se lo denomina registro de estado, cauce o pipeline, ya que es por el que se encauza la información del próximo estado a las líneas de dirección de la memoria. En la Fig. 3.3 se tiene un esquema general de este caso.

Figura 3.3 – Esquema de direccionamiento por pasos de enlace.

El reloj del sistema, que es quien define el tiempo de estado, entra a las entradas de reloj de los flip-flops. El próximo estado del sistema, que está definido por un campo de la ROM, se carga a la salida del registro cauce con cada flanco activo del reloj, obteniéndose una nueva dirección de memoria en conjunto con el estado de las entradas en ese momento. Cada entrada de la MEF tiene asignada una línea de dirección de la memoria dedicada. Para una situación dada (un estado de la máquina), si la entrada está en 0, se accede a una palabra de la memoria, y si está en 1, se accede a otra, con lo que se podrán definir dos próximos es-tados. Este esquema permite implementar cualquier tipo de MEF (Moore o Mealy) sin necesi-dad de reestructurar la carta ASM que describe el funcionamiento del sistema. Se denomina direccionamiento por pasos de enlace debido a que cada paso o camino de enlace del diagra-ma de estados, es decir cada línea que lleva de un estado a otro, tiene asignado, al menos, una

8

dirección de memoria. Esto se muestra con un ejemplo, como el mostrado en la Fig. 3.4. En la tabla 3.1 se describe cómo se tendría que llenar el campo de próximo estado de la memoria para ese ejemplo.

Figura 3.4 – Ejemplo para el esquema de direccionamiento por pasos de enlace.

Estado presente Valor de la Entrada E1

Campo de Próximo Estado

Paso de enlace

0011 0 0101 a → b 0011 1 0100 a → c

Tabla 3.1 – Valores a colocar en el campo de próximo estado.

Puede suceder que algún paso de enlace tenga asignado más de un lugar memoria. Esto se debe a que si una transición entre estados es incondicional (ver la Fig. 3.5) o no depende de todas las entradas de la máquina, entonces se deberán asignar al mismo paso de enlace todas las direcciones de memoria correspondientes a los valores 0 y 1 de las entradas que no se usan en esa transición. En dichos casos, el campo de próximo estado se llena con el mismo valor.

Figura 3.5 – Caso de una transición incondicional.

Estado presente Valor de la Entrada E1

Campo de Próximo Estado

Paso de enlace

0010 0 0011 d → e 0010 1 0011 d → e

Tabla 3.2 – Llenado del campo de próximo estado para las transiciones incondicionales.

9

Un aspecto en el que hay que tener especial cuidado es con el llenado del campo correspon-diente a las instrucciones o salidas de la MEF. Se debe recordar que la salida de una MEF es función del estado presente (salidas Moore) y en algunos casos también de las entradas (sali-das Mealy). Por lo tanto, para las salidas Moore se debe colocar un 1 en la columna corres-pondiente a cada salida y en la fila correspondiente al estado de origen de cada transición (o paso de enlace). Por otra parte, para las salidas Mealy, se debe colocar un 1 en la columna correspondiente a cada salida, pero únicamente en la fila correspondiente al paso de enlace en que esa salida se activa.

MEMORIA

Próximo estado Instrucciones

Registro cauce

Q15

Reloj

C B A Variablesde estado

VENT

3 4

D3 = INTD2 = CRGLTCHD1 = LIMPCNTD0 = HABCNT

Salidas

Figura 3.6 – Esquema de direccionamiento por pasos de enlace para el caso de ejemplo.

En la Fig. 3.6 se tiene el esquema para el caso de ejemplo. En el “tacómetro digital” se tienen 4 salidas y 3 variables de estado, por lo que se necesitan 7 bits para conformar la palabra de la ROM. Por otra parte se tiene 2 entradas y 3 variables de estado, por lo que se necesitan 5 líne-as de dirección en la ROM. Es decir que se necesitaba una ROM de 32 palabras x 7 bits. De los 32 lugares de memoria, se usan 20, dejándose el resto en 0. Esto último es conveniente desde el punto de vista de la robustez del sistema, ya que ante una falla que saque a la MEF de su secuencia normal, se va automáticamente al estado inicial. A los efectos de facilitar el llenado de los datos en la ROM, conviene usar para las variables de estado las líneas de dirección con peso más alto, y para las entradas las de peso más bajo. De esta manera quedarán todos los lugares de memoria correspondiente a un mismo estado en una zona adyacente en la memoria. Así, para el caso de ejemplo se usan las líneas de direc-ción A4, A3 y A2 para el estado presente, correspondientes a las variables de estado C, B y A respectivamente. La línea de dirección A1 se usa para la entrada VENT y A0 para Q15. El cam-po de próximo estado utiliza 3 bits y se define así: D6 = C*, D5 = B* y D4 = A*. El asterisco aquí indica próximo estado de la variable de estado. El campo de instrucciones o salidas se define así: D3 = INT, D2 = CRGLTCH, D1 = LMPCNT y D0 = HABCNT.

10

3.1.1 PROCEDIMIENTO PARA EL LLENADO DE LA MEMORIA

A continuación se detalla el procedimiento a seguir para el llenado de los campos de próximo estado y de instrucciones de la memoria. Para ello se mostrarán los casos representativos de la MEF cuya carta y asignación de estados se muestran en la Fig. 2.2. Se comienza por el estado a, que tiene dos pasos de enlace: uno que vuelve sobre el mismo estado a y otro que lleva al estado b (ver la Fig. 3.7).

Figura 3.7 – Pasos de enlace del estado a.

Dir. A4 A3 A2 A1 A0 D6 D5 D4 D3 D2 D1 D0 Paso de enlace

0 0 0 0 0 0 0 0 0 0 0 0 0 a → a 1 0 0 0 0 1 0 0 0 0 0 0 0 a → a 2 0 0 0 1 0 0 0 1 0 0 0 0 a → b 3 0 0 0 1 1 0 0 1 0 0 0 0 a → b

Tabla 3.3 – Llenado de la memoria para el estado a.

Para el estado a, como el próximo estado sólo depende de la entrada VENT, se deberán asig-nar dos lugares de memoria para cada paso de enlace, las que corresponden a Q15 igual a 0 y 1 (es decir, la línea de dirección A0). La transición de a → a ocupa las direcciones 00000 y 00001. El campo de próximo estado de esas dos direcciones se llena con el próximo estado de esa transición, es decir, el valor 000 correspondiente al estado a. La transición de a → b ocu-pa las direcciones 00010 y 00011, colocándose en el campo de próximo estado de ambas di-recciones el valor 001 correspondiente al estado b. En el estado a no se activa ninguna de las salidas de la máquina, por lo que el campo de instrucciones de las cuatro direcciones mencio-nadas está completamente en 0. El estado b tiene 3 próximos estados: el mismo b, el c y el d. La transición de b → c sólo de-pende de la entrada Q15, por lo que ese paso de enlace tiene asignado 2 direcciones de memo-ria, 00101 y 00111, que se corresponden con los valores 0 y 1 de VENT. Las otras dos transi-ciones tienen asignadas una dirección de memoria cada una, ya que dependen de las dos en-tradas de la MEF. En el campo de próximo estado se debe colocar el próximo estado de cada paso de enlace: 001 para la transición b → b; 010 para la transición b → c y 011 para la tran-

11

sición b → d. El estado b tiene definida como activa una salida Moore, HABCNT, por lo que en el campo de instrucciones de las cuatro direcciones de la Tabla 3.4 se debe colocar un 1 en la columna D0, correspondiente a esa salida.

Figura 3.8 – Pasos de enlace del estado b.

Dir. A4 A3 A2 A1 A0 D6 D5 D4 D3 D2 D1 D0 Paso de enlace

4 0 0 1 0 0 0 1 1 0 0 0 1 b → d 5 0 0 1 0 1 0 1 0 0 0 0 1 b → c 6 0 0 1 1 0 0 0 1 0 0 0 1 b → b 7 0 0 1 1 1 0 1 0 0 0 0 1 b → c

Tabla 3.4 – Llenado de la memoria para el estado b.

El estado c también tiene definidos tres próximos estados (ver la Fig. 3.9). El llenado del campo de próximo estado es similar a los casos anteriores. Aquí la única particularidad se presenta con la salida Mealy INT, que aparece en la casilla de salida condicional. Esa salida se activa si la MEF está en el estado c y además se pone en 0 la entrada Q15. Esa condición co-rresponde al paso de enlace que tiene asignadas las direcciones 01000 y 01010, por lo que sólo en esas direcciones hay que poner un 1 en la columna de la salida INT. El estado c tam-bién tiene definida una salida Moore, HABCNT, por lo que la columna correspondiente a esa salida se llena con unos en todas las direcciones asignadas a este estado.

12

Figura 3.9 – Pasos de enlace del estado c.

Dir. A4 A3 A2 A1 A0 D6 D5 D4 D3 D2 D1 D0 Paso de enlace

8 0 1 0 0 0 0 0 1 1 0 0 1 c → b 9 0 1 0 0 1 0 1 1 0 0 0 1 c → d 10 0 1 0 1 0 0 0 1 1 0 0 1 c → b 11 0 1 0 1 1 0 1 0 0 0 0 1 c → c

Tabla 3.5 – Llenado de la memoria para el estado c.

En el estado d se tiene el caso de una transición incondicional, es decir es una transición que no depende de ninguna de las entradas. De todas maneras se tienen que usar 4 direcciones de memoria para definir el próximo estado y las salidas de ese estado, lo que significa un desper-dicio importante de memoria, ya que la información aparece repetida cuatro veces. El campo de próximo estado se llena en todos los casos con el valor 100 y en el campo de instrucciones se debe poner un 1 en la columna correspondiente a la salida Moore que se activa, CRGLTCH, tal como se observa en la Tabla 3.6. La transición de e → a es un caso similar y se sigue el mismo procedimiento. En la tabla 3.7 se tiene el listado completo del contenido de la memoria ROM para este caso.

13

Figura 3.10 – Pasos de enlace del estado d.

Dir. A4 A3 A2 A1 A0 D6 D5 D4 D3 D2 D1 D0 Paso de

enlace 12 0 1 1 0 0 1 0 0 0 1 0 0 d → e 13 0 1 1 0 1 1 0 0 0 1 0 0 d → e 14 0 1 1 1 0 1 0 0 0 1 0 0 d → e 15 0 1 1 1 1 1 0 0 0 1 0 0 d → e

Tabla 3.6 – Llenado de la memoria para el estado d.

Como resumen de este esquema de microprogramación, puede decirse que para cada estado se deben usar p2 direcciones de memoria, siendo p la cantidad de entradas de la MEF. A cada paso de enlace de la MEF le corresponde al menos un lugar de memoria. Como ventaja se tiene que con este esquema se puede implementar todo tipo de MEF, ya sean tipo Moore o Mealy. La principal desventaja es que la memoria se duplica en longitud por cada entrada de la máquina que se tenga o agregue. Para sistemas con muchas entradas la utilización de la memoria es pobre y se hace muy engorroso el llenado del contenido de la memoria, lo que lo hace un método muy propenso a errores.

14

Dir. A4 A3 A2 A1 A0 D6 D5 D4 D3 D2 D1 D0 Paso de

enlace Definición de las variables

0 0 0 0 0 0 0 0 0 0 0 0 0 a → a A4 = C 1 0 0 0 0 1 0 0 0 0 0 0 0 a → a A3 = B 2 0 0 0 1 0 0 0 1 0 0 0 0 a → b A2 = A 3 0 0 0 1 1 0 0 1 0 0 0 0 a → b A1 = VENT 4 0 0 1 0 0 0 1 1 0 0 0 1 b → d A0 = Q15 5 0 0 1 0 1 0 1 0 0 0 0 1 b → c 6 0 0 1 1 0 0 0 1 0 0 0 1 b → b D6 = C* 7 0 0 1 1 1 0 1 0 0 0 0 1 b → c D5 = B* 8 0 1 0 0 0 0 0 1 1 0 0 1 c → b D4 = A* 9 0 1 0 0 1 0 1 1 0 0 0 1 c → d D3 = INT 10 0 1 0 1 0 0 0 1 1 0 0 1 c → b D2 = CRGLTCH 11 0 1 0 1 1 0 1 0 0 0 0 1 c → c D1 = LMPCNT 12 0 1 1 0 0 1 0 0 0 1 0 0 d → e D0 = HABCNT 13 0 1 1 0 1 1 0 0 0 1 0 0 d → e 14 0 1 1 1 0 1 0 0 0 1 0 0 d → e 15 0 1 1 1 1 1 0 0 0 1 0 0 d → e 16 1 0 0 0 0 0 0 0 0 0 1 0 e → a 17 1 0 0 0 1 0 0 0 0 0 1 0 e → a 18 1 0 0 1 0 0 0 0 0 0 1 0 e → a 19 1 0 0 1 1 0 0 0 0 0 1 0 e → a 20 1 0 1 0 0 0 0 0 0 0 0 0 No esp. 21 1 0 1 0 1 0 0 0 0 0 0 0 No esp. 22 1 0 1 1 0 0 0 0 0 0 0 0 No esp. 23 1 0 1 1 1 0 0 0 0 0 0 0 No esp. 24 1 1 0 0 0 0 0 0 0 0 0 0 No esp. 25 1 1 0 0 1 0 0 0 0 0 0 0 No esp. 26 1 1 0 1 0 0 0 0 0 0 0 0 No esp. 27 1 1 0 1 1 0 0 0 0 0 0 0 No esp. 28 1 1 1 0 0 0 0 0 0 0 0 0 No esp. 29 1 1 1 0 1 0 0 0 0 0 0 0 No esp. 30 1 1 1 1 0 0 0 0 0 0 0 0 No esp. 31 1 1 1 1 1 0 0 0 0 0 0 0 No esp.

Tabla 3.7 – Contenido de la memoria para el esquema de pasos de enlace.

3.2 DIRECCIONAMIENTO POR PARES ESTADO-ENTRADA O DE 2 VÍAS

Una alternativa para mejorar la utilización de la ROM es restringir el modelo utilizado para definir la MEF, limitándolo a un modelo tipo Moore (es decir que no se admiten salidas Mea-ly) y a una sola entrada afectando a cada estado. El formato de la ROM se modifica agregan-do un campo para seleccionar una entrada de la máquina mediante un multiplexor, y en fun-ción del valor que esa entrada tenga se seleccionará mediante otro multiplexor (llamado hori-zontal) uno de dos campos de próximo estado posibles: uno para la condición 0 de la entrada y otro para la condición 1 de la misma. En la Fig. 3.11 se muestra el esquema de esta configu-ración. A este esquema también se lo puede denominar de 2 vías porque para cada estado sólo se admiten 2 próximos estados. En este esquema, a las líneas de dirección de la memoria sólo llegan las variables de estado de la MEF. Así, el largo requerido de la memoria es sensiblemente menor que en el caso del di-reccionamiento por pasos de enlace. Se necesitará sólo una dirección de memoria por cada

15

estado de la MEF. Como esto da lugar a una memoria corta y ancha, estos esquemas también reciben el nombre de microprogramación horizontal, y en general son los que permiten un mayor grado de paralelismo en el funcionamiento de un sistema basado en microprograma-ción.

Figura 3.11 – Esquema de direccionamiento por pares Estado-Entrada o de 2 Vías.

La carta ASM del ejemplo debe modificarse para cumplir con la restricción impuesta. Se de-ben agregar estados en las transiciones que dependen de más de una entrada, ya que este es-quema sólo permite seleccionar una entrada por estado. Así, en la carta se deben agregar 2 estados: uno entre las dos casillas de decisión que afectan al estado b y otro entre las casillas de decisión que afectan al estado c. En los casos en que hayan más entradas que afecten a un estado, se deberán agregar todos los estados que sean necesarios entre las casillas de decisión para cumplir con la restricción impuesta. Como no se admiten salidas Mealy, se debe transformar la salida condicional que contiene la salida INT en un estado, con las modificaciones pertinentes para que no se cambie el algorit-mo verbal definido para la MEF. Como en el lazo formado por los estados b y c se debe man-tener activa la salida HABCNT, en el estado agregado para la salida Mealy también debe agregarse dicha salida. La Fig. 3.12 muestra la carta ASM modificada para este esquema. Como puede observarse, los requerimientos de la memoria han cambiado (ver la Fig. 3.13). Para este caso se necesita: 1 bit para la selección de las entradas (se tienen 2 entradas); 3 bits para el próximo estado si la entrada vale 0, 3 bits para el próximo estado si la entrada vale 1 y por último 4 bits para las instrucciones o salidas. Esto hace un total de 11 bits de ancho de palabra de la ROM. Por otra parte, se necesita únicamente una palabra de memoria por cada estado de la MEF, que con los estados que se agregaron suman 8.

16

VENT

HABCNT

Q15

HABCNT

Q15

VENT

VENT

CRGLTCH

LIMPCNT

b

c

g

h

a

000

001

010

110

111

HABCNT

INT, HABCNTe

HABCNTd

f

011 100

101

Figura 3.12 – Carta modificada para el esquema de 2 Vías.

17

Selección Pxmo. Est.0

Pxmo. Est.1 Instr.

Dire

cció

n

MEMORIA

Multiplexor 2:1

Registro cauce

Salidas

Reloj

Mux

2:1VENT

Q15

1 3 3 4

D3 = INTD2 = CRGLTCHD1 = LIMPCNTD0 = HABCNT

3

00

1

1

Figura 3.13 – Esquema de direccionamiento por pares Estado-Entrada para el ejemplo.

3.2.1 PROCEDIMIENTO PARA EL LLENADO DE LA MEMORIA

A continuación se indica el procedimiento para llenar la memoria para el direccionamiento por pares Estado-Entrada. En este caso, como siempre un estado tiene sólo dos próximos es-tados y sólo se admiten salidas tipo Moore, determinar el contenido de la memoria es mucho más sencillo. Sólo hay que llenar una fila por estado de la MEF.

Figura 3.14 – Determinación de los valores de los campos del estado a.

Estado A2 A1 A0 S C*0 B*0 A*0 C*1 B*1 A*1 D3 D2 D1 D0a 0 0 0 0 0 0 0 0 0 1 0 0 0 0

Tabla 3.8 – Llenado de la memoria para el estado a.

18

Para el estado a (ver la Fig. 3.14), se debe seleccionar la entrada VENT, por lo que en el cam-po de selección se debe colocar un 0, indicando que el multiplexor de las entradas transfiera a su salida el valor de dicha entrada. Si la entrada VENT vale 0, el próximo estado es el mismo estado a, por lo que se debe colocar el valor 000 en el campo correspondiente al próximo es-tado por 0. Si VENT vale 1, el próximo estado es el b, por lo que se debe colocar el valor 001 en el campo correspondiente al próximo estado por 1. En función del valor de la entrada, el multiplexor horizontal seleccionará uno de los dos valores de próximo estado definidos para cargarlo en el registro cauce con el próximo flanco del reloj. Como en el estado a todas las salidas están inactivas, se pone un 0 en todas las columnas del campo definido para las sali-das.

HABCNT

Q15

HABCNT

b

c

001

010

HABCNTf

101

Valor a colocar en el campo de próximo estado si la entrada

seleccionada vale 0.

Valor a colocar en el campo de próximo estado si la entrada

seleccionada vale 1.

Entrada que hay que seleccionar con el campo de

Selección.

Colocar un 1 en la columna correspondiente a esta salida.

Figura 3.15 – Determinación de los valores de los campos del estado b.

Estado A2 A1 A0 S C*0 B*0 A*0 C*1 B*1 A*1 D3 D2 D1 D0b 0 0 1 1 1 0 1 0 1 0 0 0 0 1

Tabla 3.9 – Llenado de la memoria para el estado b.

Para el estado b (ver la Fig. 3.15) hay definidos dos próximos estados diferentes, por lo que este es el caso más general. En este caso se debe seleccionar la entrada Q15, por lo que en el campo de selección se debe colocar un 1. En los campos de próximo estado por 0 y por 1 se coloca 101 y 010 respectivamente. En este estado sólo está activa la salida HABCNT, y por lo tanto se debe colocar un 1 en la columna correspondiente a esta salida (D0). El llenado de la mayoría de los otros estados es similar al anterior. Como caso particular se tienen las transiciones incondicionales entre estados, es decir aquéllas transiciones entre esta-dos que no dependen de ninguna entrada y por lo tanto tienen definido un único próximo es-tado. En este caso, en los campos de próximo estado por 0 y 1 se debe colocar el mismo valor. Por ejemplo, para la transición de g → h (ver la Fig. 3.16) el próximo estado es el 111 y se debe colocar ese valor en ambos campos de próximo estado. En el campo de selección de las entradas se puede colocar cualquier valor (0 ó 1), pero no un valor no especificado ya que en la memoria no se pueden cargar valores indefinidos. Para el llenado del campo de instruccio-nes se sigue el mismo procedimiento que para los otros casos. En el caso en que en un estado se active más de una salida, como por ejemplo en el estado e, se debe colocar un 1 en la co-lumna correspondiente a cada salida que aparezca en dicho estado. En la Tabla 3.11 se tiene el contenido completo de la memoria para este esquema.

19

Figura 3.16 – Determinación de los valores de los campos del estado g.

Estado A2 A1 A0 S C*0 B*0 A*0 C*1 B*1 A*1 D3 D2 D1 D0g 1 1 0 0 1 1 1 1 1 1 0 1 0 0

Tabla 3.10 – Llenado de la memoria para el estado g.

Estado A2 A1 A0 S C*0 B*0 A*0 C*1 B*1 A*1 D3 D2 D1 D0a 0 0 0 0 0 0 0 0 0 1 0 0 0 0b 0 0 1 1 1 0 1 0 1 0 0 0 0 1 c 0 1 0 1 0 1 1 1 0 0 0 0 0 1 e 0 1 1 0 0 0 1 0 0 1 1 0 0 1 d 1 0 0 0 1 1 0 0 1 0 0 0 0 1 f 1 0 1 0 1 1 0 0 0 1 0 0 0 1 g 1 1 0 0 1 1 1 1 1 1 0 1 0 0 h 1 1 1 0 0 0 0 0 0 0 0 0 1 0

Tabla 3.11 – Contenido de la memoria para el direccionamiento por pares Estado-Entrada.

Como puede observarse, la cantidad de bits necesarios para implementar este esquema es sen-siblemente inferior al caso de direccionamiento por pasos de enlace. Usando direccionamiento por pasos de enlace se tienen 20 x 7 = 140 bits, mientras que con direccionamiento por pares Estado-Entrada, se tienen 8 x 11 = 88 bits para el mismo ejemplo, con un mejor aprovecha-miento de la memoria. Si bien la cantidad de bits utilizados en este último caso es inferior, la realización práctica del diseño puede requerir más circuitos integrados (salvo que se haga la implementación con un FPGA o un ASIC). Por lo general las memorias se fabrican de 8 bits de ancho, por lo que el primer caso requiere 1 CI, mientras que el segundo 2 CIs de memoria. En función del tamaño del problema y de los requerimientos de memoria, se deberá tener cuidado en la definición del formato de la palabra de memoria. Más adelante se verá una forma de reducir el ancho de la palabra mediante la codificación de las salidas.

3.3 DIRECCIONAMIENTO DE 4 VÍAS

El esquema de direccionamiento por pares Estado-Entrada puede expandirse para considerar más entradas por estado. Si se consideran 2 entradas por estado, existirán 4 próximos estados posibles, si se consideran 3 entradas, habrán 8 próximos estados posibles, etc. Así, habrá que

20

incluir en el formato de la palabra de memoria p2 campos de próximo estado, siendo p la cantidad de entradas que se admiten por estado en la carta ASM. Además, se deberán agregar los multiplexores que hagan falta para seleccionar la cantidad de entradas por estado que ad-mita el esquema. En la Figura 3.17 se muestra el esquema del direccionamiento llamado de 4 Vías (porque admite 4 próximos estados).

Figura 3.17 – Esquema de direccionamiento de 4 Vías.

Como se puede observar, este esquema es más costoso en hardware que el anterior, pero se tiene la ventaja que se tendrán que agregar menos estados si se tiene que modificar la carta. Se siguen imponiendo las restricciones del caso de 2 vías, aunque más relajadas con respecto a las entradas. En este caso no se pueden tener más de 2 entradas afectando a la transición de cada estado y sólo se admiten salidas tipo Moore. Al tener más campos de próximo estado y de selección de entradas, el formato se hace más ancho, pero en general se tendrán menos estados, dando lugar a una memoria más ancha pero también más corta. Por lo tanto este esquema es más horizontal aún que el anterior. En la Fig. 3.18 se muestra cómo hay que llenar la memoria en el caso más general. El campo de selección en este caso, queda dividido en dos partes. Un grupo de bits S0 seleccionará la primera entrada del multiplexor correspondiente a las entradas E1, y otro grupo de bits S1 seleccionará la segunda entrada del multiplexor correspondiente a las entradas E2.

21

Lista de Salidas

E1

E2 E2

p

q r s t

PPP

QQQ RRR SSS TTT

Valor a colocar en el campo de próximo estado

si las entradas seleccionadas valen 00.

Valor a colocar en el campo de próximo estado

si las entradas seleccionadas valen 01.

Valor a colocar en el campo de próximo estado

si las entradas seleccionadas valen 10.

Valor a colocar en el campo de próximo estado

si las entradas seleccionadas valen 11.

Entrada que hay que seleccionar con el campo

de Selección S0.

Entrada que hay que seleccionar con el campo

de Selección S1.

Campo de Instrucciones: Colocar un 1 en la

columna de cada salida que aparece en la lista.

Figura 3.18 – Indicaciones para llenar la memoria con el esquema de 4 Vías.

Es de destacar que no siempre hace falta poner los dos multiplexores de las entradas. Incluso hay casos en los que no hace falta ninguno. Si la MEF tiene sólo 2 entradas, dichas entradas hay que conectarlas directamente al multiplexor horizontal y en tal caso, el campo de selec-ción de la memoria no existe. Otro caso particular es cuando la MEF tiene 3 entradas y se da el caso de que en cualquier transición una de ellas siempre va acompañada de alguna de las otras dos. En tal caso, la que siempre aparece se conecta directamente a una de las entradas del multiplexor horizontal, mientras que la otra entrada se selecciona con un multiplexor de entradas con el campo de selección correspondiente. En este caso sería un error agregar un multiplexor para seleccionar sólo una entrada. El campo de próximo estado se llena de manera análoga al de 2 Vías, nada más que en este caso hay 4 campos a llenar de acuerdo a la combinación binaria de las entradas. Un caso par-ticular es cuando la transición entre estados es incondicional, en el que en el campo de selec-ción se puede poner cualquier valor y todos los campos de próximo estado se llenan con el mismo valor de próximo estado. Lo mismo para las transiciones afectadas por una sola entra-da, en el que dos campos llevan un valor de próximo estado y los otros dos llevan otro. Para el llenado del campo de instrucciones se procede igual que en los casos anteriores, recordando que las salidas Moore que aparecen en el estado se deben colocar en la fila correspondiente a dicho estado (¡¡¡y no en la fila del próximo estado!!!). Para el caso del tacómetro digital de ejemplo, la única modificación que habría que hacerle a la carta ASM es transformar la casilla de salida condicional (salida Mealy) que depende del estado c en un estado (el f), para cumplir con la restricción de que sólo hayan salidas Moore. Para preservar el correcto funcionamiento de la MEF, además se debe incluir en el estado f la salida HABCNT. En la Fig. 3.19 se tiene la carta modificada para este esquema.

22

Figura 3.19 – Carta modificada para el esquema de 4 Vías.

Pxmo. Est.00

Pxmo. Est.01 Instr.

MEMORIA

Multiplexor 4:1

Registro cauce

Salidas

Reloj

Pxmo. Est.10

Pxmo. Est.11

S0

S1

0 1 2 3VENT

Q15

3 3 3 3 4

D3 = INTD2 = CRGLTCHD1 = LIMPCNTD0 = HABCNT

Figura 3.20 – Esquema de 4 Vías para el caso de ejemplo.

23

En este caso la máquina sólo tiene 2 entradas, y tal como se explicó arriba, no hace falta ningún multiplexor para las entradas. La entrada VENT se conecta directamente a la entrada de selección S0 del multiplexor horizontal y la entrada Q15 a la S1, tal como se muestra en la Fig. 3.20. En la palabra de memoria no hay ningún campo de selección de entradas.

3.3.1 PROCEDIMIENTO PARA EL LLENADO DE LA MEMORIA

A continuación se verán algunos ejemplos del llenado de la memoria para el esquema de 4 Vías. El próximo estado del estado a sólo está afectado por la entrada VENT (ver la Fig. 3.21). Por lo tanto en el campo de próximo estado habrán valores que no dependen de la entrada Q15, es decir, el valor que entra por la entrada S1 del multiplexor horizontal es un valor no especificado. De acuerdo al esquema del circuito, la entrada VENT debe seleccionar el conte-nido de los campos X0 si vale 0 y X1 si vale 1, y por lo tanto habrán valores que aparecen repetidos. (Nota: aquí la X significa valor no especificado). Así, para el estado a hay que co-locar el valor 000 en los campos de próximo estado X0 y 001 en los campos X1. Como este estado no tiene listada ninguna salida, el campo de instrucciones está totalmente en 0.

Figura 3.21 – Determinación de los valores del campo de próximo estado del estado a.

Est. A2 A1 A0 C*00 B*00 A*00 C*01 B*01 A*01 C*10 B*10 A*10 C*11 B*11 A*11 D3 D2 D1 D0

a 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0

Tabla 3.12 – Llenado de la memoria para el estado a.

24

HABCNT

Q15

HABCNT VENT

CRGLTCH

b

c

d

001

010

011

Valor a colocar en el campo de próximo estado si las

entradas valen 01.

Valor a colocar en el campo de próximo estado si las

entradas valen 00.

Valor a colocar en el campo de próximo estado si las entradas valen 10 y 11.

Colocar un 1 en la columna

correspondiente a esta salida.

Figura 3.22 – Determinación de los valores de los campos del estado b.

El estado b tiene definidos 3 próximos estados, habiendo dos que dependen de las dos entra-das y uno que depende de una sola. Así, si las entradas valen 00, en ese campo hay que colo-car el valor 011, si valen 01 el valor es 001 y si valen 1X, en ambos campos hay que colocar 010. También hay que colocar un 1 en la columna correspondiente a la salida HABCNT (D0).

Est. A2 A1 A0 C*00 B*00 A*00 C*01 B*01 A*01 C*10 B*10 A*10 C*11 B*11 A*11 D3 D2 D1 D0

b 0 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1

Tabla 3.13 – Llenado de la memoria para el estado b.

Un caso particular es el de las transiciones incondicionales. Por ejemplo, para el estado d (ver la Fig. 3.22), el próximo estado es el e sin importar el valor de ninguna de las entradas de la MEF. Por lo tanto habrá que poner el mismo valor (100) en todos los campos de próximo es-tado. La salida que se activa en este estado es CRGLTCH, por lo que hay que colocar un 1 en la columna correspondiente (D2). La Tabla 3.15 resume el contenido de la memoria para el esquema de 4 Vías.

25

Figura 3.23 – Determinación de los valores del campo de próximo estado del estado d.

Est. A2 A1 A0 C*00 B*00 A*00 C*01 B*01 A*01 C*10 B*10 A*10 C*11 B*11 A*11 D3 D2 D1 D0

d 0 1 1 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0

Tabla 3.14 – Llenado de la memoria para el estado d.

Est. A2 A1 A0 C*00 B*00 A*00 C*01 B*01 A*01 C*10 B*10 A*10 C*11 B*11 A*11 D3 D2 D1 D0

a 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 b 0 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 c 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 0 0 0 1 d 0 1 1 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 e 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 f 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 0 1 - 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Tabla 3.15 – Contenido de la memoria para el esquema de 4 Vías.

Con este esquema, la memoria requerida para implementar el caso de ejemplo es de 6 x 16 bits = 96 bits, algo mayor que con el esquema de direccionamiento de 2 vías, pero con menos estados.

3.4 ESQUEMA DE DIRECCIONES ASUMIDAS

Este esquema se basa en el diagrama del contador de salto de la Fig. 1.2 y en el esquema de direccionamiento por pares Estado-Entrada. Como registro cauce se usa un contador con car-ga en paralelo, como puede ser un 74x163, al que se lo denomina μPC (se lee micro PC) por analogía con el Contador de Programa (Program Counter o PC) de un microprocesador o computadora. Este esquema impone las mismas restricciones que el esquema de direcciona-miento por pares Estado-Entrada, es decir sólo se admiten una entrada por estado y salidas Moore. El contador 74x163 tiene varias entradas de control que permiten:

a) Poner a cero la cuenta con la entrada Limpiar (CLR_L). b) Cargar el contador con la entrada Cargar (LD_L = 0). Se carga el valor presente en las

entradas paralelo del contador. c) Incrementar el contador en 1 (cuando LD_L = 1).

26

d) Retener la cuenta actual usando las entradas de habilitación ENP y ENT. El uso del contador agrega restricciones adicionales, ya que, en función de las entradas de control que se usen, se debe adaptar el resto del circuito al funcionamiento del contador. La entrada Limpiar (CLR_L) normalmente se usa para la inicialización de la MEF. Si bien se pueden plantear esquemas en el que se usen todas las entradas de control de forma convenien-te, en este trabajo sólo plantearemos un esquema en el que se usa la entrada LD_L. En tal caso la principal restricción que aparece se da en la asignación de estados. En general para cual-quier estado dado, uno de los dos próximos estados deberá siempre tener un código que sea el estado actual más 1. Es bastante obvio que esto se debe a que el próximo estado asumido por defecto es el actual más 1, al que se le da el nombre de dirección asumida. El otro estado, que puede tener cualquier otro código de estado, se alcanza poniendo en bajo la entrada LD_L, con lo que se cargará una nueva dirección de la memoria (la dirección de salto) en el conta-dor. De esta manera, al haber siempre una dirección asumida, el campo de próximo estado sólo necesita tener un solo campo, el de la dirección de salto. De esta manera se obtiene un es-quema con menos bits de ancho. Una primera aproximación a este esquema es el mostrado en la Fig. 3.24.

Figura 3.24 – Esquema de direcciones asumidas sin entradas.

En este caso el formato de la palabra se divide en 3 campos: uno para la dirección de salto, otro para indicar si el contador se debe incrementar o si debe cargar el próximo estado desde la memoria y un tercero para las instrucciones. El bit de Incrementar/Cargar se conecta a la entrada respectiva del contador (LD_L). Si bien este esquema permite implementar una MEF, no permite realizar saltos condicionados, por lo que su uso es muy limitado. Una forma de tener la posibilidad de efectuar saltos condicionados por las entradas, es agregar un multiplexor para las entradas y reestructurar el formato de la palabra de memoria, tal como se muestra en la Fig. 3.25. Se sigue usando un campo para la dirección salto, que se conecta a la carga en paralelo del μPC. Con un segundo campo se selecciona una entrada del multi-

27

plexor de entrada, cuya salida se conecta a la entrada de Incrementar/Cargar (LD_L) del μPC. El tercer campo se utiliza para las instrucciones de salida de la máquina.

Figura 3.25 – Esquema de direcciones asumidas con entradas.

En el multiplexor de entrada puede ser necesario conectar una de las entradas a 0 y otra a 1, de manera de tener la posibilidad de seleccionar un salto forzado o un incremento del μPC para las transiciones incondicionales. Es necesario aclarar que estas entradas del multiplexor deben conectarse sólo en caso de ser necesario. Si no hacen falta, no se deben incluir, ya que en todos los casos se debe tratar de hacer la implementación con el circuito más simple. En algunos casos se deberá hacer algún cambio en las casillas de condición de la carta para cumplir con los requisitos del esquema de direcciones asumidas. Supongamos el caso mostra-do en la Fig. 3.26. Si luego de hacer la asignación de estados (y no habiendo forma de cam-biarla) queda algún estado en el que la dirección asumida está por la salida negada de la casi-lla de decisión (y por lo tanto, no se cumple con la tabla mostrada en la Fig. 3.25), se puede cambiar la posición de la burbuja de negación al otro paso de enlace de salida de la casilla. Para preservar el algoritmo descrito por la carta ASM, dentro de la casilla de decisión se debe colocar el complemento de la entrada que afecta esa transición. En tal caso, en el multiplexor de entrada deberá conectarse el complemento de la entrada afectada utilizando un inversor.

28

Figura 3.26 – Modificación de las casillas de decisión.

3.4.1 PROCEDIMIENTO PARA HACER LA ASIGNACIÓN DE ESTADOS

En primer lugar, se debe tener la carta ASM con las modificaciones impuestas por el esquema de direccionamiento de 2 Vías, es decir una entrada por estado y sólo salidas Moore (ver la Fig. 3.12). Dado que este esquema tiene una restricción adicional, para hacer la asignación de estado se deberán buscar caminos por la carta de manera que siempre que se pasa a través de una casilla de decisión, uno de los próximos estados tenga la dirección asumida. Esta fase se debe hacer por prueba y error, hasta obtener un resultado satisfactorio. A continuación se describirá el procedimiento para el caso de ejemplo. En la Fig. 3.27 se han dibujado sobre la carta ASM (con líneas de raya y punto) dos caminos posibles sobre los cua-les aplicar las direcciones asumidas. Por esos caminos los códigos de estado deben seguir la cuenta binaria del contador, que en este caso es de 3 bits, a partir de un estado. En el resto de los casos no cubiertos por estos caminos se debe usar la dirección de salto. Se puede observar que hay tres transiciones en las que no se cumple con los requisitos del esquema: la de los estados b, c y f. En todos esos casos se debe cambiar la posición de la bur-buja y poner dentro de la casilla de decisión el complemento de la entrada. En la Fig. 3.28 se tiene la carta modificada, con una asignación de estados que cumple con las restricciones im-puestas.

29

VENT

HABCNT

Q15

HABCNT

Q15

VENT

VENT

CRGLTCH

LIMPCNT

b

c

g

h

a

HABCNT

INT, HABCNTe

HABCNTd

f

Figura 3.27 – Determinación de los caminos para las direcciones asumidas.

30

HABCNT

HABCNT

CRGLTCH

LIMPCNT

b

c

g

h

a

000

001

110

011

100

HABCNT

INT, HABCNTe

HABCNTd

f

111 101

010

VENT

VENT

Q15

VENTQ15

Figura 3.28 – Asignación de estados con la carta ASM modificada.

Con las modificaciones realizadas, el esquema de direcciones asumidas va a requerir un mul-tiplexor de entrada que incluya las siguientes conexiones: VENT , VENT , 15Q y GND para los saltos incondicionales. Así, el formato de la palabra queda con 3 bits para la dirección de sal-to, 2 bits para seleccionar la entrada y 4 bits para las salidas, haciendo un total de 9 bits, tal como se muestra en la Fig. 3.29.

31

Figura 3.29 – Esquema de direcciones asumidas para el caso de ejemplo.

3.4.2 PROCEDIMIENTO PARA EL LLENADO DE LA MEMORIA

Para el llenado de la memoria con este esquema se procede de forma muy similar al esquema de direccionamiento por pares Estado-Entrada, con la diferencia de que el campo de próximo estado ahora sólo contiene un valor (la dirección de salto). Sólo se detallarán dos casos típi-cos, un estado que tenga una entrada y otro que tenga una transición incondicional.

Figura 3.30 – Determinación de los valores de los campos del estado b.

32

Estado A2 A1 A0 C* B* A* S1 S0 D3 D2 D1 D0 b 0 0 1 1 1 0 0 1 0 0 0 1

Tabla 3.16 - Llenado de la memoria para el estado b.

Para el estado b (ver la Fig. 3.30), se debe seleccionar la entrada 15Q , por lo que en el campo de selección se debe colocar el valor 01. La dirección de salto, que se alcanza por la salida negada de la casilla de decisión, es la 110. Por último, habrá que colocar un 1 en la columna correspondiente a la salida HABCNT (D0).

LIMPCNTh

a

100

000 Dirección de salto

Colocar un 1 en la columna correspondiente a esta salida.

Figura 3.31 – Determinación de los valores de los campos del estado h.

Estado A2 A1 A0 C* B* A* S1 S0 D3 D2 D1 D0 h 1 0 0 0 0 0 0 0 0 0 1 0

Tabla 3.17 - Llenado de la memoria para el estado h.

El estado h tiene cómo único próximo estado el estado a (ver la Fig. 3.31). En este caso, por tratarse de una transición incondicional, con el campo de selección se debe elegir la entrada 0 del multiplexor colocando 00 en el campo de selección. Esto forzará al contador a realizar una carga. En el campo de la dirección de salto se coloca el valor 000. Luego hay que colocar un 1 en la columna correspondiente a la salida LIMPCNT (D1).

Estado A2 A1 A0 C* B* A* S1 S0 D3 D2 D1 D0 a 0 0 0 0 0 0 1 0 0 0 0 0 b 0 0 1 1 1 0 0 1 0 0 0 1 f 0 1 0 0 0 1 1 1 0 0 0 1 g 0 1 1 1 0 0 0 0 0 1 0 0 h 1 0 0 0 0 0 0 0 0 0 1 0 d 1 0 1 0 1 1 1 0 0 0 0 1 c 1 1 0 1 0 1 0 1 0 0 0 1 e 1 1 1 0 0 1 0 0 1 0 0 1

Tabla 3.18 – Contenido de la memoria para el esquema de direcciones asumidas.

La Tabla 3.18 muestra el contenido completo de la memoria para el esquema de direcciones asumidas. Se puede observar que para la transición de g → h se ha usado un salto, en lugar de incrementar el contador. Como de todas maneras es una transición incondicional, se usa este método a los efectos de evitar el agregado de una entrada extra en el multiplexor de selección conectada a Vcc , que obligaría a usar un multiplexor más grande (de 8 entradas). La memoria

33

requerida para el caso de ejemplo es de 8 x 9 bits = 72 bits. Se tiene una memoria más peque-ña que en los casos anteriores, pero se tiene que agregar más hardware externo a la memoria.

3.5 ESQUEMA DE DIRECCIONES ASUMIDAS MEJORADO

El esquema de direcciones asumidas se puede mejorar mediante la inclusión de un “inversor programable” implementado con una compuerta O exclusiva (XOR). Esta compuerta se agre-ga a la salida del multiplexor de selección de entrada, de manera de evitar tener que conectar entradas negadas para cumplir con el esquema de direcciones asumidas, como sucedió en el caso anterior. En la memoria aparece un nuevo campo llamado de polaridad de 1 bit, que se conecta a una de las entradas de la compuerta XOR. Si este bit vale 0, la compuerta XOR se comporta como un driver, es decir, no modifica la entrada. Si vale 1, la compuerta XOR se comporta como un inversor. En este caso ya no hay que conectar una de las entradas a Vcc cuando se quiere hacer un salto incondicional incrementando el contador. Bastará con seleccionar la entrada 0 del multiplexor y poner un 1 en el campo de polaridad.

µPC

MEMORIA

Dirección de Salto Selección Instrucciones

Salidas

Reloj

Contador concarga en paralelo

Incrementar/Cargar

MultiplexorS1S0

0 1 2 3

GND COND1 COND2 COND3

Polaridad

Figura 3.32 – Esquema de direcciones asumidas mejorado.

34

Pol. S1 S0 Función 0 0 0 Ir a la dirección de salto. 0 0 1 Saltar si la COND1 es Falso. 0 1 0 Saltar si la COND2 es Falso. 0 1 1 Saltar si la COND3 es Falso. 1 0 0 Incrementar el μPC. 1 0 1 Saltar si la COND1 es Verdadero. 1 1 0 Saltar si la COND2 es Verdadero. 1 1 1 Saltar si la COND3 es Verdadero.

Tabla 3.19 – Operación del esquema de direcciones asumidas mejorado.

La tabla de verdad de la operación de este esquema se muestra en la Tabla 3.19. Se puede observar que al agregar la compuerta XOR la funcionalidad del esquema es mayor. Por un lado los saltos condicionales pueden hacerse en función de cualquier condición de las entra-das, y por lo tanto no hace falta modificar la carta como en el caso anterior. Por otra parte, el multiplexor tiene una mejor utilización, ya que sólo habrá que usar una entrada del mismo por cada entrada de la MEF, más uno adicional para el salto incondicional o incrementar el μPC.

Figura 3.33 – Esquema de direcciones asumidas mejorado para el caso se ejemplo.

35

Para hacer la asignación de estados se procede igual que en el caso anterior, pero en este caso no es necesario modificar las casillas de decisión de la carta ASM. Por lo demás, rigen las mismas restricciones impuestas para el esquema de direcciones asumidas. En la Figura 3.34 se tiene la carta con una asignación de estados posible.

VENT

HABCNT

Q15

HABCNT

Q15

VENT

VENT

CRGLTCH

LIMPCNT

b

c

g

h

a

HABCNT

INT, HABCNTe

HABCNTd

f

000

001

010

011

100

101

110

111

Figura 3.34 – Carta ASM para el esquema de direcciones asumidas mejorado.

3.5.1 PROCEDIMIENTO PARA EL LLENADO DE LA MEMORIA

Para este caso también se explicarán en detalle algunos casos típicos. Para el estado a (ver la Fig. 3.35), se debe seleccionar la entrada VENT, por que en el campo de selección se coloca el valor 10. En este estado la MEF debe saltar si la condición es Falso, por lo que el bit de pola-ridad debe ponerse en 0. En este estado no hay ninguna salida activa, por lo que el campo de instrucciones se deja totalmente en 0. La Tabla 3.20 muestra el contenido de la memoria para el estado a.

36

VENT

a

000

HABCNTb

001

Entrada que hay que seleccionar con el campo de Selección, con Polaridad = 0.

Dirección de salto

Dirección asumida

Figura 3.35 - Determinación de los valores de los campos del estado a.

Estado A2 A1 A0 C* B* A* P S1 S0 D3 D2 D1 D0a 0 0 0 0 0 0 0 1 0 0 0 0 0

Tabla 3.20 - Llenado de la memoria para el estado a.

Figura 3.36 - Determinación de los valores de los campos del estado b.

Estado A2 A1 A0 C* B* A* P S1 S0 D3 D2 D1 D0

b 0 0 1 1 1 0 1 0 1 0 0 0 1

Tabla 3.21 - Llenado de la memoria para el estado b.

Para el estado b (ver la Fig. 3.36), se debe seleccionar la entrada Q15, por lo tanto, en el cam-po de selección se debe colocar el valor 01. En este estado la MEF debe saltar si la condición es Verdadero, por lo que el bit de polaridad debe ponerse en 1. La dirección de salto es la co-rrespondiente al estado c, y en dicho campo se debe colocar 110. En este estado se activa la salida HABCNT, por lo que se debe colocar un 1 en la columna correspondiente (D0). La Ta-bla 3.21 muestra el contenido de la memoria para el estado b.

37

Otro caso particular es el de las transiciones incondicionales. En la carta ASM del caso de ejemplo se tienen dos casos típicos. El primero es una transición incondicional con incremen-to del contador, tal como en la transición de g → h.

CRGLTCH

LIMPCNT

g

h

011

100 Dirección asumida

Colocar un 1 en la columna correspondiente a esta salida.

Figura 3.37 - Determinación de los valores de los campos del estado g.

Estado A2 A1 A0 C* B* A* P S1 S0 D3 D2 D1 D0g 0 1 1 1 0 0 1 0 0 0 1 0 0

Tabla 3.22 - Llenado de la memoria para el estado g.

En este caso se debe seleccionar la entrada GND, por lo que en el campo de selección se debe colocar 00. Como se trata de un incremento del μPC, el bit de polaridad debe ponerse en 1. En este estado se activa la salida CRGLTCH, por lo que se debe colocar un 1 en la columna co-rrespondiente (D2). El campo de la dirección de salto es un valor no especificado, pero por robustez, conviene poner la dirección del próximo estado (100). La Tabla 3.22 muestra el con-tenido de la memoria para el estado g.

Figura 3.38 - Determinación de los valores de los campos del estado e.

38

Otro caso de transición incondicional es la de e → b, pero en esta caso se debe usar una direc-ción de salto, tal como se ilustra en la Figura 3.38. En el campo de selección se debe colocar 00 para seleccionar la entrada conectada a GND y en el campo de polaridad se debe colocar un 0 para forzar la carga del contador con la dirección de salto. En este caso se activan dos salidas, INT y HABCNT, por lo que se debe colocar un 1 en las columnas correspondientes a dichas salidas (D3 y D0). La Tabla 3.23 resume el contenido de la memoria para el estado e y la Tabla 3.24 el contenido completo de la memoria para el esquema de direcciones asumidas mejorado.

Estado A2 A1 A0 C* B* A* P S1 S0 D3 D2 D1 D0e 1 1 1 0 0 1 0 0 0 1 0 0 1

Tabla 3.23 - Llenado de la memoria para el estado e.

Estado A2 A1 A0 C* B* A* P S1 S0 D3 D2 D1 D0a 0 0 0 0 0 0 0 1 0 0 0 0 0b 0 0 1 1 1 0 1 0 1 0 0 0 1 f 0 1 0 0 0 1 1 1 0 0 0 0 1 g 0 1 1 1 0 0 1 0 0 0 1 0 0 h 1 0 0 0 0 0 0 0 0 0 0 1 0 d 1 0 1 0 1 1 0 1 0 0 0 0 1 c 1 1 0 1 0 1 1 0 1 0 0 0 1 e 1 1 1 0 0 1 0 0 0 1 0 0 1

Tabla 3.24 – Contenido de la memoria para el esquema de direcciones asumidas mejorado.

En este caso la memoria requerida es de 8 x 10 = 80 bits. Se requieren algunos bits más que en el caso anterior, pero se gana mucho en funcionalidad.

3.6 ESQUEMA DE MICROPROGRAMACIÓN VERTICAL

En los esquemas basados en μPC mostrados se observa que existen al menos tres campos básicos: el campo de próximo estado, el campo de selección y el de las instrucciones de sali-da. Opcionalmente se puede agregar el campo de polaridad. Una forma de reducir el ancho de la palabra en estos esquemas es usar distintos formatos de palabra para contener dichos cam-pos básicos. Esto da lugar a lo que se denomina microprogramación vertical o de formato variable. Este esquema es particularmente útil cuando se tiene una MEF con muchas salidas, ya que al solapar el campo de instrucciones con los otros el ancho de la palabra se reduce sus-tancialmente. El diagrama de la máquina debe ser modificado de manera de agregar los estados necesarios. Se deben diferenciar los estados que producen salidas, de los que producen saltos condiciona-les o incondicionales. Se mantienen las restricciones vistas para el criterio de direcciones asumidas, es decir, únicamente se admiten una entrada por estado y salidas Moore. Además se restringe la asignación de estados, uno de los próximos estados debe tener la dirección actual más 1. Un formato puede ser el siguiente: un campo de 1 bit, denominado de formato, indica qué tipo de palabra es: si en ese campo hay un 1 es una palabra de instrucciones y si hay un 0 es una palabra de selección de la entrada y salto. La palabra que es instrucción, tendrá el resto de los

39

bits para indicar las salidas que se producen en ese estado. La palabra que es selección y salto tendrá una parte asignada a cada una de estas funciones. Cabe aclarar que también es posible implementar un formato en el que cada campo básico tenga una palabra distinta, en cuyo caso habrá que usar 2 bits para el campo de formato de la palabra y las palabras tendrán 3 formatos distintos. En esto el diseñador tiene libertad de ele-gir los formatos que más se adecuen al problema.

Listado de salidas

Formato 1Instrucciones

Al estado asumido (+1) COND

Al estado asumido (+1)

Al estado X (salto)

Formato 2Selección y salto

Figura 3.39 – Casillas de estado para el esquema de formato variable.

Supongamos que se usan sólo dos formatos distintos, tal como se muestra en la Fig. 3.39. Si bien este esquema permite ahorrar bits de la memoria, lo hace a un costo, más allá de los cir-cuitos extra que haya que agregar. Por un lado se debe modificar la carta ASM de una manera más radical. Por cada estado de la carta original en general deberán colocarse 2 estados, uno de cada formato. Hay una posible excepción a esta regla, que se explicará más adelante con el caso de ejemplo. Al haber una mayor cantidad de estados, normalmente se requerirán más variables de estados y la asignación de estados se hará más engorrosa. Otra desventaja que se tiene es que para cada estado “original” se necesitarán 2 ciclos de reloj y esto impactará en la frecuencia máxima de trabajo de la MEF. Por lo tanto, si el circuito tiene requisitos de rendi-miento muy altos se desaconseja usar este esquema y usar algunos de los otros esquemas pro-puestos. Con el esquema de dos formatos propuesto se deben introducir algunas modificaciones en el circuito. Por un lado, se debe agregar una compuerta OR a la entrada de Incrementar/Cargar el μPC, de manera de forzar un 1 en dicha entrada cada vez que se esté en un estado de instruc-ciones. Al colocar el uno se producirá siempre un incremento del contador, de manera de pa-sar al estado de selección/salto asociado a esas salidas (Formato 2). Demás está decir que la asignación de estados debe tener en cuenta esta situación, por lo que el código del estado de selección/salto deberá ser siempre el del estado de instrucciones más 1. Además, en la salida se debe agregar un cerrojo transparente manejado por el bit de formato. Debido a que los mismos bits de datos de la memoria se usan para distintas funciones, interesa retener a la salida de la MEF únicamente lo que está a la salida de la MEF cuando se está en un estado de instrucciones. Cuando la máquina se encuentra en un estado de salto/selección, se retienen las salidas del estado anterior (Formato 1) independientemente del valor que se

40

presente en la entrada del cerrojo. Para la selección de las entradas en las transiciones condi-cionales se debe usar la Tabla 3.19. En la Fig. 3.40 se muestra el esquema propuesto para al caso de ejemplo, basado en el esquema de direcciones asumidas mejorado.

PC

MEMORIA

Bit deformato

Selección

Instrucciones

Salidas

Reloj

Contador concarga en paralelo

Incrementar/Cargar

Multiplexor 4:1S1S0

0 1 2 3

GND Q15 VENTNo

Usada

1

D3 = INTD2 = CRGLTCHD1 = LIMPCNTD0 = HABCNT

0

1

Dirección de salto

Cer

rojo

Polaridad

C

D Q

1 2 4

Figura 3.40 – Esquema de formato variable para el caso de ejemplo.

En la Fig. 3.41 se muestra la carta ASM para el problema de ejemplo, adaptada a los requisi-tos de este esquema. Se puede observar que la mayoría de los estados de la carta realizada para el esquema de direcciones asumidas mejorado se ha desdoblado en dos estados. Como sólo se puede seleccionar una entrada por estado de selección/salto, las casillas de decisión que deban separarse para cumplir con esta restricción requieren sólo un estado de Formato 2. La salida correspondiente al estado del cual dependen las entradas separadas de esta manera quedará acerrojada en el cerrojo de salida hasta que se decida el próximo estado con otra sali-da válida. En total se tienen 13 estados por lo que serán necesarias 4 variables de estado para implementar esta MEF. El procedimiento para hacer la asignación de estados es similar al usado en la Sección 3.4.1.

41

De todas maneras hay algunas particularidades que remarcar. La transición de f → g es incon-dicional y con la asignación de estados realizada se tiene que el código del estado g es el del estado f más 1 (dirección asumida). En este caso no hace falta agregar un estado de Formato 2, ya que se incrementará el contador automáticamente. Sin embargo, la transición incondi-cional de g → a es igual al caso general, en el que se deberá incluir un estado extra de For-mato 2 para poder realizar el salto incondicional. Una situación similar se tiene en el estado l.

Figura 3.41 - Carta ASM para el esquema de formato variable.

3.6.1 PROCEDIMIENTO PARA EL LLENADO DE LA MEMORIA

Para este esquema también se detallará el procedimiento para llenar la memoria para casos de transiciones condicionales e incondicionales. Dado que cada estado original de la máquina se ha desdoblado casi siempre en dos estados, se procederá al llenado de la memoria consideran-do los pares de estados de Formato 1 y Formato 2. El estado a es de Formato 1, por lo que sólo se deben llenar los bits correspondientes a las salidas definidas para este estado (bits D3 ~ D0). Como ninguna de las salidas se activa, todos los bits se ponen en 0. En las palabras de Formato 1, como sólo hay definidas 4 salidas, los

42

bits rotulados con P, S1 y S0 son valores no especificados y se pueden llenar con cualquier valor, en este caso, con ceros. El estado b es el de selección y salto asociado al estado a. Al estado b se llega automática-mente porque el bit de formato en el estado a está en 1, forzando un incremento del μPC. Esto sucede siempre que se está en un estado de Formato 1. Este estado debe seleccionar la entrada VENT, por lo que en el campo de selección se coloca 10. En el campo de polaridad se debe colocar un 0 debido a que no se tiene que negar la condición de la entrada. Es decir, el estado de salto se alcanza por la condición normal de la entrada. En este caso el estado de salto es el a, por lo que en los bits D3 ~ D0 deberá colocarse su código de estado (0000). En la Tabla 3.25 se han agrisado los campos que hay que llenar en cada formato de palabra.

VENT

0000

0001

a

b

Dirección de salto para el estado b.

Dirección asumida del estado a.

Entrada que hay que seleccionar con el campo de Selección, con

Polaridad = 0.

HABCNT

0010 Dirección asumida del estado b.

Figura 3.42 - Determinación de los valores de los campos de los estados a y b.

Estado A3 A2 A1 A0 F P S1 S0 D3 D2 D1 D0 a 0 0 0 0 1 0 0 0 0 0 0 0 b 0 0 0 1 0 0 1 0 0 0 0 0

Tabla 3.25 - Llenado de la memoria para los estados a y b.

El estado c (ver la Fig. 3.43) es de instrucciones, por lo que sólo hay que colocar un 1 en la columna correspondiente a la salida HABCNT (D0). El estado d es el primer estado de selec-ción y salto asociado al estado c. En el multiplexor de entrada se debe seleccionar la entrada Q15, por lo que en el campo de selección se debe colocar 01. En este caso el bit de polaridad debe ir en 1, debido a que en la carta ASM la dirección de salto se alcanza por el camino de la entrada directa (saltar si Q15 es Verdadero). Por lo tanto, para que se pueda cargar la direc-ción de salto en el contador se debe negar la entrada. En el campo de la dirección de salto se debe colocar el código del estado j (1001). El estado e es el segundo estado de selección y salto asociado al estado c. En este caso se debe saltar si la condición de VENT es Falso. Por ello, el bit de polaridad debe ir en 0. El campo de selección debe ponerse en 10 para elegir VENT, y la dirección de salto es la correspondiente al estado c (0010). Como se puede observar, en este caso quedan dos estados de selección y sal-to contiguos. La salida HABCNT permanece acerrojada con en valor presente en el estado 1, mientras se termina de decidir cuál es el próximo estado en base a la condición de las dos en-tradas consultadas en forma sucesiva en los estados d y e.

43

Figura 3.43 - Determinación de los valores de los campos de los estados c y d.

Estado A3 A2 A1 A0 F P S1 S0 D3 D2 D1 D0

c 0 0 1 0 1 0 0 0 0 0 0 1 d 0 0 1 1 0 1 0 1 1 0 0 1 e 0 1 0 0 0 0 1 0 0 0 1 0

Tabla 3.26 - Llenado de la memoria para los estados c, d y e.

El estado f es un caso particular (ver la Fig. 3.44). En este caso la transición de f → g es in-condicional y el estado g tiene asignado un código de estado que es el de f más 1. En este caso no hace falta agregar un estado de Formato 2, ya que la dirección asumida se alcanza por las características del cableado del circuito. En el estado f el bit de formato está en 1, y como esa línea de dato está conectada a la compuerta O que maneja la entrada de Incrementar/Cargar del contador, se forzará un incremento del μPC. Por lo tanto, en este caso sólo hay que llenar el campo de instrucciones, poniendo un 1 en la columna correspondiente a CRGLTCH (D2).

Figura 3.44 - Determinación de los valores de los campos del estado f.

44

Estado A3 A2 A1 A0 F P S1 S0 D3 D2 D1 D0 f 0 1 0 1 1 0 0 0 0 1 0 0

Tabla 3.27 - Llenado de la memoria para el estado f.

HABCNT, INT

1011

1100

l

m

HABCNTc

0010

Colocar un 1 en la columna correspondiente a estas salidas.

Dirección asumida del estado l.

Dirección de salto del estado m.

Figura 3.45 - Determinación de los valores de los campos de los estados l y m.

Estado A3 A2 A1 A0 F P S1 S0 D3 D2 D1 D0 l 1 0 1 1 1 0 0 0 1 0 0 1 m 1 1 0 0 0 0 0 0 0 0 1 0

Tabla 3.28 - Llenado de la memoria para los estados l y m.

El estado l requiere una transición incondicional al estado c, pero con una dirección de salto (ver la Fig. 3.45). Por lo tanto, en el estado l se debe colocar un 1 en las columnas correspon-dientes a las salidas INT (D3) y HABCNT (D1). Para poder realizar el salto incondicional se agrega el estado m de Formato 2, cuyos campos se deben llenar de la siguiente manera. Con el campo de selección se debe seleccionar la entrada conectada a GND, colocando el valor 00. El bit de polaridad debe ponerse en 0 para transferir un 0 a la entrada Incrementar/Cargar del contador y forzar un salto. Por último, en el campo de la dirección de salto se carga el código del estado c (0010). Como en otros casos, para mejorar la robustez de la MEF a los estados no usados conviene definirlos como de Formato 2, con un salto incondicional al estado de inicio. Esto no implica ningún costo extra. La Tabla 3.29 resume el contenido de la memoria para el esquema de formato variable para el caso de ejemplo. La memoria requerida es de 8 x 13 = 104 bits. Se observa que se requieren más bits que en el caso de direcciones asumidas, pero el ancho de la memoria es menor. En este caso el diseño entraría en un solo chip de una memoria comercial.

45

Estado A3 A2 A1 A0 F P S1 S0 D3 D2 D1 D0

a 0 0 0 0 1 0 0 0 0 0 0 0 b 0 0 0 1 0 0 1 0 0 0 0 0 c 0 0 1 0 1 0 0 0 0 0 0 1 d 0 0 1 1 0 1 0 1 1 0 0 1 e 0 1 0 0 0 0 1 0 0 0 1 0 f 0 1 0 1 1 0 0 0 0 1 0 0 g 0 1 1 0 1 0 0 0 0 0 1 0 h 0 1 1 1 0 0 0 0 0 0 0 0 i 1 0 0 0 0 1 1 0 0 1 0 1 j 1 0 0 1 1 0 0 0 0 0 0 1 k 1 0 1 0 0 1 0 1 1 0 0 0 l 1 0 1 1 1 0 0 0 1 0 0 1 m 1 1 0 0 0 0 0 0 0 0 1 0 - 1 1 0 1 0 0 0 0 0 0 0 0 - 1 1 1 0 0 0 0 0 0 0 0 0 - 1 1 1 1 0 0 0 0 0 0 0 0

Tabla 3.29 – Contenido de la memoria para el esquema de formato variable.

3.7 ESQUEMA COMBINADO “PASOS DE ENLACE” + “PARES ESTADO-ENTRADA”.

Para el problema de ejemplo también se puede plantear un esquema combinado entre el direc-cionamiento por Pasos de Enlace y el de Pares Estado-Entrada. Este esquema permite imple-mentar máquinas de cualquier tipo (Moore y Mealy), con la ventaja de tener un mejor aprove-chamiento de la memoria con respecto al primero de los esquemas. Para el problema de ejem-plo, conviene conectar a una entrada de dirección de memoria la entrada Q15, ya que la única salida Mealy (INT) depende de esa entrada. Para el resto de las transiciones, se puede usar un esquema con multiplexor horizontal, similar al usado en el esquema de Pares Estado/Entrada. El esquema combinado en este caso funciona como un esquema de 4 vías, pero con menor ancho de la palabra y admitiendo salidas Mealy. El esquema planteado se puede ver en la Fi-gura 3.46. En este caso, por tener la MEF sólo 2 entradas, no se necesita modificar la carta ASM, aún cuando en otros casos podría ser necesaria alguna modificación de la misma. Por ejemplo, si una MEF tiene 3 entradas y se usa un multiplexor vertical de entrada para dos de ellas, habrá que separar con estados las casillas de decisión que contengan las dos entradas que van al multiplexor, esto si es que aparecen juntas en un determinado estado de la máquina. Para el caso de ejemplo se usan las líneas de dirección A3, A2 y A1 para el estado presente, correspondientes a las variables de estado C, B y A respectivamente. La línea de dirección A0 se usa para la entrada Q15. La entrada VENT se utiliza para la selección del próximo estado por 0 ó por 1, sin necesidad de un multiplexor vertical de entrada (se conecta directamente al multiplexor horizontal). El campo de próximo estado utiliza 6 bits, separados en dos campos de 3 bits cada uno, y se define así: D9 = C*0, D8 = B*0, D7 = A*0 D6 = C*1, D5 = B*1 y

46

D4 = A*1. El campo de instrucciones o salidas se define como en los casos ya vistos: D3 = INT, D2 = CRGLTCH, D1 = LMPCNT y D0 = HABCNT.

Pxmo. Est.0

Pxmo. Est.1 Instrucciones

MEMORIA

Registro cauce

Salidas

Reloj

Multiplexor 2:10 1VENT

Q15

3 3 4

D3 = INTD2 = CRGLTCHD1 = LIMPCNTD0 = HABCNT

Fig. 3.46 – Esquema combinado “Pasos de Enlace” + “Pares Estado-Entrada”

3.7.1 PROCEDIMIENTO PARA EL LLENADO DE LA MEMORIA

En este caso particular, a cada estado le corresponden dos palabras de la memoria, las que quedan en forma consecutiva por la forma en que se conectó la entrada Q15 (al bit menos significativo de la dirección).

Fig. 3.47 - Determinación de los valores de los campos del estado a. El próximo estado del estado a (ver la Fig. 3.47) queda determinado sólo por la entrada VENT. Como en la transición no se ve involucrada la entrada Q15, en la memoria habrá que repetir la misma información en las dos filas correspondientes al estado a. En cada fila habrá

47

que colocar el valor 000 en el campo correspondiente al próximo estado por 0 de la casilla de decisión y 001 en el campo correspondiente al próximo estado por 1 de la misma.

Estado A3 A2 A1 A0 C*0 B*0 A*0 C*1 B*1 A*1 D3 D2 D1 D0a 0 0 0 0 0 0 0 0 0 1 0 0 0 0a 0 0 0 1 0 0 0 0 0 1 0 0 0 0

Tabla 3.30 – Llenado de la memoria para el estado a.

El estado b tiene definido 3 próximos estados: b, c y d (ver la Fig. 3.48). La primera fila de este estado, con la dirección 0010, corresponde a las transiciones b → b y b → d. El campo correspondiente al próximo estado por 0 se debe llenar con 011 (estado d) y el campo corres-pondiente al próximo estado por 1 con 001 (estado b). La segunda fila de este estado, con la dirección 0011, corresponde a la transición b → c. Esta transición sólo depende de la entrada Q15, por lo que los dos campos correspondientes al próximo estado por 0 y por 1 tendrán el mismo valor, 010. En este estado sólo está activa la salida HABCNT, y por lo tanto se debe colocar un 1 en la columna correspondiente a esta salida (D0).

HABCNT

Q15

HABCNT VENT

CRGLTCH

b

001

010

011

c

d

Dirección 0011 Dirección 0010

Valor a colocar en elcampo de próximoestado si la entrada

VENT vale 0.

Valor a colocar en elcampo de próximoestado si la entrada

VENT vale 1.

Valor a colocar enlos dos campos de

próximo estado.

Colocar un 1 enla columna

correspondientea esta salida.

Figura 3.48 – Determinación de los valores de los campos del estado b.

Estado A3 A2 A1 A0 C*0 B*0 A*0 C*1 B*1 A*1 D3 D2 D1 D0

b 0 0 1 0 0 1 1 0 0 1 0 0 0 1b 0 0 1 1 0 1 0 0 1 0 0 0 0 1

Tabla 3.31 – Llenado de la memoria para el estado b.

El estado c también tiene definidos 3 próximos estados y tiene una salida Mealy (INT) y una Moore (HABCNT) (ver la Fig. 3.49). La primera fila de este estado define la transición c → b, y le corresponde la dirección de memoria 0100. Como por este camino no interviene la entrada VENT, se repite el mismo valor (001) para los dos campos de próximo estado. La se-gunda fila de este estado, con la dirección 0101, define las transiciones c → c y c → d. El

48

campo correspondiente al próximo estado por 0 se debe llenar con 011 (estado d) y el campo correspondiente al próximo estado por 1 con 010 (estado c). El campo de instrucciones debe tener un 1 en las dos filas de este estado para la columna correspondiente a HABCNT (D0), por ser una salida Moore. Sin embrago, la salida INT (D3), que es Mealy, sólo debe activarse en este estado si Q15 vale 0, es decir en la fila correspondiente a la dirección 0100. Aquí es donde se ve la ventaja de este esquema combinado.

HABCNT

Q15

HABCNT

Q15

VENTINT

VENT

CRGLTCH

b

c

d

001

010

011

Dirección 0100

Dirección 0101

Valor a colocar enlos dos campos de

próximo estado.

Valor a colocar en elcampo de próximoestado si la entrada

VENT vale 0.

Valor a colocar en elcampo de próximoestado si la entrada

VENT vale 1.

Colocar un 1 en la columna correspondiente a esta

salida en las dos direcciones usadas para el estado c.

Colocar un 1 en la columna correspondiente a esta salida

sólo en la dirección 0100.

Figura 3.49 – Determinación de los valores de los campos del estado b.

Estado A3 A2 A1 A0 C*0 B*0 A*0 C*1 B*1 A*1 D3 D2 D1 D0

c 0 1 0 0 0 0 1 0 0 1 1 0 0 1c 0 1 0 1 0 1 1 0 1 0 0 0 0 1

Tabla 3.32 – Llenado de la memoria para el estado c.

Los otros dos estados (d y e) no presentan mayor dificultad, por tener transiciones incondicio-nales. En ambos casos los campos de próximo estado deben llenarse con el mismo valor en las 2 filas correspondientes a dichos estados. Los estados no usados conviene apuntarlos al estado inicial para darle más robustez al diseño. La Tabla 3.33 muestra el contenido de la memoria para este caso de esquemas combinados. Se utilizan 10 x 10 = 100 bits de la memoria para su implementación. Este valor se encuentra en un valor intermedio entre los 140 bits utilizados en el esquema de Pasos de Enlace, y los 88 utilizados en el esquema de Pares Estado-Entrada.

49

Como se puede observar, la penalización por la utilización de una salida Mealy en este caso no es muy severa (sólo 12 bits más).

Estado A3 A2 A1 A0 C*0 B*0 A*0 C*1 B*1 A*1 D3 D2 D1 D0a 0 0 0 0 0 0 0 0 0 1 0 0 0 0a 0 0 0 1 0 0 0 0 0 1 0 0 0 0 b 0 0 1 0 0 1 1 0 0 1 0 0 0 1b 0 0 1 1 0 1 0 0 1 0 0 0 0 1 c 0 1 0 0 0 0 1 0 0 1 1 0 0 1c 0 1 0 1 0 1 1 0 1 0 0 0 0 1 d 0 1 1 0 1 0 0 1 0 0 0 1 0 0d 0 1 1 1 1 0 0 1 0 0 0 1 0 0 e 1 0 0 0 0 0 0 0 0 0 0 0 1 0e 1 0 0 1 0 0 0 0 0 0 0 0 1 0 - 1 0 1 0 0 0 0 0 0 0 0 0 0 0- 1 0 1 1 0 0 0 0 0 0 0 0 0 0 - 1 1 0 0 0 0 0 0 0 0 0 0 0 0- 1 1 0 1 0 0 0 0 0 0 0 0 0 0 - 1 1 1 0 0 0 0 0 0 0 0 0 0 0- 1 1 1 1 0 0 0 0 0 0 0 0 0 0

Tabla 3.33 – Contenido de la memoria para el esquema combinado “Pasos de Enlace” +

“Pares Estado-Entrada”.

3.8 CODIFICACIÓN DE LAS SALIDAS

Es posible lograr una reducción en la cantidad de bits necesarios para el campo de las instruc-ciones o salidas combinando o codificando algunas de ellas. Las salidas que son equivalentes se pueden combinar dejando una sola columna para representarlas. Dos o más salidas son equivalentes si se activan en los mismos estados. Esto resulta más o menos evidente cuando se tiene terminada la carta ASM, pero en la fase de definición del problema no siempre es fácil detectarlo, especialmente si se trata de una MEF con muchas salidas. Por otra parte, las salidas que son complementarias pueden obtenerse mediante el uso de in-versores. Esto también puede observarse en la misma carta ASM o bien en el contenido de la memoria, por simple inspección.

50

Figura 3.50 – Esquema de direcciones asumidas mejorado con salidas codificadas.

Por último, las salidas que son excluyentes entre sí se pueden codificar en un número menor de bits, obteniéndose las mismas mediante el uso de un decodificador o bien con un circuito combinacional adecuado. En el caso de que se utilice un decodificador, debe reservarse una combinación para el caso en que ninguna de las salidas del mismo esté activa. En algunos casos, el decodificador dispone de un terminal para colocar todas las salidas en 0, en cuyo caso puede usarse un bit de la ROM para este fin, pero habrá que analizar la conveniencia o no de usarlo. Para el caso de ejemplo, podemos lograr una reducción en el ancho de la palabra usando un decodificador para las salidas CRGLTCH, LMPCNT e INT, ya que nunca se activan simultá-neamente. En la Tabla 3.34 se tiene una codificación posible de dichas salidas. La salida HABCNT se activa en varios estados y en uno de ellos junto con la salida INT, por lo tanto conviene reservar un bit exclusivo para ella. Como ejemplo de codificación de las salidas se tomará el esquema de direcciones asumidas mejorado, que se muestra en la Fig. 3.50. La pa-labra ahora se conforma así: 3 bits para la dirección de salto, 1 bit de polaridad, 2 bits para seleccionar la entrada, 2 bits para codificar las 3 salidas mencionadas arriba (D2 y D1) y 1 bit para la salida HABCNT (D0).

51

Salida Código

D2 D1

No usada 0 0

LMPCNT 0 1

CRGLTCH 1 0

INT 1 1

Tabla 3.34 – Código de las salidas.

Estado A2 A1 A0 C* B* A* P S1 S0 D2 D1 D0 a 0 0 0 0 0 0 0 1 0 0 0 0 b 0 0 1 1 1 0 1 0 1 0 0 1 f 0 1 0 0 0 1 1 1 0 0 0 1 g 0 1 1 1 0 0 1 0 0 1 0 0 h 1 0 0 0 0 0 0 0 0 0 1 0 d 1 0 1 0 1 1 0 1 0 0 0 1 c 1 1 0 1 0 1 1 0 1 0 0 1 e 1 1 1 0 0 1 0 0 0 1 1 1

Tabla 3.35 - Contenido de la memoria para el esquema con salidas codificadas.

La Tabla 3.35 resume el contenido de la memoria para el esquema de direcciones asumidas mejorado con salidas codificadas. La carta ASM correspondiente es la mostrada en la Fig. 3.34. La memoria requerida para este caso es de 8 x 9 = 72 bits. En el caso de ejemplo la codificación de las salidas permite ahorrar solo un bit de la memoria, pero en casos más complejos, como puede ser la MEF de la unidad de control de un micro-procesador, la reducción en el ancho de la palabra puede ser considerablemente mayor (ver el Cap. 12 de la referencia bibliográfica 3). Si bien como ejemplo se ha aplicado a este esquema, la codificación de las salidas se puede realizar en cualquiera de los esquemas planteados. El precio a pagar por tener una memoria más angosta es el(los) decodificador(es) que habría que agregar para decodificar las salidas que hayan sido codificadas. En el esquema de micropro-gramación vertical, el decodificador debe colocarse después del cerrojo utilizado para retener las salidas cuando se está en un estado de Formato 2.

3.8 SOLAPADO DE LA BÚSQUEDA DE MICROINSTRUCCIONES

Es posible mejorar el rendimiento de una unidad de control solapando la búsqueda de la próxima microinstrucción con la ejecución de la actual. Las instrucciones o salidas de la MEF deben mantenerse activas durante un cierto tiempo, que viene fijado por el tiempo que lleva ejecutar o realizar lo que esa salida indica. Por ejemplo, una combinación de salidas de la MEF puede indicarle a una RALU (Unidad Aritmético Lógica con Registros) que realice una operación relativamente compleja como puede ser una suma y una multiplicación simultánea, mientras que otra puede ser tan simple como cargar un registro. En general la máxima fre-cuencia de trabajo de la MEF queda fijada por el peor caso en los tiempos de ejecución de las instrucciones de salida. Al tiempo de ejecución de esa tarea se le debe sumar el tiempo de acceso de la memoria que contiene el microprograma, los retardos propios de los circuitos usados para la determinación del próximo estado (dependiendo del esquema de microprogra-

52

mación utilizado), y el tiempo de establecimiento de los flip-flops que conforman el registro cauce. La idea subyacente es independizar de alguna manera los retardos de propagación propios de la MEF de los retardos de los circuitos manejados por ella. Para lograr este objetivo se utiliza un registro conectado a la salida de la memoria, que se usa para mantener la microinstrucción actualmente en ejecución (ver la Fig. 3.51). En lugar de utilizar un contador con carga en pa-ralelo, se utiliza una estructura compuesta de un registro, un incrementador y un multiplexor. El incrementador se puede implementar utilizando un sumador total de n bits con un 1 en una de las entradas y la dirección actual en la otra. De esta manera, con cada flanco del reloj se tiene siempre disponible la dirección asumida en una de las entradas del multiplexor de direc-ciones y la dirección de salto en la otra. La entrada seleccionada por el multiplexor de condi-ción es la que decide cuál de las dos se usa. Como puede observarse, mientras se está ejecutando la microinstrucción presente, se está aplicando la dirección de la próxima en las líneas de dirección de la memoria, independiente-mente de si se trata una carga o un incremento. Este proceso independiza el tiempo de búsqueda de la próxima microinstrucción del tiempo de ejecución de la presente. Por lo tanto, el período del reloj queda fijado por uno de los dos tiempos (el mayor de los dos) y no por la suma de ambos. En lo que respecta al llenado de la memoria, el procedimiento a seguir en este caso es el mis-mo al utilizado en el esquema de direcciones asumidas mejorado. La selección de las entradas es igual a ese esquema y se debe usar la Tabla 3.19. Lo que se trata en esta sección entra dentro de lo que se llaman mecanismos de aceleración, que se usan para incrementar el rendimiento de un sistema de cómputo. Entre ellos se pueden mencionar la prebúsqueda de instrucciones, el uso de memorias caché para instrucciones y datos, la segmentación de la CPU, el uso de TLBs (Translation Lookaside Buffers) para las direcciones, la ejecución especulativa, la repetición de unidades funcionales, etc.

53

MEMORIA

Dirección de Salto Selección Instrucciones

Salidas

Reloj

Multiplexor de CondiciónS1S0

0 1 2 3

GND COND1 COND2 COND3

Registro Cauce (o Pipeline)

Multiplexorde Direcciones

0 1 Registro deDirecciones Asumidas

Incrementador(Dir. Actual +1)

Polaridad

Figura 3.51 - Esquema con solapado de la búsqueda de microinstrucciones.

En la organización de una computadora, el solapado de la búsqueda de microinstrucciones a nivel de la unidad de control de una CPU es muy similar a la prebúsqueda de instrucciones (instruction prefectch) en el nivel superior, de ejecución de macroinstrucciones. A ese nivel lo que se hace es colocar un circuito que busca otra instrucción de máquina mientras se está eje-cutando la presente, en base a lo que se denomina principio de localidad de la referencia, que dice que hay una alta probabilidad de que la próxima instrucción a ser ejecutada es la que si-gue en orden secuencial en la memoria. La única diferencia con este planteo a nivel de micro-programa es que en el nivel superior, la instrucción que se prebusca no siempre se ejecuta. Esto sucede cuando la instrucción que se está ejecutando es un salto o ramificación. El princi-pio de localidad de la referencia también se usa en las memorias caché, pero con un criterio más amplio (temporal y espacial).

54

4. CONCLUSIONES En este trabajo se han expuesto distintos esquemas básicos de la estructura de una MEF mi-croprogramada. Como se ha mostrado con un caso de ejemplo bastante sencillo, el microcódi-go (o firmware) puede resultar de longitudes y anchos diferentes. En general se puede decir que mientras más horizontal es el microprograma, más paralelismo se puede lograr con la unidad de control. La cantidad de microinstrucciones necesarias para ejecutar una tarea resulta de esta manera menor. Por el contrario, si el microprograma se hace más vertical, se tienen menos bits por palabra haciendo el diseño más económico, pero hacen falta más microinstruc-ciones para realizar la misma tarea. La velocidad y el rendimiento del sistema es menor. Por lo tanto, se deberá buscar un equilibrio (o “compromiso”, denominado en inglés trade-off) entre el costo del sistema y su rendimiento, de manera de optimizar cada una de las variables del problema. La utilización de un esquema u otro es una cuestión de criterio del diseñador, en función del objetivo general de la aplicación. Demás está decir que los mostrados son sólo algunos esquemas posibles, pero no los únicos. Existen otros esquemas que se tratan en bi-bliografía más específica usada en cursos avanzados. Aquí sólo se tratan de explicar las ideas básicas y plantear algunas soluciones. Además de las memorias ROM de todo tipo que existen (ROM por máscara, PROM, EPROM, EEPROM), en la actualidad se dispone de una amplia gama de dispositivos lógicos programables (SPLDs, CPLDs, FPGAs, etc.) que permiten implementar prácticamente cual-quier MEF, por compleja que sea, en un solo chip. La evolución tecnológica hacia dispositi-vos programables cada vez más complejos ha ido modificando los criterios de decisión con respecto a la conveniencia o no de usar técnicas de microprogramación para implementar una MEF. A esto se suma la facilidad con la que ahora se pueden realizar diseños sumamente complejos utilizando lenguajes de descripción de hardware, como VHDL, ABEL o Verilog, que luego se pueden implementar en un dispositivo programable o bien en un chip a medida ASIC. De todas maneras las técnicas de microprogramación se siguen utilizando en el diseño de mi-croprocesadores complejos, principalmente para realizar la unidad de control de los mismos. Así, con relación a la lógica cableada, la microprogramación tiene las siguientes ventajas y desventajas: Ventajas:

• El diseño es más ordenado y uniforme. • Los cambios y ampliaciones en el sistema son fáciles de realizar, sin tener que modifi-

car el cableado. • Para sistemas muy complejos, el costo es menor. • Resulta más apropiado para diseños con VLSI. • Las posibilidades de diagnóstico y detección de fallas son mejores. • El sistema es más confiable. • En las computadoras y microprocesadores:

El diseño de la unidad de control es sistemático. Facilidad de implementar una familia de computadoras con código compatible. Capacidad para emular otras computadoras (para la compatibilidad hacia atrás). Bajos costos marginales para agregar funciones.

55

Desventajas:

• En sistemas simples, el costo puede ser mayor. • Con ciertos esquemas el sistema puede resultar más lento debido a los tiempos de ac-

ceso de la memoria. • Los diseños son más fáciles de copiar. • En las computadoras se agrega otro nivel de interpretación con la sobrecarga asociada. • Herramientas de soporte limitadas.

Algo difícil de determinar es el punto en el cual un diseño pasa a ser antieconómico si se lo implementa con ROM. El costo por bit se incrementa a medida que el tamaño de la memoria se hace más chico. En algún punto, estimativamente en máquinas de 10 a 20 estados, el costo de la lógica cableada pasa a ser inferior que el de la lógica programada, aunque esa cifra ha ido variando mucho con la evolución tecnológica. En cada caso corresponde hacer un estudio técnico-económico para encontrar la solución óptima. Se puede llegar a encontrar un ancho de palabra que optimice el costo y la velocidad de fun-cionamiento del circuito. Una ROM organizada con una palabra por estado del algoritmo de control tiene el menor número de estados para dicho algoritmo, y para una frecuencia deter-minada del reloj, se tendrá la máxima velocidad de funcionamiento. Si se restringe el ancho de la palabra, el número de estados, y por lo tanto de microinstrucciones, se incrementará, con lo que la velocidad del sistema será menor. El costo de una ROM es, en general, una función de su capacidad en bits, por lo que el producto de la cantidad de palabras por el ancho de la palabra da una idea del funcional de costo del sistema a optimizar. Si se logra minimizar este valor, se tendrá en general el menor costo, con algún sacrificio en la velocidad de la MEF. Si bien este trabajo tiene como finalidad principal explicar cómo se implementa una MEF con las técnicas de microprogramación, hay otras conclusiones que también se pueden sacar del mismo. Por un lado, de todo lo expuesto se puede inferir que hay muchas formas de realizar lo mismo. Unas son más rápidas y costosas, otras más lentas y baratas y este concepto se extien-de a todo un sistema de cómputo. De ahí que este tema apunta a desarrollar los criterios de costo/rendimiento muy extendidos en todos los campos de la ingeniería. Como se puede ob-servar, encontrar el diseño óptimo puede llevar varios intentos. Otro aspecto a considerar es el de saber dónde se aplican fundamentalmente las MEF en la actualidad. Desde la aparición del microprocesador en los 70, su uso se ha difundido de tal forma que prácticamente se los usa en todos los aspectos de la vida cotidiana. Esto se ha visto favorecido por la gran diversidad de microprocesadores que existen. Actualmente se da que prácticamente hay uno específico para cada aplicación y algunos de ellos son muy baratos. Así, cabe preguntarse para qué ver este tema con cierta profundidad, siendo que para casi todo ya se justifica sobradamente el uso de un microprocesador. Casualmente como su uso está tan difundido, se hace necesario conocer en detalle cómo fun-cionan internamente, más que nada para sacar el máximo de provecho de los mismos. Como ya se dijo, la principal utilización de las técnicas de microprogramación es en la implementa-ción de la unidad de control de un microprocesador, particularmente de los denominados CISC (Complex Instruction Set Computer). Se hace esta aclaración ya que los microprocesa-dores RISC (Reduced Instruction Set Computer) suelen tenerla cableada por cuestiones de velocidad. Pero esa discusión se deja para cursos más avanzados.

56

A lo largo del curso se han visto prácticamente todos los elementos básicos que se encuentran en un microprocesador: registros, contadores, registros de desplazamiento, memorias ROM y RAM, decodificadores, mutliplexores, etc. El corazón de un microprocesador es su unidad de control, que como ya se dijo, es una MEF. Es la que hace que todos esos componentes en conjunto tengan una funcionalidad muy superior a la de sus componentes aislados. Es la res-ponsable de activar todas las señales que permiten traer instrucciones de memoria, mover los datos a través de las unidades funcionales y llevar los resultados a memoria principal. Y de ahí la importancia de verla con un cierto grado de detalle. Se entiende que en la medida que todo esto se conozca en profundidad, se facilitará la comprensión del curso que sigue, centra-do en la programación de un microprocesador a bajo nivel.

5. LECTURA ADICIONAL Como referencia básica se usó el libro de Christopher Clare, Desinging Logic Systems Using State Machines [1]. En el Capítulo V se puede encontrar el desarrollo de una MEF que im-plementa un juego de Black Jack, pero con menos esquemas a los planteados en este trabajo. En el Capítulo 12 del libro de Randy H. Katz, Contemporary Logic Design [3] se describe la implementación completa de la unidad de control de un microprocesador simple usando es-quemas de microprogramación horizontal y vertical. Resulta interesante el esquema de micro-programación vertical propuesto. Los esquemas más avanzados se han tomado del Capítulo 4 del libro de Michel A. Lynch, Microprogrammed State Machine Design [2]. Este libro descri-be con bastante detalle la tecnología rebanada de bits (bit slice) que se popularizó en los ’80, pero que ahora ha quedado demodé con la introducción de los dispositivos programables avanzados, especialmente los FPGA, y los lenguajes de descripción de hardware.

6. BIBLIOGRAFÍA 1. Clare, Christopher R.- Desinging Logic Systems Using State Machines, McGraw-Hill,

1973. 2. Lynch, Michel A. – Microprogrammed State Machine Design, CRC Press, 1993. 3. Katz, Randy H. – Contemporary Logic Design, Benjamin Cummings/Addison Wesley

Publishing Company, 1993. 4. Assandri, A. D – Procesadores Digitales de Alta Velocidad, Publicación Interna INAUT,

1989.