Устройство управления II: микрокод в ПЗУ
Паспорт модуля
| Параметр | Значение |
|---|---|
| Аудитория | 🟡🔴; пройден М11 |
| Аутентичная задача | зашить полную систему команд Я74-ISA в ПЗУ и получить машину, поведение которой меняется перепрошивкой, а не перепайкой |
| Объём | 5 занятий × 90 мин |
| Оборудование | 2× EEPROM 28C256 (или NOR-flash SST39SF010A — современный резерв BOM), панельки, RP2350-программатор (М10), Python |
| Ограничения | 5 В; прошивка EEPROM — только в панельке на программаторе, не в схеме |
Цели
| № | Обучающиеся … | Блум—Андерсон | Миллер | Проверка |
|---|---|---|---|---|
| 1 | проектируют формат слова управления и карту адресов ПЗУ | создавать | делает | защита формата |
| 2 | кодируют таблицу микроопераций в Python-генераторе прошивки | применять/создавать | делает | ревью кода + прошивка |
| 3 | реализуют условные переходы JC/JZ через флаги в адресе ПЗУ | анализировать/создавать | делает | тест-программы «ветвление» |
| 4 | верифицируют микрокод трассой и локализуют ошибку в таблице | анализировать | показывает как | дебаг-кейс |
Ключевые проектные решения (worked example)
Слово управления (16 бит, конвенция курса, две EEPROM по 8 бит):
| Бит | Сигнал | Бит | Сигнал |
|---|---|---|---|
| 15 | HLT | 7 | AI (A слушает) |
| 14 | MI (MAR слушает) | 6 | AO (A говорит) |
| 13 | RI (RAM пишет) | 5 | ΣO (АЛУ говорит) |
| 12 | RO (RAM говорит) | 4 | SU (вычитание) |
| 11 | IO (IR-операнд говорит) | 3 | BI (B слушает) |
| 10 | II (IR слушает) | 2 | OI (OUT слушает) |
| 9 | CE (PC считает) | 1 | CO (PC говорит) |
| 8 | J (PC грузится) | 0 | FI (флаги защёлкнуть) |
Адрес ПЗУ (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, итоговое, протокол обязателен).