Як дізнатися, чи двійкове число дорівнює нулю


16

Я реалізував ALU із специфікацій, наведених у моїй книзі «Елементи обчислювальних систем». Я застряг лише в одній проблемі. Як дізнатись, чи задане число дорівнює нулю чи ні. Одне, що я можу зробити, це або кожен шматочок у шині, а потім застосувати не ворота до цього. Але має бути якесь інше елегантне рішення.


6
це не здається, що ти насправді застряг - більше, як ти незадоволений :)
vicatcu

7
вхід X NOR - це елегантне рішення. Для того, щоб визначити, чи містить регістр нуль, кожен біт повинен бути вивчений, щоб перевірити, чи містить він логічний 0. Ви вказали, що вам потрібен один бітовий вихід. Тому вам потрібна деяка функція з X входами і один вихід, як NOR.
W5VO

Відповіді:


14

Просто не обійтися всіма бітами, як неприємно, як може здатися. Однак ви не обмежені двома вхідними воротами в кремнію. Ви можете побудувати 4-вхідний затвор NOR у логіці CMOS, помістивши 4 серійні транзистори типу p в мережу підключення та 4 паралельні транзистори n-типу в розкривній мережі. Це зменшує глибину топології дерева, а отже, і затримку розповсюдження. Ви можете прийняти цю теорію поки що, хоча до накопичувального падіння напруги через серійні транзистори змушення підтягування не є достатньою, щоб бути "1" ... чотири - це хороше правило, якщо я правильно пам'ятаю.


Чи має сенс використання більшої кількості біт, що чергуються воротами NOR і NAND? Наприклад, з вентилятором 4-х воріт, 64-бітний нульовий тест може використовувати 16 воріт NOR, що подають результат 1, якщо 4 біта нульові до 4-х воріт NAND, які подають результат 0, якщо всі 4 біти 1 (усі 16 оригінальних бітів було 0), ці чотири результати потім будуть відправлені до остаточної версії NOR. (Я не EE, але це, здається, буде краще, ніж використання проміжних інверторів - щоб повернути результат нуль повністю до 0 - і використовувати лише ворота NOR.)
Пол А. Клейтон,

Можливо, також існують способи частково скласти затримку виявлення нуля на затримку додавання.
Пол А. Клейтон

Що з використанням NMOS: один підтягуючий резистор та X транзистори для зниження рівня до 0, якщо будь-який вхід дорівнює 1?
Оскар ского

13

Логічна функція - це ворота NOR. Це найпростіша логічна функція, яка існує.


8

Типовим рішенням з 8-бітових машин було те, що ALU видасть декілька бітів 'flag', які б представляли результат останньої операції. Хоча можна було б мати будь-яку кількість бітів прапора навколо (тобто, ви можете мати прапор "Z" для кожного реєстру у вашому процесорі), як правило, ви просто обчислили те, що вам найбільше цікаво, це має певний ступінь сенсу робити це саме так.

Деякі з цих старих процесорів автоматично встановлюють біти прапора майже для кожного переміщення даних, а інші вимагають, щоб у вашому коді було вписано певну інструкцію "зіставити", якщо вам несподівано потрібно знати, чи певний реєстр дорівнює нулю. І якщо ви надаєте нульову перевірку для кожного регістра або просто для того, що тільки що було обчислено, насправді немає більш простого способу перевірити "чи це слово нульове", ніж просто АБО всі біти разом.


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- більшість інструментів синтезу оптимізують його до найкращої реалізації, оскільки вони точно знають, що ви робите.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.