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



Сейчас уже стало понятно, что компьютер будет состоять из 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

Комментарии (22)


  1. mynameisdaniil
    27.05.2015 20:22
    +1

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


    1. romychs
      28.05.2015 11:50

      Для улучшения качества шаблона еще есть такая аэрозолька, погуглите «Усилитель оптической плотности тонера Density Toner».


      1. mynameisdaniil
        28.05.2015 12:08

        Я в курсе. Еще можно над парами ацетона подержать, поиграться с настройкой принтера, просто смазать для лучшего прилегания (силиконовым маслом, например). Есть много способов. Но добавить реперные метки и напечатать две копии шаблона — проще всего.


  1. AndreyDmitriev
    27.05.2015 20:26
    +3

    Офигенно. Единственно, что портит немного вид — это спагетти из проводов под оргстеклом, особенно те, которые по диагонали проложены — было бы круто увязать их в горизонтально-вертикальные жгуты (причём не пластиковыми кабельными стяжками, а именно олдскульными нитками, как раньше делали).


  1. radiolok
    27.05.2015 20:44
    +1

    Как помешанный на реле рад видеть продолжение работы над такой красотой. Сам потихоньку (уже 6-й год) проектирую РЦВМ-2 на герконовых реле. Пока только 1200 из 3000 реле набрал — у вас не найдется пары сотен ненужных РЭС55 и РЭС64?
    Интересные релюшки со светодиодами…

    Вопрос по шине адреса — память программ и адреса раздельно или вместе? Не маловато ли будет 256 ячеек под программу? Понятно что большая часть тестовых программок не превзойдет и сотни байт, но если душа захочет больше?
    Можно 2 или 4 регистра допаять до возможности соединяться в 16-разрядный регистр адреса для ОЗУ к примеру. Хотя придется что-то изменять в конструкции.

    И что насчет SRAM? тоже реле, или как у всех остальных проектов микросхема?


    1. Dovgaluk Автор
      27.05.2015 20:57
      +1

      Нет, РЭС у меня никаких не найдётся. А что, китайцы ничего похожего не делают?
      3000 — это же очень много. Только на пайку куча времени уйдёт. Да и с надёжностью что-то делать надо будет.

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

      Для данных уж точно не нужно больше 256 байт.
      Для памяти у меня несколько вариантов — динамическая на конденсаторах или ферритовые сердечники. Ну или на худой конец микросхему сделаю, если эти варианты не сработают.


      1. radiolok
        27.05.2015 21:22

        Тритыщщи из-за того, что герконовые реле по большей части с одной парой контактов. Вот и умножайте все на 8. пайка — неканоничный монтаж на печатных платах. И надежность будет решаться модульной конструкцией.
        У китайцев есть мелочевка, но она не так выглядит как советские реле. да и стоимость их несколько выше. Может быть часть блоков соберу на ТТЛ микросхемах — их 2 тыщщи корпусов в шкафу лежит, тоже надо куда-то девать :)

        Проблема DRAM на конденсаторах в букве D. Надо будет ставить дополнительную схему обновления заряда. Можно попробовать на радиорынках найти блок памяти на ферритовых колечках от какого-нибудь старого цифрового измерительного прибора или микроЭВМ. Мне пару раз на глаза попадались на 1-2кбит, но они имели слишком «гуманный» ценник.
        Зато оно ПЗУ. Правда при считывании, содержимое ячейки уничтожается и схема считывания должна будет записать данные обратно.

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

        Лично я заморачиваться не буду — буду использовать микросхему.


        1. Dovgaluk Автор
          27.05.2015 21:56

          У меня есть два модуля памяти на сердечниках. Там, конечно, есть управляющие микросхемы.
          Но все равно наверное попробую их запустить.

          А про конденсаторы кто-то писал, что ток утечки не очень большой. Могут и без обновления протянуть.
          Ну или извратиться и сделать схему обновления на реле :)


  1. Alex013
    27.05.2015 21:13
    +2

    Крутые вы затейники :)!!!
    Вряд ли у кого герконовые релюхи будут сотнями, но две-три у меня вроде есть — если кинуть кличь — может и соберём общими силами. Этакий релейный краудфандинг получится ;)…


    1. radiolok
      27.05.2015 21:31

      Релейный краудфайндинг… Релефайндинг! А что, хорошая мысль.

      Вряд ли у кого герконовые релюхи будут сотнями,

      Или тысячами


  1. Speccyfan
    28.05.2015 09:37

    Есть у знакомого есть такое ОЗУ на ферритовых кольцах, как раз для подобного компьютера подойдет.
    image


    1. Dovgaluk Автор
      28.05.2015 09:37

      Вот у меня примерно такой же блок есть. Только ещё не знаю как его использовать.


  1. artemonster
    28.05.2015 12:48

    Я тоже несколько раз собирал-разбирал свой релейный проц. Столкнулся с проблемой: не могу придумать какую-нибудь интересную программу для «демо». Написал эмулятор с компилятором и пытался написать такую программу, с которой было бы интересно «поиграться» на реальном железе, но ничего не придумал.
    Есть идеи? Думал о калькуляторе и игре быки-коровы. Больше в голову ничего не лезет.


    1. Dovgaluk Автор
      28.05.2015 12:55

      Как обычно, крестики-нолики :)


    1. Dovgaluk Автор
      28.05.2015 13:00

      А что за релейный проц? Где можно посмотреть?


    1. Speccyfan
      28.05.2015 14:12

      Расшифровать какой-нибудь код Энигмы, повторить успех Тьюринга?
      Или крестики-нолики, правда это не просто.


    1. radiolok
      28.05.2015 16:24

      тут вопрос с устройствах ввода и вывода.

      В демках на youtube любят алгоритмы с циклами, чтобы запустить и оно шурует. Кто-то счетчик имитирует, кто-то текст на VFD дисплее выводить пытался(и в итоге сжег).

      У меня запланирован дисплей 16х32пикс на светодиодах со статической видеопамятью. две матрицы лежат который год, ждут своего часа.
      Буду выводить на ней картинку или текст.
      Правда мой герконник будет иметь 40-50Гц тактовой частоты и работать это будет относительно быстро.


      1. Dovgaluk Автор
        28.05.2015 16:33
        +1

        А вот вообще калькулятор квадратных корней: www.youtube.com/watch?v=gI8luQnyM9A
        Для него не стоит вопроса что за программу запускать :)

        И, кстати, в нем как раз индикатор на лампах.


        1. radiolok
          28.05.2015 16:38

          Потрясающая машина. Спасибо за интересное видео.

          Довольно занятный тактовый генератор, способ ввода чисел и дизайн в целом.


          1. Dovgaluk Автор
            28.05.2015 16:40

            У меня на github'е много ссылок на всякие такие штуки.
            Если что-то ещё видели интересное — присылайте ссылку.


  1. muller
    29.05.2015 07:42
    +2

    Латунные болтики — это просто. Купите нулевую шину IEK, которая латунная. В ней 8-10 латунных винтиков как на картинке. Конструкции могут отличаться и винтики тоже могут быть разными кстати…


    1. Dovgaluk Автор
      29.05.2015 08:30

      Хорошая идея, спасибо.