|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Давайте думать над железкой (TRIADOR)
Author |
Message |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Но с шуткой про математика ты так или иначе тут явно перегнул... Хотя... я тоже люблю анекдот " про цИганку".
_________________ iLavr
|
02 May 2020 23:55 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22730 Location: Silicon Valley
|
Ну почему перегнул? Тут тоже самое - чтобы получить вычитание предлагается сначала выполнить инструкцию "инверсия", что сведёт изначально поставленную задачу "реализовать вычитание" к уже известной задаче "реализовать сложение" А на самом деле надо подходить к решению комплексно и делать ОДНУ инструкцию, которая выполняет только одну операцию - вычитание...
|
03 May 2020 00:01 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
Ух ты, годами тишина, отвернулся на минуту, а вы уже десяток сообщений накидали В этой системе сдвиги и умножение/деление - не одно и то же. Пример: 11/3 = 3, а сдвиг PPN вправо даёт PP, что есть 4.
|
03 May 2020 00:08 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Это какое-то "масло маслянное" со словом "комплексное"... Ну что за комплексный подход? Вот смотри - это сумматор в пределах ОДНОГО трита: Тут и так всего дофига! А твой "комплексный подход" - подсыпать сюда еще 2 корпуса!
_________________ iLavr
|
03 May 2020 00:10 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А ты чаще форум читай и меньше справляй дни рождения неадекватных дедушек...
_________________ iLavr
|
03 May 2020 00:11 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
Не с точки зрения задержек, но с точки зрения сложности железа соглашусь, я не хочу вычитание делать, если сложения и инверсии хватит. Моя самая длинная программа на сегодня имеет несколько сотен инструкций, и честное пионерское, отсутствие вычитания (а я там вынужден вычитать в том числе) тормозит программу в лучшем случае на один процент. Кроме того, использовать одну из 27 всех возможных команд расширения - это ж дорого!
|
03 May 2020 00:14 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
кстати, я изменю чуть-чуть порядок команд пропуска, сделаю вот так: Таким образом, инвертируя аргумент, мы получаем инверсию логической операции. Мне кажется, что это проще запомнить.
|
03 May 2020 07:36 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22730 Location: Silicon Valley
|
11/3 = 3.666(6), что округляется до 4 Я в своё время думал сделать так или эдак - вспомнил, что существующий вариант скипов вроде бы получился проще в железе: http://www.nedopc.org/forum/viewtopic.php?p=141103#p141103UPDATE: попробовал большой вариант DDT-задания для skip-блока (старый skip-big.ddt и новый skip-big2.ddt), где отсутствуют только мультиплексоры вычисления знака регистра, с которыми всё понятно (+8 троичных мультиплексоров), а всё остальное включено (как и в реальной схеме полный декод команды отсутствует - приходит только enable-ne и 3 младших трита кода операции):
skip-big.ddt skip-big2.ddt Расширенные варианты получили похожие результаты - 20 functions (18 x DG403):
| | | | Code: $ diff ddt_skip-big_.c ddt_skip-big2_.c 7c7 < int ddt_skip-big_(int f, DDT i1, DDT i2, DDT i3, DDT i4, DDT i5, DDT i6, DDT i7, DDT i8, DDT i9, DDT* o1) --- > int ddt_skip-big2_(int f, DDT i1, DDT i2, DDT i3, DDT i4, DDT i5, DDT i6, DDT i7, DDT i8, DDT i9, DDT* o1) 13c13 < f2 = ddt_e12(f,i2,O,r1,&r2); --- > f2 = ddt_e21(f,i2,r1,O,&r2); 17c17 < f4 = ddt_e21(f,i2,r1,O,&r4); --- > f4 = ddt_e12(f,i2,O,r1,&r4);
| | | | |
18 корпусов (это без вычисления знака регистров) - чуть больше, чем вышло у меня 3 года назад - возможно оно быстрее из-за меньшего количества слоёв (меньше задержка? надо нарисовать и поглядеть на схему), но тем не менее - результаты у старого и нового варианта идентичны...
P.S. Запомнить на самом деле проще так, как было т.к. там во всех тройках сначала идёт меньше, потом равно, потом больше и в верхней части есть not - вобщем смотри сам, только тебе картинки придётся перерисовывать и описание менять во многих местах интернета
|
03 May 2020 08:21 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22730 Location: Silicon Valley
|
| | | | haqreu wrote: Мне сейчас начинает не хватать обычного сложения, так что ADD это пять. применения ADDC не очень вижу, а тем более SUB. SUB это просто две операции OP NOP ADD Аналогично и ADDC можно в несколько команд всего разбить. RRC - а какой смысл в потритовых сдвигах вообще? Какой самый частый сценарий для OPB? Для OPA, наверное, смена знака (OP NOP). | | | | |
Возвращаясь к идеям EX - чего у нас там остаётся в сухом остатке, чтобы осчастливить пользователя? NNNNN - EX -13 -> ADD (hardwired C,R1=R1+R2) <<<<< единственный железобетонный ADD NNNNO - EX -12 -> ADD-12 (programmable by PEX) NNNNP - EX -11 -> ADD-11 (programmable by PEX) NNNON - EX -10 -> ADD-10 (programmable by PEX) NNNOO - EX -9 -> ADD-9 (programmable by PEX) NNNOP - EX -8 -> ADD-8 (programmable by PEX) NNNPN - EX -7 -> ADD-7 (programmable by PEX) NNNPO - EX -6 -> ADD-6 (programmable by PEX) NNNPP - EX -5 -> ADD-5 (programmable by PEX) NNONN - EX -4 -> RMH (read higher triad from memory [27*R4+R3] to R1) NNONO - EX -3 -> WMM (write R2,R1 to memory [27*R4+R3]) NNONP - EX -2 -> RML (read lower triad from memory [27*R4+R3] to R1) NNOON - EX -1 -> JPI (store current PC+1 to R4,R3 and jump to R13,R2) <<<<< нужно для реализации CALL и RET NNOOO - EX 0 -> PEX (program OPB instances below and ADD instances above) NNOOP - EX +1 -> OPB №1 (R1=R1 o R2) - programmable by PEX or hardwired MSK? NNOPN - EX +2 -> OPB №2 (R1=R1 o R2) - programmable by PEX or hardwired MAX? NNOPO - EX +3 -> OPB №3 (R1=R1 o R2) - programmable by PEX or hardwired MIN? NNOPP - EX +4 -> OPB №4 (R1=R1 o R2) - programmable by PEX or hardwired something? NNPNN - EX +5 -> OPB №5 (R1=R1 o R2 where o is programmable by PEX or manually) NNPNO - EX +6 -> OPB №6 (R1=R1 o R2 where o is programmable by PEX or manually) NNPNP - EX +7 -> OPB №7 (R1=R1 o R2 where o is programmable by PEX or manually) NNPON - EX +8 -> OPB №8 (R1=R1 o R2 where o is programmable by PEX or manually) NNPOO - EX +9 -> OPB №9 (R1=R1 o R2 where o is programmable by PEX or manually) NNPOP - EX +10 -> OPB №10 (R1=R1 o R2 where o is programmable by PEX or manually) NNPPN - EX +11 -> OPB №11 (R1=R1 o R2 where o is programmable by PEX or manually) NNPPO - EX +12 -> OPB №12 (R1=R1 o R2 where o is programmable by PEX or manually) NNPPP - EX +13 -> HLT ( halt and catch fire ; )
Возможно из бинарных операций надо сразу же предоставить пользователю MIN, MAX, а также MSK (ибо маскирование в сбалансированной троичной системе не равна MIN как в двоичной системе): MAX=NOPOOPPPP MIN=NNNNOONOP MSK=PONOOONOP (такое маскирование включает негативное маскирование, когда при N сигнал инвертируется, при O - обнуляется, а при P - повторяется - в таком случае таблица истинности полностью симметрична) Чего там ещё у нас есть из полезных бинарных операций с симметричной таблицей истинности? Троичный XOR? Хм, по Дугласу Джонсу (см. http://homepage.divms.uiowa.edu/~jones/ternary/logic.shtml) получается, что троичный XOR это инверсия моего маскирования MSK XOR=NOPOOOPON в таком случае оно вряд ли нужно как отдельная инструкция т.к. мы можем просто сделать MSK и затем инвертировать потритно OP PON, а вот потритовое сложение SUM от Дугласа Джонса может пригодиться (и оно не равно XOR, как в двоичной системе): SUM=PNONOPOPN Ещё из интересного у него есть Consensus и Comparison, но это наверное слишком специфично и достаточно будет иметь это в программируемых инструкциях, не железобетонных В итоге имеем 8 программируемых инструкций в положительной части (с кодами от EX +5 до EX +12 которые реализуют OPB) и 8 программируемых инструкций в отрицательной части (с кодам от EX -5 до EX -12 которые реализуют разнообразные комбинации сложений, вычитаний и сдвигов) - опять же упрощённые реализации триадора могут программируемость и не предоставлять либо предоставлять частично т.к. программируемость требует дополнительного ОЗУ, если программировать программно (с помощью PEX), либо дополнительного ПЗУ, если программировать вручную т.е. переключателями (это кстати вариант для самодельного триадора минимизирующий количества дополнительного железа).А вот если сделать Comparison как в сях - если трит из первого аргумента равен триту из второго, то результат O, если меньше, то N и если больше, то P: CMP=OPPNOPNNO (таблица истинности тут НЕ симметричная, т.е. последовательность аргументов имеет значение!) тогда сравнивая таким образом две триады и они равны, то мы получим на выходе OOO (0), если получилось отрицательное число (самый старший ненулевой трит это N), то первая триада меньше второй, если положительное (самый старший ненулевой трит это P), то больше - выходит мы сравнили две триады БЕЗ вычитания P.S. Если внешняя память триадная (3 трита на ячейку), а не трайтовая (6 тритов на ячейку, как указано выше), то 3 инструкции обращения к памяти превращаются в 2: NNONO - EX -3 -> WM (write R1 to memory [27*R4+R3]) NNONP - EX -2 -> RM (read triad from memory [27*R4+R3] to R1) что есть суть тоже самое - мы просто игнорируем старшую триаду, которой физически может не быть в железе... P.P.S. А вот интересно насколько оказалась бы полезной в триадоре команада Permutation, которая перемешивала бы триты в R1 любом порядке? Имея три трита в результате нам надо задать источник каждого трита, которые могут быть младшим тритом, средним тритом или старшим тритом регистра R1 - одного трита достаточно, чтобы это указать - получается одной триадой мы можем задать такой Permutation для целевой триады - тогда имеет смысл программировать это на лету допустим содержимым регистра R2 и команду такую назвать PRM, поставив её скажем на место EX -5. Такая команда легко покроет все возможные вращения в кольце, не задевающие флаг C (например записав в R2 триаду OPN мы сообщаем PRM, что хотели бы сдвинуть R1 на 1 трит влево по кольцу). P.P.P.S. Если добавить источников - в дополнение к 3 тритам R1 добавим один трит флаг C плюс три константы N,O,P, то получаем 7 вариантов, программируемых двумя тритами (и ещё запас на 2 трита-источника остаётся - скажем на будущие теневые флаги?) на каждый трит результата - если выходной флаг C также будет результатом (для реализации вращений через флаг C), то нам надо 4*2=8 тритов, чтобы такую сложную пермутацию запрограммировать. Для круглоты ещё один трит можно задействовать скажем для указания того, что мы используем один из двух теневых флагов вместо основного флага C - вот это ваще будет гибкость неописуемая...
|
03 May 2020 16:36 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
По поводу команд расширения - прежде чем их добавлять, я бы хотел понять про каждую, что она даёт. ADD совершенно чётко даёт экономию в один сегмент памяти програм (или даже больше, если им пользоваться часто) + прирост производительности. Для чего нужны остальные команды? Я даже для OPA пока не вижу других применений, кроме как инверсии числа... halt and catch fire, конечно же нужна!
|
04 May 2020 02:43 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22730 Location: Silicon Valley
|
Для того чтобы превратить триадора в универсальный компьютер нужна память данных - команды RML,RMH и WMM Чтобы делать полноценные подпрограммы - нужны CALL и RET, которые реализуемы через JPI Остальное - особенно программируемое - надо смотреть на конкретные алгоритмы Кстати добавь виртуальный метод в класс Triador, чтобы внешние обработчики EX можно было цеплять - вот и попробуем Типа P.S. Я могу сам добавить и тебе заслать пул-реквест P.P.S. Да и OP надо бы к общему знаменателю привести http://www.nedopc.org/forum/viewtopic.php?p=154508#p154508
|
04 May 2020 09:28 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
А что такое универсальный компьютер? И что делают эти три команды? Sub и ret великолепно эмулируются на базовой системе команд...
Я думаю, что основная проблема триадора - не бедный набор инструкций (даже без add я прекрасно могу жить), а очень маленькая память. Поэтому я бы думал скорее про инструкции, которые бы позволили расширить память.
|
04 May 2020 10:35 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
Кстати, просто шутки ради. Триадор в его базовой версии позволяет запрограммировать pong (нужно пять или шесть сегментов памяти команд), прикладываю результат эмуляции. Нижняя полоска - это очки (трёхтритное число). Не вижу ни одной проблемы воплотить в железе, раз уж в эмуляции работает. Память использована полностью вся: r13 - выбранный сегмент r11,r12 - x и y координаты мячика r9, r10 - скорость мячика r7, r8 - положение двух ракеток r6 - очки r5 - эмуляция адреса возврата из сабрутины add r1-r4 необходимы для текущих вычислений, в основном для сложения (но не только).
|
04 May 2020 10:46 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22730 Location: Silicon Valley
|
А у тебя подпрограмма может вызывать другую подпрограмму? А самою себя, выполняя рекурсию? Так вот это те самые инструкции и есть NNONN - EX -4 -> RMH (read higher triad from memory [27*R4+R3] to R1) NNONO - EX -3 -> WMM (write R2,R1 to memory [27*R4+R3]) NNONP - EX -2 -> RML (read lower triad from memory [27*R4+R3] to R1) Про то как расширять память я писал ещё в ноябре 2017 года: т.е. я предполагал, что ПЗУ будет двоичным с тупым отображением троичного адреса в двоичный диапазон адресов 2К, а вот ОЗУ может быть троичным и к нему можно будет получать доступ программно, записывая и читая данные, а также загружая туда подпрограммы извне, а потом можно пойти ещё дальше и сделать банки памяти, листая это самое ОЗУ (да и двоичное ПЗУ тоже можно листать). Вот тогда у нас и будет универсальный компьютер, который будет способен подгружать с внешних носителей и исполнять программы, написанные пользователем на этом же самом компьютере... P.S. По идее доп.память может и не быть связана с памятью программ, которая может оставаться в ПЗУ - например можно добавить несколько ячеек статической памяти на тримуксах "сбоку" и обращаться к ним через 2 из вышеописанных трёх команд, используя только триады: если ячеек "сбоку" меньше 27, то R4 можно игнорировать, адресуя это доп.память только через R3...
|
04 May 2020 16:45 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
Ой. у меня нынче голова вообще не варит. Давай вернёмся к вопросу расширения после того, как я закончу базовый вариант. Расширение памяти согласен, нужно. Не очень уверен только в необходимости писать/читать аж целое слово. JPI... оно ж сразу два регистра отжирает, причём важных. Ну да не суть, особенно если будет расширена память, нехай подпрограммы сами себе память расчищают. Хардверное сложение да, обязательно, причём по совершенно тупой причине: софтверное сложение требует большего количества тримуксов, нежели хардверное, а мне лень паять Можешь привести сценарий использования OPB? Итого, пока что я полностью согласен с необходимостью WM (write R1 to memory [27*R4+R3]) RM (read triad from memory [27*R4+R3] to R1) ADD (C,R1=R1+R2) JPI (store current PC+1 to R4,R3 and jump to R13,R2) HCF
|
04 May 2020 23:28 |
|
|
Who is online |
Users browsing this forum: No registered users and 6 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|