Diseñar una ALU simple

8

Necesito diseñar una ALU con dos entradas de 8 bits A y B y las entradas de control x, y yz que admiten las siguientes operaciones:

x  y  z  |  operation

0  0  0  |  S = A-B
0  0  1  |  S = A+B
0  1  0  |  S = A*8
0  1  1  |  S = A/8
1  0  0  | S = A NAND B (bitwise)
1  0  1  | S = A XOR B (bitwise)
1  1  0  | s = reverse the bits of A
1  1  1  | S = NOT A (bitwise)

Se supone que esto se debe hacer con un sumador de 8 bits y un extensor de lógica aritmética. Al leer mi libro de texto, veo que el propósito de un extensor de AL es alterar los bits de entrada para que se pueda usar un sumador, en lugar de muchos componentes adicionales, para hacer todo (o al menos eso es lo que entiendo de ello). ). Por ejemplo, el extensor AL podría poner los bits en el complemento de dos para que el sumador haga una resta. Del mismo modo, para las operaciones lógicas a nivel de bits, los bits podrían modificarse adecuadamente y una de las entradas del sumador podría ser cero para que el resultado se obtenga correctamente.

Pero, ¿qué hago exactamente con la multiplicación? Mi libro es muy vago, por lo que no estoy seguro de que un extensor de AL requiera que haga algo inteligente para hacer que el sumador haga el trabajo (solo agregue 8 veces en mi caso? ... ja ja), o si Solo puedes lanzar un multiplicador ahí. Tendré que leer sobre división, pero apuesto a que es similar a la multiplicación.

Bueno, de todos modos, la línea de fondo sigue siendo, ¿qué se "permite" que pueda tener un extensor de AL en él? ¿Su único propósito es modificar la entrada para que pueda ser alimentada a un sumador?

* EDITAR: Bueno, es multiplicación / división por 8, por lo que esto se puede realizar fácilmente con el desplazamiento hacia la izquierda o hacia la derecha por 3. ¿Seguiría teniendo un extensor de AL real si agrego algunos desplazadores allí? (Quizás estoy pensando demasiado en esto como un principiante completo ...)

    
pregunta nicole

3 respuestas

5

El enfoque más simple sería descodificar las entradas x y z en ocho líneas. Luego, a partir de estos, implementa la lógica que controla las líneas de selección de chip para habilitar la unidad apropiada que maneja las entradas, así como las transformaciones necesarias para que la unidad realice la operación correcta.

No creo que puedas usar un sumador para tus operaciones lógicas porque el sumador lleva (a menos que tenga alguna entrada que deshabilite el comportamiento de la propagación de acarreo). Pero puedes tener una sola unidad para hacer toda la lógica.

Tal vez haya una razón por la que llaman a estas ALU, con una A y una L. separadas

La multiplicación por 8 significa simplemente la activación de ceros en las tres líneas de entrada más bajas, ignorando las tres líneas superiores y mapeando la línea 0 a la línea 3, 1 a 4, y así sucesivamente. Es como un interruptor de ferrocarril.

    
respondido por el Kaz
6

(Truco)
La solución más simple pero más poderosa es usar una memoria Flash como una tabla de búsqueda para los resultados. Entrada de 8 bits A + entrada de 8 bits B + código de operación de 3 bits es de 19 bits. Elija un flash de 512 k \ $ \ veces \ $ 16 bit (aproximadamente $ 2), use las 19 líneas de entrada como dirección y programe los resultados para cada combinación de entrada. De esta manera usted puede tener cualquier operación que desee. ¿Quieres pecado (A)? Solo agregue una tabla de búsqueda de seno de 256 palabras, incluso puede tener un resultado preciso de 16 bits. No estás limitado a multiplicar por 8; puede multiplicar A por B. Del mismo modo, puede dividir A por B y obtener un cociente de 8 bits y un resto de 8 bits. Para la multiplicación y la división, utilizará todos los bits en un bloque de 64 kword, pero, por ejemplo, la inversión de bits hace que su uso sea menos eficiente: no depende del valor de B, por lo que tendrá 256 valores idénticos para Cada entrada A y el byte de orden superior ni siquiera se utilizarían. Entonces, mientras que solo necesita 256 \ $ \ veces \ $ 8 = 2048 bits para la inversión de bits, usaría 65536 \ $ \ veces \ $ 16 = 1048576 bits; Eso no es muy eficiente. Podría decir que esto es un serio inconveniente de la solución Flash, pero me gustaría que implementara un multiplicador de 8 \ $ \ times \ $ 8 usando puertas lógicas básicas por $ 2.

Está bien, tal vez no quieras eso; Las puertas lógicas son mucho más desafiantes. Al igual que Kaz , comience con un decodificador de 3 a 8 para tener una señal única para cada código de operación. Puedes hacer esto con puertas básicas, pero sugeriría usar un 74HC238 para empezar. Cuando la ALU funciona, aún puede reemplazar el HC238 por una colección de puertas.

Lo que no desea para el multiplicador es un registro de desplazamiento que se desplaza hacia la izquierda 3 veces. Esa es una función registrada que necesita un reloj, en lugar de una función combinatory que produce el resultado inmediatamente. (Tenga en cuenta que Flash también produce cualquier resultado en nanosegundos, aunque más lento que con la lógica combinatoria.) Tenga un camino de A0 a Y3, A1 a Y4, etc., que habilite con el decodificador "010" opcode Del mismo modo, Y3 se conectará a A6 si la señal "011" está activa (división), y a A4 cuando el opaco es "110" (inversión de bit). Eso significa mucha multiplexación.

Para volver al Flash, también puede hacer una combinación de lógica combinatoria para operaciones simples, como NAND, NOR, cambiar a la izquierda, desplazar a la derecha \ $ ^ {(*)} \ $, y solo usar el Flash para La multiplicación y división. Podría usar un Flash más pequeño (128 kword en lugar de 512 kword), o agregar funciones más avanzadas, como el seno que di como ejemplo (tal vez no sea el mejor, pero estoy seguro de que puede pensar de algo).


\ $ ^ {(*)} \ $ ¿Por qué multiplicas por 8, pero no te queda el turno más básico? Los turnos a la izquierda / derecha, rotar a la izquierda / a la derecha (tanto a través del transporte como a los no) son indispensables para cualquier ALU, y puede dividir entre 8 utilizando 3 derechos de desplazamiento, mientras que no puede dividir entre 2. La inversión de bits es un DSP típico función, pero no quieres construir un DSP para empezar, ¿verdad? Yo cambiaría las funciones a

x  y  z  |  operation

0  0  0  |  S = A - B
0  0  1  |  S = A + B
0  1  0  |  S = shift left A by 1 bit
0  1  1  |  S = shift right A by 1 bit
1  0  0  |  S = A NAND B (bitwise)
1  0  1  |  S = A XOR B (bitwise)
1  1  0  |  S = rotate left A
1  1  1  |  S = NOT A (bitwise)
    
respondido por el stevenvh
1

Me quedé atascado en el mismo problema del mismo libro. Por suerte me topé con este hilo que me dio una idea de qué hacer. Kaz tiene un muy buen punto acerca de manejar ceros y trazar líneas. El extensor de ALU en este libro está diseñado de n (n representa el número de bits en los que operar) componentes combinacionales idénticos pero separados y un componente diferente para el transporte. Estos componentes tienen cinco entradas y dos salidas. Las cinco entradas son: 'X', 'Y', 'Z' (para seleccionar la operación) y 'a', 'b' (bits individuales de A y B con el mismo significado). Supongo que la idea aquí es dividir el problema en partes más pequeñas para tener una tabla de verdad de tamaño razonable. Eso es 5 entradas vs 8 + 8 + 3 = 19 entradas si el extensor aceptaría todos los bits de A y B más las entradas de control. Ahora, si el extensor se compuso de tal manera (19 entradas), creo que la lógica de la multiplicación podría implementarse en ese único componente, pero escribir una tabla de verdad para esto estaría fuera de discusión. De todos modos, mi solución es usar muxes después de cada componente que maneja bits individuales ayb, asumiendo que el componente ya está diseñado de tal manera que una entrada XYZ = 010 pasa un bit 'a' sin cambios y filtra 'b', es decir 'b' = 0. El mux debe tener dos entradas, una del componente anterior y una del componente tres lugares a la derecha. Tres muxes a la derecha deben tener ceros como segunda entrada. Una lógica combinacional simple con una compuerta AND y dos inversores puede configurar los muxes cuando XYZ = 010. Este mismo método también se puede usar para la división, pero necesita muxes con tres entradas y un circuito combinatorio ligeramente diferente para controlarlos.

    
respondido por el Marin

Lea otras preguntas en las etiquetas