АЛУ: Сердце математики

Арифметико-логическое устройство (АЛУ) — это главный мозг процессора, его математический центр. Снаружи АЛУ кажется сложным чёрным ящиком, который умеет и складывать, и вычитать, и сравнивать, и сдвигать биты.

Решение уровня «АЛУ»: арифметико-логическое устройство с выбором операции
АЛУ в сборе: авторское решение уровня

Но внутри нет абсолютно никакой магии. Там просто параллельно стоят сумматор и блок логических вентилей (AND, OR, XOR). Когда в АЛУ попадают два числа, оно выполняет над ними вообще все доступные операции одновременно!

А как же тогда получается один правильный ответ? Очень просто. На выходе из всех этих вычислительных блоков стоит большой мультиплексор. Получив код операции от процессора (например, команду «Сложить»), этот мультиплексор просто выбирает нужный провод с уже готовым результатом суммы, передаёт его на выход, а все остальные результаты просто игнорирует.

Чёрный ящик с тремя ступенями внутри

АЛУ принимает два 8-битных числа — A и B — и код операции (opcode). В ответ выдаёт результат, а также флаг Zero, который сигнализирует, что результат равен нулю. Снаружи это «чёрный ящик», внутри — простая трёхступенчатая схема: декодер (разбор opcode через Splitter на биты) → параллельные вычислительные блоки → каскад мультиплексоров, который выбирает итоговый ответ.

Все операции — одновременно

Пока ты, как человек, решаешь, складывать или умножать, схеме выбирать не нужно. В АЛУ сумматор и все логические блоки считают свои результаты постоянно, всегда и параллельно. На вход пришли два числа — и сумматор уже выдаёт A+B, блок AND — A&B, блок OR — A|B. Процессору остаётся только выбрать нужный. Это главный трюк: скорость достигается параллелизмом, а не быстрым переключением «режимов».

За выбор отвечает каскад мультиплексоров — о них мы подробно говорили в статье про мультиплексор-стрелочник. Управляющие сигналы приходят с декодера, который разбирает opcode на биты. Один бит выбирает между парой результатов, следующий — между парами, и так каскад из шести мультиплексоров сводит семь результатов к одному.

Таблица операций АЛУ

OpcodeОперацияСмысл
0ADDA + B — сложение
1ANDA & B — побитовое И
2ORA | B — побитовое ИЛИ
3XORA ^ B — побитовое исключающее ИЛИ
4NOT~A — побитовое отрицание A
5SHLA << 1 — сдвиг влево: умножить на 2
6SHRA >> 1 — сдвиг вправо: разделить на 2

Сдвиги — маленькое чудо арифметики: сдвинуть биты на один разряд влево — значит умножить число на 2, а вправо — разделить на 2. Сложение же опирается на сумматоры, устроенные так, как описано в статье про анатомию сумматора.

Числовой пример: 10 и 6

Подадим на вход два числа: A = 1010 (это 10) и B = 0110 (это 6). Посмотрим, что выдаст АЛУ при разных opcode.

1. Opcode 0 (ADD): 10 + 6 = 16, в 8 битах — 00010000. (В 4-битной арифметике 1010 + 0110 = 1 0000: единица «уезжает» в перенос.)

2. Opcode 1 (AND): 1010 & 0110 = 0010, то есть 2.

3. Opcode 2 (OR): 1010 | 0110 = 1110, то есть 14.

4. Opcode 5 (SHL): A << 1 = 10100 = 20 (в 8 битах — 00010100): число удвоилось.

5. Opcode 6 (SHR): A >> 1 = 0101 = 5: число поделилось на 2.

Всё это вычисляется параллельно за один проход: на входы подали пару чисел, а мультиплексор по opcode просто переключил выход на нужный провод.

Флаг Zero

Отдельный выход АЛУ — флаг Zero. Он равен 1, когда результат равен нулю. Достигается это просто: результат подаётся на детектор нуля (BusZero), который выдаёт 1 только если на входе все биты равны 0. Зачем это нужно? По флагу Zero процессор понимает, что «ничего не вышло»: например, инструкция условного перехода JZ «перейти, если ноль» смотрит именно на этот сигнал.

Частые ошибки

Проверь себя

АЛУ выполняет операции по очереди?

Нет: внутри АЛУ все блоки (сумматор, И, ИЛИ…) считают одновременно, а мультиплексор по коду операции выбирает нужный результат.

Как АЛУ понимает, что результат — ноль?

Все восемь выходов суммы проходят через детектор нуля: если каждый бит равен 0, флаг Z становится 1.

Как из сложения получить вычитание?

Инвертировать биты вычитаемого и прибавить единицу — дополнительный код: A − B = A + (НЕ B) + 1.

Резюме

1. АЛУ — это параллельные вычислительные блоки плюс мультиплексор, который выбирает нужный результат.

2. Opcode 0–6 кодируют операции: ADD, AND, OR, XOR, NOT, SHL, SHR.

3. Сдвиг влево умножает число на 2, сдвиг вправо — делит на 2.

4. Каскад из шести мультиплексоров сводит семь параллельных результатов к одному.

5. Флаг Zero показывает, что результат равен нулю.

6. Схема «декодер → операции → MUX» — стандарт для любых АЛУ, от простых до суперскалярных.

На уровне 1.13 тебе предстоит собрать селектор операций из каскада мультиплексоров, а на уровне 1.14 — полное 8-битное АЛУ.

Попробовать в симуляторе →