31. Блок управления
31. Блок управления (Control Unit)
🎯 Цель урокаПонять как декодируются инструкции и генерируются управляющие сигналы.
🧠 Фаза 2: Теория (20 мин)
Роль блока управления
Control Unit — “дирижёр” процессора:
- Читает инструкцию из памяти
- Декодирует её (понимает что делать)
- Генерирует сигналы для всех компонентов
┌─────────────────────────────────────────────────────────┐
│ CONTROL UNIT │
│ │
│ Instruction ──►[Decoder]──► Control Signals │
│ │
│ CLK ──►[Sequencer]──► Timing │
│ │
│ Flags ──►[Logic]──► Conditional Branching │
│ │
└─────────────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────┐
│ УПРАВЛЯЮЩИЕ СИГНАЛЫ │
├────────────────────────────────────────┤
│ PC_inc, PC_load, Reg_A_en, Reg_B_en, │
│ ALU_op, Mem_read, Mem_write, ... │
└────────────────────────────────────────┘
Формат инструкции
Простая 8-битная инструкция:
7 6 5 4 3 2 1 0
┌──┬──┬──┬──┬──┬──┬──┬──┐
│ OPCODE │ OPERAND │
└──┴──┴──┴──┴──┴──┴──┴──┘
└────┬────┘ └────┬────┘
4 бита 4 бита
код операции аргумент
Набор инструкций
| Opcode | Мнемоника | Описание |
|---|---|---|
| 0000 | NOP | Ничего не делать |
| 0001 | LDA n | Загрузить n в A |
| 0010 | LDB n | Загрузить n в B |
| 0011 | ADD | A = A + B |
| 0100 | SUB | A = A - B |
| 0101 | OUT | Вывести A |
| 0110 | JMP addr | Перейти к адресу |
| 0111 | JZ addr | Перейти если Z=1 |
| 1111 | HLT | Остановить |
Микрооперации
Каждая инструкция состоит из микроопераций (шагов):
Инструкция ADD (OPCODE = 0011):
Шаг 0 (Fetch):
PC_out = 1 ; PC на адресную шину
Mem_read = 1 ; Читать память
IR_load = 1 ; Загрузить в регистр инструкций
PC_inc = 1 ; PC++
Шаг 1 (Execute):
RegA_out = 1 ; A на шину (к ALU)
RegB_out = 1 ; B на шину (к ALU)
ALU_op = ADD ; Операция сложения
RegA_load = 1 ; Результат в A
Шаг 2:
Reset_step ; Следующая инструкция
🏗️ Архитектура Control Unit
Вариант 1: Hardwired (на логике)
┌─────────────────────────────────────────────────────┐
│ │
│ OPCODE[3:0] ──► [74HC138] ──► Сигнал инструкции │
│ Decoder │
│ │ │
│ ▼ │
│ STEP[1:0] ────► [Комбинационная] ──► Control │
│ (от счётчика) логика (AND/OR) Signals │
│ │
│ FLAGS ────────► │
│ │
└─────────────────────────────────────────────────────┘
Вариант 2: Микропрограммный
┌─────────────────────────────────────────────────────┐
│ │
│ OPCODE + STEP ──► [ROM/EEPROM] ──► Control Word │
│ (адрес) (таблица) (сигналы) │
│ │
└─────────────────────────────────────────────────────┘
ROM содержит "микропрограмму" для каждой инструкции
🔧 Фаза 3: Hardwired Control Unit (25 мин)
Компоненты
| Компонент | Количество | Назначение |
|---|---|---|
| 74HC138 | 1 | Декодер opcode (3:8) |
| 74HC00 | 2 | NAND для логики |
| 74HC32 | 1 | OR для логики |
| 74HC161 | 1 | Счётчик шагов |
| LED | 8 | Индикация сигналов |
Схема декодера инструкций
OPCODE[2:0] ──► 74HC138 ──► Instruction Lines
│
├── I0 (NOP)
├── I1 (LDA)
├── I2 (LDB)
├── I3 (ADD)
├── I4 (SUB)
├── I5 (OUT)
├── I6 (JMP)
└── I7 (JZ)
Счётчик микрошагов
74HC161 (4-bit counter):
CLK ──► счёт 0, 1, 2, 3, 0, 1, 2, 3, ...
Q[1:0] = номер микрошага (Step 0-3)
Reset: при завершении инструкции
Генерация сигналов
Пример: сигнал RegA_load
RegA_load = (I1 AND Step1) ; LDA: загрузить в A
OR (I3 AND Step1) ; ADD: результат в A
OR (I4 AND Step1) ; SUB: результат в A
Схема:
I1 ──┐
├─► AND ─┐
S1 ──┘ │
├─► OR ──► RegA_load
I3 ──┐ │
├─► AND ─┤
S1 ──┘ │
│
I4 ──┐ │
├─► AND ─┘
S1 ──┘
Таблица управляющих сигналов
| Step | Сигнал | NOP | LDA | LDB | ADD | SUB | OUT | JMP |
|---|---|---|---|---|---|---|---|---|
| 0 | PC_out | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 0 | Mem_rd | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 0 | IR_load | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 0 | PC_inc | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
| 1 | A_load | 0 | 1 | 0 | 1 | 1 | 0 | 0 |
| 1 | B_load | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
| 1 | OUT_en | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
| 1 | PC_load | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 1 | ALU_sub | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
💡 Микропрограммный вариант (EEPROM)
Вместо логических элементов используем ROM:
Адрес ROM = {OPCODE[3:0], STEP[1:0]}
ROM[адрес] = {PC_out, Mem_rd, IR_load, PC_inc,
A_load, B_load, OUT_en, ALU_sub, ...}
Пример:
ROM[0x30] = 0b11110000 ; ADD, Step 0: Fetch
ROM[0x31] = 0b00001000 ; ADD, Step 1: Execute
Преимущество: легко менять набор инструкций (перепрограммировать ROM).
📝 Мини-задания
✅ Чеклист
- Понимаю роль Control Unit
- Знаю формат инструкции
- Могу составить таблицу микроопераций
- Понимаю разницу hardwired vs микропрограммный
