Релейная ЭВМ версия 2. Релейная логика. Сумматор с параллельным переносом

Блог проекта BrainfuckPC
Привет, давно не виделись. Я вернулся к проекту релейной ЭВМ и хочу представить на суд продолжение этой темы.
UPDATE: Снял видео из цикла BrainfuckPC. Дабы не плодить новую статью, добавлю его сюда:


Введение

Релейная ЭВМ должна быть не только релейной, но еще и быстрой. Как и любая другая ЭВМ, моя РЦВМ будет синхронной машиной, оснащенной тактовым генератором. Естественно мне не хочется растрачивать впустую циклы тактирования и постараться каждую операцию уместить в один цикл — т. е. за нарастающий и спадающий фронты синхронного генератора успеть загрузить новую команду и исполнить ее. Желательно при этом чтобы все команды выполнялись за одинаковый период времени.

Каждое реле имеет некоторую задержку срабатывания и отпускания, которое мы примем за 1 условную единицу времени(у.е.в.) Если будем использовать реле РЭС22, 1у.е.в. будет равен 12-15мс (справочное), РЭС64 — 1.3мс(справочное). Самой дорогой операцией в АЛУ моей машины является сумматор.
Сумматор сам по себе довольно простой и быстрый, но «есть один нюанс», который заключается в способе вычисления и передачи сигнала переноса.

Изначально я планировал использовать сумматор с последовательным переносом. В таком сумматоре каждый последующий разряд зависит от состояния сигнала переноса разряда текущего. В итоге длительность операции вычисления будет колебаться между 2 у.е.в. — N*2 у.е.в., где N — число разрядов. В итоге, 8-разрядный сумматор с последовательным переносом будет иметь максимальную задержку 12 у.е.в.

Рисунок 1: Принципиальная схема 4-разрядного сумматора с последовательным переносом
Такой вариант меня не устроил, поэтому будем проектировать сумматор с параллельным переносом. Так как сумматоров в системе будет как минимум два — сумматор в АЛУ и сумматор текущей команды (Instruction Pointer — IP) (не хочу отдавать его на откуп микроконтроллеру), задачка становится еще более актуальной. Сумматор в АЛУ будет 8-разрядным, сумматор IP — 16-разрядным.

Схема суммирования

Рассмотрим таблицу истинности схемы суммирования двух бит с переносом:

Уравнение суммирования можно описать с помощью логической операции XOR:

И в релейной схеме выглядеть вот так:

Рисунок 2: Принципиальная схема сложения с переносом
Как видно из рисунка, операция суммирования с переносом требует 4 реле типа РЭС55 на разряд. Это число является постоянным для любого числа разрядов. Итого на сумматор АЛУ нам потребуется 32 реле, на сумматор IP — 64 реле.

Параллельный перенос

По таблице истинности составим уравнение операции переноса:

Приняв получим

Следующий разряд будет зависеть от предыдущего:

Разворачивая и подставляя до посинения, получаем:

Как говорится, ничто не предвещало бури.
Давайте посчитаем во сколько реле нам это встанет.
2AND можно организовать двумя путями:

Рисунок 3: Принципиальная схема логического AND — с полной развязкой (а) и частичной (б)

Общая черта логического И представленного на рисунке 3а, б заключается в масштабировании — без особо труда можно добавить дополнительный вход без усложнения коммутационной схемы. Отличие в том, что для создания логического AND на N входов схеме на рисунке  3а потребуется N реле РЭС64, в то время как для схемы на рисунке 3б — (N-1).

Логическое ИЛИ организовывается так:

Рисунок 4: Принципиальная схема логического OR с полной развязкой (а) и ее отсутствием (б)

Схема на рисунке 4.а представляет собой классическое OR на реле и обладает неоспоримым преимуществом — полностью развязывает вход от выхода. Зато вторая схема совершенно не требует реле и главное — не имеет задержки срабатывания ( задержка конечно есть, но на порядки меньшая чем у реле и про нее можно даже не думать). С другой стороны, на диоде падает целый 1 Вольт напряжения, что для релейной схемы с питанием 5-6В может быть критично.
Обе схемы требуют N элементов для создания N-разрядного OR.

Подсчитаем общее количество реле, требуемых для переноса в 16-разрядном счетчике.
1. Для развязки сумматора на входе поставим полностью развязанные 2 AND и 2 OR, в количестве 16 штук каждый. Итого — 32 реле + 32 реле.
2. на перенос 16 разряда возьмем минимизированные схема AND и OR. Итого:
  • 17 OR — 0реле 17 диодов,
  • 16 AND — 15 реле 1 диод,
  • 15 AND — 14 реле 1 диод,
  • 14 AND — 13 реле 1 диод,
  • 13 AND — 12 реле 1 диод,
  • 12 AND — 11 реле 1 диод,
  • 11 AND — 10 реле 1 диод,
  • 10 AND — 9 реле 1 диод,
  • 9 AND — 8 реле 1 диод,
  • 8 AND — 7 реле 1 диод,
  • 7 AND — 6 реле 1 диод,
  • 6 AND — 5 реле 1 диод,
  • 5 AND — 4 реле 1 диод,
  • 4 AND — 3 реле 1 диод,
  • 3AND — 2 реле 1 диод,
  • 2AND — 1 реле 1 диод.
Итого 136 реле и 32 диода.

Хьюстон, у нас проблемы. На один только перенос потребуется около тысячи реле. Хотя погодите, а что если мы сделаем многовходовый AND с промежуточными выходами (рисунок 5).
В этом случае для переноса 16-го разряда мы сравним число диодов с количеством реле — 136 диодов, но при этом из него можно будет получить и все младшие разряды переноса просто забирая нужный разряд с многовходового AND. Более того, многовходовое логическое OR, в силу наличия диодов развязки в многовходовом AND, вовсе не будет содержать диодов.

Рисунок 5: Принципиальная схема 8-разрядного И с промежуточными выходами. Бездиодный выход нужен для стекирования элементарных блоков
Подводим подсчеты:
  • 16-Разрядный сумматор
    1. Схема суммирования — 64 реле, 1 у.е.в.
    2. Буферные элементы — 64 реле, 1 у.е.в.

    3. Схема вычисления переноса — 136 реле, 136 диодов, 1 у.е.в.
    4. ИТОГО: 264 реле, 136 диодов, задержка 2у.е.в.
  • 8-Разрядный сумматор
    1. Схема суммирования — 32 реле, 1 у.е.в.
    2. Буферные элементы — 32 реле, 1 у.е.в.

    3. Схема вычисления переноса — 36 реле, 36 диодов, 1 у.е.в.
    4. ИТОГО: 100 реле, 36 диодов, задержка 2у.е.в.
Задержка сумматора в 2у.е.в. меня полностью устраивает. Конечно, количество требуемых для 16-разрядного сумматора реле все равно достаточно высоко. На самом деле нет. 16-разрядный сумматор с последовательным переносом требует 144 реле (9шт на разряд). Так что увеличение количества релюшек на 84% ради уменьшения времени задержки с 24у.е.в. до 2у.е.в. — т. е. в 12 раз — очень даже оправданно.
Итоговая схемка 8-разрядного сумматора с параллельным переносом:

Рисунок 6: Принципиальная схема 8-разрядного сумматора с параллельным переносом. Вон те 8 блоков сверху — сумматор. Все остальное — схема переноса

Вся работа может быть изучена в репозитории на GitHub:
https://github.com/radiolok/RelayComputer2
В скором времени буду заказывать печатные платки и начну сие собирать.

7 комментариев

avatar
С другой стороны, на диоде падает целый 1 Вольт напряжения
Тут можно Шоттки.

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

Но, в любом случае, реквестирую память программ на ферритовых сердечниках.
Комментарий отредактирован 2016-10-28 21:08:38 пользователем bsvi
avatar
Не-не-не. Ждать 24 мс когда можно подождать 2мс с учетом того что у меня все основные операнды завязаны на сумматор — это расточительство. тем более что не настолько это сложно как оказалось.


Вот например 16-разрядный сумматор с параллельным переносом. На 32 унифицированных модулях. 248 реле. Это уже финальный вариант. С15 отсутствует за ненадобностью.
Сижу заказываю на али всякую мелочевку и в бой. Платы буду делать сам. Заодно вспомню как паяльная маска делается.

А память на ферритах — да где-бы контроллер взять! На ebay полно модулей 16х16, да контроллеров с адекватной ценой нема. Я вон 50к сердечников за 30 долларов купить могу и сам матрицы нашить, но управлять чем?

ЦМД-шки еще можно типа вот таких http://www.155la3.ru/k1602.htm но у этих встает вопрос где взять их и контроллер на них. На ebay встречаются bubble-memory но конских ценников.
Комментарий отредактирован 2016-10-29 10:19:40 пользователем radiolok
avatar
Ну, если так сложно, то прикольно еще можно делать память типа как на перфокартах, но на текстолите. На текстолите вытравливать квадратики и щетками снимать данные. Вообщем, по-любому, ПЗУ для такого девайса должна быть механической.
avatar
Ок, модуль памяти на 8К слов по 17 бит каждый (16 данные плюс один на контроль четности).
HP 5060-8331, устанавливался в компьютеры HP 2100A

цена в рублях. контроллера нет, но зато драйвер на месте.
avatar
Чувствую автор и до релейного суперскаляра дойдёт. :D
Если серьёзно – очень ядрёная штука, моей силы воли даже на ЭВМ из 74-й логики не хватило, тоже когда-то делал. :)
Кстати – какое еще планируется железо кроме АЛУ? По ПЗУ смотрю уже пошли обсуждения. :)

P.S.
Will it run Crysis? :D
avatar
А у меня в общем-то и АЛУ то нет. Сумматор, четыре регистра, немного защелок и микрокод(в разработке):


Пока блок памяти будет целиком на SRAM. у меня есть SRAM-кэш от 386-го или первопня: um61512ak-15 две штуки как раз 128Кб дадут. Загрузчик программы в первой итерации будет внешний, через МК.
Ферритовое ПЗУ с загрузчиком уже потом подключу, ибо Х его З как это делается :) Пока только подготовлю логику чтобы можно было страницы по 4Кб разных типов памяти ставить. Типа первые 8кслов — ПЗУ, следующие ОЗУ, потом внешняя шина и т.д.

Да, это вдобавок еще и Фон-Нейман :) Но с учетом только одного вычислительного блока суперскаляра от меня не дождетесь :) Хотя реализация предполагает израсходование только половины от имеющихся у меня запасов герконовых реле :) Другая половина ХЗ куда…
Комментарий отредактирован 2016-10-30 12:24:45 пользователем radiolok
avatar
Первая итерация реализации микрокода. Нихрена непонятно, ошибок нашел уже с кучу, системы тактирования нет, но общий объем логики примерно таков:


Изготовление начну, как ни странно — с модуля памяти. Так как там будет shadow MCU и 16 входов и выходов, что идеально для реализации отладочного логического анализатора.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.