Релейная ЭВМ версия 2. Релейная логика, АЛУ.

Блог проекта BrainfuckPC
«Доктор, я опять занимался этим всю ночь..»

В далеком 2010 году я представил общественности небольшое 4-битное АЛУ и назвал его РЦВМ-1.
О ней можно почитать ВОТ ТУТ.

Еще тогда я загорелся желанием создать вторую версию этой адской машины. Время от времени я открывал DipTrace и рисовал. Но сегодня ночью я нарисовал слишком много и представляю текущее состояние своей работы на критику и рекомендации АЛУ новой машины. Делать эту машину я буду еще несколько лет :)

Куча релейной логики под катом.

Изначальная задача звучит следующим образом:
Разработать полноценную 8-разрядную ЭВМ на базе герконовых реле.
герконовые реле были выбраны ввиду своей компактности и быстроты работы — среднее время срабатывания реле — 1мс позволяет в теории получить тактовые частоты в десятки герц.

На данный момент, при проектировании используются следующие герконовые реле:

РЭС43 — 2 управляющие катушки, 2 пары замыкающих контактов;
РЭС55 — 1 управляющая катушка, 1 пара переключающих контактов;
РЭС64А(Б) — 1 управляющая катушка, 1 пара замыкающих контактов;
РЭС83 — 2 управляющих катушки, 4 пары замыкающих контактов.

около тысячи реле в коробках. АЛУ, как оказалось, съест половину.

Релейная логика

Первая задача — создать основные блоки РЦВМ. Есть несколько полезных книжек по этому поводу, мне пока хватает университетского курса по релейно-контакторным схемам.
Поехали:
2-AND

Этот вариант дает развязку левой части от правой и возможность запитать схемы от разных напряжений (так как релюхи с разными паспортами).
2-OR

Одно реле это не баг, это фича — РЭС43 имеет две полноценные катушки.
2-AND-NOT

А вот тут такая фича уже не прокатит — контакты на переключение.
2-OR-NOT

2-XOR

A XOR B понадобится для совершения математической операции в АЛУ
3-XOR

Но если честно, то в АЛУ нужен 3-входовый XOR, дабы добавить C флаг.
Выведем A XOR B, так как она пригодится где-то дальше.
NOT

без инвертора никуда.
Ключи
Для подключения тех или иных блоков и функций необходимы ключи:

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

Двухбитовый ключ на сдвоенном реле.

Четырехбитовый ключ.

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

Теперь можно скомбинировать элементарную логику в более высокие уровни:
SR-триггер

RS триггер будет основой для регистров — РОН и промежуточного
Одно реле устанавливает бит, второе сбрасывает.
синхронный D-триггер

Задача этого триггера — по сигналу на синхроимпульсе сохранить данные. Для этого сигнал инвертируется (дабы правильно отрабатывать S и R сигналы) и через ключи подается на вход RS-триггера, решающего основную задачу.
1 bit ADD+C

Главный элемент АЛУ — сумматор с переносом. результат реализуется с помощью 3XOR,
перенос — когда как минимум два из трех входов — единины.

Система команд

Так как мне безумно нравится MSP430, я решил частично скопировать его систему команд по работе с арифметикой и логикой. Причем будем придерживаться логике нативых и эмулируемых команд — про последние не забудем на этапе создания компилятора:
  1. ADD — dst = dst+src, не забудем отключить вход C;
  2. ADDC — dst = dst+src+C;
  3. SUB — dst = not.src + dst + 1, не забудем подать 1 вместо C на вход С нулевого бита
  4. SUBC — dst = dst+scr+C;
  5. XOR — dst = dst XOR src;
  6. AND — dst &=src;
  7. BIT — dst&src, управляет флагами, но не копирует результат. не забыть отключить сигнал STORE
  8. BIC — dst &= ~src — инвертируем вход и делаем лог. умножение;
  9. BIS — dst |=src;
  10. RRA — MSB -> MSB… LSB ->C, арифметический сдвиг вправо;
  11. RRC — C-> MSB… LSB ->C, циклический сдвиг вправо, не забыть, что читается старое значение С, а пишется новое
  12. CMP — TST = A XOR B, C = A*B, описание ниже

АЛУ

Так как предполагаемый объем реле на 1 бит будет существенным, принято решение создать 1 битовую имплементацию АЛУ, которую блоками расположить на общей печатной плате. В теории, при Внезапном наличии нескольких тысяч реле железку можно будет расширить по 16 бит :)
Так как операции сдвига работают со всеми битами и там как раз подойдут 4-битовые ключи, они сделаны отдельно:
RRA

RRC

Выходы подключаются через блок 1бит АЛУ, так как в нем реализован промежуточный буфер.
блок 1 бит АЛУ

Назначение выводов:
Слева:
  • C — перенос с предыдущего разряда или из регистра;
  • 0bit=1 — устанавливается для 0 разряда для операции SUB;
  • src — разряд регистра источника;
  • dst — разряд регистра приемника;
  • ADD — на TST результат сложения;
  • ADDC — на TST результат сложения с переносом;
  • SUB — на TST результат отрицания;
  • SUBC — на TST результат отрицания с переносом;
  • AND — на TST результат логического умножения;
  • BIT — на TST результат логического умножения без записи в промежуточный регистр;
  • BIS — на TST результат логического сложения;
  • BIC — на TST результат сброса бита;
  • XOR — на TST результат математического сложения;
  • CMP — на TST результат проверки на Z без записи в регистр. Также проверяется C;
  • STORE — попытка записи TST в буфер;
  • LOAD — попытка выгрузки данных из буфера;
Справа:
  • VCC — питание. предположительно 12В;
  • rslt — прочтенные данные из буфера;
  • TST — результат операции. По нему производятся оценка N(bit7=1),Z(bit0...bit7=0);
  • С — флаг переноса. По нему определяются полуперенос-H(bit4=1), и переполнение (V=C8)
Полная схема:

Актуальная схема из моего облака ЗДЕСЬ.
По блокам:
ADD/SUB

сигналы src и dst поступают на общий вход. Если выбрана команда SUB, src инвертируется. Сигналы поступают на влок мат. сложения.
Сигнал переноса выбирается в зависимости от команды. Ключ будет активирован для команд ADDC, SUB и SUBC. Для команды SUB в случае первого бита вместо внешнего сигнала переноса подается лог. 1, что дает dst+not.src+1.
По любой из команд сдвоенный ключ выведет R на TST и С на С.
Линия A XOR B через однобитовый ключ по своей команде будет подана на TST
AND BIT BIS

Через блок И (вместо него использован ключ) сигнал подается на ключ результата.
Команды AND и BIT разделяются через блок ИЛИ, при этом сигнал BIT уходит на блок запрета STORE/LOAD
ИЛИ просто подается через ключ
BIC

сигнал dst умножается на инвертированный src и подается на ключ.
CMP

задача команда CMP — выдать Z при нуле, и C при переносе операции dst-src.
нуль при dst- src будет при AB=00, AB=11. как как TST проверяется на Z целиком, то просто выведем на него результат A XOR B. С будет при AB=11, выведем на него A AND B
не забудем отключить STORE/LOAD для буфера — за это отвечает двухбитовый ключ, который отключится при командах BIT и CMP.

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

Итого на схему 1 разряда АЛУ, без операции сдвигов 36 реле. Когда-нибудь аккуратно размещу из на одной плате и сделаю 8-разрядный модуль АЛУ на четыре сотни реле. неплохо, да :)

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

avatar
Маниакально!
avatar
Вот, что значит щелкать битики
Комментарий отредактирован 2014-10-19 23:56:28 пользователем faddistr
avatar
в реле не бумбум, как работает RS триггер, где хранятся данные?
avatar
Данные хранятся в состоянии самого реле.



Когда подается импульс на Set, через K2.1 начинает течь ток. Оно замыкает контакты K2.2 и начинает питать само себя. Таким образом, битик записался. Чтоб сбросить битик, нужно подать импульс на reset — K1.2 разомкнется и K2.1 отключится.
avatar
Это называется самоблокировка реле. У меня так в деревне управление водой из дома организовано — нажимаешь черную кнопочку — вода потекла (про селекцию клапанами, чтобы вода потекла в нужную трубу, умолчу). А вот чтобы отключить воду, приходится нажимать красную кнопочку — и у посетителя бани гаснет свет :) И это не баг, это фича :)

проснулся утром и перерисовал сумматор, уменьшив число реле с 10 до 7 (уверен это не предел) и D-триггер — с 5 до 4 :) Когда только одних триггеров во всем компьютере полторы сотни(17*8), важна каждая капля :)

Вместо инвертора и двух блоков И один ключ и один переключатель.
Сигналом на D выбираем сброс или установку, а сигналом клок подаем ииницу на вход переключателя.
Но это задача следующих выходных :)
Комментарий отредактирован 2014-10-20 22:26:55 пользователем radiolok
avatar
Насчет D-триггера, попробовал что-то сотворить. Вроде-бы, уместился в 3 релешечки. извиняюсь за постимпрессионизм :)

avatar

Правую часть совсем не понял — то что подписано LATCH это типа катушка третьего реле?
А за счет чего оно удерживается при отсутствии D и C(ведь питание идет через них) и как переключается?
И как сигнал C влияет на запись?
но если предположить, что я не увидел тонкой авторской предпосылки, то я вижу два переключающих контакта — а это опять два реле — один герконник с двумя переключающими контактами я не встречал, а два герконника — это уже 4 реле.
Сейчас глянул на схему регистра машины Гарри Портера — он перед записью просто обрубает всем триггерам регистра питание, они сбрасываются и он заливает новые данные :) Надо подумать над этим вариантом — минус 7*17 реле ) Но это будет синхронный буффер…
Комментарий отредактирован 2014-10-20 23:27:49 пользователем radiolok
avatar
Да, вот эти куски с D и С не правильно перерисовал :)



С низу — симметрично. Смысл в том, что когда клок нулевой, релюха-защелка находится в устойчивом состоянии. Когда клок высокий, ветка по которой она питается зависит от данных.

Естественно, есть «нюанс» в том, что при падающем клоке релюха может выключится до того, как включится основное питание, но это должен решить небольшой конденсаторчик :)

Но раз не бывает таких реле, то и уменьшить врядли получится.
avatar
Так у тебя еще и C на переключение :) и их тоже две штуки.
Так что триггеры сделаю по последней своей, а в регистры как у Гарри Портера сделаю с общим сбросом — там вовсе 2 реле на бит + 1 останется = 17 реле на буфер. и переключатель не нужен.
avatar
Ну и правильно :) А откуда будет код вводится? Имхо, сложный набор комманд для релейного компьютера, я бы делала One Instruction Set Computer.
Комментарий отредактирован 2014-10-21 11:07:10 пользователем bsvi
avatar
Код будет храниться в неканоничной микросхеме ОЗУ в 64 кбайт.
Причем небольшая область памяти будет выводиться на светодиодную матрицу 32х16 — надо же ее уже куда-нибудь пристроить, а то лежит без дела.

Я не ставлю перед собой задачу сделать простую машину. Можно и аппаратный брейнфак замутить, но смысл?:)
Комментарий отредактирован 2014-10-21 11:51:25 пользователем radiolok
avatar
Интересно прикинуть сколько будет жрать такая ЭВМ уровня процессора 386.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.