ALU (Arithmetic Logic Unit)

Operaciones lógicas. Memoria virtual. señales de control. Operaciones aritméticas. Circuitos integrados. Fuente de alimentación. Multiplexor

  • Enviado por: Anarro
  • Idioma: castellano
  • País: España España
  • 13 páginas
publicidad
publicidad

TRABAJO Nº5

Enunciado:

ALU_04

Diseñar una unidad aritmético-lógica de 4 bits que, en función de las señales de control S2 , S1 , S0 realice las operaciones aritméticas y lógicas mostradas en la tabla.

S2 = 0

S2 = 1

S1

S0

OPERACIONES LÓGICAS

OPERACIONES ARITMÉTICAS

0

0

A'

-A+3

0

1

B'

-A-3

1

0

A+B'

-B-4

1

1

A·B

-B-3

Diseñar con el menor coste en circuitos integrados.

Una ALU o Unidad Aritmético Lógica (Arithmetic Logia Unit) es un circuito combinacional, es decir, un sistemas digitales cuyas salidas en cualquier instante t dependen únicamente de los valores de las entradas en ese mismo instante t (excepto retardos en la propagación de las señales por el circuito), que puede realizar tanto operaciones lógicas como operaciones aritméticas según cierta combinación de señales de selección de operación.

En este caso dichas señales de selección de operación van a ser 3 bits, S2,S1 y S0. El primero de todos ellos, S2, será el encargado de seleccionar entre que se muestren los resultados provenientes de la unida lógica (S2=0) o de la unidad aritmética (S2=1). S1 y S0 se encargarán de la selección de la operación a realizar dentro de dichas unidades. Las señales de datos serán 2 de 4 bits cada una, A y B.

Para comenzar, plantearemos el diseño de la ALU en dos unidades diferenciadas, unidad lógica y unidad aritmética. Las entradas de datos de cuatro bits Ai y Bi se introducirán a ambas, sin embargo a la salida deberemos que solución mostrar mediante el uso de cuatro multiplexores de dos a uno, cado uno encima de otro, para así conseguir ofrecer en la salida de la ALU sólo una solución SULi o SALi. Como ya hemos mencionado esta selección se llevará a cabo con la entrada S2.

Todas estás señales serán introducidas por el usuario.

Un esquema de lo que podría ser la ALU lo tenemos aquí:

Este mismo esquema pero realizado utilizando Orcad sería:

Como podemos ver además de las entradas seleccionadas por el usuario, existen otras dos entradas, VCC y GND. La primera VCC es la fuente de alimentación, es decir donde irán unidos lo 1 por ejemplo en los multiplexores de la unidad lógica; mientras que GND, del inglés ground, es la tierra, donde uniremos los 0.

Y dentro de lo que llamamos Unidad Aritmético Lógica:

El siguiente paso es la realización de los dos grandes bloques que componen la ALU, la unidad lógica y la unidad aritmética.

Diseño de la unidad lógica.-

La unidad lógica es la parte de la unidad aritmético lógica que se encarga de realizar los calculo de tipo lógico entre las variables Ai y Bi.

Lo primero que haremos será realizar la tabla de verdad de la unidad lógica, que se utilizará cuando la entrada en S2 este a nivel bajo. Por lo que la tabla de verdad deberemos hacerla en función a cuatro entradas, las de control, S1 y S0, y las de datos Ai y Bi. La tabla de verdad únicamente deberemos hacerla una vez, sin embargo, a la hora de implementar las funciones mediante multiplexores, deberemos repetir el procedimiento cuatro veces, uno por cada bit, en este caso cuatro. Así quedarán cuatro salidas SULi (SUL0, SUL1, SUL2, SUL3) que serán el resultado de las operaciones realizadas con las entradas de datos Ai (A0, A1, A2, A3,) y Bi (B0, B1, B2, B3).

S1

S0

Operación Lógica

0

0

Negación de A

0

1

Negación de B

1

0

Suma lógica de A y el complemento de B (OR)

1

1

Multiplicación lógica de A y B (AND)

Tabla de verdad:

S1

S0

Ai

Bi

SULi

0

0

0

0

1

1

0

0

0

1

1

0

0

1

0

0

0

0

0

1

1

0

0

1

0

0

1

Bi'

0

1

0

1

0

0

1

1

0

1

Bi'

0

1

1

1

0

1

0

0

0

1

Bi'

1

0

0

1

0

1

0

1

0

1

1

1

0

1

1

1

1

1

0

0

0

Bi

1

1

0

1

1

1

1

1

0

1

1

1

1

1

1

1

Podemos simplificar la tabla de verdad haciendo que SULi esté en función de Bi. Así haríamos una tabla de verdad de 3 variables, las de control, S1 y S0, y esta vez únicamente la de datos Ai. Podríamos haber simplificado igualmente por cualquier otra variable que no fuera Bi sin embargo la he escogido por simple cuestión de comodidad ya que al haberla representado como bit menos significativo (LSB), está situada en la columna más exterior en la derecha y es muy fácil reducir la tabla de verdad así.

S1

S0

Ai

SULi

0

0

0

1

0

0

1

0

0

1

0

Bi'

0

1

1

Bi'

1

0

0

Bi'

1

0

1

1

1

1

0

Bi

1

1

1

1

Una vez tenemos la tabla de verdad reducida, podemos implementar la función SULi con un multiplexor de 8 a 1, utilizando las entradas S1 (MSB), S0, Ai (LSB) como entradas de control del multiplexor, y los valores 1, 0 y la entrada Bi y su complemento como entradas del multiplexor. La salida de dicho multiplexor será SULi. Como ya he comentado antes, al ser una unidad lógica con 4 bits este procedimiento habremos de repetirlo cuatro veces.

Para asignar las entradas del multiplexor nos basaremos en la tabla de verdad anterior. El orden de peso en los bits es el antes ya comentado S1, S0, Ai (LSB).

Una vez hecho esto ya tendríamos la solución de la unidad lógica para i=0,1,2,3.

El equivalente de este circuito en Orcad, utilizando el inversor 74LS04 y el multiplexor 74LS151 sería:

Este es el circuito para cada bit i, a continuación, mostraremos el circuito donde están implementados todos los bit de solución de la unidad lógica. Es decir, repetiremos el proceso para este bit, pero nombraremos en vez de i, el bit correspondiente (0,1,2,3). La forma más rápida de realizar este procedimiento es utilizar los llamados módulos jerárquicos, donde en cada uno implementaremos este circuito. El circuito completo de la unidad lógica quedaría de esta manera:

Cada módulo jerárquico recibe de entrada los dos bit de datos correspondientes (Ai y Bi) y los dos bit de control que controlan que operación se realiza, es decir S1 y S0. Estos dos últimos se introducen al módulo jerárquico directamente mediante un bus de dos bit. La salida de cada módulo jerárquico nos proporciona la solución para cada bit, y su negado, que no utilizamos.

Diseño de la unidad aritmética.-

La unidad aritmética se encargará de realizar los cálculos de carácter aritmético, valga la redundancia, que le indicaremos mediante las señales de control. Todos éstos cálculos se realizarán en complemento a dos, puesto que así ahorramos circuitería con respecto a otro tipo de representaciones de cantidades negativas. Los cálculos a realizar son los siguientes:

S1

S0

OPERACIONES ARITMÉTICAS

0

0

-A+3

0

1

-A-3

1

0

-B-4

1

1

-B-3

Para poder realizarla con el mínimo coste en circuito integrados tendremos que hacer ciertas manipulaciones:

La implementaremos utilizando sumadores en paralelo de 4 bit 74LS83 como el siguiente:

Puesto que necesitamos introducir los datos dentro de él a partir de 2 entradas de 4 bits (A1…A4 y B1…B4 en el dibujo) y una entrada de un bit que representará el acarreo de entrada vamos a construir una tabla con los datos obtenidos en la manipulaciones algebraicas anteriormente realizadas.

S1

S0

OPERACIONES ARITMÉTICAS

EQUIVALENTE

X

Y

Cin

0

0

-A+3

'{ALU}'

3

1

0

1

-A-3

'{ALU}'

'{ALU}'

1

1

0

-B-4

'{ALU}'

'{ALU}'

1

1

1

-B-3

'{ALU}'

'{ALU}'

'{ALU}'

1

X e Y representarán los 4 bits de entrada de A y B del sumador respectivamente. Cin el acarreo de entrada. En el bloque X para elegir entre A, 3 y 2 utilizaremos multiplexores, lo mismo en el bloque Y. Por otro lado, para negar la variable o el número utilizaremos, puertas XOR de la siguiente manera:

'{ALU}'

Para las entradas de control de los multiplexores que controlen la entrada en X e Y, utilizaremos una función de S1 y S0. También serán en función de S1 y S0 las entradas de las puertas XOR que se encargarán de negar las variables.

F1: Elegirá para X: A (F1=0) o un número (F1=1)

F2: Elegirá para Y: B(F2=0) o un número (F2=1)

F3: Negará el contenido que entrará en BA1…B4 si F3=1, o la dejará sin negar si F3=0

Además se nos presenta una nueva cuestión que resolver, habremos de elegir en ambos bloques entre 2 y 3 para F1=0 o F3=0. En el bit de peso 0 o LSB (bit menos significante) para elegir entre 2 y 3 pondremos S0 negado ya que se corresponde dicho valor con el requerido, en vez de poner 0 o 1 constantes.

Vamos a representar la tabla de verdad de las diferentes funciones:

S1

S0

F1

F2

F3

0

0

0

1

0

0

1

0

1

1

1

0

1

0

1

1

1

1

0

1

Otra situación que se nos plantea sería poner un multiplexor de 2 a 1 que eligiera entre 0 y 1. Como los multiplexores de 2 a 1 no están disponibles como circuitos integrados (el CI disponible son 4 puestos en cascada) vamos a realizar el diseño de dicho multiplexor:

Siendo M1 y M2 las entradas a coger, CM la señal de control del multiplexor y SM la salida. Vamos a ver la tabla de verdad de éste multiplexor:

CM

SM

0

M1

1

M2

CM será la señal de control que controle por lo tanto (si está el multiplexor situado en el LSB) entre 2 y 3.

Sin embargo esta solución es mucho más costosa en circuitos integrados ya que requiere la utilización de puertas lógicas mientras que la otra solución es directa.

Pasemos a implementar el diseño del bloque X (el que se encargará de seleccionar y modificar las entradas para las variables A1…A4 del 74LS83). El bloque lógico X es el siguiente:

Ahora que ya tenemos el bloque lógico X, el siguiente paso será implementar el bloque lógico Y, y de esta manera ya trabajar directamente sobre el sumador una vez que ya han sido seleccionadas las entradas.

Como podemos observar la diferencia más importante con el bloque lógico X, es la suma lógica S1 y S0 para negar las variables en las puertas XOR.

Una vez ya tenemos implementados ambos bloques, la unidad aritmética estará formada como ya hemos mencionado por un sumador 74LS83 al que se le conectarán las salidas de ambos bloques lógicos y también el acarreo de entrada que irá conectado a la alimentación. Finalmente las salidas serán el resultado de la operación que saldrá en un bus de 4 bits, y el acarreo de salida, formado por un solo bit de datos.

'{ALU}'

'{ALU}'

2

1

SULi

0

1

2

3

4

5

6

7

0