Pull to refresh

A fistful of relays. Часть 2 — Регистровый файл

Abnormal programming *
Прошло уже больше года, с тех пор как я начал писать о разработке компьютера на электромагнитных реле. Сегодня я закончил работу над вторым модулем компьютера — регистровым файлом.



Сейчас уже стало понятно, что компьютер будет состоять из 4 блоков: АЛУ, регистровый файл, управляющий блок, блок памяти и периферии.

Блок регистров устроен проще всего — в каждом регистре по 8 реле для хранения битов, реле для сброса и несколько реле для подключения регистра к шине.



Но все же первым я сделал АЛУ, чтобы разобраться с построением логических схем на реле. К тому же, при этом сразу получился 8-битный калькулятор, который теперь иногда включают коллеги (с недавних пор компьютер переехал ко мне на работу).

Как реле сохраняет данные


Обычно реле не используется для хранения данных, а только коммутирует сигналы. Но если добавить в его работу обратную связь, то результате может получиться RS-триггер. Чтобы однажды включившееся реле не выключилось, а сохранило это свое включенное состояние, нужно через его нормально разомкнутые контакты подать напряжение питания на обмотку. Когда контакты замкнутся — это напряжение будет поддерживать реле во включенном состоянии:



Теперь чтобы выключить это реле надо разорвать связь между источником питания и обмоткой. Для этого используется дополнительное реле, отвечающее за сброс триггера:



Зачем вообще сбрасывать реле? Дело в том, что самый простой способ записать туда заданное значение — это сбросить старое и подать (или не подавать) напряжение для сохранения нового состояния.
Так как регистр всегда сбрасывается целиком, то для всех его битов используется одно и то же сбрасывающее реле.

Контакты всех переключателей в реле, отвечающих за хранение данных, запараллелены. Это сделано для повышения надежности — если один контакт выйдет из строя, ток пойдёт через другой.

Архитектура компьютера


Изначально я планировал, что шина адреса у компьютера будет 12-битной. Так можно легко разбить все адресное пространство на несколько 8-битных групп и подключать к ним разные устройства. При этом адресная арифметика упростится до 8-битной (почти как работа с сегментами памяти в 8086).

Поэтому в регистровом файле было 2 вида регистров — 4 штуки 8-битных GPR, 2 штуки «сегментных» по 4 бита и 2 штуки со смещениями по 8 бит. При этом из «сегментных» и «смещений» можно было формировать 2 полных адреса, так как регистры складывались в фиксированные пары, типа HL, DE или BC в Z80. Но при этом любой из регистров мог использоваться как вход или выход АЛУ.

Изменения начались с того, что я «внезапно» сделал сегментные регистры 8-битными. Архитектуру это принципиально не меняло (шина адреса оставалась 12-битной), но давало больше возможностей для вычислений.

Потом я прикинул, что даже простое суммирование 256 ячеек памяти займёт несколько десятков минут. Поэтому я решил сузить шину адреса до 8 бит. Из-за этого система команд сильно упростилась:
  1. Пропала необходимость в отдельных командах 12-битного инкремента, 12-битной пересылки, 12-битной загрузки значения.
  2. Команды перехода, вызова подпрограммы и загрузки 8-битного значения объединились в одну с незначительными отличиями.
    В качестве побочного эффекта команда загрузки значения получила возможность условного выполнения.
  3. У команд работы с памятью появились варианты с непосредственным значением адреса


Благодаря всему этому схема управляющего модуля тоже стала проще. Число реле, которые для него потребуются, сильно уменьшилось. В том числе и за счет того, что не нужно отдельно реализовывать счетчик инструкций (так как он переехал в регистровый модуль в виде почти что обычного регистра).

В итоге получилось нечто похожее на режим Thumb процессора ARM, только ещё проще — 8 регистров по 8 бит. Один регистр служит в качестве адреса возврата, а другой — счетчиком инструкций. Любой регистр можно использовать в качестве любого из аргументов команд.
Единственное исключение — только 4 из 8 регистров можно использовать в качестве адреса для чтения (или записи) из памяти.

Шин, к которым подключаются регистры, получилось 3 штуки — 2 для передачи данных (например, кода инструкции или операндов АЛУ) и одна — для передачи адреса.

Конструкция


Сложнее всего (а точнее, утомительнее) было изготовить таблички с названиями регистров. В прошлый раз я заказывал лазерную гравировку. Но применяемые для этого аппараты имеют очень маленькую рабочую область и на мои таблички этого не хватало. Поэтому я занялся фотолитографией. Долго учился наклеивать/напылять, экспонировать и проявлять фоторезист, пока не получилось хоть что-то приемлемое. До идеала пока далеко, но это и не последний блок в компьютере.



Я не стал встраивать тумблеры для загрузки значений в регистры в этот блок. Ведь регистровый модуль сразу можно подключить к АЛУ и пользоваться уже его тумблерами.

Еще одна особенность этого модуля — в нем нет дополнительных светодиодов для отображения сигналов. Все хранимые данные можно наблюдать с помощью контрольных светодиодов, встроенных в реле. Поэтому для снятия дампа регистров достаточно иметь фотоаппарат.



На сегодня у меня работают уже два блока будущего компьютера — регистровый файл и АЛУ. Но оба они управляются внешними сигналами и поэтому могут производить вычисления только в режиме калькулятора. Корпус для управляющего модуля почти готов, поэтому скоро можно будет начать запускать схемы, издающие тикающие звуки самостоятельно.

Что можно было бы сделать лучше


Из-за того, что я отказался от спаренных регистров, необходимость в удвоенной шине данных пропала.
Теперь она действительно нужна только в одном месте — при выборке инструкции. Размер всех инструкций 16 бит, поэтому 16-битная шина нужна для загрузки всего кода инструкции за один такт. Для подключения второго аргумента к АЛУ можно было бы использовать шину адреса. За счет этого удалось бы сэкономить 8 реле в блоке регистров (и, возможно, ещё парочку в управляющем блоке).

Для крепления табличек с подписями я использовал болты под крестообразную отвертку, так как олдскульный вариант у меня закончился. Кто-нибудь знает где можно достать латунные болты с прямым шлицем? В прошлый раз я их покупал в магазине хобби-товаров в Хельсинки. Но это довольно дорого, да и снова я туда не попаду в ближайшее время.



Еще нужно как-то улучшить негативную маску, печатаемую на лазерном принтере. Сейчас залитые черным поля получились немного прозрачными. Поэтому на некоторых табличках из-за этого появились мелкие точки. Может кто знает как это победить?

Бонус


На следующем видео работающий прототип тактового генератора. Частоту я скорее всего немного увеличу, чтобы получилось около 5 тактов в секунду.



Страница проекта на github: github.com/Dovgalyuk/Relay
Tags:
Hubs:
Total votes 55: ↑53 and ↓2 +51
Views 22K
Comments Comments 22