¿Cómo se implementó Zero Flag en Z80 ALU?

Z80 era un popular procesador de 8 bits con una ALU de 4 bits.

Z80 ALUMINIO

La implementación de un indicador cero para un registro debería ser sencilla, sería una lógica NORde todos los bits en el registro.

ni gigante

Algo así funcionaría para una pequeña cantidad de entradas. En cuanto a un procesador de 64 bits, no puede hacer una NORpuerta gigante con 64 entradas. El fan-in sería demasiado alto. Demasiados transistores estarían en serie.

Entonces, puedo ver algunas otras opciones (lista no exhaustiva).

  • El indicador cero podría generarse directamente a partir del resultado de 8 bits utilizando una lógica de 2 niveles.

lógica de dos niveles lógica de dos niveles

  • El indicador cero podría generarse directamente a partir del resultado de 8 bits utilizando una lógica de 3 niveles.

lógica de tres niveles

  • La bandera de cero podría generarse a partir de cada mordisco y luego juntarse, como si hubiera una bandera de "medio" cero. El resultado del menor se guardaría utilizando un flip-flop mientras se espera que se calcule el resultado del nibble alto.

Picar

Ken Shirriff escribió un buen artículo sobre la ingeniería inversa del Z80 ALU. Sin embargo, cuando se trata de la bandera cero, afirma:

En el diagrama de bloques no se muestran los circuitos simples para calcular la paridad, probar el cero y comprobar si un valor de 4 bits es inferior a 10. Estos valores se utilizan para establecer los indicadores de condición.

Entonces, aunque son circuitos simples, me gustaría saber exactamente cómo se implementaron y si usaron alguna de las implementaciones propuestas anteriormente o algo completamente diferente.

Hay una pregunta relacionada donde hablan sobre la implementación de bandera cero en términos generales.

Creo que las CPU modernas están diseñadas con un software que es capaz de generar automáticamente múltiples etapas si la fan-in es demasiado alta.

Respuestas (3)

Recibí una respuesta del propio Sr. Shirriff que no solo responde a mi pregunta, sino que también brinda más detalles sobre el resto del circuito de la bandera.

Buena pregunta. El indicador cero es generado en la ALU por NOR de los 8 bits: los 4 bits que acaba de generar la ALU y los 4 bits que están bloqueados en la ALU de la media operación anterior.

Llevar por otro lado es mucho más complicado. La operación de 4 bits genera el medio acarreo, que está bloqueado. Hay un montón de lógica para manejar la suma frente a la resta, los cambios, etc. Luego, la siguiente operación de 4 bits genera el acarreo completo.

La paridad se genera por exclusiva-o de los 4 primeros bits. Ese resultado luego se introduce en el exclusivo o de los siguientes 4 bits para generar la paridad final.

Conocido

Cuando se usa la lógica CMOS, las puertas NAND y NOR con un alto grado de fan-in son problemáticas porque mientras un lado de la puerta tendrá muchos transistores en paralelo (no hay problema particular con 8-wide fan-in, y probablemente ni siquiera para Fan-in de 64 de ancho), el otro lado tendrá muchos transistores en serie (produciendo un tiempo de propagación proporcional al cuadrado del número de transistores en serie una vez que las cosas van mucho más allá de 3-4). Sin embargo, el Z80 original no se implementó con lógica CMOS, sino con lógica NMOS.

Cuando se usa la lógica NMOS, una puerta NOR de 8 entradas generalmente tendría ocho transistores que intentan bajar una señal de manera condicional y un pull-up pasivo que intenta subirla de manera incondicional (pero débil). La lógica NMOS dinámica (usada en el 6502, no estoy seguro sobre el Z80) podría hacer que las cosas sean un poco más eficientes desde el punto de vista energético, a costa de imponer una velocidad de operación mínima, al tener una señal levantada incondicionalmente durante la mitad de un ciclo de reloj y luego baja condicionalmente durante la otra mitad; los efectos de capacitancia parásita son suficientes para asegurar que si nada baja la señal durante la segunda mitad del ciclo, se mantendrá en un nivel alto válido durante al menos 5 us (medio período de reloj a la velocidad mínima permitida). En cualquier caso, usar una compuerta NOR de 8 entradas no es peor que dos compuertas NOR de cuatro entradas, incluso si la última no

Por cierto, el NMOS 6502 podría realizar aritmética decimal codificada en binario a la misma velocidad que la aritmética binaria; la versión CMOS del 6502 es más lenta (requiere un ciclo adicional) y otros procesadores generalmente requieren pasos separados de "adición binaria" y "limpieza". Sospecho que la capacidad de tener redes pull-down complicadas sin tener que tener redes pull-up complementarias lo hizo posible, aunque el circuito aritmético BCD del 6502 es lo suficientemente complejo, nunca lo entendí.

Realmente no importa siempre y cuando la respuesta esté lista de manera confiable a tiempo para el siguiente borde del reloj. No estoy seguro de que pueda esperar una respuesta definitiva: los diseñadores originales probablemente ya hayan superado sus fechas de caducidad, a menos que se haya publicado una descripción a nivel de transistor.

Aquí hay una idea del diseño a nivel de transistor en el Z80.

En realidad, para una puerta NOR simple de 8 entradas, habría 8 transistores en paralelo (y ninguno en serie, salvo la carga) en el caso de la ca original. 1976 Zilog NMOS Z80. Sospecho que así es exactamente como lo habrían hecho.