Прошло уже больше года, с тех пор как я начал писать о разработке компьютера на электромагнитных реле. Сегодня я закончил работу над вторым модулем компьютера — регистровым файлом.
Сейчас уже стало понятно, что компьютер будет состоять из 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 бит. Из-за этого система команд сильно упростилась:
Благодаря всему этому схема управляющего модуля тоже стала проще. Число реле, которые для него потребуются, сильно уменьшилось. В том числе и за счет того, что не нужно отдельно реализовывать счетчик инструкций (так как он переехал в регистровый модуль в виде почти что обычного регистра).
В итоге получилось нечто похожее на режим Thumb процессора ARM, только ещё проще — 8 регистров по 8 бит. Один регистр служит в качестве адреса возврата, а другой — счетчиком инструкций. Любой регистр можно использовать в качестве любого из аргументов команд.
Единственное исключение — только 4 из 8 регистров можно использовать в качестве адреса для чтения (или записи) из памяти.
Шин, к которым подключаются регистры, получилось 3 штуки — 2 для передачи данных (например, кода инструкции или операндов АЛУ) и одна — для передачи адреса.
Сложнее всего (а точнее, утомительнее) было изготовить таблички с названиями регистров. В прошлый раз я заказывал лазерную гравировку. Но применяемые для этого аппараты имеют очень маленькую рабочую область и на мои таблички этого не хватало. Поэтому я занялся фотолитографией. Долго учился наклеивать/напылять, экспонировать и проявлять фоторезист, пока не получилось хоть что-то приемлемое. До идеала пока далеко, но это и не последний блок в компьютере.
Я не стал встраивать тумблеры для загрузки значений в регистры в этот блок. Ведь регистровый модуль сразу можно подключить к АЛУ и пользоваться уже его тумблерами.
Еще одна особенность этого модуля — в нем нет дополнительных светодиодов для отображения сигналов. Все хранимые данные можно наблюдать с помощью контрольных светодиодов, встроенных в реле. Поэтому для снятия дампа регистров достаточно иметь фотоаппарат.
На сегодня у меня работают уже два блока будущего компьютера — регистровый файл и АЛУ. Но оба они управляются внешними сигналами и поэтому могут производить вычисления только в режиме калькулятора. Корпус для управляющего модуля почти готов, поэтому скоро можно будет начать запускать схемы, издающие тикающие звуки самостоятельно.
Из-за того, что я отказался от спаренных регистров, необходимость в удвоенной шине данных пропала.
Теперь она действительно нужна только в одном месте — при выборке инструкции. Размер всех инструкций 16 бит, поэтому 16-битная шина нужна для загрузки всего кода инструкции за один такт. Для подключения второго аргумента к АЛУ можно было бы использовать шину адреса. За счет этого удалось бы сэкономить 8 реле в блоке регистров (и, возможно, ещё парочку в управляющем блоке).
Для крепления табличек с подписями я использовал болты под крестообразную отвертку, так как олдскульный вариант у меня закончился. Кто-нибудь знает где можно достать латунные болты с прямым шлицем? В прошлый раз я их покупал в магазине хобби-товаров в Хельсинки. Но это довольно дорого, да и снова я туда не попаду в ближайшее время.
Еще нужно как-то улучшить негативную маску, печатаемую на лазерном принтере. Сейчас залитые черным поля получились немного прозрачными. Поэтому на некоторых табличках из-за этого появились мелкие точки. Может кто знает как это победить?
На следующем видео работающий прототип тактового генератора. Частоту я скорее всего немного увеличу, чтобы получилось около 5 тактов в секунду.
Страница проекта на github: github.com/Dovgalyuk/Relay
Сейчас уже стало понятно, что компьютер будет состоять из 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 бит. Из-за этого система команд сильно упростилась:
- Пропала необходимость в отдельных командах 12-битного инкремента, 12-битной пересылки, 12-битной загрузки значения.
- Команды перехода, вызова подпрограммы и загрузки 8-битного значения объединились в одну с незначительными отличиями.
В качестве побочного эффекта команда загрузки значения получила возможность условного выполнения. - У команд работы с памятью появились варианты с непосредственным значением адреса
Благодаря всему этому схема управляющего модуля тоже стала проще. Число реле, которые для него потребуются, сильно уменьшилось. В том числе и за счет того, что не нужно отдельно реализовывать счетчик инструкций (так как он переехал в регистровый модуль в виде почти что обычного регистра).
В итоге получилось нечто похожее на режим Thumb процессора ARM, только ещё проще — 8 регистров по 8 бит. Один регистр служит в качестве адреса возврата, а другой — счетчиком инструкций. Любой регистр можно использовать в качестве любого из аргументов команд.
Единственное исключение — только 4 из 8 регистров можно использовать в качестве адреса для чтения (или записи) из памяти.
Шин, к которым подключаются регистры, получилось 3 штуки — 2 для передачи данных (например, кода инструкции или операндов АЛУ) и одна — для передачи адреса.
Конструкция
Сложнее всего (а точнее, утомительнее) было изготовить таблички с названиями регистров. В прошлый раз я заказывал лазерную гравировку. Но применяемые для этого аппараты имеют очень маленькую рабочую область и на мои таблички этого не хватало. Поэтому я занялся фотолитографией. Долго учился наклеивать/напылять, экспонировать и проявлять фоторезист, пока не получилось хоть что-то приемлемое. До идеала пока далеко, но это и не последний блок в компьютере.
Я не стал встраивать тумблеры для загрузки значений в регистры в этот блок. Ведь регистровый модуль сразу можно подключить к АЛУ и пользоваться уже его тумблерами.
Еще одна особенность этого модуля — в нем нет дополнительных светодиодов для отображения сигналов. Все хранимые данные можно наблюдать с помощью контрольных светодиодов, встроенных в реле. Поэтому для снятия дампа регистров достаточно иметь фотоаппарат.
На сегодня у меня работают уже два блока будущего компьютера — регистровый файл и АЛУ. Но оба они управляются внешними сигналами и поэтому могут производить вычисления только в режиме калькулятора. Корпус для управляющего модуля почти готов, поэтому скоро можно будет начать запускать схемы, издающие тикающие звуки самостоятельно.
Что можно было бы сделать лучше
Из-за того, что я отказался от спаренных регистров, необходимость в удвоенной шине данных пропала.
Теперь она действительно нужна только в одном месте — при выборке инструкции. Размер всех инструкций 16 бит, поэтому 16-битная шина нужна для загрузки всего кода инструкции за один такт. Для подключения второго аргумента к АЛУ можно было бы использовать шину адреса. За счет этого удалось бы сэкономить 8 реле в блоке регистров (и, возможно, ещё парочку в управляющем блоке).
Для крепления табличек с подписями я использовал болты под крестообразную отвертку, так как олдскульный вариант у меня закончился. Кто-нибудь знает где можно достать латунные болты с прямым шлицем? В прошлый раз я их покупал в магазине хобби-товаров в Хельсинки. Но это довольно дорого, да и снова я туда не попаду в ближайшее время.
Еще нужно как-то улучшить негативную маску, печатаемую на лазерном принтере. Сейчас залитые черным поля получились немного прозрачными. Поэтому на некоторых табличках из-за этого появились мелкие точки. Может кто знает как это победить?
Бонус
На следующем видео работающий прототип тактового генератора. Частоту я скорее всего немного увеличу, чтобы получилось около 5 тактов в секунду.
Страница проекта на github: github.com/Dovgalyuk/Relay