Уровень 17: Анатомия дешифратора
Открыть уровень →Где это в машине →
Задание
Соберите логику распознавания 3 опкодов (ADD, STA, JMP) для дешифратора. На выходах LED-индикаторы покажут, какая линия активна.
Дешифратор команд превращает код инструкции в управляющие сигналы. На холсте уже есть каркас: - Splitter (pre:spl) — разбирает входную шину Instr на 8 битов. - 4 инвертора NOT: ~Bit0 (pre:not0), ~Bit1 (pre:not1), ~Bit2 (pre:not2), ~Bit3 (pre:not3).
Главная идея уровня: опкод — это просто биты, и распознать его значит собрать конъюнкцию нужных битов и отрицаний ненужных: каждая команда активирует ровно одну линию дешифратора. По этим линиям потом пойдут управляющие сигналы процессора.
Материалы по теме
- Дешифратор инструкций: Переводчик процессора
- Decoder — дешифратор команд
Решение для самопроверки
Сначала попробуйте собрать схему сами. Решение ниже — способ свериться, если застряли или уже справились.
Вход Instr — это байт. Биты 4-7 содержат команду (opcode): - ADD = 0001 (opcode 1, hex 0x10). - STA = 0110 (opcode 6, hex 0x60) — запись в память. - JMP = 0111 (opcode 7, hex 0x70) — безусловный переход.
Метафора — замок и ключ: AND-цепочка открывается единственным битовым паттерном, как замок — единственным ключом. Прямые биты проверяют «здесь должна быть единица», а NOT ставят там, где ожидаем нули: инвертированный ноль превращается в единицу и «подтверждает» замок.
Ваша задача: добавить AND-элементы, чтобы «узнавать» эти коды. Для каждого опкода нужна цепочка из трёх AND (один AND принимает только 2 входа, а нужно проверить 4 бита).
═══════ STA (opcode 6 = 0110) → выход MemWr ═══════ Нужно, чтобы срабатывало, когда: Bit0=0, Bit1=1, Bit2=1, Bit3=0.
AND#1: вход A = pre:not0 (~Bit0), вход B = Splitter.Bit5 (Bit1 опкода). AND#2: вход A = выход AND#1, вход B = Splitter.Bit6 (Bit2 опкода). AND#3: вход A = выход AND#2, вход B = pre:not3 (~Bit3). Выход AND#3 подключите к выходу MemWr.
═══════ JMP (opcode 7 = 0111) → выход JumpUncond ═══════ Нужно, чтобы срабатывало, когда: Bit0=1, Bit1=1, Bit2=1, Bit3=0.
AND#4: вход A = Splitter.Bit4 (Bit0 опкода), вход B = Splitter.Bit5 (Bit1). AND#5: вход A = выход AND#4, вход B = Splitter.Bit6 (Bit2). AND#6: вход A = выход AND#5, вход B = pre:not3 (~Bit3). Выход AND#6 подключите к выходу JumpUncond.
═══════ ADD (opcode 1 = 0001) ═══════ Все выходы должны быть 0 — просто ничего не подключайте к ALUOp0, ALUOp1, JumpCond. Неподключённый Output всегда читается как 0.