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

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



    Сейчас уже стало понятно, что компьютер будет состоять из 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
      Чтобы повысить контраст масок их нужно складывать по две штуки; обычно, этого достаточно. Не лишним будет добавить реперные метки с прозрачной точкой посередине. После совмещения склеиваю маски суперклеем: прикасаюсь к границе совмещения двух шаблонов, немного надавливаю на тюбик и клей капилярными силами всасывается между шаблонами (клей должен быть жидким). Двух капель по углам достаточно.
        0
        Для улучшения качества шаблона еще есть такая аэрозолька, погуглите «Усилитель оптической плотности тонера Density Toner».
          0
          Я в курсе. Еще можно над парами ацетона подержать, поиграться с настройкой принтера, просто смазать для лучшего прилегания (силиконовым маслом, например). Есть много способов. Но добавить реперные метки и напечатать две копии шаблона — проще всего.
        +3
        Офигенно. Единственно, что портит немного вид — это спагетти из проводов под оргстеклом, особенно те, которые по диагонали проложены — было бы круто увязать их в горизонтально-вертикальные жгуты (причём не пластиковыми кабельными стяжками, а именно олдскульными нитками, как раньше делали).
          +1
          Как помешанный на реле рад видеть продолжение работы над такой красотой. Сам потихоньку (уже 6-й год) проектирую РЦВМ-2 на герконовых реле. Пока только 1200 из 3000 реле набрал — у вас не найдется пары сотен ненужных РЭС55 и РЭС64?
          Интересные релюшки со светодиодами…

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

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

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

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

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

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

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

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

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

              Или тысячами

              0
              Есть у знакомого есть такое ОЗУ на ферритовых кольцах, как раз для подобного компьютера подойдет.
              image
                0
                Вот у меня примерно такой же блок есть. Только ещё не знаю как его использовать.
              • НЛО прилетело и опубликовало эту надпись здесь
                  0
                  Как обычно, крестики-нолики :)
                    0
                    А что за релейный проц? Где можно посмотреть?
                      0
                      Расшифровать какой-нибудь код Энигмы, повторить успех Тьюринга?
                      Или крестики-нолики, правда это не просто.
                        0
                        тут вопрос с устройствах ввода и вывода.

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

                        У меня запланирован дисплей 16х32пикс на светодиодах со статической видеопамятью. две матрицы лежат который год, ждут своего часа.
                        Буду выводить на ней картинку или текст.
                        Правда мой герконник будет иметь 40-50Гц тактовой частоты и работать это будет относительно быстро.
                          +1
                          А вот вообще калькулятор квадратных корней: www.youtube.com/watch?v=gI8luQnyM9A
                          Для него не стоит вопроса что за программу запускать :)

                          И, кстати, в нем как раз индикатор на лампах.
                            0
                            Потрясающая машина. Спасибо за интересное видео.

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

                              0
                              У меня на github'е много ссылок на всякие такие штуки.
                              Если что-то ещё видели интересное — присылайте ссылку.
                        +2
                        Латунные болтики — это просто. Купите нулевую шину IEK, которая латунная. В ней 8-10 латунных винтиков как на картинке. Конструкции могут отличаться и винтики тоже могут быть разными кстати…
                          0
                          Хорошая идея, спасибо.

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое