Diseño de una ALU de 4 bits para calcular varias funciones

He estado trabajando en el diseño de una ALU que calcula varias funciones, pero realmente no sé cómo separar cada función entre sí. Las entradas son números A y B de 4 bits. Tengo un decodificador que selecciona qué función usar, pero no sé cómo implementar las funciones del decodificador. La ALU necesita realizar 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.

Puede encontrar un diagrama lógico del antiguo chip TTL 74181 en el PDF en aeromech.usyd.edu.au/MTRXLAB/ref/components/TTL/DM74LS181.pdf (y otros lugares)

Respuestas (5)

En términos de "separar" las funciones, no es realmente así como funciona la lógica digital. La lógica digital es "siempre haciendo todo". Necesitas un mux (multiplexor) ahí. El multiplexor se utiliza para elegir la salida correcta de todas las generadas.

Suponga entradas A y B, salida Q. Suponga 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 compuerta AND. Siempre. Cada momento de cada día, el sumador está sumando A y B, y la puerta está haciendo ANDing A y B.

El mux se usa para seleccionar cuál de las salidas queremos pasar a Q. Si las señales de control a la ALU dicen "agregar", 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 "y", el mux seleccionará la salida de la compuerta AND y la pasará a Q en su lugar, mientras que la salida del sumador no se usa.

Imagine A = 0b0001 y B = 0b0010 en las entradas de la ALU. El sumador siempre produce 0b0011 y la puerta AND siempre produce 0b0000. Si proporciona la señal de control "agregar", el 0b0011 se pasa a Q. Puede dejar A y B solos y cambiar la señal de control a "y", luego 0b0000 se pasa a Q.

Sólida explicación. Completé el ALU temprano esta mañana, pero fue una buena lectura. Gracias. Votaría esto si tuviera la capacidad.

Para un ancho de palabra de 4 bits, una ROM paralela (EEPROM, Flash) es la forma más fácil de implementarlo. Use ambas palabras de entrada, combinadas con la operación (probablemente también 4 o 5 bits) como la dirección de la ROM, y generará el resultado de esa combinación. Si las operaciones incluyen la multiplicación, la salida debe tener un ancho de ocho bits, lo que manejará cualquier ROM paralela actual. Si tiene como máximo 32 operaciones, solo necesitará una ROM de 8K bytes ( 2 2 × 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í hay un ejemplo de una ALU de 2 bits. Como puede ver, XOR y o son computadoras por las primeras 3 puertas lógicas. Luego se utilizan dos puertas XOR para determinar el valor de la suma. Luego se utilizan dos puertas AND y OR para determinar el valor de equipaje de mano. Puedes calcular la tabla de verdad y ver que funciona. Luego, el acarreo se alimenta a la lógica para el segundo bit, que funciona de la misma manera. El decodificador luego selecciona la operación. Solo tienes que seguir el mismo patrón y extenderlo a 4 bits.

Para sumar tres bits (C es el remanente), 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 usando un mapa de Karnaugh

¿Sabrías cómo hacer esto con un sumador completo?

Aquí hay una ALU de 4 bits en VHDL. Si se requiere hardware real, el código podría implementarse en un CPLD adecuado.

Realmente no entiendo ese código.
Un HDL como VHDL o Verilog es la forma habitual de hacer cosas así en estos días.
Dale un respiro al tipo, no todos conocen VHDL o todavía trabajan con lógica programable. Todavía es posible construir una ALU utilizando circuitos integrados lógicos clásicos.

Los artículos de diseño de ALU perfectos están aquí: http://www.6502.org/users/dieter/