Operación de incremento de un reloj en una arquitectura de CPU de tres buses

En su capítulo sobre diseño de CPU , Edward Bosworth presenta la siguiente arquitectura de tres buses:

CPU de tres buses

Uno de los principales objetivos de diseño de este circuito es poder incrementar el contador de programa PC en un solo ciclo de reloj. De acuerdo con el texto adjunto, esto se logra manejando B1 desde la PC, B2 desde el registro constante +1, afirmando la señal de suma en la ALU y manejando la PC desde B3:

PC <- PC+1: PC -> B1, 1 -> B2, add, B3 -> PC

Entonces, la pregunta obvia es, ¿cómo puede la PC registrar la unidad B1 con un valor mientras carga simultáneamente otro valor de B3?

Se me ocurren dos posibles soluciones, pero ambas tienen problemas obvios.

  1. Las transferencias no ocurren simultáneamente. Por ejemplo, B1 se activa en el flanco ascendente, mientras que la señal se carga desde B3 en el flanco descendente. Pero luego, cuando dejamos de conducir B1, la señal desaparecería en B3 en ausencia de otro registro en el camino. Si usa un registro intermedio en algún lugar (¿en la ALU?), realmente está haciendo un incremento de dos ciclos usando ciclos de medio ciclo.
  2. El registro de PC es en realidad dos registros, uno para salida y otro para entrada, que no están conectados cuando el registro se está cargando. Pero entonces necesitaría algún tipo de "lógica de ecualización" que podría resultar no trivial.

Entonces, ¿qué está pasando aquí?

Respuestas (1)

Resulta que me perdí un detalle crucial en el texto adjunto, y los registros están compuestos por dos subregistros (maestro-esclavo):

El uso de registros maestro-esclavo

Tenga en cuenta que los contenidos de la PC se incrementan dentro del mismo pulso de reloj. Como consecuencia directa, la PC debe implementarse como un flip-flop maestro-esclavo; uno que responde a su entrada solo durante la fase positiva del reloj. En el diseño de esta computadora, todos los registros en la CPU se implementarán como flip-flops maestro-esclavo.

¿No es esta la respuesta a la pregunta? Si lo vuelvo a agregar en la pregunta, no queda ninguna pregunta. Por cierto, estoy feliz de eliminarlo todo si ustedes lo prefieren.
Oh, lo siento. Pensé que estabas agregando detalles a la pregunta. Culpa mía.
En realidad, formular la pregunta en términos lo suficientemente concretos para publicar aquí me hizo analizar el problema lo suficiente como para que, en una segunda lectura, encontré la solución más o menos inmediatamente. Entonces, incluso si respondí mi propia pregunta, todavía es electronics.stackexchange quien recibe el crédito;)
@drxzl - Sí, es EE quien se beneficia de esto y, por lo tanto, es bueno publicar su respuesta. Siempre interesante para otros usuarios. Obtendrá los votos a favor, pero el representante de 15 por aceptar se queda en el almacén :-)
Vale la pena señalar que, si bien las chanclas activadas por el borde son "la norma" hoy en día, ese no era el caso en décadas pasadas. Muchos procesadores como el venerable 6502 usaban dos o más pulsos de reloj que no se superponían para operar diferentes partes de la lógica; esos pulsos podrían generarse fuera de los bordes de un reloj razonablemente cuadrado (como se hizo con el 6502) o podrían generarse subdividiendo un reloj de frecuencia más alta (como se hizo con el 8031). Creo que muchos procesadores PIC todavía usan este tipo de enfoques. Algunos procesadores más antiguos usaban pestillos de "lógica dinámica" en lugar de los convencionales...
... para ahorrar más circuitos (se podría implementar un "latch transparente dinámico" con dos transistores activos y un pull-up pasivo, mientras que uno estático probablemente requeriría al menos cuatro transistores y dos pull-ups pasivos).
@supercat: Gracias por la nota histórica. De hecho, consideré brevemente hacer eso. También consideré enrutar la señal del reloj a través de un montón de puertas para generar una compensación. Entonces me di cuenta de que sería una idea estúpida. Luego encontré un libro en el que mencionaban que la gente solía hacer estas cosas y por qué es mejor ceñirse a la activación de borde. Es curioso cuánto de la historia del diseño digital he estado condenado a repetir en la última semana :P
Gracias a todos. Hasta ahora estoy disfrutando de mi incursión en el diseño digital. Probablemente volveré pronto con más preguntas ;)
@drxzcl: Si uno estuviera diseñando un chip a nivel de transistor, uno podría lograr un ahorro considerable en el costo y/o el consumo de energía usando elementos como pestillos transparentes. Por otro lado, es mucho más fácil razonar acerca de los diseños que utilizan cerrojos totalmente activados por el borde, todos funcionando con un reloj común. Hay momentos en los que encuentro que los diseños puramente síncronos son una molestia (por ejemplo, la serie de microcontroladores STM32LF permite mantener un cristal de 32,768 Hz en funcionamiento mientras el procesador está dormido, pero todos sus contadores funcionan de forma sincronizada con el reloj principal...
...lo que hace necesario mantener el reloj principal funcionando a un mínimo de 130Khz nominales para garantizar que los contadores continúen midiendo el tiempo cuando la CPU se despierta o se va a dormir). Los controladores basados ​​en ARM que he visto a menudo parecen tener tales limitaciones en mayor medida que los que no están basados ​​en ARM (estoy un poco desconcertado en cuanto a por qué muy pocos procesadores tienen contadores de tiempo con precisión de ciclo que pueden funcionar sin problemas durante transiciones de despertar/dormir sin necesidad de un reloj principal para seguir funcionando).