Я спробую дати вам уявлення про те, як розроблені цифрові мікросхеми для вирішення проблем цифрової обробки, використовуючи поставлені вами проблеми: як ЦП реалізують доповнення та множення.
По-перше, давайте не зможемо прямо вирішити питання: як мова програмування ефективно оцінює множення та додавання. Відповідь проста, вони складають їх у множення і додають інструкції. Наприклад, наступний код:
a = 1 + 1;
b = a * 20;
просто складено до чогось типу:
ADD 1 1 a
MUL a 20 b
(зауважте, що вищезгадана збірка призначена для уявного процесора, який не існує, для простоти).
У цей момент ви розумієте, що наведена відповідь просто зміщує проблему і вирішує її апаратною магією. Подальше питання, очевидно, як працює ця апаратна магія?
Розглянемо спочатку більш просту проблему: додавання.
Спочатку ми робимо звичну проблему, додаючи в звичайну базу 10 чисел:
17
+28
Першим кроком було б додати 7 та 8. Але це призводить до 15, що більше однієї цифри. Отже, ми переносимо 1:
(1)
17
+28
= 5
Тепер додаємо 1, 1 і 2 разом:
17
+28
=45
Тож із цього ми отримуємо такі правила:
коли результат додавання більше однієї цифри, ми зберігаємо найменш значну цифру і переносимо найбільш значну цифру вперед
якщо у нас стовпчик переноситься в наш стовпчик, ми додаємо його разом із числами, які ми додаємо
Тепер настав час інтерпретувати вищезазначені правила у базі 2 - булева алгебра.
Отже, в булевій алгебрі додавання 0 і 1 разом = 1. Додавання 0 і 0 = 0. І додавання 1 і 1 = 10, що більше однієї цифри, тому ми переносимо 1 вперед.
З цього ми можемо побудувати таблицю істинності:
a b | sum carry
-------------------
0 0 | 0 0
0 1 | 1 0
1 0 | 1 0
1 1 | 0 1
З цього ми можемо побудувати два рівняння / булеві рівняння - одне для виведення суми та одне для виведення переносу. Найнаївніший спосіб - просто перерахувати всі матеріали. Будь-яка таблиця істини, незалежно від того, наскільки велика і складна може бути перероблена у такому вигляді:
(AND inputs in first row) OR (AND of inputs in second row) OR ...
Це в основному сума форми продукції. Ми дивимося лише на результати, які призводять до значення 1, і ігноруємо 0:
sum = (NOT a AND b) OR (a AND NOT b)
Давайте замінимо І АБО І НЕ на символи мови програмування, щоб полегшити читання:
sum = (!a & b) | (a & !b)
В основному ми перетворили таблицю так:
a b | sum equation
-------------------
0 0 | 0
0 1 | 1 (!a & b)
1 0 | 1 (a & !b)
1 1 | 0
Це можна безпосередньо реалізувати у вигляді схеми:
_____
a ------------| |
\ | AND |-. ____
\ ,-NOT--|_____| \ | |
\/ `--| OR |----- sum
/\ _____ ,--|____|
/ `-NOT--| | /
/ | AND |-`
b ------------|_____|
Читачі, які спостерігають за цим спостереженням, зауважили б, що вищезазначена логіка може бути реалізована як єдиний затвор - ворота XOR, які зручно мають поведінку, яку вимагає наша таблиця правдивості:
_____
a ------------| |
| XOR |---- sum
b ------------|_____|
Але якщо ваше обладнання не надає вам ворота XOR, описані вище кроки - це, як ви б вирішили визначити та реалізувати його з точки зору воріт І, АБО та НЕ.
Спосіб перетворення логічних воріт у фактичне обладнання залежить від обладнання, яке ви маєте. Вони можуть бути реалізовані за допомогою різних фізичних механізмів до тих пір, поки механізм забезпечує певну поведінку комутації. Логічні ворота були реалізовані у всьому, від струменів води або затягування повітря (флюїди) до транзисторів (електроніки) до падіння мармуру. Сама по собі це велика тема, тому я збираюся просто промальовувати її і сказати, що можливо застосувати логічні ворота як фізичні пристрої.
Тепер ми робимо те ж саме для несучого сигналу. Оскільки існує лише одна умова, коли несучий сигнал є істинним, рівняння просто:
carry = a & b
Тож перевезти просто:
_____
a ------------| |
| AND |---- carry
b ------------|_____|
Комбінуючи їх разом, ми отримуємо те, що відоме як напівсума:
_____
a ------;-----| |
| | XOR |---- sum
b --;---|-----|_____|
| | _____
| '-----| |
| | AND |---- carry
'---------|_____|
Рівняння для наведеної схеми до речі виглядають так:
sum = a ^ b
carry = a & b
У половині суматора щось не вистачає. Ми застосували перше правило - якщо результат більше однієї цифри, ніж перенести вперед, але друге правило ми не реалізували - якщо є перенесення, додайте його разом із числами.
Отже, щоб реалізувати повний суматор, схему додавання, яка може додавати числа, що перевищують одну цифру, нам потрібно визначити таблицю істинності:
a b c | sum carry
---------------------
0 0 0 | 0 0
0 0 1 | 1 0
0 1 0 | 1 0
0 1 1 | 0 1
1 0 0 | 1 0
1 0 1 | 0 1
1 1 0 | 0 1
1 1 1 | 1 1
Рівняння для суми тепер:
sum = (!a & !b & c) | (!a & b & !c) | (a & !b & !c) | (a & b & c)
Ми можемо пройти той самий процес, щоб визначити і спростити рівняння і інтерпретувати його як ланцюг і т. Д., Як ми це робили вище, але я думаю, що ця відповідь стає надто довгою.
Ви вже маєте уявлення про те, як розроблена цифрова логіка. Є й інші хитрощі, про які я не згадував, такі як карти Карно (використовуються для спрощення таблиць істинності) та компілятори логіки, такі як еспресо (так що вам не доведеться вручну розбивати булеві рівняння), але основна в основному те, що я Викладено вище:
Розв’яжіть проблему, поки ви не зможете працювати на рівні біт (цифр).
Визначте результати, які ви хочете, використовуючи таблицю істинності.
Перетворіть таблицю в булеві рівняння та спростіть рівняння.
Інтерпретувати рівняння як логічні ворота.
Перетворіть свою логічну схему в реальні апаратні схеми, застосувавши логічні ворота.
Ось як насправді вирішуються фундаментальні (точніше, низькорівневі) проблеми - багато та багато таблиць істини. Справжня творча робота полягає у розбитті складної задачі, такої як декодування MP3, до бітового рівня, щоб ви могли працювати над ним за допомогою таблиць правдивості.
Вибачте, у мене немає часу пояснювати, як реалізувати множення. Ви можете спробувати взяти тріщину, визначивши правила того, як довго працює множення, потім інтерпретуючи його у двійкові, а потім спробуйте розбити його на таблиці істинності. Або ви можете прочитати Вікіпедію: http://en.wikipedia.org/wiki/Binary_multiplier