Недавно мой старший сын решил собрать однобитный компьютер на дискретных транзисторах. Идея создания однобитного устройства может показаться дурацкой, но в данном случае речь идёт не о машине, имеющей всего две инструкции или ячейки памяти, а о размере «слова» арифметически-логического устройства (АЛУ). Малая ширина в битах позволяет получить более простую схему, но для пошаговой обработки требует использования операндов шире аппаратного лимита. Однобитные АЛУ можно назвать экстремальным решением, но они вполне имеют коммерческое применение, включая микроконтроллер MC14500B, выпущенный компанией Motorola в конце 70х.

Но эта статья немного о другом. В традициях неизменных законов соперничества между братьями и сёстрами вскоре ко мне подошёл младший сын и попросил помочь ему собрать ещё более устаревшее устройство. После некоторого обсуждения мы выбрали в качестве такого устройства калькулятор на основе реле. Затем я получил дальнейшие инструкции: печатная плата должна быть старого образца в жёлтом цвете, и все реле должны быть прозрачными.

Я изначально понимал, что мы не будем собирать схему исключительно на реле. Такая задача затянула бы реализацию проекта на месяцы. К тому же при цене прозрачных реле в $6 за единицу его общая стоимость оказалась бы слишком высока. И всё же я выяснил, что можно заставить реле выполнять реальные математические действия.

▍ Немного про АЛУ


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

Сложение двоичных цифр по своему принципу аналогично работе с десятичными числами, только в максимально упрощённой форме. У вас есть два входа с двумя возможными значениями каждый. Также есть одно выходное значение с тем же свойством. Ещё есть бит переноса, который может либо передаваться в следующий столбец, либо использоваться в качестве сигнала о переполнении. Это поведение можно обобщить в виде следующей логической таблицы:
In_A In_B Out Out_C
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1
Теоретически это арифметическая операция, но при внимательном рассмотрении правых столбцов становится ясно, что её можно реализовать с помощью булевой логики:

Out   = In_A XOR In_B
Out_C = In_A AND In_B

В электронной схеме, если у вас есть способ построить простые логические вентили, то очевидной альтернативой будет:


Рудиментарный однобитный сумматор

Тем не менее эта схема (полусумматор) неполноценна в том смысле, что не может учитывать перенос из предыдущего столбца. Иными словами, она не может автоматически складывать многозначные целые числа.

Чтобы собрать полноценный сумматор, нам потребуется более сложный подход с третьей входной строкой:
In_A In_B In_C Out Out_C
0 0 0 0 0
0 1 0 1 0
1 0 0 1 0
1 1 0 0 1
0 0 1 1 0
0 1 1 0 1
1 0 1 0 1
1 1 1 1 1
Первая половина (In_C = 0) останется такой же, что и в полусумматоре, а вот вторая будет отличаться. При наличии входного переноса выход инвертируется, и этот перенос распространяется на все кейсы, кроме In_A = In_B = 0. Равнозначный эквивалент в виде булевой алгебры получится менее элегантен, но всё равно достаточно прост для анализа:

Out   = (In_A XOR In_B) XOR In_C
Out_C = (In_A AND In_B) OR (In_C AND (In_A OR In_B))

В электронике это можно реализовать, в точности следуя приведённой формуле. В качестве альтернативы схему можно представить в виде двух связанных полусумматоров и операции OR, применяемой к получаемому на их выходе переносу:


Один из вариантов представления полноценного сумматора

Полноценные сумматоры можно составить в столбец для одновременного сложения любого количества двоичных значений. Один сумматор также можно использовать последовательно в составе однобитного АЛУ – как в дизайне моего старшего сына.

▍ Логика на основе реле


Реле обладают двумя свойствами, которые делают их подходящими для построения цифровой логики: они двоичны по своему принципу действия и могут «усиливать» входные сигналы, позволяя бесконечно соединять их в цепочку.

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

Существует много вариантов реализации логики на основе реле, отчасти ввиду разнообразия на рынке и различных способов кодирования нулей и единиц. Например, компьютер Z3 Конрада Цузе был построен на основе четырёхполюсных двухточечных устройств (4PDT) и «хитрил», также передавая вторичный, инвертированный сигнал переноса – но эта конструкция давала полноценный сумматор на основе всего двух реле.

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

После некоторого изучения вопроса я остановился на серии компактных реле G6C компании Omron. Эти устройства доступны как с одним переключателем SPST-NO, так и с дополнительной парой терминалов SPST-NO и SPST-NC. Вот схема SPST-NO, которую я использовал для вентиля OR:


Простая схема OR на основе реле

Принцип работы этой схемы должен быть очевиден: если одно из реле активно, выход оказывается подключён к плюсовой линии подачи. В противном случае выход остаётся подвешен.

Вентиль OR также можно реализовать на основе одного реле SPDT, хотя проводящая архитектура для одного из входов подразумевает необходимость следить за «разветвлением» (нисходящей нагрузкой выхода).


«Бюджетная» версия того же самого

Вентиль AND можно построить аналогичным образом, с помощью одного или двух реле SPST-NO:


Два варианта схемы вентиль AND

Вентиль XOR собирается уже чуть сложнее и требует, как правило, двух двухходовых реле. Вот решение, которое я реализовал с помощью расширенной топологии SPST-NO + SPST-NC:


XOR на основе реле

Терминалы SPST-NO выполняют операцию OR, подключая выход к общей линии (внизу), когда любое из реле активно. Сторона SPST-NC выполняет NAND, отключая эту линию от положительного источника, когда включены оба реле.

Более компактную версию, по сути, той же архитектуры можно получить, используя реле SPDT:


Ещё один, по сути, идентичный вариант реализации XOR

В конце я использовал два реле для самой простой реализации шести логических операций, необходимых для получения полноценного сумматора:

Out   = (In_A XOR In_B) XOR In_C
Out_C = (In_A AND In_B) OR (In_C AND (In_A OR In_B))

А вот крупный план раздела сумматора на печатной плате. Обратите внимание на изогнутость дорожек в «ретро» стиле и намеренное отсутствие паяльной маски:


Сумматор на печатной плате

Реализация этого макета в KiCad вызвала массу негодования. Кроме того, не обошлось без продолжительной переписки с производителем печатной платы.

▍ Но ведь используются не только о реле?


Нет, по крайней мере, не сейчас. Вся «основная» плата показана ниже, вместе с самодельными стикерами для клавиш, старым переключателем, редким аксиальным электролитическим конденсатором и… да – 8-битным микроконтроллером:


Основная плата для Calc-U-Later

Микроконтроллер будет отвечать за различные вспомогательные задачи, которые потребовали бы сотен дополнительных реле. К ним относится сканирование блока клавиш, декодирование цифр, выстраивание последовательности операций, обработка ошибок и память. Тем не менее сумматор имеет чётко обозначенную роль и будет выполнять реальные математические вычисления.

Вот последовательность операций микроконтроллера при выполнении сложения:

  1. Установка указателя бита операнда на 0 (LSB, младший бит).
  2. Инициализация строки «входящего переноса» на нуль.
  3. Передача битов операндов на входные линии сумматора.
  4. Ожидание установки реле в течение ~ 20 мс.
  5. Обратное считывание и сохранение выходного бита сумматора.
  6. Передача «исходящего переноса» во «входящий перенос».
  7. Смещение указателя бита операнда вправо.
  8. Возвращение к шагу 3, пока не кончатся биты для сложения.

Иными словами, здесь всё честно, хотя микроконтроллер, в принципе, мог бы и сам выполнить работу АЛУ.

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

110 × 1011 = ?
 ↓     ↓
110 ×  1   →      110
110 ×  1   →     110
110 ×  0   →    000
110 ×  1   →   110 
              -------
       sum =  1000010

При большом желании это смещение битов можно выполнять с помощью сумматора. Каждый сдвиг влево равнозначен сложению операнда с самим собой (то есть умножению на 2).

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

▍А дисплей?


Вот здесь я не поленился и собрал специально ради этого хитроумный девайс. Его печатная плата содержит несколько 7-сегментных дисплеев полностью под управлением реле:


Крупный план пустой платы дисплея

Для сохранения контроля над числом линий данных состояние дисплея сохраняется в 8-битных регистрах-защелках (шесть микросхем 74HC259 внизу), поэтому реле присутствуют в избытке – но задача была в том, чтобы вводить цифры было так же приятно, как наблюдать АЛУ в действии.


Собранный модуль дисплея

Вот первый ролик тестирования модуля дисплея:

В следующем завораживающем аудиовизуальном ролике показано, как калькулятор обрабатывает умножение 111 на 222:

Естественно, для подобного проекта нам требовался подходящий корпус. Его мы собрали в мастерской за пару часов:


Настольный калькулятор представительского уровня из орехового дерева

Спереди калькулятор выглядит не столь впечатляюще. Вот фото сбоку:


Клавишно-дисплейный интерфейс

Ну и, наконец, вот видео, на котором калькулятор обрабатывает дроби, отрицательные числа и деление:

▍ Сколько реле реально потребуется?


Всё зависит от контекста. Если мы ограничимся примитивным входом и выходом – скажем, столбцами переключателей с фиксированным положением и индикаторами – тогда сложение и вычитание можно будет выполнять в один шаг с помощью сумматора достаточной ширины. Общее число реле будет наименьшим кратным числу входных битов.

Если же мы решим реализовать умножение и деление, то картина усложнится. В наиболее практичной форме эти операции реализуются в виде серии шагов. Вам потребуется тактовый генератор, «микросеквенсор» и массив мультиплексоров, который будет гибко подключать регистры для выполнения загрузки, сохранения и операций АЛУ.

Ещё больше всё усложнится, если мы захотим реализовать поддержку современного типа ввода, когда цифры вводятся слева направо. Поскольку для отображения и вычисления операнды должны быть выровнены по правому краю, а количество вводимых цифр заранее будет неизвестно, то потребуется дополнительная схема для выполнения необходимых сдвигов.
Сложно оценить точно, но, отталкиваясь от первых транзисторных калькуляторов вроде Friden EC-130, я бы предположил, что для подобной задачи потребуется около 500 реле.

При цене в $6 за штуку, использованные мной в проекте прозрачные детали, стали бы не самым удачным выбором. Тем не менее, взяв миниатюрные сигнальные реле, такие как Kemet EA2-5NU, мы бы уже заплатили за них меньше $1,000, а также получили более адекватный размер устройства.

Что касается питания, то оно не должно являться серьёзной проблемой – здесь речь идёт о десятках ватт – но вот производительность выступает ограничивающим фактором. В случае миниатюрных реле верхним пределом станет, пожалуй, 200 Гц. Если же брать более крупные детали, то 50 Гц уже будет много.

Теперь, когда я завершил этот «разминочный» проект, у меня может возникнуть соблазн собрать калькулятор уже исключительно на реле…

Скачать исходный код для Calc-U-Later можно здесь.

Узнавайте о новых акциях и промокодах первыми из нашего Telegram-канала ????

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


  1. YMA
    19.11.2023 10:36
    +36

    Не, неспортивно. Получился не релейный калькулятор, а "продукт релесодержащий". :)

    Типа "лампового" усилителя, где пара ламп стоит во входном каскаде, а дальше стыдливо прячется TDA-шка D-класса.


    1. engine9
      19.11.2023 10:36
      +5

      Грустнее, когда лампа стоит между двумя ОУ и всё это гордо называется "ламповым предусилителем" :(


      1. nafikovr
        19.11.2023 10:36
        +2

        справедливости ради, ламповое "украшательство" звука так получить можно. но я с вами соглашусь.


    1. NickDoom
      19.11.2023 10:36
      +6

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

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

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


      1. PuerteMuerte
        19.11.2023 10:36
        +3

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

        Например, не делать всякие жирные вещи, которые лезут в голову современному инженеру, вроде "сканирования клавиш", как предлагал автор. Последовательный номеронабиратель, два регистра на реле и сумматор.


        1. NickDoom
          19.11.2023 10:36

          Ну, если только складывать — то да. https://habr.com/ru/companies/cloud4y/articles/708154/comments/#comment_25062912


          1. PuerteMuerte
            19.11.2023 10:36

            ...и вычитать. И с помощью дополнительной схемы - умножать и делить.


    1. Bluewolf
      19.11.2023 10:36
      +11

      КДПВ, не вглядываясь

      Вау, надо почитать, как они упихнули всё в столь небольшое количество реле

      Микроконтроллер

      Разочаровывающее чувство разочарования от проекта


  1. shadrap
    19.11.2023 10:36
    +5

    Но он прекрасен!)) Интересно не смотрелись бы лучше газоразрядные индикаторы? К155-е смотрелись бы то ж аутентично. И что то я не верю что б такой корпус из ореха можно было сделать за пару часов.... пару тройку дней это да.. одних лаков и полировок на пол недели..)


    1. Arhammon
      19.11.2023 10:36
      +2

      пару тройку дней это да.. одних лаков и полировок на пол недели..)

      Не надо недооценивать набитую руку - там "некошерное" стыковое соединение и обход фрезой по всем краям, час 55 как раз на склейку, покрытие лаком и уборку остаётся)


  1. danjahjah
    19.11.2023 10:36
    +6

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


    1. Arhammon
      19.11.2023 10:36
      +2

      Это не так страшно, берете на каком-нибудь вудмарте готовые плашки, а так же пилу риобу, 45 градусную фрезу с подшипником, кромочный фрезер. Надо будет сделать широкую площадку для фрезера и упор с магнитом для пиления под 90 градусов. Самое дорогое - это время на обучение, практику и уборку за фрезером(

      Пардон, защитные очки еще забыл.


    1. aumi13
      19.11.2023 10:36
      +2

      из сложного там только уголки под экраном, но их видимо на чпу выпиливали.

      а простая каробка на фрезере за 5 минут делаеца, я угловой шып-паз умею:


  1. sim2q
    19.11.2023 10:36
    +2

    и все реле должны быть прозрачными.

    по светодиодику внутрь просится, ставил как то - но это целое искусство подобрать расположение и нужный угол, но без отражателей всё равно скучно получалось


  1. NotSlow
    19.11.2023 10:36
    +5

    Судя по звуку, Mother в фильме Alien была релейным калькулятором :]

    Ну и немножко матричным принтером


    1. dragonnur
      19.11.2023 10:36
      +1

      Телетайпом на МПК :-)


      1. N1X
        19.11.2023 10:36
        +1

        АЦПУ ЕС7040


  1. anmipo
    19.11.2023 10:36
    +1

    @Bright_Translate, как-то уж очень перевод прихрамывает.

    выглядит не столь впечатлительно.

    "Впечатляюще"

    8-битных защёлках

    Регистр-защёлка, если уж выбрасывать слово, то второе.

    простые логические затворы

    Вентили: https://ru.wikipedia.org/wiki/Логический_вентиль

    Равнозначный эквивалент
    аудиовизуальном видео

    Масленое масло

    плата содержит пару 7-сегментных дисплеев

    Их там шесть штук. Но это авторский косяк.


    1. Bright_Translate Автор
      19.11.2023 10:36

      Все верно. Спасибо


    1. Dolios
      19.11.2023 10:36
      +1

      Их там шесть штук. Но это авторский косяк.

      "a couple of" переводится, в том числе, как "несколько", "небольшое количество" - пруф, смотрим вариант b


      1. anmipo
        19.11.2023 10:36

        Спасибо. Тогда к автору оригинала вопросов нет :)


      1. Bright_Translate Автор
        19.11.2023 10:36

        Очень редкий случай, когда подразумевается "несколько". Обычно для этого используют оборот several.


  1. aabzel
    19.11.2023 10:36
    +1

    Мне понравился звук работы релейного калькулятора.


    1. NotSlow
      19.11.2023 10:36
      +4

      Да, ssd работают тихо и быстро, но есть какая-то магия в хрусте медленного жесткого диска.

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

      Есть оцифрованный звук, но некоторые все равно готовы слушать скрежет иглы по грампластинке.

      Это ощущение чего-то настоящего, что можно увидеть, услышать, почуствовать вибрацию. Против чего-то более эффективного... но ненастоящего и фальшивого для подсознания.


      1. NickDoom
        19.11.2023 10:36

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

        Хотя это потребует самодельной головки, что уменьшает ёмкость трека до каких-то килобайт. Штатная, без кучи усилий, будет постоянно мимо дорожки промахиваться. Проехали :(

        Может, гарвардская архитектура с прошивкой на вращающейся фотопластинке, чтением через фотообъектив, а память на ферритовых кольцах?


        1. YMA
          19.11.2023 10:36

          Возьмите 3,5" дисковод, esp32 и реализуйте свою мечту. ;) 5,25" боюсь, уже не найти в живом виде.


          1. 200sx_Pilot
            19.11.2023 10:36

            Встречаются ещё.

            Вот 8" найти бы рабочий...


            1. not-allowed-here
              19.11.2023 10:36

              Армия США частенько реализует.... на Ebay иногда всплывают....


  1. 200sx_Pilot
    19.11.2023 10:36
    +3

    В следующем завораживающем аудиовизуальном видео показано, как калькулятор обрабатывает умножение 111 на 222:

    у меня оба видео - первые.

    и на индикаторы просится светофильтр.


    1. Bright_Translate Автор
      19.11.2023 10:36

      Точно. Исправил


  1. chnav
    19.11.2023 10:36

    Мне кажется если бы для управления обвязкой использовали FPGA - получилось ещё более близко к цифровой логике. Впрочем и туда можно вшить процессорное ядро, но это уже на совести авторов проекта.


  1. ZyXI
    19.11.2023 10:36
    +1

    А можно спросить, что не так с релизацией макета в KiCAD? По моему опыту проектирования дорожек с дугами у последнего KiCAD всё лишь немного хуже, чем у Altium 18 (не знаю, как у более новых) — т.е. не так удобно, как обычные дорожки под 45° из‐за того, что всякое перетаскивание не работает (точнее, производит дорожки под 45°), но если вы не собираетесь делать что‐то вроде ведения параллельно 32 дорожек от микросхемы A к микросхеме B, то неудобства не такие уж большие.

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


    1. ZyXI
      19.11.2023 10:36

      Не заметил, что это перевод…


  1. AlexMih
    19.11.2023 10:36
    +2

    Мне кажется, куда интереснее было бы реализовать пусть крохотное, но полностью релейное счетное устройство. И это вполне реально, и позволило бы глубже окунуться в мир ретро-ЭВМ. Сердцем устройства оставить целочисленный сумматор - это уже сделано. Для вычитания представлять слагаемые в дополнительном коде - сперва вручную, а при желании позже сделать для этого отдельный блок. Вывод оставить двоичный, линейкой светодиодов - переводите в уме. А опроса клавиатуры можно избежать, если не следовать за инерцией мышления, и не копировать дизайн современых калькуляторов, а вспомнить, как ввод значений делался раньше: выставил значение на панели кнопок-тумблеров, нажал "ввод" - и число вносится в нужный регистр:

    Hidden text


    1. Demon416
      19.11.2023 10:36
      +1

      Светодиоды это слишком современно

      Блинкерный или другой электромеханический индикатор будет более уместен


    1. mikryukovsl
      19.11.2023 10:36
      -1

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


    1. Dovgaluk
      19.11.2023 10:36

      Вот и релейный компьютер, и клавиатура, и печать: https://habr.com/ru/articles/750554/


  1. PTM
    19.11.2023 10:36

    Закройте красные семисегментные дисплеи красным оргстеклом будет хороший эффект


  1. kh0
    19.11.2023 10:36

    Технически, можно используя технологии древних на ферритовых колечках попытаться сумматор заинженерить, главная сложность была бы смостырить 4 входовый дешифратор или возить с оптимизацией. А всю обвязку запихать в мк. Быстродействие сумматора было бы весьма-весьма. А ниже реле только механический сумматор по иерархии остался наверное).


    1. not-allowed-here
      19.11.2023 10:36

      тогда уж сразу "Сетунь"....


  1. sdy
    19.11.2023 10:36
    +1

    За такой перевод автор бы точно не похвалил, вот для примера только пару перлов:

    использованные мной прозрачные детали

    - что это за ересь? в оригинале четко прописано - the relays

    Инициализация строки «входящего переноса» на нуль.

    - опять какой-то бред, в оригинале - Initialize the adder “carry in” line to zero

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