Сейчас уже стало понятно, что компьютер будет состоять из 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
Комментарии (22)
AndreyDmitriev
27.05.2015 20:26+3Офигенно. Единственно, что портит немного вид — это спагетти из проводов под оргстеклом, особенно те, которые по диагонали проложены — было бы круто увязать их в горизонтально-вертикальные жгуты (причём не пластиковыми кабельными стяжками, а именно олдскульными нитками, как раньше делали).
radiolok
27.05.2015 20:44+1Как помешанный на реле рад видеть продолжение работы над такой красотой. Сам потихоньку (уже 6-й год) проектирую РЦВМ-2 на герконовых реле. Пока только 1200 из 3000 реле набрал — у вас не найдется пары сотен ненужных РЭС55 и РЭС64?
Интересные релюшки со светодиодами…
Вопрос по шине адреса — память программ и адреса раздельно или вместе? Не маловато ли будет 256 ячеек под программу? Понятно что большая часть тестовых программок не превзойдет и сотни байт, но если душа захочет больше?
Можно 2 или 4 регистра допаять до возможности соединяться в 16-разрядный регистр адреса для ОЗУ к примеру. Хотя придется что-то изменять в конструкции.
И что насчет SRAM? тоже реле, или как у всех остальных проектов микросхема?Dovgaluk Автор
27.05.2015 20:57+1Нет, РЭС у меня никаких не найдётся. А что, китайцы ничего похожего не делают?
3000 — это же очень много. Только на пайку куча времени уйдёт. Да и с надёжностью что-то делать надо будет.
Память программ и память данных будут раздельные. Если вдруг под программу станет мало, можно изобрести регистр для переключения банков.
Для данных уж точно не нужно больше 256 байт.
Для памяти у меня несколько вариантов — динамическая на конденсаторах или ферритовые сердечники. Ну или на худой конец микросхему сделаю, если эти варианты не сработают.radiolok
27.05.2015 21:22Тритыщщи из-за того, что герконовые реле по большей части с одной парой контактов. Вот и умножайте все на 8. пайка — неканоничный монтаж на печатных платах. И надежность будет решаться модульной конструкцией.
У китайцев есть мелочевка, но она не так выглядит как советские реле. да и стоимость их несколько выше. Может быть часть блоков соберу на ТТЛ микросхемах — их 2 тыщщи корпусов в шкафу лежит, тоже надо куда-то девать :)
Проблема DRAM на конденсаторах в букве D. Надо будет ставить дополнительную схему обновления заряда. Можно попробовать на радиорынках найти блок памяти на ферритовых колечках от какого-нибудь старого цифрового измерительного прибора или микроЭВМ. Мне пару раз на глаза попадались на 1-2кбит, но они имели слишком «гуманный» ценник.
Зато оно ПЗУ. Правда при считывании, содержимое ячейки уничтожается и схема считывания должна будет записать данные обратно.
В принципе, 256 колец не так уж и много и прошить матрицу 8х8 будет довольно просто. Сложнее будет подобрать подходящие кольца и величины управляющих токов для них.
Лично я заморачиваться не буду — буду использовать микросхему.Dovgaluk Автор
27.05.2015 21:56У меня есть два модуля памяти на сердечниках. Там, конечно, есть управляющие микросхемы.
Но все равно наверное попробую их запустить.
А про конденсаторы кто-то писал, что ток утечки не очень большой. Могут и без обновления протянуть.
Ну или извратиться и сделать схему обновления на реле :)
Alex013
27.05.2015 21:13+2Крутые вы затейники :)!!!
Вряд ли у кого герконовые релюхи будут сотнями, но две-три у меня вроде есть — если кинуть кличь — может и соберём общими силами. Этакий релейный краудфандинг получится ;)…radiolok
27.05.2015 21:31Релейный краудфайндинг… Релефайндинг! А что, хорошая мысль.
Вряд ли у кого герконовые релюхи будут сотнями,
Или тысячамиartemonster
28.05.2015 12:48Я тоже несколько раз собирал-разбирал свой релейный проц. Столкнулся с проблемой: не могу придумать какую-нибудь интересную программу для «демо». Написал эмулятор с компилятором и пытался написать такую программу, с которой было бы интересно «поиграться» на реальном железе, но ничего не придумал.
Есть идеи? Думал о калькуляторе и игре быки-коровы. Больше в голову ничего не лезет.Speccyfan
28.05.2015 14:12Расшифровать какой-нибудь код Энигмы, повторить успех Тьюринга?
Или крестики-нолики, правда это не просто.
radiolok
28.05.2015 16:24тут вопрос с устройствах ввода и вывода.
В демках на youtube любят алгоритмы с циклами, чтобы запустить и оно шурует. Кто-то счетчик имитирует, кто-то текст на VFD дисплее выводить пытался(и в итоге сжег).
У меня запланирован дисплей 16х32пикс на светодиодах со статической видеопамятью. две матрицы лежат который год, ждут своего часа.
Буду выводить на ней картинку или текст.
Правда мой герконник будет иметь 40-50Гц тактовой частоты и работать это будет относительно быстро.Dovgaluk Автор
28.05.2015 16:33+1А вот вообще калькулятор квадратных корней: www.youtube.com/watch?v=gI8luQnyM9A
Для него не стоит вопроса что за программу запускать :)
И, кстати, в нем как раз индикатор на лампах.
mynameisdaniil
Чтобы повысить контраст масок их нужно складывать по две штуки; обычно, этого достаточно. Не лишним будет добавить реперные метки с прозрачной точкой посередине. После совмещения склеиваю маски суперклеем: прикасаюсь к границе совмещения двух шаблонов, немного надавливаю на тюбик и клей капилярными силами всасывается между шаблонами (клей должен быть жидким). Двух капель по углам достаточно.
romychs
Для улучшения качества шаблона еще есть такая аэрозолька, погуглите «Усилитель оптической плотности тонера Density Toner».
mynameisdaniil
Я в курсе. Еще можно над парами ацетона подержать, поиграться с настройкой принтера, просто смазать для лучшего прилегания (силиконовым маслом, например). Есть много способов. Но добавить реперные метки и напечатать две копии шаблона — проще всего.