Skip to content

Устройство управления II: микрокод в ПЗУ

Паспорт модуля

ПараметрЗначение
Аудитория🟡🔴; пройден М11
Аутентичная задачазашить полную систему команд Я74-ISA в ПЗУ и получить машину, поведение которой меняется перепрошивкой, а не перепайкой
Объём5 занятий × 90 мин
Оборудование2× EEPROM 28C256 (или NOR-flash SST39SF010A — современный резерв BOM), панельки, RP2350-программатор (М10), Python
Ограничения5 В; прошивка EEPROM — только в панельке на программаторе, не в схеме
Аутентичная задача. После модуля обучающиеся смогут: спроектировать слово управления, сгенерировать прошивку микрокода скриптом, прошить ПЗУ и доказать трассой RP2350, что каждая команда ISA исполняет ровно свою таблицу из М11.

Цели

Обучающиеся …Блум—АндерсонМиллерПроверка
1проектируют формат слова управления и карту адресов ПЗУсоздаватьделаетзащита формата
2кодируют таблицу микроопераций в Python-генераторе прошивкиприменять/создаватьделаетревью кода + прошивка
3реализуют условные переходы JC/JZ через флаги в адресе ПЗУанализировать/создаватьделаеттест-программы «ветвление»
4верифицируют микрокод трассой и локализуют ошибку в таблицеанализироватьпоказывает какдебаг-кейс

Ключевые проектные решения (worked example)

Слово управления (16 бит, конвенция курса, две EEPROM по 8 бит):

БитСигналБитСигнал
15HLT7AI (A слушает)
14MI (MAR слушает)6AO (A говорит)
13RI (RAM пишет)5ΣO (АЛУ говорит)
12RO (RAM говорит)4SU (вычитание)
11IO (IR-операнд говорит)3BI (B слушает)
10II (IR слушает)2OI (OUT слушает)
9CE (PC считает)1CO (PC говорит)
8J (PC грузится)0FI (флаги защёлкнуть)

Адрес ПЗУ (9 бит): A8..A7 = флаги Z,C | A6..A3 = опкод | A2..A0 = такт T. Условный переход — это просто четыре варианта таблицы: для JC при C=0 микрокод — «ничего» (CE уже сделан в Fetch), при C=1 — IO, J. Ветвление без единого вентиля сравнения — сильнейший «ага-момент» курса.

Фрагмент генератора прошивки (Python):

HLT,MI,RI,RO,IO,II,CE,J = (1<<15,1<<14,1<<13,1<<12,1<<11,1<<10,1<<9,1<<8)
AI,AO,SO,SU,BI,OI,CO,FI = (1<<7,1<<6,1<<5,1<<4,1<<3,1<<2,1<<1,1<<0)

FETCH = [CO|MI, RO|II|CE]
UCODE = {
  0x01: FETCH + [CO|MI, RO|MI|CE, RO|AI, 0],          # LDA
  0x02: FETCH + [CO|MI, RO|MI|CE, RO|BI, SO|AI|FI],   # ADD
  0x06: FETCH + [IO|J, 0, 0],                          # JMP: операнд из IR -> PC
  0x0F: FETCH + [HLT, 0, 0, 0],                        # HLT
}
rom = bytearray(512)
for flags in range(4):
    for op, steps in UCODE.items():
        for t, word in enumerate(steps):
            addr = (flags << 7) | (op << 3) | t
            rom[addr] = (word >> 8) & 0xFF   # чип HI; для чипа LO: word & 0xFF

(Полный листинг — в файлах комплекта; учебная ценность — обучающиеся дописывают JC/JZ и SUB сами.)

Оценивание

Контрольные точки: защита формата слова (зан. 1); ревью генератора + первая прошивка (зан. 3); тест-набор из 4 программ: счёт до HLT, ветвление по C, ветвление по Z, «ловушка» с намеренно испорченной строкой микрокода — найти по трассе (зан. 5, итоговое, протокол обязателен).

Типичные ошибки: перепутаны старшая/младшая EEPROM — половина сигналов «чужие» (симптом: MI активен, когда ждали AI; диагностируется трассой за минуты); активные уровни: RI у RAM активен низким, а в слове — единица (согласовать инверторами на выходе ПЗУ, задокументировать); флаги защёлкиваются не тем тактом (FI обязан стоять в такте самой операции АЛУ, иначе JC прыгает по прошлой команде — классическая ошибка и красивый разбор причинности); прошивка EEPROM «в схеме» — конфликт с шиной.

Уровни

Глоссарий