Microprogramación - Departamento de Electrónica y Automática

Anuncio
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. 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 control 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 microprogramació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.
1
Entradas
Lógica de Control del
Contador
Lógica del Estado de Salto
Limpiar
Cargar
Registro de Estado
Contador Sincrónico
Contar
Reloj
Lógica de Salida
Salidas
Figura 1.2 – Implementación de una MEF con un contador de salto.
E1
A0
D0
S1
E2
A1
D1
S2
D2
S3
Q
A2
D3
S4
D4
S5
Entradas
D
X0
D
Q
A3
Q
A4
X1
Salidas
PROM
D5
D
X2
D6
Próximo
Estado
D7
D
Q
A5
D8
X3
Reloj
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 ampliamente utilizado para el diseño de la mayor parte de las computadoras y controladores de periféricos hasta la aparición del microprocesador. Un microprocesador, a su vez, es una máquina 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 camino 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-
2
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 microassembler, se parece bastante.
2. ESTUDIO DE CASO
A continuación se describe el funcionamiento de un sistema digital simple que se tomará como 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 solidaria 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 microprocesador, 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 capacidad 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 veces 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 descripció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 accionando sobre las entradas de limpiar (clear) de los flip-flops que conforman el registro de estado, 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 contador 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 estado 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.
3
BUS DE DATOS DEL
MICROPROCESADOR
LATCH
Pulsos
CONTADOR
Q15
VENT
CONTROL
HABCNT
LIMPCNT
CRGLTCH
INT
Figura 2.1 – Diagrama en bloques del sistema de ejemplo.
Figura 2.2 – Descripción del sistema mediante una carta ASM.
4
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 contador 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 interrupció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 alcanzar 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 microprocesador, 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 memorias 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 pasos 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 instrucciones 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.
5
Direcciones
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.
Contador
El esquema más simple que se puede configurar es el conformado por una memoria y un contador 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
Figura 3.2 – Esquema de secuenciador con un contador y memoria.
6
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 cualquier 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 estados. Este esquema permite implementar cualquier tipo de MEF (Moore o Mealy) sin necesidad 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 diagrama de estados, es decir cada línea que lleva de un estado a otro, tiene asignado, al menos, una
7
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
0011
0011
Valor de la
Entrada E1
0
1
Campo de
Próximo Estado
0101
0100
Paso de
enlace
a→b
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
0010
0010
Valor de la
Entrada E1
0
1
Campo de
Próximo Estado
0011
0011
Paso de
enlace
d→e
d→e
Tabla 3.2 – Llenado del campo de próximo estado
para las transiciones incondicionales.
8
Un aspecto en el que hay que tener especial cuidado es con el llenado del campo correspondiente 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 (salidas Mealy). Por lo tanto, para las salidas Moore se debe colocar un 1 en la columna correspondiente 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.
Q15
VENT
MEMORIA
3
4
Próximo estado
Instrucciones
Salidas
Registro cauce
C
B
A
Reloj
Variables
de estado
D3 = INT
D2 = CRGLTCH
D1 = LIMPCNT
D0 = HABCNT
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íneas 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 direcció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 campo 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.
9
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
0
1
2
3
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
1
0
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
0
0
0
0
Paso de
enlace
a→a
a→a
a→b
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 asignar 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 ocupa las direcciones 00010 y 00011, colocándose en el campo de próximo estado de ambas direcciones 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 mencionadas 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 depende de la entrada Q15, por lo que ese paso de enlace tiene asignado 2 direcciones de memoria, 00101 y 00111, que se corresponden con los valores 0 y 1 de VENT. Las otras dos transiciones tienen asignadas una dirección de memoria cada una, ya que dependen de las dos entradas 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-
10
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
4
5
6
7
0
0
0
0
0
0
0
0
1
1
1
1
0
0
1
1
0
1
0
1
0
0
0
0
1
1
0
1
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
Paso de
enlace
b→d
b→c
b→b
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 corresponde 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 tambié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.
11
Figura 3.9 – Pasos de enlace del estado c.
Dir.
A4
A3
A2
A1
A0
D6
D5
D4
D3
D2
D1
D0
8
9
10
11
0
0
0
0
1
1
1
1
0
0
0
0
0
0
1
1
0
1
0
1
0
0
0
0
0
1
0
1
1
1
1
0
1
0
1
0
0
0
0
0
0
0
0
0
1
1
1
1
Paso de
enlace
c→b
c→d
c→b
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 desperdicio 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.
12
Figura 3.10 – Pasos de enlace del estado d.
Dir.
A4
A3
A2
A1
A0
D6
D5
D4
D3
D2
D1
D0
12
13
14
15
0
0
0
0
1
1
1
1
1
1
1
1
0
0
1
1
0
1
0
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
0
0
0
0
0
0
0
0
Paso de
enlace
d→e
d→e
d→e
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 2 p 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.
13
Dir.
A4
A3
A2
A1
A0
D6
D5
D4
D3
D2
D1
D0
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
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
0
0
0
0
0
0
0
0
0
0
1
1
0
1
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
0
1
0
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
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
0
0
0
0
0
0
0
0
0
0
0
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
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Paso de
enlace
a→a
a→a
a→b
a→b
b→d
b→c
b→b
b→c
c→b
c→d
c→b
c→c
d→e
d→e
d→e
d→e
e→a
e→a
e→a
e→a
No esp.
No esp.
No esp.
No esp.
No esp.
No esp.
No esp.
No esp.
No esp.
No esp.
No esp.
No esp.
Definición de
las variables
A4 = C
A3 = B
A2 = A
A1 = VENT
A0 = Q15
D6 = C*
D5 = B*
D4 = A*
D3 = INT
D2 = CRGLTCH
D1 = LMPCNT
D0 = HABCNT
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 Mealy) y a una sola entrada afectando a cada estado. El formato de la ROM se modifica agregando un campo para seleccionar una entrada de la máquina mediante un multiplexor, y en función del valor que esa entrada tenga se seleccionará mediante otro multiplexor (llamado horizontal) 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 configuració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 direccionamiento por pasos de enlace. Se necesitará sólo una dirección de memoria por cada
14
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 microprogramació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 deben agregar estados en las transiciones que dependen de más de una entrada, ya que este esquema 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 algoritmo verbal definido para la MEF. Como en el lazo formado por los estados b y c se debe mantener 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.
15
000
a
VENT
001
b
HABCNT
Q15
010
c
101
f
HABCNT
Q15
011
e
INT, HABCNT
HABCNT
VENT
100
d
HABCNT
110
g
CRGLTCH
111
VENT
h
LIMPCNT
Figura 3.12 – Carta modificada para el esquema de 2 Vías.
16
Dirección
MEMORIA
1
Selección
3
3
3
Pxmo. Est. Pxmo. Est.
0
1
4
Instr.
0
Q15
1
Mux 2:1
Salidas
VENT
0
D3 = INT
D2 = CRGLTCH
D1 = LIMPCNT
D0 = HABCNT
1
Multiplexor 2:1
Registro cauce
Reloj
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 estados 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
a
A2
0
A1
0
A0
0
S
0
C*0 B*0 A*0 C*1 B*1 A*1 D3
0
0
0
0
0
1
0
D2
0
D1
0
D0
0
Tabla 3.8 – Llenado de la memoria para el estado a.
17
Para el estado a (ver la Fig. 3.14), se debe seleccionar la entrada VENT, por lo que en el campo 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 estado 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 salidas.
Colocar un 1 en la columna
correspondiente a esta salida.
001
b
Entrada que hay que
seleccionar con el campo de
Selección.
HABCNT
Valor a colocar en el campo de
próximo estado si la entrada
seleccionada vale 1.
Valor a colocar en el campo de
próximo estado si la entrada
seleccionada vale 0.
Q15
101
010
c
f
HABCNT
HABCNT
Figura 3.15 – Determinación de los valores de los campos del estado b.
Estado
b
A2
0
A1
0
A0
1
S
1
C*0 B*0 A*0 C*1 B*1 A*1 D3
1
0
1
0
1
0
0
D2
0
D1
0
D0
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 estados que no dependen de ninguna entrada y por lo tanto tienen definido un único próximo estado. 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 instrucciones 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 columna 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.
18
Figura 3.16 – Determinación de los valores de los campos del estado g.
Estado
g
A2
1
A1
1
A0
0
S
0
C*0 B*0 A*0 C*1 B*1 A*1 D3
1
1
1
1
1
1
0
D2
1
D1
0
D0
0
D2
0
0
0
0
0
0
1
0
D1
0
0
0
0
0
0
0
1
D0
0
1
1
1
1
1
0
0
Tabla 3.10 – Llenado de la memoria para el estado g.
Estado
a
b
c
e
d
f
g
h
A2
0
0
0
0
1
1
1
1
A1
0
0
1
1
0
0
1
1
A0
0
1
0
1
0
1
0
1
S
0
1
1
0
0
0
0
0
C*0 B*0 A*0 C*1 B*1 A*1 D3
0
0
0
0
0
1
0
1
0
1
0
1
0
0
0
1
1
1
0
0
0
0
0
1
0
0
1
1
1
1
0
0
1
0
0
1
1
0
0
0
1
0
1
1
1
1
1
1
0
0
0
0
0
0
0
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 sensiblemente 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 aprovechamiento 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
19
incluir en el formato de la palabra de memoria 2 p 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 admita 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.
20
PPP
Entrada que hay que
seleccionar con el campo
de Selección S0.
p
Lista de Salidas
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.
E1
E2
QQQ
E2
RRR
r
q
Valor a colocar en el
campo de próximo estado
si las entradas
seleccionadas valen 00.
SSS
s
Valor a colocar en el
campo de próximo estado
si las entradas
seleccionadas valen 01.
TTT
t
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.
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 selecció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 particular es cuando la transición entre estados es incondicional, en el que en el campo de selecció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 entrada, 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.
21
Figura 3.19 – Carta modificada para el esquema de 4 Vías.
MEMORIA
3
3
3
3
4
Pxmo. Est. Pxmo. Est. Pxmo. Est. Pxmo. Est.
00
01
10
11
Instr.
Salidas
0
VENT
1
2
3
D3 = INT
D2 = CRGLTCH
D1 = LIMPCNT
D0 = HABCNT
S0
Multiplexor 4:1
Q15
S1
Registro cauce
Reloj
Figura 3.20 – Esquema de 4 Vías para el caso de ejemplo.
22
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 contenido 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 colocar 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.
23
Valor a colocar en el campo
de próximo estado si las
entradas valen 01.
001
b
Colocar un 1 en la
columna
correspondiente a
esta salida.
HABCNT
Valor a colocar en el campo
de próximo estado si las
entradas valen 10 y 11.
Q15
010
c
VENT
HABCNT
Valor a colocar en el campo
de próximo estado si las
entradas valen 00.
011
d
CRGLTCH
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 entradas y uno que depende de una sola. Así, si las entradas valen 00, en ese campo hay que colocar 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 estado. 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.
24
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
b
c
d
e
f
-
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
0
0
1
1
0
0
0
0
0
1
0
0
0
0
0
0
0
1
1
0
0
1
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
1
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
1
0
0
0
0
0
1
0
0
0
0
1
0
0
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
1
1
0
0
1
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 carga 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 direccionamiento 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).
25
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 conveniente, 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 cualquier 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 contador.
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 esquema 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-
26
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 mostrado en la Fig. 3.26. Si luego de hacer la asignación de estados (y no habiendo forma de cambiarla) queda algún estado en el que la dirección asumida está por la salida negada de la casilla 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.
27
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 cuales 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 burbuja 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 impuestas.
28
a
VENT
b
HABCNT
Q15
c
HABCNT
f
Q15
e
INT, HABCNT
d
HABCNT
VENT
HABCNT
g
VENT
h
CRGLTCH
LIMPCNT
Figura 3.27 – Determinación de los caminos para las direcciones asumidas.
29
000
a
VENT
001
b
HABCNT
Q15
010
110
c
f
HABCNT
VENT
Q15
101
111
e
INT, HABCNT
HABCNT
d
HABCNT
011
g
CRGLTCH
100
VENT
h
LIMPCNT
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 multiplexor de entrada que incluya las siguientes conexiones: VENT , VENT , Q15 y GND para los
saltos incondicionales. Así, el formato de la palabra queda con 3 bits para la dirección de salto, 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.
30
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ípicos, 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.
31
Estado
b
A2
0
A1
0
A0
1
C* B* A*
1
1
0
S1
0
S0
1
D3
0
D2
0
D1
0
D0
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 Q15 , 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).
100
h
Colocar un 1 en la columna
correspondiente a esta salida.
LIMPCNT
000
Dirección de
salto
a
Figura 3.31 – Determinación de los valores de los campos del estado h.
Estado
h
A2
1
A1
0
A0
0
C* B* A*
0
0
0
S1
0
S0
0
D3
0
D2
0
D1
1
D0
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
a
b
f
g
h
d
c
e
A2
0
0
0
0
1
1
1
1
A1
0
0
1
1
0
0
1
1
A0
0
1
0
1
0
1
0
1
C* B* A*
0
0
0
1
1
0
0
0
1
1
0
0
0
0
0
0
1
1
1
0
1
0
0
1
S1
1
0
1
0
0
1
0
0
S0
0
1
1
0
0
0
1
0
D3
0
0
0
0
0
0
0
1
D2
0
0
0
1
0
0
0
0
D1
0
0
0
0
1
0
0
0
D0
0
1
1
0
0
1
1
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
32
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 agrega 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.
GND
0
S1
S0
COND1
COND2
COND3
2
3
1
Multiplexor
Incrementar/Cargar
µPC
Reloj
Contador con
carga en paralelo
MEMORIA
Dirección de
Salto
Polaridad
Selección
Instrucciones
Salidas
Figura 3.32 – Esquema de direcciones asumidas mejorado.
33
Pol.
0
0
0
0
1
1
1
1
S1
0
0
1
1
0
0
1
1
S0
0
1
0
1
0
1
0
1
Función
Ir a la dirección de salto.
Saltar si la COND1 es Falso.
Saltar si la COND2 es Falso.
Saltar si la COND3 es Falso.
Incrementar el μPC.
Saltar si la COND1 es Verdadero.
Saltar si la COND2 es Verdadero.
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 entradas, 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.
34
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.
000
a
VENT
001
b
HABCNT
Q15
110
c
010
f
HABCNT
Q15
111
e
INT, HABCNT
HABCNT
VENT
101
d
HABCNT
011
g
CRGLTCH
100
VENT
h
LIMPCNT
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 polaridad 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.
35
000
Dirección de
salto
001
Dirección
asumida
a
Entrada que hay que
seleccionar con el campo de
Selección, con Polaridad = 0.
b
VENT
HABCNT
Figura 3.35 - Determinación de los valores de los campos del estado a.
Estado
a
A2
0
A1
0
A0
0
C* B* A*
0
0
0
P
0
S1
1
S0
0
D3
0
D2
0
D1
0
D0
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
b
A2
0
A1
0
A0
1
C* B* A*
1
1
0
P
1
S1
0
S0
1
D3
0
D2
0
D1
0
D0
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 campo 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 correspondiente 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 Tabla 3.21 muestra el contenido de la memoria para el estado b.
36
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 incremento del contador, tal como en la transición de g → h.
011
g
CRGLTCH
100
h
Colocar un 1 en la columna
correspondiente a esta salida.
Dirección
asumida
LIMPCNT
Figura 3.37 - Determinación de los valores de los campos del estado g.
Estado
g
A2
0
A1
1
A0
1
C* B* A*
1
0
0
P
1
S1
0
S0
0
D3
0
D2
1
D1
0
D0
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 correspondiente (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 contenido de la memoria para el estado g.
Figura 3.38 - Determinación de los valores de los campos del estado e.
37
Otro caso de transición incondicional es la de e → b, pero en esta caso se debe usar una direcció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
e
A2
1
A1
1
A0
1
C* B* A*
0
0
1
P
0
S1
0
S0
0
D3
1
D2
0
D1
0
D0
1
D1
0
0
0
0
1
0
0
0
D0
0
1
1
0
0
1
1
1
Tabla 3.23 - Llenado de la memoria para el estado e.
Estado
a
b
f
g
h
d
c
e
A2
0
0
0
0
1
1
1
1
A1
0
0
1
1
0
0
1
1
A0
0
1
0
1
0
1
0
1
C* B* A*
0
0
0
1
1
0
0
0
1
1
0
0
0
0
0
0
1
1
1
0
1
0
0
1
P
0
1
1
1
0
0
1
0
S1
1
0
1
0
0
1
0
0
S0
0
1
0
0
0
0
1
0
D3
0
0
0
0
0
0
0
1
D2
0
0
0
1
0
0
0
0
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 salida. 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 campos 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 sustancialmente.
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 condicionales 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
38
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 elegir los formatos que más se adecuen al problema.
Formato 1
Instrucciones
Formato 2
Selección y salto
Listado de salidas
Al estado asumido
(+1)
COND
Al estado X
(salto)
Al estado asumido
(+1)
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 circuitos 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 rendimiento muy altos se desaconseja usar este esquema y usar algunos de los otros esquemas propuestos.
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 instrucciones. Al colocar el uno se producirá siempre un incremento del contador, de manera de pasar 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
39
presente en la entrada del cerrojo. Para la selección de las entradas en las transiciones condicionales 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.
GND
Q15
VENT
No
Usada
0
1
2
3
S1
S0
Multiplexor 4:1
Incrementar/Cargar
PC
Reloj
Contador con
carga en paralelo
MEMORIA
1
Bit de
formato
0
1
1
Polaridad
2
4
Selección
Dirección de salto
Instrucciones
D
Cerrojo
C
Q
Salidas
D3 = INT
D2 = CRGLTCH
D1 = LIMPCNT
D0 = HABCNT
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 requisitos 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 salida 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.
40
De todas maneras hay algunas particularidades que remarcar. La transición de f → g es incondicional 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 incondicional de g → a es igual al caso general, en el que se deberá incluir un estado extra de Formato 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 considerando 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
41
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áticamente 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.
0000
Dirección de salto
para el estado b.
a
0001
Dirección asumida
del estado a.
0010
Dirección asumida
del estado b.
b
Entrada que hay que seleccionar
con el campo de Selección, con
Polaridad = 0.
VENT
HABCNT
Figura 3.42 - Determinación de los valores de los campos de los estados a y b.
Estado
a
b
A3
0
0
A2
0
0
A1
0
0
A0
0
1
F
1
0
P
0
0
S1
0
1
S0
0
0
D3
0
0
D2
0
0
D1
0
0
D0
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 selecció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 direcció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 salto 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 entradas consultadas en forma sucesiva en los estados d y e.
42
Figura 3.43 - Determinación de los valores de los campos de los estados c y d.
Estado
c
d
e
A3
0
0
0
A2
0
0
1
A1
1
1
0
A0
0
1
0
F
1
0
0
P
0
1
0
S1
0
0
1
S0
0
1
0
D3
0
1
0
D2
0
0
0
D1
0
0
1
D0
1
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 incondicional 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.
43
Estado
f
A3
0
A2
1
A1
0
A0
1
F
1
P
0
S1
0
S0
0
D3
0
D2
1
D1
0
D0
0
Tabla 3.27 - Llenado de la memoria para el estado f.
1011
l
Colocar un 1 en la columna
correspondiente a estas salidas.
HABCNT, INT
1100
Dirección asumida
del estado l.
m
Dirección de salto
del estado m.
0010
c
HABCNT
Figura 3.45 - Determinación de los valores de los campos de los estados l y m.
Estado
l
m
A3
1
1
A2
0
1
A1
1
0
A0
1
0
F
1
0
P
0
0
S1
0
0
S0
0
0
D3
1
0
D2
0
0
D1
0
1
D0
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 correspondientes 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.
44
Estado
a
b
c
d
e
f
g
h
i
j
k
l
m
-
A3
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
A2
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
A1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
A0
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
F
1
0
1
0
0
1
1
0
0
1
0
1
0
0
0
0
P
0
0
0
1
0
0
0
0
1
0
1
0
0
0
0
0
S1
0
1
0
0
1
0
0
0
1
0
0
0
0
0
0
0
S0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
D3
0
0
0
1
0
0
0
0
0
0
1
1
0
0
0
0
D2
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
D1
0
0
0
0
1
0
1
0
0
0
0
0
1
0
0
0
D0
0
0
1
1
0
0
0
0
1
1
0
1
0
0
0
0
Tabla 3.29 – Contenido de la memoria para el esquema de formato variable.
3.7 ESQUEMA
ENTRADA”.
COMBINADO
“PASOS
DE
ENLACE” + “PARES ESTADO-
Para el problema de ejemplo también se puede plantear un esquema combinado entre el direccionamiento por Pasos de Enlace y el de Pares Estado-Entrada. Este esquema permite implementar máquinas de cualquier tipo (Moore y Mealy), con la ventaja de tener un mejor aprovechamiento de la memoria con respecto al primero de los esquemas. Para el problema de ejemplo, 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 Figura 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
45
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.
Q15
MEMORIA
3
3
4
Pxmo. Est.
0
Pxmo. Est.
1
Instrucciones
Salidas
VENT
0
1
D3 = INT
D2 = CRGLTCH
D1 = LIMPCNT
D0 = HABCNT
Multiplexor 2:1
Registro cauce
Reloj
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á
46
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
a
a
A3
0
0
A2
0
0
A1
0
0
A0 C*0 B*0 A*0 C*1 B*1 A*1 D3
0
0
0
0
0
0
1
0
1
0
0
0
0
0
1
0
D2
0
0
D1
0
0
D0
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 correspondiente 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).
001
b
Colocar un 1 en
la columna
correspondiente
a esta salida.
HABCNT
Q15
Dirección 0011
Valor a colocar en el
campo de próximo
estado si la entrada
VENT vale 1.
Dirección 0010
010
c
VENT
HABCNT
Valor a colocar en
los dos campos de
próximo estado.
011
d
CRGLTCH
Valor a colocar en el
campo de próximo
estado si la entrada
VENT vale 0.
Figura 3.48 – Determinación de los valores de los campos del estado b.
Estado
b
b
A3
0
0
A2
0
0
A1
1
1
A0 C*0 B*0 A*0 C*1 B*1 A*1 D3
0
0
1
1
0
0
1
0
1
0
1
0
0
1
0
0
D2
0
0
D1
0
0
D0
1
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 segunda fila de este estado, con la dirección 0101, define las transiciones c → c y c → d. El
47
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.
001
b
Colocar un 1 en la columna
correspondiente a esta
salida en las dos direcciones
usadas para el estado c.
HABCNT
Q15
010
c
Valor a colocar en
los dos campos de
próximo estado.
HABCNT
Dirección
0100
Valor a colocar en el
campo de próximo
estado si la entrada
VENT vale 1.
VENT
011
Q15
d
CRGLTCH
Dirección 0101
INT
VENT
Valor a colocar en el
campo de próximo
estado si la entrada
VENT vale 0.
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
c
c
A3
0
0
A2
1
1
A1
0
0
A0 C*0 B*0 A*0 C*1 B*1 A*1 D3
0
0
0
1
0
0
1
1
1
0
1
1
0
1
0
0
D2
0
0
D1
0
0
D0
1
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 incondicionales. 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.
48
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
a
a
b
b
c
c
d
d
e
e
-
A3
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
A2
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
A1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
A0 C*0 B*0 A*0 C*1 B*1 A*1 D3
0
0
0
0
0
0
1
0
1
0
0
0
0
0
1
0
0
0
1
1
0
0
1
0
1
0
1
0
0
1
0
0
0
0
0
1
0
0
1
1
1
0
1
1
0
1
0
0
0
1
0
0
1
0
0
0
1
1
0
0
1
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
D2
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
D1
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
D0
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 instrucciones 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 inversores. Esto también puede observarse en la misma carta ASM o bien en el contenido de la
memoria, por simple inspección.
49
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 palabra 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).
50
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
a
b
f
g
h
d
c
e
A2
0
0
0
0
1
1
1
1
A1
0
0
1
1
0
0
1
1
A0
0
1
0
1
0
1
0
1
C* B* A*
0
0
0
1
1
0
0
0
1
1
0
0
0
0
0
0
1
1
1
0
1
0
0
1
P
0
1
1
1
0
0
1
0
S1
1
0
1
0
0
1
0
0
S0
0
1
0
0
0
0
1
0
D2
0
0
0
1
0
0
0
1
D1
0
0
0
0
1
0
0
1
D0
0
1
1
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 microprocesador, 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 microprogramació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 frecuencia 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 microprogra51
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 paralelo, 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 direcciones y la dirección de salto en la otra. La entrada seleccionada por el multiplexor de condició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, independientemente 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 mismo 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.
52
GND
S1
S0
0
COND1
COND2
COND3
1
2
Multiplexor de Condición
0
1
Multiplexor
de Direcciones
3
Registro de
Direcciones
Asumidas
Reloj
Incrementador
(Dir. Actual +1)
MEMORIA
Dirección
de Salto
Polaridad
Selección
Instrucciones
Registro Cauce (o Pipeline)
Salidas
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á ejecutando 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 sigue en orden secuencial en la memoria. La única diferencia con este planteo a nivel de microprograma 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 principio de localidad de la referencia también se usa en las memorias caché, pero con un criterio
más amplio (temporal y espacial).
53
4. CONCLUSIONES
En este trabajo se han expuesto distintos esquemas básicos de la estructura de una MEF microprogramada. Como se ha mostrado con un caso de ejemplo bastante sencillo, el microcódigo (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 microinstrucciones 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 bibliografí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 cualquier MEF, por compleja que sea, en un solo chip. La evolución tecnológica hacia dispositivos 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 microprocesadores 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:
•
•
•
•
•
•
•
54
El diseño es más ordenado y uniforme.
Los cambios y ampliaciones en el sistema son fáciles de realizar, sin tener que modificar 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.
Desventajas:
•
•
•
•
•
En sistemas simples, el costo puede ser mayor.
Con ciertos esquemas el sistema puede resultar más lento debido a los tiempos de acceso 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 funcionamiento 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 determinada 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 extiende 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 observar, 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 funcionan 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 implementació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 microprocesadores RISC (Reduced Instruction Set Computer) suelen tenerla cableada por cuestiones de
velocidad. Pero esa discusión se deja para cursos más avanzados.
55
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 responsable 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, centrado 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 implementa 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 esquemas de microprogramación horizontal y vertical. Resulta interesante el esquema de microprogramació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 describe 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.
56
Descargar