Уровень 22: Конфликт на шине

Открыть уровень →Где это в машине →

Задание

Исправьте конфликт на шине данных: RAM и Gamepad одновременно выдают данные. Добавьте AddrDecoder и BusAND, чтобы RAM выходила на шину только по своему адресу.

Когда на шине данных встречаются два устройства (RAM и Gamepad), возникает конфликт: оба пытаются выдать данные одновременно.

Главная идея уровня: у каждого устройства на шине своё «окно» в адресном пространстве: дешифратор адреса открывает выход только у выбранного устройства, и в каждый момент на шине говорит только один. Шина — общая дорога, и правила движения задаёт дешифратор адреса.

Материалы по теме

Решение для самопроверки

Сначала попробуйте собрать схему сами. Решение ниже — способ свериться, если застряли или уже справились.

Шина данных — это пучок медных проводов, по которым одновременно может «кричать» только одно устройство. Если RAM и геймпад выдают данные одновременно — это короткое замыкание: сигналы физически дерутся на проводах. BusAND решает проблему электрически: он «заглушает» неактивное устройство, умножая его данные на нулевую маску, — на шину выходит тишина.

AddrDecoder решает эту проблему: - Адреса 0–223 (0x00–0xDF) → RAM (RAM_SEL=1) - Адреса 224–255 (0xE0–0xFF) → I/O-устройства (IO_SEL=1)

AddrDecoder выдаёт два сигнала: - RAM_SEL8 (bus8) — маска для данных RAM (0xFF, когда выбрана RAM, и 0x00, когда I/O) - IO_SEL (bit) — флаг обращения к порту ввода-вывода

Задачи: 1. BusConstant = 2 → PC.Inc. 2. ROM#1 → RAM.Addr. 3. ROM#1 → AddrDecoder.Addr (чтобы дешифратор знал, к какому адресу обращается инструкция). 4. Подключите шину данных к ALU8.B: RAM.DataOut → BusAND.A, AddrDecoder.RAM_SEL8 → BusAND.B, затем BusAND.Q → BusOR, и далее к ALU8.B.

Эта цепочка (RAM → BusAND → BusOR) обнуляет данные RAM, когда адрес принадлежит I/O-устройству, и снимает конфликт на шине.

Схема решения уровня 22 — Конфликт на шине
Авторское решение уровня 22 в симуляторе (тёмная тема)