¿Cómo puede z80 usar una ALU de 4 bits y devolver resultados en un solo ciclo de reloj?

Según la publicación del blog de Ken Sheriff, Z80 ALU tiene 4 bits de ancho. Si echamos un vistazo a la página 8 y 9 de la Guía del usuario de Z80 encontraremos la siguiente información:

Los estados de reloj T3 y T4 de un ciclo de recuperación se utilizan para actualizar las memorias dinámicas. La CPU usa este tiempo para decodificar y ejecutar la instrucción obtenida para que no se pueda realizar ninguna otra operación simultánea.

Obtener ciclo de código de operación

También sabemos que muchas instrucciones se realizan en 1 ciclo de máquina con 4 estados T, como ADD r, SUB r, etc.

Teniendo en cuenta los siguientes hechos:

  • El bus de datos Z80 tiene 8 bits de ancho mientras que su ALU tiene 4 bits de ancho
  • Algunas instrucciones que usan la ALU se ejecutan en 4 ciclos de reloj (estados T)
  • Sabemos que T1 y T2 se usan para obtener el código de operación de la memoria y necesitamos T3 para decodificar el código de operación.

¿Cómo es posible que una ALU de 4 bits produzca un resultado de 8 bits en un solo ciclo de reloj?

¿Me estoy perdiendo algo, o acabas de decir que hay 4 estados T en un ciclo M? En cuyo caso, uno que trate con un nybble por estado T da mucho tiempo para una operación de 8 bits en un ciclo M
@ user44635 No todos los ciclos M tienen 4 estados T. Pero para este ejemplo en particular, estoy preguntando acerca de M1 (buscar-decodificar-ejecutar) con 4 estados T. No tiene 4 estados T disponibles porque se necesitan 2 para obtener y uno para decodificar. Supongo aquí que la CPU solo sabe lo que se ejecutará después del estado de decodificación, lo que nos deja con un solo ciclo de reloj para ejecutar operaciones ALU de 2 nibbles.
He hojeado el documento al que hace referencia Ken Sheriff y menciona pequeñas cantidades de canalización. Es posible que solo necesite un estado T adicional, donde la ejecución de ALU se superpone a alguna otra operación para que todo encaje. Por lo tanto, le sugiero que lea el documento "Panel de historia oral de Zilog sobre la fundación de la empresa y el desarrollo del microprocesador Z80" . Parece explicar las cosas con cierto detalle.
@gbulmer Oh, sí, lo leí una vez, no entendí mucho. Pero ahora que he estudiado más sobre Z80, podría entenderlo. Gracias.
Usted puede encontrar este artículo interesante. El escritor está aplicando ingeniería inversa a la CPU Z80 a nivel de silicio para comprender la respuesta a su pregunta: righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html

Respuestas (2)

La instrucción en realidad termina al final de T2 del ciclo M1 que lee la siguiente instrucción, como se explica en z80.info

Ejecución superpuesta Z80

Entonces, una instrucción como: SUB r se puede desglosar así:

M1 / T1
M1 / T2 : read opcode
M1 / T3 : opcode is decoded as SUB r. A is loaded into op1 latch
M1 / T4 : r is loaded into op2 latch
------------
M1 / T1 : low nibble of substraction is calculated and stored in result low latch
M1 / T2 : high nibble of substraction is calculated and written to register file,
          result low latch is written to register file, 
          next opcode is read from memory

Ruta de datos Z80 ALU

Este esquema superpuesto solo se usa si la operación escribe en un registro. Si escribe en la memoria, no se puede superponer porque eso chocaría con el ciclo M1 que intenta leer un código de operación.

Otro ejemplo: INC HL. Esto incrementa un registro de 16 bits, por lo que la ALU de 4 bits debe usarse cuatro veces. INC HL tiene un ciclo M1 que dura 6 ciclos de reloj. Su desglose es este (el número de ciclos de reloj para cada ciclo de máquina se toma del Manual técnico Mostek MK3880 Z80):

M1 / T1 :
M1 / T2 : read opcode
M1 / T3 : opcode is decoded as INC HL
M1 / T4 : L is loaded into op1 latch
M1 / T5 : low nibble of L is incremented and stored into result low latch
M1 / T6 : low nibble of H is loaded into op1 low latch,
          high nibble of L is incremented and written back to register file
------------
M1 / T1 : high nibble of H is loaded into op1 high latch,
          result low latch (new value of low nibble of L) is 
                               written back to register file
M1 / T2 : high nibble of H is incremented and written back to register file,
          read next opcode, etc...

ADD HL,DE : dura 11 ciclos de reloj con el siguiente desglose: 4+4+3

M1 / T1 :
M1 / T2 : read opcode
M1 / T3 : opcode is decoded as ADD HL,DE
M1 / T4 : L is loaded into op1 latch
------------
M2 / T1 : E is loaded into op2 latch
M2 / T2 : low nibble of L+E is calculated and stored into result low latch
M2 / T3 : high nibble of L+E is calculated and written back to register file,
          low nibble is also written to register file
M2 / T4 : H is loaded into op1 latch
------------
M3 / T1 : D is loaded into op2 latch
M3 / T2 : low nibble of H+D is calculated and stored into result low latch
M3 / T3 : high nibble of H+D is calculated and written back to register file,
          low nibble is also written to register file

He hojeado el documento al que hace referencia el blog de Ken Sheriff, "Panel de historia oral de Zilog sobre la fundación de la empresa y el desarrollo del microprocesador Z80" .

En la página 10, menciona pequeñas cantidades de tubería; por ejemplo, "Al principio introduje la tubería ALU de 4 bits"

Es posible que solo necesite un estado T adicional, donde la ejecución de ALU se superpone a alguna otra operación para que todo encaje.

Entonces, en el documento "Panel de historia oral de Zilog sobre la fundación de la compañía y el desarrollo del microprocesador Z80" , "Masatoshi Shima" parece describir lo suficiente sobre la relación entre las funciones del procesador que puede explicar cómo funcionaba. Parece explicar las cosas con cierto detalle, y mi lectura es que hay una pequeña canalización, suficiente para explicar cómo comprimieron todo en estados de 4 T.

EDITAR:
Animaría a cualquier persona interesada en la historia del desarrollo de microprocesadores a leer ese documento. Es fascinante. Mi agradecimiento a @GabrielOshiro por resaltarlo.