Недавно мой старший сын решил собрать однобитный компьютер на дискретных транзисторах. Идея создания однобитного устройства может показаться дурацкой, но в данном случае речь идёт не о машине, имеющей всего две инструкции или ячейки памяти, а о размере «слова» арифметически-логического устройства (АЛУ). Малая ширина в битах позволяет получить более простую схему, но для пошаговой обработки требует использования операндов шире аппаратного лимита. Однобитные АЛУ можно назвать экстремальным решением, но они вполне имеют коммерческое применение, включая микроконтроллер 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
Микроконтроллер будет отвечать за различные вспомогательные задачи, которые потребовали бы сотен дополнительных реле. К ним относится сканирование блока клавиш, декодирование цифр, выстраивание последовательности операций, обработка ошибок и память. Тем не менее сумматор имеет чётко обозначенную роль и будет выполнять реальные математические вычисления.
Вот последовательность операций микроконтроллера при выполнении сложения:
- Установка указателя бита операнда на 0 (LSB, младший бит).
- Инициализация строки «входящего переноса» на нуль.
- Передача битов операндов на входные линии сумматора.
- Ожидание установки реле в течение ~ 20 мс.
- Обратное считывание и сохранение выходного бита сумматора.
- Передача «исходящего переноса» во «входящий перенос».
- Смещение указателя бита операнда вправо.
- Возвращение к шагу 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)
shadrap
19.11.2023 10:36+5Но он прекрасен!)) Интересно не смотрелись бы лучше газоразрядные индикаторы? К155-е смотрелись бы то ж аутентично. И что то я не верю что б такой корпус из ореха можно было сделать за пару часов.... пару тройку дней это да.. одних лаков и полировок на пол недели..)
Arhammon
19.11.2023 10:36+2пару тройку дней это да.. одних лаков и полировок на пол недели..)
Не надо недооценивать набитую руку - там "некошерное" стыковое соединение и обход фрезой по всем краям, час 55 как раз на склейку, покрытие лаком и уборку остаётся)
danjahjah
19.11.2023 10:36+6хотелось бы иметь такую мастерскую где можно собрать такой корпус за пару часов...
Arhammon
19.11.2023 10:36+2Это не так страшно, берете на каком-нибудь вудмарте готовые плашки, а так же пилу риобу, 45 градусную фрезу с подшипником, кромочный фрезер. Надо будет сделать широкую площадку для фрезера и упор с магнитом для пиления под 90 градусов. Самое дорогое - это время на обучение, практику и уборку за фрезером(
Пардон, защитные очки еще забыл.
aumi13
19.11.2023 10:36+2из сложного там только уголки под экраном, но их видимо на чпу выпиливали.
а простая каробка на фрезере за 5 минут делаеца, я угловой шып-паз умею:
sim2q
19.11.2023 10:36+2и все реле должны быть прозрачными.
по светодиодику внутрь просится, ставил как то - но это целое искусство подобрать расположение и нужный угол, но без отражателей всё равно скучно получалось
anmipo
19.11.2023 10:36+1@Bright_Translate, как-то уж очень перевод прихрамывает.
выглядит не столь впечатлительно.
"Впечатляюще"
8-битных защёлках
Регистр-защёлка, если уж выбрасывать слово, то второе.
простые логические затворы
Вентили: https://ru.wikipedia.org/wiki/Логический_вентиль
Равнозначный эквивалент
аудиовизуальном видеоМасленое масло
плата содержит пару 7-сегментных дисплеев
Их там шесть штук. Но это авторский косяк.
Dolios
19.11.2023 10:36+1Их там шесть штук. Но это авторский косяк.
"a couple of" переводится, в том числе, как "несколько", "небольшое количество" - пруф, смотрим вариант b
Bright_Translate Автор
19.11.2023 10:36Очень редкий случай, когда подразумевается "несколько". Обычно для этого используют оборот several.
aabzel
19.11.2023 10:36+1Мне понравился звук работы релейного калькулятора.
NotSlow
19.11.2023 10:36+4Да, ssd работают тихо и быстро, но есть какая-то магия в хрусте медленного жесткого диска.
Электрические авто работают тише и быстрее, но тоже многие кайфуют от звука менее производительного двс.
Есть оцифрованный звук, но некоторые все равно готовы слушать скрежет иглы по грампластинке.
Это ощущение чего-то настоящего, что можно увидеть, услышать, почуствовать вибрацию. Против чего-то более эффективного... но ненастоящего и фальшивого для подсознания.
NickDoom
19.11.2023 10:36Сейчас меня тут убьют, но вот ещё тема — из некро-харда сделать ретро-вычислитель. Оно просто крутится на одной дорожке, считывает последовательно команду и аргумент, отсчитывает (пропускает) указанное аргументом число бит, читает, выполняет команду, отсчитывает указанное аргументом число бит и пишет. Все переходы и тому подобное — через перезапись.
Хотя это потребует самодельной головки, что уменьшает ёмкость трека до каких-то килобайт. Штатная, без кучи усилий, будет постоянно мимо дорожки промахиваться. Проехали :(
Может, гарвардская архитектура с прошивкой на вращающейся фотопластинке, чтением через фотообъектив, а память на ферритовых кольцах?
YMA
19.11.2023 10:36Возьмите 3,5" дисковод, esp32 и реализуйте свою мечту. ;) 5,25" боюсь, уже не найти в живом виде.
200sx_Pilot
19.11.2023 10:36+3В следующем завораживающем аудиовизуальном видео показано, как калькулятор обрабатывает умножение 111 на 222:
у меня оба видео - первые.
и на индикаторы просится светофильтр.
chnav
19.11.2023 10:36Мне кажется если бы для управления обвязкой использовали FPGA - получилось ещё более близко к цифровой логике. Впрочем и туда можно вшить процессорное ядро, но это уже на совести авторов проекта.
ZyXI
19.11.2023 10:36+1А можно спросить, что не так с релизацией макета в KiCAD? По моему опыту проектирования дорожек с дугами у последнего KiCAD всё лишь немного хуже, чем у Altium 18 (не знаю, как у более новых) — т.е. не так удобно, как обычные дорожки под 45° из‐за того, что всякое перетаскивание не работает (точнее, производит дорожки под 45°), но если вы не собираетесь делать что‐то вроде ведения параллельно 32 дорожек от микросхемы A к микросхеме B, то неудобства не такие уж большие.
Или я бы даже сказал, что если вы можете всё развести где нужно с первого раза, так же с самого начала расставив компоненты как нужно, то неудобств особых и нет даже при 32 параллельных дорожках. Если у вас проект с пачкой современных многоножек, то с первого раза, скорее всего, ничего не получится. Но с плотностью трассировки в вашем проекте переразводок должно быть намного меньше.
AlexMih
19.11.2023 10:36+2Мне кажется, куда интереснее было бы реализовать пусть крохотное, но полностью релейное счетное устройство. И это вполне реально, и позволило бы глубже окунуться в мир ретро-ЭВМ. Сердцем устройства оставить целочисленный сумматор - это уже сделано. Для вычитания представлять слагаемые в дополнительном коде - сперва вручную, а при желании позже сделать для этого отдельный блок. Вывод оставить двоичный, линейкой светодиодов - переводите в уме. А опроса клавиатуры можно избежать, если не следовать за инерцией мышления, и не копировать дизайн современых калькуляторов, а вспомнить, как ввод значений делался раньше: выставил значение на панели кнопок-тумблеров, нажал "ввод" - и число вносится в нужный регистр:
Hidden text
Demon416
19.11.2023 10:36+1Светодиоды это слишком современно
Блинкерный или другой электромеханический индикатор будет более уместен
mikryukovsl
19.11.2023 10:36-1Согласен! Автору калькулятора не хватило стойкости и он повёлся на поводу. Да я видел в детстве даже механический вычислитель, а там сначала нужно выставить поворотные колёсики с цифрами, это ввод начальных данных, и после повернуть ручку как у мясорубки механической. Вот от этого девайса не поддташнивало, а даже радовало хитроумностью изобретателей, в отличии от этого поста.
Dovgaluk
19.11.2023 10:36Вот и релейный компьютер, и клавиатура, и печать: https://habr.com/ru/articles/750554/
kh0
19.11.2023 10:36Технически, можно используя технологии древних на ферритовых колечках попытаться сумматор заинженерить, главная сложность была бы смостырить 4 входовый дешифратор или возить с оптимизацией. А всю обвязку запихать в мк. Быстродействие сумматора было бы весьма-весьма. А ниже реле только механический сумматор по иерархии остался наверное).
sdy
19.11.2023 10:36+1За такой перевод автор бы точно не похвалил, вот для примера только пару перлов:
использованные мной прозрачные детали
- что это за ересь? в оригинале четко прописано - the relays
Инициализация строки «входящего переноса» на нуль.
- опять какой-то бред, в оригинале - Initialize the adder “carry in” line to zero
Дислайкать не стал, только из уважения к реальному автору материала. Но так нельзя переводить, это же не художественное произведение, а технический материал. За такое в советское время по шапке бы точно надавали.
YMA
Не, неспортивно. Получился не релейный калькулятор, а "продукт релесодержащий". :)
Типа "лампового" усилителя, где пара ламп стоит во входном каскаде, а дальше стыдливо прячется TDA-шка D-класса.
engine9
Грустнее, когда лампа стоит между двумя ОУ и всё это гордо называется "ламповым предусилителем" :(
nafikovr
справедливости ради, ламповое "украшательство" звука так получить можно. но я с вами соглашусь.
NickDoom
Не вижу, как тут можно сделать на чистых реле, не превратив девайс в отдельный флигель с бюджетом небольшой африканской страны.
Но можно вывернуться, сделав на паре десятков реле простейшее АЛУ, а для коммутации этого дела поставить вращающийся
пингвинийбарабан с микрокодом, который при помощи пары десятков графитовых щёток это безобразие постоянно перекоммутирует.Даже более того, там вся остальная электроника, кроме клавиатуры и индикаторов, в этом мавару-пингвиндруме поместится с потрохами, потому что размер его будет эпичен даже при минимальнейшем размере дорожек.
PuerteMuerte
Например, не делать всякие жирные вещи, которые лезут в голову современному инженеру, вроде "сканирования клавиш", как предлагал автор. Последовательный номеронабиратель, два регистра на реле и сумматор.
NickDoom
Ну, если только складывать — то да. https://habr.com/ru/companies/cloud4y/articles/708154/comments/#comment_25062912
PuerteMuerte
...и вычитать. И с помощью дополнительной схемы - умножать и делить.
Bluewolf
Вау, надо почитать, как они упихнули всё в столь небольшое количество реле
Разочаровывающее чувство разочарования от проекта