Jak sprawdzić, czy liczba binarna wynosi zero

16

Wdrażałem ALU zgodnie ze specyfikacjami podanymi w mojej książce The Elements of Computing Systems Systems. Utknąłem tylko na jednym problemie. Jak mogę sprawdzić, czy podana liczba wynosi zero, czy nie. Jedną rzeczą, którą mogę zrobić, to albo co jakiś czas w autobusie, a następnie zastosować do tego bramkę. Ale musi być jakieś inne eleganckie rozwiązanie.

Rick_2047
źródło
6
nie brzmi to tak, jakbyś naprawdę utknął - bardziej jakbyś był niezadowolony :)
vicatcu
7
wejście X NOR to eleganckie rozwiązanie. Aby ustalić, czy rejestr zawiera zero, każdy bit musi być sprawdzony, aby sprawdzić, czy zawiera logiczne 0. Podałeś, że potrzebujesz wyjścia pojedynczego bitu. Dlatego potrzebujesz funkcji z wejściami X i jednym wyjściem, jak NOR.
W5VO,

Odpowiedzi:

14

Po prostu nie ma szans na obejście wszystkich bitów, choć może się to wydawać niezadowalające. Jednak nie jesteś ograniczony do dwóch bramek wejściowych w krzemie. Możesz zbudować 4-wejściową bramkę NOR w logice CMOS, umieszczając 4 tranzystory typu p w sieci pullup i 4 równoległe tranzystory typu n w rozwijanej sieci. Zmniejsza to głębokość topologii drzewa, a tym samym opóźnienie propagacji. Do tej pory można przyjąć tę teorię, zanim jednak skumulowany spadek napięcia na tranzystorach szeregowych sprawi, że podciąganie nie będzie wystarczające, aby być „1”… cztery to dobra zasada, o ile dobrze pamiętam.

vicatcu
źródło
Czy przy większej liczbie bitów sensowne byłoby stosowanie naprzemiennych bramek NOR i NAND? Na przykład, przy wachlowaniu 4 bramek, 64-bitowy test zerowy mógłby wykorzystać 16 bramek NOR zasilających wynik 1, jeśli 4 bity są zerowe do 4 bramek NAND, które zasilają wynik 0, jeśli wszystkie 4 bity są równe 1 (wszystkie 16 oryginalnych bitów to 0), te cztery wyniki zostaną następnie przesłane do ostatecznej bramki NOR. (Nie jestem EE, ale wydaje się to lepsze niż używanie falowników pośrednich - aby uzyskać wynik zerowy z powrotem do 0 - i używanie tylko bramek NOR.)
Paul A. Clayton
Mogą również istnieć sposoby częściowego złożenia opóźnienia detekcji zerowej w opóźnienie dodawania.
Paul A. Clayton
Co powiesz na użycie NMOS: jeden rezystor podciągający i tranzystory X, aby obniżyć poziom do 0, jeśli jakieś wejście ma wartość 1?
Oskar Skog
13

Funkcją logiczną jest bramka NOR. To najprostsza z dostępnych funkcji logicznych.

Rex Logan
źródło
8

Typowe rozwiązanie dla maszyn 8-bitowych polegało na tym, że ALU produkowałoby wiele „flagowych” bitów, które reprezentowałyby wynik ostatniej operacji. Chociaż można mieć dookoła dowolną liczbę bitów flagi (tzn. Możesz mieć flagę „Z” dla każdego rejestru w procesorze), zwykle jest to najbardziej interesująca rzecz, którą właśnie obliczyłeś, więc robienie tego w ten sposób ma pewien sens.

Niektóre z tych starych procesorów automatycznie ustawiałyby bity flagi dla prawie każdego przenoszenia danych, podczas gdy inne wymagałyby umieszczenia w kodzie określonej instrukcji „porównaj”, jeśli nagle trzeba by wiedzieć, czy określony rejestr ma wartość zero. I niezależnie od tego, czy zapewniasz zerowanie dla każdego rejestru, czy tylko dla tego, co właśnie zostało obliczone, tak naprawdę nie ma prostszego sposobu, aby sprawdzić „to słowo zero” niż po prostu LUB wszystkie bity razem.

JustJeff
źródło
1
Jest to również typowe dla 32-bitowych układów ARM i może być typowe dla większości architektur. W przypadku ARM APSR (rejestr statusu programu aplikacji) przechowuje bity N, Z, C, V i Q (ujemne, zero, przenoszenie, przepływ, nasycenie Q), aby zapewnić inne funkcje oprócz szukanego bitu zerowego . Mogą one, ale nie muszą być przydatne dla twojego komputera.
Kevin Vermeer
Mam rozwiązanie lub w porządku, ale to mnie wkurza, że ​​muszę użyć tyle logiki, aby uzyskać tylko jeden kawałek. Musi być jakieś eleganckie rozwiązanie.
Rick_2047,
@ Rick_2047 - nie wspomniałeś, z czym to wdrażasz, ale zgaduję FPGA? Niepokoiłoby mnie również to, że musiałbym powiązać dowolną liczbę bloków logicznych tylko po to, aby wykonać wysoką bramkę wachlarza. To dobry powód, aby umieścić tylko jeden z nich.
JustJeff,
nie do końca FPGA, ale HDL i symulator sprzętowy.
Rick_2047,
3

Niektóre procesory, na przykład MIPS, mają rejestr, który zawsze zawiera zero, co sprawia, że ​​testowanie innego rejestru dla zera jest bardzo szybkie.

Leon Heller
źródło
Jak sprawdzić numer, jeśli mam rejestr zawierający zero? Chcę też wygenerować tylko jeden bit, który jest prawdziwy lub fałszywy, w zależności od tego, czy magistrala 16 bitów ma wartość zero, czy nie
Rick_2047
1
komparator ... który degeneruje się w chwalebną bramę NOR ...
vicatcu
Może coś zyskać w ten sposób, jeśli rejestry są tanie (znajdują się w bloku SRAM w FPGA) i potrzebuje instrukcji porównywania rejestrów z innych powodów.
jpc
@vicatu - właściwie jeśli chcesz porównać dwie liczby N bitów, potrzebujesz N-wejściowych bramek XOR. OR / NOR jest dobry tylko dla testów zerowych.
JustJeff,
ale ostatecznie musiałbym użyć tylu bramek, ile mam bitów wejściowych lub przynajmniej tylu tranzystorów.
Rick_2047,
0

Jestem wielkim fanem or_reduce- większość narzędzi do syntezy zoptymalizuje to do najlepszej implementacji, ponieważ dokładnie wiedzą, co robisz.

Aaron D. Marasco
źródło