A fistful of relays. Частина 3 — декодер команд і керуючий автомат

Моя колекція старих комп'ютерів поповнюється не дуже швидко, тому я роблю старий комп'ютер своїми руками.

Він працює повністю на електромагнітних реле і буде складатися з чотирьох блоків.
На сьогоднішній день я закінчив вже три з них: АЛУ, регістровий файл і керуючий модуль, який декодує інструкції роздає іншим блокам вказівки що робити.

Теплий ламповий клацаючий звук тактового генератора:



Архітектура
Спочатку я думав над гарвардською архітектурою для комп'ютера, але потім вирішив, що дані зручніше буде вводити з того ж ПЗУ, що і програми. Тож тепер у мене буде 8-бітна шина адреси і 16-бітна шина даних. Всі 16 біт використовуються для читання коду інструкції для передачі двох операндів в АЛУ. Дані ж прочитуються в регістр через молодші 8 біт цієї шини.

Всі інструкції мають однакову ширину, тому їх читання вийшло зовсім простим — досить заклацнути те, що прийшло по шині даних. При цьому ті ж самі реле частково виконують функції декодування інструкцій, адже в кожному з них по 4 перемикача.



В результаті завантаженням, зберіганням і декодуванням коду інструкції займаються всього 46 реле, що менше, ніж у HPRC, який я використовував як зразок.

Кожна інструкція виконується за 10 тактів. Так багато потрібно, тому що реле не можуть спрацьовувати по фронту сигналу як мікросхеми з кількома паралельними входами. Доводиться виділяти цілий такт на защелкивание результату, наприклад. Деяким командам потрібно на 1-2 такти менше, але я не став ускладнювати схему, тому ці 10 тактів пробігають завжди:



Система команд
Команди процесора схожі на ARM — результат обчислень можна помістити в будь-який регістр. Наприклад, можлива така шалена операція XOR PC, A, B. При виклику функції адреса повернення кладеться в регістр L (link register). Звернення до пам'яті тільки за допомогою окремих інструкцій завантаження (але пам'яті все одно поки немає).

Зате, на відміну від ARM, ширина коду інструкції значно більше ширини регістрів. Завдяки цьому всі завантаження констант, адрес, а також переходи кодуються однією інструкцією.

Є прапори умовного виконання для переходів — можна перевіряти знак результату обчислень, рівність нулю і переповнення. Інструкції MOV, CALL і JUMP кодуються майже однаково, так і роблять майже одне і те ж. JUMP — це просто пересилання значення в PC. Тому є приємний побічний ефект — для MOV також працює можливість умовного виконання. Тобто можна виконати (чи не виконати) MOV NZ, A, 255.

Крім завантажень і пересилок керуючий модуль вміє підключати регістри до АЛУ і отримувати результат з нього. АЛУ робить додавання, віднімання, OR, XOR, AND, NOT, різні зрушення на 1 біт. Причому в інструкціях АЛУ є прапор, який відключає запис результату. Тобто команда працює як CMP або TEST на x86, але при цьому можна вибрати будь-яку операцію. Наприклад, перевірити прапори, як якщо б виконався OR, але не псувати ніяких регістрів.

А тепер спробуємо з усім цим злетіти
Зараз у комп'ютера немає ніякої пам'яті крім регістрів, тому виконувану інструкцію можна набрати за допомогою тумблерів. Зате потім він може робити її до нескінченності:



Підтримуються дві частоти тактових імпульсів. Більш повільний режим потрібен для спостереження за тим, що відбувається усередині комп'ютера:



Ніякої відладчик не потрібен — дамп регістрів зчитується просто очима:



Що потім?
Далі залишилося реалізувати запам'ятовуючі пристрої. Зараз вже готовий корпус для модуля, де вони будуть розташовуватися, так що скоро можна буде запустити програму відразу з декількох інструкцій.



Сторінка проекту на github: github.com/Dovgalyuk/Relay
Перша частина опису: https://habrahabr.ru/post/220865/
Друга частина опису: https://habrahabr.ru/post/258337/
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.