He estado trabajando en el diseño de una ALU que calcula varias funciones, pero no sé muy bien cómo separar cada función de la otra. Las entradas son números de 4 bits A y B. Tengo un decodificador que selecciona qué función usar, pero no sé cómo implementar las funciones desde el decodificador. La ALU necesita hacer operaciones aritméticas y también operaciones lógicas. Si alguien sabe cómo estructurar una ALU que tenga 2 entradas de 4 bits y 1 salida de 4 bits, agradecería cualquier orientación. Gracias.
Respuestas
¿Demasiados anuncios?En cuanto a "separar" las funciones, en realidad no es así como funciona la lógica digital. La lógica digital "siempre hace de todo". Necesitas un mux (multiplexor). El multiplexor se utiliza para elegir la salida correcta de entre todas las generadas.
Supongamos entradas A y B, salida Q. Supongamos que la ALU hace dos cosas diferentes: Q=A+B, o Q=A&B.
La ALU tendrá un sumador. También tendrá una gran puerta AND.
A y B van al sumador y a la puerta AND. Siempre. Cada momento de cada día, el sumador está sumando A y B, y la puerta está ANDing A y B.
El mux se utiliza para seleccionar cuál de las salidas queremos pasar a Q. Si las señales de control a la ALU dicen "add", entonces el mux seleccionará la salida del sumador y la pasará a Q; la salida de la puerta AND no se utiliza. Si el control dice "and", el mux seleccionará la salida de la puerta AND y la pasará a Q en su lugar, mientras que la salida del sumador no se utiliza.
Imagina A = 0b0001 y B = 0b0010 en las entradas de la ALU. El sumador siempre produce 0b0011, y la puerta AND siempre produce 0b0000. Si proporcionas la señal de control "add", el 0b0011 se pasa a Q. Puedes dejar A y B solos, y cambiar la señal de control a "and", entonces 0b0000 se pasa a Q.
Para un ancho de palabra de 4 bits, una ROM paralela (EEPROM, Flash) es la forma más sencilla de implementarlo. Utiliza ambas palabras de entrada, combinadas con la operación (probablemente también de 4 o 5 bits) como dirección de la ROM, y ésta emitirá el resultado para esa combinación. Si las operaciones incluyen la multiplicación, la salida tiene que ser de ocho bits de ancho, que cualquier ROM paralela actual manejará. Si tienes como máximo 32 operaciones sólo necesitarás una ROM de 8K bytes ( \$2^{2 \times 4 + 5} = 8192\$ )
La tarea más difícil (e incluso eso no es tan difícil) es escribir un programa para crear el contenido de la ROM.
Aquí es un ejemplo de ALU de 2 bits. Como se puede ver XOR, y, o son ordenador por las 3 primeras puertas lógicas. A continuación, dos puertas XOR se utilizan para determinar el valor de la suma. A continuación, se utilizan dos puertas AND y una puerta OR para determinar el valor del acarreo. Puedes elaborar la tabla de verdad y ver que funciona. El acarreo se introduce en la lógica del segundo bit, que funciona de la misma manera. El decodificador selecciona entonces la operación. Sólo tienes que continuar el mismo patrón y ampliarlo a 4 bits.
Para sumar tres bits (C es el acarreo) la tabla de verdad es:
A B C (A+B) Carry
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
Puede averiguar cómo implementar estas dos funciones lógicas utilizando un Mapa de Karnaugh
Los artículos de diseño de ALU perfectos están aquí : http://www.6502.org/users/dieter/