En una CPU, ¿cómo se controlan las entradas/salidas de LU y cómo se retroalimentan a los registros?

Problema básico: la instrucción de la CPU elige qué registro alimentar a una LU (como una ALU), que luego genera un número en algún lugar y lo retroalimenta a un registro. Pero a veces desea retroalimentar la respuesta en el mismo registro. Un ejemplo es Agregar RA y RB y almacenar la respuesta en RA.

Entonces, tratar de imaginar eso en mi cabeza me atrapa en un ciclo de retroalimentación infinito. Así que busqué en línea durante un tiempo relativamente largo, pero solo obtuve cosas irrelevantes sobre lo que hay dentro de una ALU.

He hecho sumadores de 4 y 8 bits antes, incluso conseguí que funcionara el bit de acarreo. Eso no es lo que estoy buscando aquí. Estoy buscando la arquitectura fuera de la LU que controla las entradas y salidas y la retroalimenta a los registros. En lo que a mí respecta, ahora mismo las LU pueden ser cajas negras.

Decidí intentar dibujar mi propio diagrama y ver hasta dónde puedo llegar. (Haga clic para obtener una resolución más alta).

ingrese la descripción de la imagen aquí

En este ejemplo, tengo cuatro registros de 4 bits y cuatro LU. Una de las LU solo realiza operaciones unarias, por lo que solo toma un registro como entrada. Las otras tres LU realizan operaciones binarias, por lo que toman dos registros como entradas.

LU1 tiene un multiplexor que protege la entrada. 2 bits de control eligen qué registro alimentar. Las otras LU tienen dos multiplexores que protegen sus entradas. (Tenga en cuenta que eso significa que puede "copiar" un registro en ambas entradas, por ejemplo, use Reg A y Reg A en LU2).

La LU procesa las entradas y genera una salida. De hecho, todas las LU envían su respuesta a otro multiplexor, que tiene 2 bits de control que eligen qué valor enviar al elemento final, que es un demultiplexor en forma de signo más. 2 bits de control eligen a qué registro enviar ese valor.

Así que finalmente llegamos al problema. Almacenar la respuesta en Reg A, cuando Reg A se usó como entrada en primer lugar, causará problemas. Estados muy variados que podrían asentarse o no. Podrías llamar a esto una condición de carrera.

Ahora sé que "la respuesta obvia" es usar un reloj para ralentizar las transmisiones. Pero no sé cómo usarlo. ¿Qué partes necesitan un reloj? ¿Los MUX? ¿Los LU? ¿El DEMUX? ¿Los propios Regs? ¿Todo lo anterior?

También sé que hay una cosa llamada búfer de tres estados , pero por lo que puedo decir, solo usa la impedancia para "desconectar" una línea, como si estuviera cortada por la mitad, de modo que MUX o DEMUX ya no está conduciendo ( determinar) el estado de tensión de la línea.

Lo siento, este problema tomó muchos párrafos para escribir. Pensé que era más simple de explicar, pero no puedo pensar en buenas maneras de condensarlo. Con suerte, alguien puede iluminar mi arquitectura, o al menos un enlace a un buen diagrama con las partes de control mostradas y explicadas. Siento que solo me falta una pequeña pieza crítica que hará que todo encaje.

Entonces, su pregunta básica es cómo la lógica síncrona (como una CPU) actualiza un valor de registro en un borde de reloj, sin afectar inmediatamente la salida, incluso cuando la salida retroalimenta a la entrada; esta es su pregunta subyacente, ¿verdad? Esto se puede simplificar en gran medida simplemente examinando cómo funciona un flip-flop D. El flip flop D es un registro de 1 bit, se pueden construir registros más largos con la misma tecnología.
@MarkU Creo que es un resumen preciso, pero realmente no sé mucho sobre relojes, así que no puedo estar totalmente seguro. Si se puede simplificar a un flip-flop D, sería muy feliz, solo necesito que alguien me muestre dónde insertar el flip-flop en mi diagrama. ¿Puede una señal de reloj ser sinónimo de un flip-flop de este tipo en determinados casos?
Los propios registros en su diagrama son los flip-flops. Cuando el reloj es estable, emiten un valor e ignoran lo que hay en su entrada. Cuando el reloj sube, copian los datos de la entrada a la salida. Y luego todo vuelve a ser estable hasta el siguiente flanco ascendente.

Respuestas (1)

Los registros normalmente están hechos de flip-flops D , que transfieren y mantienen datos en el flanco ascendente (o descendente) del reloj. Suponiendo que el tiempo de retención de datos de los flip flops es menor que el retraso de propagación a través de las LU, etc., estos flip flops D son todo lo que necesita para evitar una condición de carrera. El resto puede ser lógica combinatoria que permita que las señales fluyan.

En funcionamiento, configuraría los MUX para que la salida de los registros de origen se conecte a la LU y luego vuelva a los registros. Después de esperar un tiempo lo suficientemente largo para que las señales se propaguen a través de la lógica, registra el registro de destino, que almacena la 'respuesta'.

El reloj obliga al circuito a operar a una velocidad más baja de lo que podría hacerlo si dejas que todo suceda lo más rápido posible, lo que suena mal. Pero simplifica enormemente el diseño y mejora la confiabilidad porque las señales solo tienen que ser estables antes del próximo reloj, mientras que con la lógica sin reloj tendrías que ajustar cuidadosamente los retrasos de propagación para que las señales lleguen en los tiempos correctos. La variación de la temperatura y el voltaje podría hacer que diferentes partes de la CPU funcionen a diferentes velocidades, alterando el tiempo y haciendo que funcione mal.

¿Línea de fondo? Necesita un reloj, no solo para este circuito sino también para otras partes de la CPU . Es posible que algunas operaciones deban realizarse en varios pasos con registros temporales que contengan resultados intermedios. Para obtener la secuencia adecuada y tener en cuenta los retrasos, es posible que necesite varios relojes consecutivos por ciclo de máquina, lo que se puede hacer usando ambos bordes, teniendo varias entradas de reloj sincrónicas con fases sesgadas o cronometrando un contador de anillo .