Давайте думать над железкой (TRIADOR)

Уравновешенная троичная система счисления - форум переехал с http://ternary.info

Moderator: haqreu

haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

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

Итак, память инструкций. Один сегмент из себя представляет железку, принимающую на вход три трита адреса (offset), а на выход выдающую пять тритов самой инструкции:

Image

Внутри сидит пять раз повторённая вот эта схема:

Image
haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

Дальше, программный счётчик имеет 9 входящих линий и 7 выходящих:

Image

7 выходящих линий V0-V6 дают семиразрядный троичный счётчик. При этом V4,V5,V6 даёт номер сегмента памяти программ, V1,V2,V3 смещение (номер инструкции внутри сегмента), а V0 - это номер текущего цикла. То есть, у меня каждая инструкция будет иметь три цикла.

На вход CLK идёт троичная пила, при этом счётчик увеличивает своё значение при каждом восходящем фронте N-O-P.

Счётчик считает импульсы CLK только если на линии Rewrite подана -1. Если на Rewrite не -1 (0 или 1), то значение счётчика переписывается на то, что дано на входных линиях R0-R6.

Внутри счётчик выглядит следующим образом:
Image
haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

Дальше, если у нас есть код инструкции, то взяв старшие два трита (OC5 и OC4), можно сгенерировать пять сигналов, которые включат куски АЛУ, соответствующие пяти инструкциям базовой архитектуры. Я их расположил по порядку, -1 на линии включает АЛУ.

Image
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Re: Давайте думать над железкой (TRIADOR)

Post by petrenko »

haqreu wrote:... Как мне эти 6 пластин организовать в пространстве .. ? .. Какие будут идеи ? ..
вид сверху :

_|_
/|\
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Давайте думать над железкой (TRIADOR)

Post by Lavr »

haqreu wrote:Плоский вариант размещения самый простой, но плох своей немобильностью.
Как раз, будучи оформлен в виде плоского стенда с прозрачной открывающейся крышкой,
занимает наименьший объем, визуально весь доступен, мобилен, если сверху приделать
ручку, не мешает в помещении, т.к. всегда может быть размещен на стене или у стены.
iLavr
haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

Продолжаем разговор. Следующий логический блок - это оперативная память. Называть регистрами я её не буду, т.к. она содержит блок адресации, и прямого доступа к ячейкам у меня нет. В моей памяти 13 трёхтритных ячеек = 39 ячеек памяти с запоминанием по нисходящему фронту PON. Все 39 ячеек получаются одинаковой схемой при помощи двух тримуксов:

Image

В этой схеме две ячейки с запоминанием по уровню собраны в пару ведущая-ведомая, в итоге оно запоминает по фронту PON.


Вся память представляет собой логический блок следующего вида:

Image

Входных линий семь: три линии адреса, одна линия CLK, три линии A (то, что нужно в память записать при подаче PON на CLK). Три выходных линии Q (это то, что хранится в памяти). Внимание, тремя линиями адреса теоретически можно адресовать 27 ячеек, но у нас только 13. Поэтому "регистры" выбираются положительными значениями на линии адреса. Все невалидные адреса в моей железке приводят к выбору R1.

Итого плата памяти представляет собой 39 ячеек с запоминанием по ниспадающему фронту, и 7 мультиплексоров 1:13.
haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

Вот грубо нарисованная схема моей имплементации триадора:

Image

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

Тонкость: пропуск команд происходит на уровне декодера, на этой схеме я нарисовал что декодер просто не генерирует ни одной линии ENABLE_**, а АЛУ всё равно получает код инструкции. В моём текущем исполнении сделано несколько не так: у меня декодер генерирует фальшивый код инструкции (OOOOO), то есть, АЛУ получает опкод не из регистра команд, а непосредственно от декодера.
В принципе, оба подхода эквивалентны.
haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

Показываю ещё пару картинок:

Image

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

Счётчик увеличивается на каждом восходящем фронте N-O-P (красные пунктирные линии). Вся память у меня с запоминанием по ниспадающему фронту P-O-N (зелёные пунктирные линии). На слабую долю хлопает :)
Это сделано для того, чтобы все переходные процессы уже давно устаканились. Вот схема моего компьютера, на ней нарисованы практически все провода.

Image

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

Специальное внимание нужно уделить инициализации компьютера при старте:

1) клок должен обязательно начинаться с состояния P (чтобы не пропустить ниспадающий клок цикла N), это одна ячейка памяти и one time fire схемка на паре мультиплексоров. Поэтому нужно инициализировать эту ячейку памяти.
2) нужно записать N NNN NNN в счётчик инструкций
3) регистр инструкций на всякий случай нужно обнулить в ничего не делающую инструкцию OOOOO.
4) флаг пропуска инструкции в декодере нужно тоже обнулить.

Оперативная память и все внутренние буферы АЛУ при старте будут получать мусор. Вроде ничего не забыл.


Тонкость: пропуск команд происходит на уровне декодера: у меня декодер генерирует фальшивый код инструкции (OOOOO), то есть, АЛУ получает опкод не из регистра команд, а непосредственно от декодера.

Можно сделать иначе: декодер может просто не генерировать ни одной линии ENABLE_**, а АЛУ всё равно получает код инструкции непосредственно из регистра команд. В принципе, оба подхода эквивалентны.
haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

Давайте покажу, как у меня работает универсальная унарная операция над R1.

Напоминаю, что это опкод ONttt, и оно осуществляет потритовую операцию. Сама логика работы очень простая:
если у нас число Q (состоящее из трёх тритов Qhi Qmi Qlo), и есть младшие три трита опкода OC3 OC2 OC1, то можно получить результирующее трёхтритное число A следующим образом:

Image

Ещё раз: OC задаёт команду, Q - параметр, A - результат. Если с OC понятно, просто берём младшие три трита из регистра команд, то число Q нужно получить из ячейки R1 оперативной памяти. Посему чисто этой схемы не хвататет, нужно ещё немного синхронизации с внешним миром.

Напоминаю, что декодер инструкций нам даёт входящий сигнал EN_OP (нужно включить этот кусок АЛУ, когда этот сигнал равен -1). Тогда на адресный вход нашей оперативки можно подать адрес OOP при условии, что EN_OP=-1:

Image

Это нам гарантирует, что два разных куска АЛУ не обратятся одновременно к разным кускам памяти, создав короткое замыкание на адресной линии. Таким образом, входы мультиплексоров, висящие в воздухе (обозначены как n.c.) - это очень важная часть схемы.

Линии Q нам экранировать не надо, т.к. они идут только на чтение. А вот линии A для сохранения результата и линию клока памяти C (напоминаю, память сохраняет по нисходящему клоку P-O-N) нужно тоже аккуратно экранировать от неосторожного включения в неподходящий момент.

То есть, полная схема универсальной унарной операции над R1 выглядит следующим образом:

Image

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

Итого пять с половиной тримуксов на полный срез АЛУ, занимающийся потритовой унарной операцией.
haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

Любопытно выглядит кусок АЛУ, отвечающий за команду безусловного перехода (JP). Вычислений в нём нет вообще никаких, одна синхронизация (я покрасил все мультплексоры в синий цвет). Итак, как она работает. Во-первых, нам надо на входы R4-R6 (сегмент) счётчика команд подать содержимое регистра R13. Для этого при условии того, что наш срез АЛУ включен (EN_JP=-1), подаём на адресную линию памяти число PPP. Затем необходимый адрес берём из линии Q оперативной памяти (сегмент) и младших трёх тритов опкода (смещение). Этот адрес заводится на счётчик команд через мультиплексоры для того, чтобы не было конфликта во время нажатия кнопки резет. Резет обнулит регистр команд, таким образом, даже если EN_JP был включен, он обнулится и позволит переинициализировать счётчик. Разумеется, токоограничительные резисторы всё же приветствуются.

Сама команда перезаписи подаётся на линию Rewrite программного счётчика (всё, что отлично от -1) при двух условиях: а) EN_JP=-1 и б) CLK=1. Напоминаю, что новый опкод у нас копируется по ниспадающему фронту P-O-N, таким образом, EN_JP подготовится при CLK=-1. Условие перезаписи счётчика при CLK=1 - это просто задержка, которая позволит памяти выбрать регистр R13. Таким образом, JP - это единствення операция, которая исполняется в один цикл вместо трёх (у меня линия R0 счётчика жёстко заведена на -1), поэтому любая перезапись счётчика приводит к перезаписи цикла = N.

Image
haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

Ну и напоследок из реально запаянного команды R1,R2,R3,R4 (прямая запись в регистры R1-R4).

Image

Думаю, что после предыдущих комментариев тут писать особо нечего. Разве что отметить, что запись в память произойдёт два раза: на цикле O и на цикле P, что, впрочем, никак не отразится на работоспособности. Из базовых команд АЛУ мне осталось сделать SK и RR. Схемы у меня уже в блокноте нарисованы, но не проверены в железе. Впрочем, ошибиться там негде :)
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

Прикинул тут, что в 2x2мм чип влезет только 500 троичных мультиплексоров, т.е. триадор в него не влезет :(
А скажем если заказывать 3x3мм, то оно будет несколько дороже, но зато на 1300 троичных мультиплексоров, которых на триадор должно хватить за глаза (даже с памятью)
Кроме того кристалл большего размера сможет вместить в себя больше падов - например тот же 3x3 сможет до 76 ног поддержать :o
Можно скажем в PLCC68 упаковаться, для которого сгодится 2.7x2.7мм, куда примерно 1000 троичных мультиплексеров (с хвостиком) влезет!

P.S. Вот так к примеру можно распиновку PLCC68 организовать:
1 земля
1 питание
1 вход тактирования
6 адрес для внешней памяти
5 слово из внешней памяти
39 выходы всех регистров R1...R13!!!
3 входы для R13 (по умолчанию цепляются к выходам R13)
и после этого ещё остаётся 12 ног на тест и например на организацию внешних EX-команд (как запись в память программ)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

Триадор на хакадее https://hackaday.io/project/28579-homebrew-ternary-computer за день получил 25 тысяч просмотров скорее всего вот по этому :roll:

https://www.reddit.com/r/programming/comments/7k6duz/the_only_ternary_computer_made_for_real_in_the/
Я тут за главного - если что шлите мыло на me собака shaos точка net
haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

500 муксов может хватить. А что ты собирался в чип закатывать от триадора? Не целиком же компьютер. Память программ явно снаружи должна быть, например...
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

haqreu wrote:500 муксов может хватить. А что ты собирался в чип закатывать от триадора? Не целиком же компьютер. Память программ явно снаружи должна быть, например...
500 отдельных мультиплексоров - не сдвоенных тримуксов, а память да - снаружи (см. выше P.S. который я только что добавил)
можно попробовать EX-ы снаружи организовать (потребуется некоторая привязка - как минимум 3-тритный ввод данных)
Я тут за главного - если что шлите мыло на me собака shaos точка net