Дешифратор инструкций: Переводчик процессора

Допустим, Счётчик команд достал из памяти байт с кодом 10100111. Для нас это просто набор единиц и нулей, но для процессора это команда. Однако как заставить эту команду физически выполнить работу? Как АЛУ узнает, что нужно именно складывать, а ОЗУ поймёт, что в него сейчас будут записывать данные?

Решение уровня «Анатомия дешифратора»: распознавание опкодов ADD, STA и JMP
Дешифратор команд: авторское решение уровня

За это отвечает Дешифратор инструкций (Instruction Decoder). Это комбинационная схема из логических вентилей, которая работает как идеальный переводчик. Она принимает на вход двоичный код команды (Opcode) и мгновенно превращает его в набор управляющих сигналов.

Например, дешифратор видит код команды «Сохранить в память» (STA). Он тут же активирует провод, который идёт к контакту Write Enable (разрешение записи) на чипе оперативной памяти, и одновременно выключает все другие ненужные модули. Дешифратор — это настоящий кукловод, который дёргает за нужные ниточки-провода, заставляя весь процессор синхронно выполнять волю программиста.

Из чего состоит инструкция

Байт инструкции в нашем компьютере делится пополам: старшие 4 бита (разряды 7–4) — это опкод, код операции; младшие 4 бита (разряды 3–0) — операнд, обычно адрес или значение. Четыре бита опкода дают 24 = 16 возможных команд — именно столько умеет закодировать наш процессор.

На уровне 1.17 дешифратор должен «узнавать» три команды: ADD = 0001 (0x10) — сложение, STA = 0110 (0x60) — запись в память, JMP = 0111 (0x70) — безусловный переход. Остальные коды на этом уровне просто не используются.

Распознавание через цепочки AND

Как схема понимает, что опкод равен 0110? Для каждой команды строится цепочка из вентилей AND, которая выдаёт 1 только для одного, нужного сочетания битов. Поскольку один AND принимает всего два входа, для проверки четырёх битов требуется цепочка из трёх AND.

В игре опкод снимается со Splitter: биты 4–7 байта — это и есть четыре бита команды. Чтобы проверить, что какой-то бит равен нулю, его сначала пропускают через инвертор NOT — на холсте уже стоят четыре готовых инвертора. Как байт инструкции вообще попадает на вход дешифратора, рассказывает статья про счётчик команд.

Таблица: опкод → управляющий сигнал

ОпкодКомандаСработавшие сигналы
0001 (0x10)ADDСигналов нет — АЛУ по умолчанию складывает (ALUOp = 00)
0110 (0x60)STAMemWr = 1 — разрешение записи в RAM
0111 (0x70)JMPJumpUncond = 1 — перезапись счётчика команд

Всего на выходе дешифратора пять сигналов: ALUOp0 и ALUOp1 (выбор операции АЛУ), MemWr (запись в память), а также JumpUncond и JumpCond (безусловный и условный переходы).

Числовой пример: расшифровываем 0x60

Возьмём байт 0x60 = 0110 0000. Старшие четыре бита — 0110 — это опкод STA, младшие — 0000 — операнд (адрес 0). Разберём по шагам, как дешифратор «узнаёт» STA.

1. Splitter разбирает байт на 8 битов; нас интересуют биты 4–7: 0, 1, 1, 0.

2. Чтобы биты, равные нулю, превратились в единицы, пропускаем их через NOT: ~bit0 = 1 и ~bit3 = 1.

3. Строим цепочку AND: (~bit0) AND bit1 AND bit2 AND (~bit3).

4. Подставляем значения: 1 AND 1 AND 1 AND 1 = 1 — на выходе MemWr появляется единица!

5. Процессор включает запись в RAM: байт из аккумулятора попадает на шину данных и сохраняется по адресу из операнда (0).

Заметь: для распознавания нуля нужен инвертор — поэтому без NOT цепочки не обойтись. На уровне 1.18 этот дешифратор встраивается в полный Harvard-компьютер: сигналы ALUOp управляют АЛУ, MemWr — памятью, а JumpUncond и JumpCond через OR подаются на вход Load счётчика команд.

Декодирование — мгновенное и параллельное

Вся магия дешифратора в том, что это чистая комбинационная логика: никаких тактов и ожидания. Как только байт инструкции появился на входе, сигналы на выходах устанавливаются за время прохождения через несколько вентилей — за доли такта. Все пять управляющих линий считаются одновременно, параллельно.

Именно связка «счётчик команд → память → дешифратор → исполнительные блоки» и есть цикл выполнения инструкции. О том, как адреса и данные ходят по шинам и почему провода не сталкиваются, читай статью «Конфликт на шине».

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

Резюме

1. Байт инструкции = опкод [7:4] + операнд [3:0]; четыре бита опкода кодируют до 16 команд.

2. Дешифратор — комбинационная схема, превращающая опкод в управляющие сигналы.

3. В игре распознаются опкоды ADD (0x10), STA (0x60) и JMP (0x70) цепочками AND и NOT.

4. STA включает MemWr (запись в RAM), JMP включает JumpUncond (перезапись PC), а ADD не включает ничего — АЛУ по умолчанию складывает.

5. На выходе дешифратора пять сигналов: ALUOp0, ALUOp1, MemWr, JumpUncond, JumpCond.

6. На уровне 1.18 дешифратор становится частью полного компьютера Ершова.

На уровне 1.17 тебе предстоит собрать логику распознавания трёх опкодов из цепочек AND и NOT, а на уровне 1.18 встроить готовый дешифратор в полный компьютер Ершова.

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