Cómo saber si un número binario es cero

Estaba implementando la ALU a partir de las especificaciones dadas en mi libro The Elements of Computing Systems. Estoy atascado en un solo problema. ¿Cómo saber si un número dado es cero o no? Una cosa que puedo hacer es o cada bit en el bus, y luego aplicar una puerta no en eso. Pero tiene que haber alguna otra solución elegante.

no suena como si realmente estuvieras atascado, más bien como si no estuvieras satisfecho :)
una entrada X NOR es la solución elegante. Para determinar si el registro contiene cero, se debe examinar cada bit para ver si contiene un 0 lógico. Usted especificó que necesita una salida de un solo bit. Por lo tanto, necesita alguna función con X entradas y una salida, como NOR.
Si la velocidad no le preocupa, puede usar un registro de desplazamiento, una puerta o y un flip-flop y usar una operación en serie. La misma lógica podría usarse para agregar, etc. Algunos procesadores de 8 bits realmente hicieron esto.

Respuestas (7)

Simplemente no hay forma de evitar ORing todos los bits, por insatisfactorio que parezca. Sin embargo, tampoco está restringido a dos puertas de entrada en silicio. Puede construir una puerta NOR de 4 entradas en lógica CMOS colocando 4 transistores tipo p en serie en la red pullup y 4 transistores paralelos tipo n en la red pulldown. Eso reduce la profundidad de su topología de árbol y, por lo tanto, su retraso de propagación. Sin embargo, solo puede tomar esa teoría hasta cierto punto antes de que la caída de voltaje acumulada en los transistores en serie haga que el pull-up no se levante lo suficiente como para ser un "1" ... cuatro es una buena regla general si no recuerdo mal.

Para una mayor cantidad de bits, ¿tendría sentido usar puertas alternas NOR y NAND? Por ejemplo, con fan-in de 4 compuertas, una prueba cero de 64 bits podría usar 16 compuertas NOR alimentando un resultado de 1 si los 4 bits son cero a 4 compuertas NAND que alimentan un resultado de 0 si los 4 bits son 1 (todos 16 bits originales eran 0), estos cuatro resultados se enviarían a una puerta NOR final. (No soy un EE, pero eso parecería ser mejor que usar inversores intermedios, para que el resultado de cero vuelva a 0, y usar solo puertas NOR).
También puede haber formas de plegar parcialmente la latencia de detección cero en la latencia adicional.
¿Qué pasa con el uso de NMOS: una resistencia pull-up y transistores X para bajar el nivel a 0 si alguna entrada es 1?

La función lógica es la puerta NOR. Esa es la función lógica más simple que existe.

La solución típica con máquinas de 8 bits era que la ALU produciría una cantidad de bits de 'bandera' que representarían el resultado de la operación más reciente. Si bien sería posible tener cualquier cantidad de bits de bandera (es decir, podría tener una bandera 'Z' para cada registro en su CPU), generalmente es lo que acaba de calcular que le interesa más, por lo que tiene cierto grado de sentido hacerlo de esa manera.

Algunas de esas CPU antiguas establecerían automáticamente bits de marca para casi todos los movimientos de datos, mientras que otras requerirían que coloque una instrucción específica de "comparación" en su código si de repente necesita saber si un determinado registro es cero. Y ya sea que proporcione una verificación de cero para cada registro o solo para lo que se acaba de calcular, realmente no hay una forma más sencilla de verificar "es esta palabra cero" que simplemente O todos los bits juntos.

Esto también es típico de los chips ARM de 32 bits y puede ser típico de la mayoría de las arquitecturas. Para el ARM, el APSR (registro de estado del programa de aplicación) contiene bits N, Z, C, V y Q (negativo, cero, acarreo, oVerflow, saturateQ) para proporcionar otras funciones además del bit cero que está buscando . Estos pueden o no ser útiles para su máquina.
Obtuve la solución o bien, pero me molesta que tenga que usar mucha lógica para obtener solo un bit. Tiene que haber alguna solución elegante.
@ Rick_2047: no mencionó con qué está implementando esto, pero supongo que un FPGA. También me molestaría tener que vincular cualquier cantidad de bloques lógicos solo para hacer una puerta de entrada alta. Esa es una buena razón para poner solo uno de ellos.
no es exactamente un FPGA sino un HDL y un simulador de hardware.

Algunas CPU, MIPS por ejemplo, tienen un registro que siempre contiene cero, lo que hace que la prueba de cero en otro registro sea muy rápida.

¿Cómo compruebo el número si tengo un registro que contiene cero? También quiero generar solo un bit que sea verdadero o falso dependiendo de si el bus de 16 bits es cero o no.
un comparador... que degenera en una puerta NOR glorificada...
Podría ganar algo de esta manera si los registros son baratos (están en un bloque SRAM en un FPGA) y necesita una instrucción de comparación de registros por otras razones de todos modos.
@vicatu: en realidad, si desea comparar dos números de N bits, necesitaría N puertas XOR de 2 entradas. Lo de OR/NOR solo es bueno para cero pruebas.
pero en última instancia, necesitaría usar tantas puertas como bits de entrada tengo o al menos tantos transistores.

Soy un gran admirador de or_reduce: la mayoría de las herramientas de síntesis lo optimizarán para la mejor implementación, ya que saben exactamente lo que está haciendo.

Encontré esta publicación por la misma razón que el OP: intentar implementar zr para ALU en el curso The Elements of Computing. zr es 1 si la salida ALU es 0, 0 de lo contrario

El curso proporciona un simulador de hardware y una gama de chips predefinidos integrados.

Uno de los chips incorporados es una puerta OR de 8 vías. No se proporciona una puerta NOR de 8 vías. La ALU es de 16 bits. Dividí la señal de 16 bits en dos buses de 8 bits usando un multiplexor. Cada uno de estos va a una puerta Or separada de 8 vías. Las salidas de cada una de las compuertas O de 8 vías van a una compuerta Not separada. Las salidas de las dos puertas Not van a una puerta And. La salida de la puerta And es la función zr.

Probé esto usando el curso Hardware Simulator v2.5.

Necesitamos verificar si nuestra matriz de salida contiene solo 0 bits. Si el número que representa Array es 0, entonces no es Negativo ni Positivo en un sentido matemático. Entonces puede verificar el último bit de la matriz de salida si es igual a 0. Porque en el complemento de 2, todos los números negativos tendrán 1 como último MSB si MSB == 0, entonces no es negativo.

Para verificar si tampoco es positivo, podemos NEGAR la matriz de salida y AGREGARLA a sí misma, lo que nos llenará la matriz de 1. Ahora agregaremos la matriz de salida a esta matriz completa de 1. Si la matriz de salida contenía 1 bit, generará un acarreo que eventualmente causará un desbordamiento y establecerá el MSB del resultado en 0. Si la matriz de salida contenía solo 0, el resultado permanecerá lleno de 1. Y MSB seguirá siendo 1 también.

Así que ahora nosotros

Y (NO ( matriz de salida [MSB]), AGREGAR [MSB] ( matriz de salida , AGREGAR ( matriz de salida , NEGAR ( matriz de salida )))

Haga eso para verificar si el número representado por la matriz de salida no es positivo ni negativo. Mb aunque usar OR multidireccional para los 16 bits es más fácil y mejor.

¿Cuál es el signo de un cero en complemento a dos si "no es negativo ni positivo"? ¿Qué significa "Mb tho to or all"?
@ElliotAlderson Pensé que 0 no tiene signo, porque los números positivos y negativos se definen en relación con 0. Para O todo: me refiero a aplicar la compuerta OR multidireccional a toda la matriz de salida para que devuelva 1 si al menos un bit en la matriz es 1 - eso significaría que no es cero. Como sugiere la respuesta marcada como correcta. Puede ser menos costoso porque todas estas sumas y negaciones que propuse no son gratuitas después de todo. Estoy siguiendo el mismo curso que el libro OP: The Elements of Computing Systems. Esa fue mi solución. Funciona, pero no sé cuál es el más eficiente todavía.
Los números se definen como sin signo o con signo, independientemente de su valor. Si usa un procesador típico, las operaciones de bifurcación condicional considerarán cero como positivo. En la aritmética del complemento a 2, "positivo" significa mayor o igual que cero. Por otro lado, los números de punto flotante y las representaciones de magnitud de signo tienen cero positivo y cero negativo.
@ElliotAlderson ¡Gracias por la explicación! He editado mi respuesta, espero que se vea mejor ahora.