29. Программный счётчик (PC)
29. Программный счётчик (PC)
🎯 Цель урокаПонять и собрать Program Counter — регистр, хранящий адрес текущей инструкции.
🎮 Фаза 1: Симулятор (10 мин)
Turing Complete
Пройди уровни с Program Counter — пойми как процессор “знает” какую команду выполнять.
🧠 Фаза 2: Теория (15 мин)
Что такое Program Counter?
PC (Program Counter) — специальный регистр, содержащий адрес следующей инструкции.
Память программ:
Адрес Инструкция
─────────────────────
0000 LOAD A, 5 ◄── PC = 0000
0001 LOAD B, 3
0002 ADD
0003 STORE C
0004 HALT
Операции PC
| Операция | Описание | Когда |
|---|---|---|
| PC++ | Инкремент | После каждой инструкции |
| PC = addr | Загрузка | Команды перехода (JMP) |
| PC = 0 | Сброс | При старте/сбросе |
Цикл выполнения инструкции
┌──────────────────────────────────────────────────┐
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
└─►│ FETCH │───►│ DECODE │───►│ EXECUTE │──────┘
│ │ │ │ │ │
│ PC → MAR│ │ IR анализ│ │ ALU/Mem │
│ Mem → IR│ │ │ │ PC++ │
└─────────┘ └─────────┘ └─────────┘
Структура PC
┌─────────────────────────────────────┐
│ │
D ───┤ │
(8) │ PC Register ├─── Q (8)
│ (74ACT377) │ │
Load ──┤ │ │
│ │ │
CLK ──┤► │ │
└─────────────────────────────────────┘ │
│
┌─────────────────────────────┘
│
▼
┌─────────────┐
│ 74HC283 │
│ +1 ├─── PC+1
└─────────────┘
│
┌────────────┴────────────┐
│ │
▼ ▼
┌─────────┐ ┌─────────┐
│ Jump │ │ Normal │
│ Address │ │ (PC+1) │
└────┬────┘ └────┬────┘
│ │
│ ┌─────────┐ │
└────┤ MUX ├─────────┘
│ (JMP?) │
└────┬────┘
│
▼
D вход PC
🔧 Фаза 3: Собираем PC (25 мин)
Компоненты
| Компонент | Количество | Назначение |
|---|---|---|
| 74ACT377 | 1 | 8-бит регистр PC |
| 74HC283 | 1 | Инкремент +1 |
| 74HC157 | 2 | MUX для JMP |
| Кнопки | 3 | CLK, JMP, RESET |
| DIP-переключатель 8-поз | 1 | Jump Address |
| LED | 8 | Значение PC |
Схема PC с инкрементом
┌─────────────────────────────────────────────────────┐
│ │
│ ┌───────────────────────────────────────────────┐ │
│ │ │ │
│ │ 74ACT377 (PC) │ │
│ │ │ │
│ │ D0-D7 ◄────────────────────────────────┐ │ │
│ │ │ │ │
│ │ Q0-Q7 ───────────────────────┬─────────┼───┼──┴── LED × 8
│ │ │ │ │
│ │ ~EN ◄── GND │ │ │
│ │ CLK ◄── кнопка STEP │ │ │
│ │ │ │ │
│ └────────────────────────────────┼─────────┼───┘
│ │ │
│ ▼ │
│ ┌───────────┐ │
│ │ 74HC283 │ │
│ 1 ──┤ B = 1 │ │
│ │ A = Q │ │
│ │ │ │
│ │ Σ = Q+1 ├────┴── PC+1
│ └───────────┘
│ │
│ ┌─────────────────────────┘
│ │
│ │ JMP Address (DIP)
│ │ │
│ ▼ ▼
│ ┌─────────────────────────────────┐
│ │ 74HC157 × 2 │
│ │ (MUX) │
│ │ │
│ │ S ◄── JMP signal │
│ │ │
│ │ A ◄── PC+1 (normal) │
│ │ B ◄── JMP Addr (jump) │
│ │ │
│ │ Y ─────────────────────────────┼──► D входы PC
│ └─────────────────────────────────┘
│
└─────────────────────────────────────────────────────
Соединения
74ACT377 (PC Register):
D0-D7 ── от MUX
Q0-Q7 ── к LED и к 74HC283
CLK ── кнопка STEP
~EN ── GND
74HC283 (Incrementer):
A1-A4 ── Q0-Q3 от PC
B1-B4 ── 0001 (константа 1)
C0 ── GND
Σ1-Σ4 ── к MUX (PC+1 low)
C4 ── к второму 74HC283 или игнорируем
Для 8 бит: два 74HC283 каскадом (C4 первого → C0 второго)
74HC157 × 2 (MUX):
S ── JMP сигнал
A inputs ── PC+1 (от 74HC283)
B inputs ── Jump Address (от DIP)
Y outputs ── D входы PC
Проверка
- RESET: Установи DIP = 00000000, нажми JMP → PC = 0
- INCREMENT: Нажимай STEP → PC = 1, 2, 3, 4…
- JUMP: Установи DIP = 00001010 (10), нажми JMP → PC = 10
- Continue: Нажимай STEP → PC = 11, 12, 13…
💡 Условные переходы
JMP vs JZ (Jump if Zero)
JMP — безусловный переход:
PC = Jump_Address
JZ — переход если Z=1:
if (Z_flag == 1) then PC = Jump_Address
else PC = PC + 1
Схема условного перехода
Z_flag ───────────┐
│
JMP_opcode ───────┼──► AND ──► JMP_enable
│
│
JZ_opcode ────────┘
📝 Мини-задания
✅ Чеклист
- Понимаю роль PC в процессоре
- Собрал PC с инкрементом
- Реализовал загрузку адреса (JMP)
- Проверил последовательный и произвольный переход
