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.
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.
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.
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.
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.
vicatcu
W5VO
Spehro Pefhany