Уровень 14: Сердце математики
Открыть уровень →Где это в машине →
Задание
Соберите 8-битное АЛУ (ADD, AND, OR, XOR, NOT, SHL, SHR). Подсказка: декодер → операции → MUX.
АЛУ (арифметико-логическое устройство) — сердце любого процессора. Оно выполняет 7 операций над двумя 8-битными числами.
Главная идея уровня: масштаб берётся архитектурой, а не размером схемы: декодер превращает код операции в управляющие сигналы, операции работают параллельно, MUX выбирает результат, флаг Zero сообщает о нуле. Приём «декодер → операции → MUX» повторит и блок управления процессора.
Материалы по теме
- АЛУ: Сердце математики
- ALU8 — арифметико-логическое устройство
Решение для самопроверки
Сначала попробуйте собрать схему сами. Решение ниже — способ свериться, если застряли или уже справились.
Подсказка в игре на этом уровне вставляет каркас: схема без одного провода — выхода BusOR в каскад мультиплексоров. Провод нужно замкнуть самому: без него операция OR выдаёт мусор, и сразу видно, зачем декодер управляет выбором.
Работайте в три этапа:
Этап 1 — декодирование: Вход Opcode (число 0-6) говорит, какую операцию выполнить. Разберите Opcode через Splitter на биты — они понадобятся для управления мультиплексорами.
Этап 2 — вычисление: Запустите все 7 операций параллельно. Электрические токи текут по всем 7 блокам одновременно: каждый блок непрерывно вычисляет свой результат, а каскад BusMUX в конце выбирает нужный. Ничего не «вызывается» по очереди — вся математика идёт параллельно, каждое мгновение. Поставьте на холст и подайте входы A и B на каждый блок: - ADDER8 (сложение: A+B) - BusAND (побитовое И: A&B) - BusOR (побитовое ИЛИ: A|B) - BusXOR (побитовое XOR: A^B) - BusNOT (побитовое НЕ: ~A — нужен только вход A) - BusSHL (сдвиг влево: A<<1) - BusSHR (сдвиг вправо: A>>1)
Этап 3 — выбор: Постройте каскад из 6 BusMUX. Первый уровень выбирает в парах (ADD/AND, OR/XOR, NOT/SHL), второй и третий уровни сводят к одному результату. Выход последнего MUX — это Result.
Не забудьте про выход Zero: подключите Result к BusZero — его выход покажет 1, когда Result=0.
Про границу диапазона: 100+100 даёт Result=200 и Carry=0 — для беззнаковых чисел (0–255) это верный ответ. Но если старший бит считать знаковым (дополнительный код), 200 читается как −56: это знаковое переполнение. Перенос (выход за границу 255) и переполнение знака — разные события: вектор 200+100 ловит первый, вектор 127+1 — второй.