¿Cómo se implementó el indicador cero en la ALU Z80?

3

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

Implementarunindicadordeceroparaunregistrodeberíasersencillo,seríaunNORlógicodetodoslosbitsenelregistro.

Algo así funcionaría para un pequeño número de entradas. En cuanto a un procesador de 64 bits, no se puede crear una puerta gigante NOR con 64 entradas. El abanico sería demasiado alto. Demasiados transistores estarían en serie.

Por lo tanto, puedo ver algunas otras opciones (lista no exhaustiva).

  • La bandera de cero podría generarse directamente a partir del resultado de 8 bits usando lógica de 2 niveles.

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

  • Labanderadeceropodríagenerarseapartirdecadamordiscoyluegojuntarse,comosihubieraunabanderadecerode"mitad". El resultado para el más bajo se guardaría usando un flip-flop mientras se espera que se calcule el resultado del mordisco alto.

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

  

No se muestran en el diagrama de bloques los circuitos simples para calcular la paridad, probar el cero y verificar si el valor de 4 bits es menor que 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 utilizaron alguna de las implementaciones propuestas anteriormente o alguna otra cosa completamente diferente.

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

    
pregunta GabrielOshiro

3 respuestas

3

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

  

Esa es una buena pregunta. El indicador cero se genera 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 en 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 transporte completo.

     

La paridad se genera de forma exclusiva o de los primeros 4 bits. Ese resultado luego se alimenta a la exclusiva o de los siguientes 4 bits para generar la paridad final.

     

Ken

    
respondido por el GabrielOshiro
1

En realidad, no importa mientras la respuesta esté lista de manera confiable a tiempo para el próximo límite del reloj. No estoy seguro de que pueda esperar una respuesta definitiva: los diseñadores originales probablemente ya hayan pasado sus mejores fechas antes, a menos que se haya publicado una descripción a nivel de transistor.

Aquí hay alguna información sobre el diseño a nivel de transistor en El Z80.

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

    
respondido por el Spehro Pefhany
1

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

Cuando se usa la lógica NMOS, una compuerta NOR de 8 entradas generalmente tendría ocho transistores que intentan extraer condicionalmente una señal y un pull-up pasivo que intenta extraerla incondicionalmente (pero débilmente). La lógica NMOS dinámica (utilizada en el 6502 (no estoy seguro acerca del Z80) podría hacer que las cosas sean un poco más eficientes en cuanto al consumo de energía, al costo de imponer una velocidad de operación mínima, al tener una señal incondicionalmente detenida durante la mitad de un ciclo de reloj y luego condicionalmente baja durante la otra mitad; los efectos parásitos de la capacitancia son suficientes para asegurar que, si nada detiene la señal durante la segunda mitad del ciclo, se mantendrá en un nivel alto válido durante al menos 5us (medio período de reloj a la velocidad mínima permitida). En cualquier caso, el uso de una compuerta NOR de 8 entradas no es peor que dos compuertas NOR de cuatro entradas, incluso si esta última no requiriera circuitos adicionales para obtener el valor del indicador Z.

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 desplegables complicadas sin tener que tener redes complementarias lo hizo posible, aunque el circuito aritmético BCD del 6502 es lo suficientemente complejo como para entenderlo.

    
respondido por el supercat

Lea otras preguntas en las etiquetas