Как узнать, является ли двоичное число нулевым

16

Я реализовывал ALU по спецификациям, приведенным в моей книге «Элементы вычислительных систем». Я застрял только на одной проблеме. Как я могу найти, если данное число равно нулю или нет. Одна вещь, которую я могу сделать, - это каждый бит в шине, а затем применить к нему не гейты. Но должно быть какое-то другое элегантное решение.

Rick_2047
источник
6
это не похоже на то, что вы застряли на самом деле - скорее, вы недовольны :)
vicatcu
7
X input NOR - элегантное решение. Чтобы определить, содержит ли регистр ноль, каждый бит должен быть проверен, чтобы видеть, содержит ли он логический 0. Вы указали, что вам нужен однобитовый вывод. Поэтому вам нужна некоторая функция с X-входами и одним выходом, например, NOR.
W5VO

Ответы:

14

Там просто нет способа обойти все биты, как бы неудовлетворительно это ни казалось. Однако вы не ограничены двумя входными вентилями в кремнии. Вы можете построить 4-входной вентиль NOR в логике CMOS, поместив 4 серии транзисторов p-типа в сеть с понижением и 4 параллельных транзистора n-типа в сеть с понижением. Это уменьшает глубину топологии вашего дерева и, следовательно, вашу задержку распространения. Вы можете принять эту теорию до сих пор, хотя до того, как кумулятивное падение напряжения на последовательных транзисторах сделает подтягивание не достаточным, чтобы стать «1» ... четыре - хорошее эмпирическое правило, если я правильно помню.

vicatcu
источник
Имеет ли смысл использовать чередующиеся элементы NOR и NAND для большего числа бит? Например, при разветвлении из 4 шлюзов в 64-битном тесте с нулем можно использовать 16 вентилей NOR, которые подают результат 1, если 4 бита - от 0 до 4 вентилей NAND, которые подают результат 0, если все 4 бита равны 1 (все 16 исходных битов были 0), затем эти четыре результата будут отправлены в конечный логический элемент NOR. (Я не EE, но это было бы лучше, чем использовать промежуточные инверторы - чтобы вернуть нулевой результат обратно к 0 - и использовать только вентили NOR.)
Пол А. Клейтон
Также могут быть способы частично свести задержку обнаружения нуля к задержке сложения.
Пол А. Клейтон,
Как насчет использования NMOS: один подтягивающий резистор и X транзисторы, чтобы снизить уровень до 0, если любой вход равен 1?
Оскар Ског
13

Логическая функция - это вентиль NOR. Это самая простая логическая функция, которая существует.

Рекс Логан
источник
8

Типичное решение для 8-битных машин состояло в том, что ALU будет генерировать несколько битов «флага», которые будут представлять результат самой последней операции. Хотя было бы возможно иметь любое количество битов флага (т. Е. Вы могли бы иметь флаг 'Z' для каждого регистра в вашем ЦП), обычно наиболее интересным является то, что вы только что вычислили, поэтому имеет определенный смысл делать это таким образом.

Некоторые из этих старых процессоров автоматически устанавливают биты флагов почти для каждого перемещения данных, в то время как другие требуют, чтобы вы вставили в код определенную инструкцию «сравнения», если вам просто вдруг понадобится узнать, равен ли определенный регистр нулю. И независимо от того, предоставляете ли вы проверку на ноль для каждого регистра или только для того, что только что было вычислено, на самом деле нет более простого способа проверить «это слово ноль», чем просто ИЛИ все биты вместе взятые.

JustJeff
источник
1
Это также типично для 32-разрядных микросхем ARM и может быть типичным для большинства архитектур. Для ARM APSR (регистр состояния прикладной программы) содержит биты N, Z, C, V и Q (отрицательный, ноль, перенос, oVerflow, saturateQ) для обеспечения других функций в дополнение к нулевому разряду, который вы ищете , Они могут или не могут быть полезны для вашей машины.
Кевин Вермеер
У меня есть правильное решение или решение, но меня это беспокоит, мне приходится использовать так много логики, чтобы получить хоть один бит. Должно быть какое-то элегантное решение.
Rick_2047
@ Rick_2047 - вы не упомянули, с чем вы это реализуете, но я предполагаю, что FPGA? Мне тоже было бы неприятно, если бы мне пришлось связать любое количество логических блоков просто для того, чтобы сделать большой фан-ин. Это хорошая причина, чтобы вставить только один из них.
JustJeff
не совсем FPGA, но HDL и аппаратный симулятор.
Rick_2047
3

Некоторые процессоры, например MIPS, имеют регистр, который всегда содержит ноль, что делает тестирование другого регистра на ноль очень быстрым.

Леон Хеллер
источник
Как проверить номер, если у меня есть регистр, содержащий ноль? Также я хочу сгенерировать только один бит, который является истинным или ложным в зависимости от того, равна ли шина 16 битов нулю или нет
Rick_2047
1
компаратор ... который вырождается в прославленные ворота NOR ...
vicatcu
Он может получить что-то таким образом, если регистры дешевы (они находятся в блоке SRAM в FPGA), и ему все равно нужна инструкция сравнения регистров по другим причинам.
jpc
@vicatu - на самом деле, если вы хотите сравнить два N-разрядных числа, вам потребуются N 2-входные вентили XOR. Функция OR / NOR подходит только для нулевых тестов.
JustJeff
но в конечном итоге мне нужно было бы использовать столько затворов, сколько у меня входных битов, или хотя бы столько же транзисторов.
Rick_2047
0

Я большой поклонник or_reduce- большинство инструментов синтеза оптимизируют его до наилучшей реализации, поскольку они точно знают, что вы делаете.

Аарон Д. Мараско
источник