Come scoprire se un numero binario è zero


16

Stavo implementando l'ALU dalle specifiche fornite nel mio libro sui sistemi di The Elements of Computing. Sono bloccato su un solo problema. Come faccio a sapere se un determinato numero è zero o no. Una cosa che posso fare è o almeno un po 'nel bus, e quindi applicare un non gate su quello. Ma ci deve essere qualche altra soluzione elegante.


6
non sembra che tu sia bloccato davvero - più come se fossi insoddisfatto :)
vicatcu il

7
un ingresso X NOR è la soluzione elegante. Per determinare se il registro contiene zero, ogni bit deve essere esaminato per vedere se contiene uno 0. logico È stato specificato che è necessario un output a singolo bit. Pertanto hai bisogno di alcune funzioni con ingressi X e un'uscita, come un NOR.
W5VO,

Risposte:


14

Semplicemente non c'è modo di aggirare OR tutti i bit, per quanto insoddisfacente possa sembrare. Tuttavia, non sei limitato a due porte di ingresso in silicone. È possibile creare una porta NOR a 4 ingressi in logica CMOS inserendo 4 transistor di tipo p serie nella rete pullup e 4 transistor di tipo n paralleli nella rete pulldown. Ciò riduce la profondità della topologia dell'albero e quindi il ritardo di propagazione. Puoi prendere questa teoria fino a quel momento, anche se prima che la caduta di tensione cumulativa attraverso i transistor della serie renda il pull-up non abbastanza grande da essere un "1" ... quattro è una buona regola empirica se ricordo bene.


Per un numero maggiore di bit sarebbe sensato utilizzare porte NOR e NAND alternate? Ad esempio, con il fan-in di 4 gate, un test zero a 64 bit potrebbe utilizzare 16 gate NOR che forniscono un risultato di 1 se i 4 bit sono da zero a 4 gate NAND che alimentano un risultato di 0 se tutti e 4 i bit sono 1 (tutti 16 bit originali erano 0), questi quattro risultati sarebbero stati inviati a un gate NOR finale. (Non sono un EE, ma sembrerebbe migliore rispetto all'utilizzo di inverter intermedi - per riportare il risultato a zero a zero - e usando solo porte NOR.)
Paul A. Clayton

Ci potrebbero essere anche modi per piegare parzialmente la latenza del rilevamento zero nella latenza di aggiunta.
Paul A. Clayton,

Che dire dell'utilizzo di NMOS: un resistore pull-up e transistor X per portare il livello a 0 se un input è 1?
Oskar Skog,

13

La funzione logica è la porta NOR. Questa è la funzione logica più semplice che esista.


8

La soluzione tipica con macchine a 8 bit era che l'ALU produceva un numero di bit "flag" che rappresentavano il risultato dell'operazione più recente. Mentre sarebbe possibile avere un numero qualsiasi di bit di flag in giro (cioè, potresti avere un flag 'Z' per ogni registro nella tua CPU), di solito è la cosa che hai appena calcolato che ti interessa di più, quindi ha un certo grado di senso farlo in quel modo.

Alcune di quelle vecchie CPU imposteranno automaticamente i bit di flag per quasi tutti gli spostamenti di dati, mentre altri richiederebbero di applicare un'istruzione di "confronto" specifica nel codice se improvvisamente hai bisogno di sapere se un certo registro era zero. E se si fornisce un controllo zero per ogni registro o solo per ciò che è stato appena calcolato, non esiste davvero un modo più semplice per verificare "è questa parola zero" che solo OR o tutti i bit insieme.


1
Questo è anche tipico dei chip ARM a 32 bit e può essere tipico della maggior parte delle architetture. Per ARM, l'APSR (Application Status Status Register) contiene bit N, Z, C, V e Q (Negativo, Zero, Carry, oVerflow, saturateQ) per fornire altre funzioni oltre al bit zero che si sta cercando . Questi potrebbero essere utili o meno al tuo computer.
Kevin Vermeer,

Ho capito bene la soluzione, ma mi dà fastidio che devo usare tanta logica per ottenere solo un po '. Ci deve essere una soluzione elegante.
Rick_2047,

@ Rick_2047 - non hai menzionato ciò con cui lo stai implementando, ma sto indovinando un FPGA? Sarebbe un bug anche per me dover collegare qualsiasi numero di blocchi logici solo per fare un alto fan-in gate. Questa è una buona ragione per inserirne solo una.
JustJeff,

non esattamente un FPGA ma un simulatore HDL e hardware.
Rick_2047

3

Alcune CPU, ad esempio MIPS, hanno un registro che contiene sempre zero, rendendo molto veloce il test di un altro registro per zero.


Come posso controllare il numero se ho un registro contenente zero? Inoltre voglio generare solo un bit che è vero o falso a seconda che il bus di 16 bit sia zero o no
Rick_2047

1
un comparatore ... che degenera in una porta NOR glorificata ...
vicatcu,

Potrebbe ottenere qualcosa in questo modo se i registri sono economici (si trovano in un blocco SRAM in un FPGA) e ha comunque bisogno di un'istruzione di confronto dei registri per altri motivi.
jpc,

@vicatu - in realtà se vuoi confrontare due numeri N bit, avresti bisogno di porte XOR N 2 input. La cosa OR / NOR va bene solo per zero test.
JustJeff,

ma alla fine avrei bisogno di usare tutte le porte quante ho bit di input o almeno altrettanti transistor.
Rick_2047

0

Sono un grande fan di or_reduce- la maggior parte degli strumenti di sintesi lo ottimizzeranno per la migliore implementazione poiché sanno esattamente cosa stai facendo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.