Так почему троичные компьютеры "не взлетели"?

Dec 16, 2023 18:21

Чуть ли не первый пост у меня в ЖЖ был про уравновешенную троичную систему счисления. Затем разрабатывал уравновешенное троичное быстрое преобразование Фурье ( раз, два, три, четыре, пять, шесть, семь), давненько им не занимался, к сожалению.

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

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

Я думаю, основная проблема в ужасающем числе 19683 - именно столько существует различных 2-входовых троичных логических элементов! По контрасту, обычных двоичных 2-входовых элемента может быть только 16, из которых действительно оригинальных двухвходовых (не переходящих друг в друга, если поменять местами два входа) - лишь 8, и все имеют свои интуитивно понятные имена.


Давайте посчитаем. Начнём с 0-входовых элементов. Двоичных таковых ровно два: "0" и "1". Они же GND и VCC (или VDD). Троичных, очевидно, три: "0", "1" и "-1". Пока ничего удивительного.

Далее, смотрим на 1-входовые элементы. Двоичных их изначально 4 штуки, поскольку у нас есть два варианта входного сигнала (0 или 1) и мы имеем право установить любой ответ (0 либо 1) на 0 и любой ответ на 1, итого 22 = 4 разных элемента:

0 -> 0, 1 -> 0. Это просто "0".
0 -> 0, 1 -> 1. Это просто "буфер", повторитель. С логической точки зрения такой элемент не имеет смысла.
0 -> 1, 1 -> 0. Это инвертор, единственный "невырожденный" 1-входовой двоичный логический элемент.
0 -> 1, 1 -> 1. Это просто "1".

Троичных 1-входовых элементов заметно больше, 27 штук! Так получается, поскольку у нас 3 варианта входа (-1, 0, 1), и на каждый мы можем предложить один из 3 вариантов выхода, итого выходит 33 = 27 элементов. Перечислим первые 6:

-1 -> -1, 0 -> -1, 1 -> -1. Это просто "-1".
-1 -> -1, 0 -> -1, 1 -> 0. Это "вычесть 1 с насыщением".
-1 -> -1, 0 -> -1, 1 -> 1. Это "проверка >0".

-1 -> -1, 0 -> 0, 1 -> -1. Это "-|x|".
-1 -> -1, 0 -> 0, 1 -> 0. Это "ограничение не выше нуля".
-1 -> -1, 0 -> 0, 1 -> 1. Это "буфер".

И так далее... Там будет "циклически прибавить 1", "циклически вычесть 1", "прибавить 1 с насыщением", будет старый добрый инвертор, и ещё целая куча вариантов, которые и озаглавить-то сложно.

Теперь вспомним 2-входовые двоичные логические элементы. Тут возможны 4 входные комбинации (00, 01, 10, 11), и на каждую из них мы имеем право выдать 0 или 1, что даёт нам 24 = 16 различных элементов:

00 -> 0, 01 -> 0, 10 -> 0, 11 -> 0. Это просто "0".
00 -> 0, 01 -> 0, 10 -> 0, 11 -> 1. Это "И", он же "AND", он же &.
00 -> 0, 01 -> 0, 10 -> 1, 11 -> 0. Это ~A & B, т.е И, в котором один вход инвертировали.
00 -> 0, 01 -> 0, 10 -> 1, 11 -> 1. Это просто буфер на один из входов, второй игнорируется.
00 -> 0, 01 -> 1, 10 -> 0, 11 -> 0. Это A & ~B, то же самое, что 2 строками раньше, только входы поменяли местами.
00 -> 0, 01 -> 1, 10 -> 0, 11 -> 1. Это просто буфер на другой из входов, ничего интересного.
00 -> 0, 01 -> 1, 10 -> 1, 11 -> 0. Это исключающее ИЛИ, оно же XOR, оно же ^.
00 -> 0, 01 -> 1, 10 -> 1, 11 -> 1. Это обычное ИЛИ, оно же OR, оно же |.
00 -> 1, 01 -> 0, 10 -> 0, 11 -> 0. Это ИЛИ-НЕ, оно же NOR.
00 -> 1, 01 -> 0, 10 -> 0, 11 -> 1. Это исключающее ИЛИ-НЕ, оно же XNOR, оно же эквивалентность, ==.
00 -> 1, 01 -> 0, 10 -> 1, 11 -> 0. Это обычный инвертор на один из входов.
00 -> 1, 01 -> 0, 10 -> 1, 11 -> 1. Это A OR ~B, т.е обычный ИЛИ с одним входом инвертированным. Он же оператор следования, или импликации. Тот самый, в котором "из лжи следует истина".
00 -> 1, 01 -> 1, 10 -> 0, 11 -> 0. Это обычный инвертор на второй из входов.
00 -> 1, 01 -> 1, 10 -> 0, 11 -> 1. Это ~A OR B, та же импликация, только входы поменяли местами.
00 -> 1, 01 -> 1, 10 -> 1, 11 -> 0. Это И-НЕ, он же NAND, он же латрёшка.
00 -> 1, 01 -> 1, 10 -> 1, 11 -> 1. Это просто "1".

Вот так перебрали все возможные варианты и, кроме констант, буферов и инверторов, нашли ещё 8 уникальных логических элементов.

Этот перебор не был таким уж тяжёлым, и могло бы показаться, что от перехода к тритам большой разницы не будет. Не тут-то было... Теперь у нас может быть 9 различных входных последовательностей, и на каждую из них мы имеем право выдать произвольный трит на выход. Вот и получаем 39=19683 различных элемента!

Может показаться, что "много-не мало"! Не обязательно реализовывать их все, достаточно рассмотреть конкретные задачи и уже "выдумывать" на ходу необходимые нам элементы. Да и если это делать на ПЛИС, там в любом случае любая логика реализуется в виде таблиц (LUT), так что вопрос чисто технический, в размере этих таблиц, там разница будет не столь велика. Обычно используется 4-входовый элемент, т.е различных входных комбинаций 16, и нужно записать реакцию на каждую из них, так что один ЛЭ в ПЛИС содержит 16-битную память, которая инициализируется в начале работы. Если сделать 4-входовой троичный элемент, комбинаций будет уже 81, и на каждую надо выдать по 1 триту. Т.е вместо 16 бит - 81 трит, куда не шло.

Думаю, дело именно в человеческом мышлении. 8 различных элементов - очень хорошее число для человека, обозримое, их все можно непосредственно держать "в памяти" и быстро сообразить, какому элементу соответствует конкретная задача. Но 19683 - это сразу хана... Да, можно, наверное, продолжить на троичных элементах собирать схемы так, как это делалось на двоичных - те же мультиплексоры, дешифраторы, регистры и так далее, ограничившись, например, лишь "объёмом данных". Рассмотреть отдельно именно арифметику: как уравновешенные троичные числа складывать, вычитать, умножать и делить.

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

Все методы синтеза комбинаторной логики надо пересматривать! Да ту же конъюнктивную / дизъюнктивную нормальную форму придётся выкинуть на помойку, а значит, прощайте методы "в лоб", как таблицу истинности превратить в, пусть и громоздкую, но вполне обозримую и работающую логическую схему! Туда же отправляем диаграммы Карно - их можно нарисовать, но теперь это будут какие-то "контурные карты", с островками из (-1) и 1.

Возможно, всё не так страшно, и есть какая-то своя, "троичная нормальная форма", но у того же Брусенцова я не видел её описания (или вообще каких-то методов синтеза), он всё больше пересказывал разными словами неинтуитивность бинарного силлогизма (если 2+2=5, то я папа Римский) и красоту уравновешенной троичной системы счисления, и я с этим полностью согласен, просто не понимаю, а как мне разработать свой троичный компьютер, чтобы он максимально задействовал мощь троичной логики?

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

По крайней мере, такая мысля меня посетила после возни на ПЛИСах, в том же верилоге, и с ручной реализацией всевозможных модульков, где на уровне RTL у меня получался вдвое меньший расход ЛЭ, чем в представлении "абстрактного конечного автомата", где квартус не понимает "вот на этот регистр мне в этом состоянии плевать, делай с ним что хошь", отчего логика растёт как не в себя.

Poll Троичные компьютеры

странные девайсы, ПЛИС, бред, программки, уравновешенное троичное БПФ, работа, троичная система счисления

Previous post Next post
Up