Уровень 18: ФИНАЛ: Компьютер Ершова
Открыть уровень →Где это в машине →
Задание
Соберите 8-битный компьютер! Гарвардская архитектура: ROM(инструкции) + RAM(данные) + PC + Register + ALU + Decoder + Clock.
Финальный уровень — соберите полноценный 8-битный компьютер с Гарвардской архитектурой!
Главная идея уровня: процессор — не новая деталь, а соединение собранных блоков: ROM держит программу, PC шагает по инструкциям, дешифратор расшифровывает, АЛУ и аккумулятор считают. Компьютер заработает на той же логике, что строилась с первого уровня.
Материалы по теме
Трассировка одной инструкции
Схема собрана — теперь пройдите по ней вместе с одной командой. Возьмём LDA 5: «прочитай ячейку 5 памяти данных в регистр». Пусть в RAM[5] лежит число 42, а команда записана в ROM по адресу 3 — счётчик команд сейчас равен 3.
- Где лежит команда. Такт Clock — и счётчик команд выдаёт на адресный вход ROM число 3. Из ячейки ROM[3] выходит байт команды.
- Как команда разбирается. Splitter режет байт пополам: старшие биты 4–7 — код операции (для LDA), младшие биты 0–3 — операнд, число 5.
- Как команда распознаётся. Дешифратор получает код операции и включает ровно один выход — линию LDA. Остальные линии (ADD, STA, JMP) молчат. Это тот самый «кодовый замок» из уровня 17.
- Какие данные читаются. Операнд 5 идёт на адресный вход RAM. Память данных по адресу 5 отдаёт на шину число 42.
- Что меняется в регистре. Сигнал LDA открывает MUX на пути к Register8 — тот самый переключатель из уровня 9, — и после фронта такта в регистре оказывается 42: путь RAM → шина → MUX → регистр.
- Почему PC переходит дальше. Никакой сигнал перехода не включён: константа 1 на входе сумматора прибавляется к счётчику, и после такта PC = 4 — процессор готов забирать следующую команду.
Пройдите этот путь ещё раз сами — мышкой по своей схеме, от ROM до Register8. Когда получится рассказать его без подсказки, попробуйте предсказать следующий шаг: что изменится для STA 6, если в регистре уже лежит 42? На какой линии дешифратора появится сигнал и куда в этот раз пойдёт шина? Проверить предсказание можно запуском программы из трёх команд: LDA 5, STA 6, HLT.
Что происходит с программой: от кода к байтам
Вкладка «Ассемблер» на этом уровне открывается уже с заготовленной программой (и серый шаблон в пустом редакторе — это просто подсказка, а не код). Строки, начинающиеся с ; — комментарии: ассемблер их пропускает, они нужны только вам. Разберём, что происходит с программой после нажатия «Выполнить».
Ассемблер превращает каждую строку программы в один байт и записывает байты в ROM подряд, с адреса 0. В каждом байте старшие биты 4–7 — код операции (ADD = 1, LDA = 5, STA = 6, HLT = 15), младшие биты 0–3 — операнд. Именно эти байты ваша схема потом разбирает: Splitter отрезает код операции для дешифратора, операнд уходит на адрес RAM или в АЛУ.
Пример программы с комментариями:
; Складываем 5 и 3, результат остаётся в RAM[0]
LDA 5 ; байт 0x50: число 5 попадает в регистр
ADD 3 ; байт 0x13: регистр = 5 + 3 = 8
STA 0 ; байт 0x60: результат 8 записывается в RAM[0]
HLT ; байт 0xF0: процессор останавливается
После нажатия «Выполнить» в ROM лягут четыре байта: 50 13 60 F0 (в шестнадцатеричном виде — это видно в редакторе ROM). Запустите такты — и по схеме должен пройти такой путь: PC=0 → ROM отдаёт 0x50 → дешифратор включает линию LDA → в регистр записывается 5; далее ADD прибавляет 3, STA пишет 8 в RAM[0], HLT останавливает тактирование. Итог на выходе: в регистре (ACC) — 8, в RAM[0] — 8, счётчик команд замирает на адресе 4. Панель отладки под редактором показывает PC, ACC и содержимое RAM — по ним удобно сверять каждый такт.
Проверка уровня убеждается, что программу исполняет именно ваша схема: блоки на месте, Clock подключён к PC, запись в RAM разрешена, и программа в ROM реально прокручивается тактами.
Решение для самопроверки
Сначала попробуйте собрать схему сами. Решение ниже — способ свериться, если застряли или уже справились.
Подсказка в игре на этом уровне вставляет каркас: схема без двух проводов — такта Clock на счётчик команд и линии записи RAM. Провода нужно замкнуть самим: без них процессор не тактируется и не запоминает — два ключевых принципа финального уровня.
Основной цикл процессора: Clock → PC (счётчик команд) → ROM (память команд) → Decoder (дешифратор) → Register + ALU → RAM (память данных).
Соберите основные блоки:
1. ProgramCounter — готовый блок из палитры. Выход PC подайте на адресный вход ROM.
2. ROM — память команд (256 байт). На вход Addr подаётся адрес от PC, на выходе Data — байт инструкции.
3. Splitter — разберите выход ROM на две части: - Биты 4-7 → Opcode (код команды). - Биты 0-3 → Operand (операнд, например адрес или значение).
4. Decoder — распознаёт Opcode и выдаёт 5 управляющих сигналов. Готового блока «Decoder» в палитре на этом уровне нет — соберите его сами из вентилей NOT и AND (чекпойнт требует минимум 2 NOT и 2 AND), как «кодовый замок» на уровне 17: по битам opcode, при нужной комбинации открывается ровно одна линия. Сигналы: - ADD — АЛУ складывает (регистр загружает результат). - LDA — в АЛУ подаётся константа-операнд через мультиплексор. - STA (MemWr) — разрешение записи в RAM. - JMP — безусловный переход. - JZ — условный переход (результат АЛУ = 0). Для переходов: PC.Load = JMP OR (JZ AND Zero), где Zero — флаг нуля с выхода АЛУ.
5. Register8 — хранит промежуточный результат. Данные берутся с выхода АЛУ или из RAM.
6. ALU — выполняет операции над операндом и регистром.
7. RAM — оперативная память (256 байт). Читает/пишет данные по адресу из операнда инструкции.
После сборки откройте вкладку «Ассемблер» — программа с комментариями уже заготовлена в редакторе. Нажмите «Выполнить» и запускайте такты. Ожидаемый результат: ACC = 8, RAM[0] = 8.