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

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

Moderator: haqreu

User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Shaos wrote:В методе cycle нужно засунуть return в условие для case -4 (строка 129), а то внешние EX-команды небудут нормально работать (PC небудет инкрементироваться):

Code: Select all

        case -4: { // EX: halt and catch fire if not processed
                     if (!do_ex(arg)) {
                       fHalt = true;
                       return;
                     }
                 } break;
и поменять местами if (fHalt) break; // halt and catch fire и if (verbose) display_memory_state(); в конце метода run, чтобы при окончании программы состояние регистров не печаталось два раза для EX -13 (т.к. после хальта PC не проинкрементируется и инкрементировать его нельзя т.к. при этом эмулятор вывалиться по ошибке что PC вылез за пределы программы)
Заслал пулл-реквест про эти две штуки https://github.com/ssloy/triador/pull/3
Изменения в triador.cpp:
https://github.com/ssloy/triador/pull/3/commits/bac364bd137cacd961253794a58534a7f91d7aac
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Shaos wrote:
haqreu wrote:Я не очень понимаю, зачем он нам нужен. У меня же уже есть ассемблер...
Чтобы большие приложения писать, например тетрис :mrgreen:
Без макросов это почти нереально
Ну и выход будет совместим с твоим эмулятором
Чото месяц уже прошёл, а я всё никак не могу сесть и сделать :no:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Shaos wrote:
Shaos wrote:
haqreu wrote:Я не очень понимаю, зачем он нам нужен. У меня же уже есть ассемблер...
Чтобы большие приложения писать, например тетрис :mrgreen:
Без макросов это почти нереально
Ну и выход будет совместим с твоим эмулятором
Чото месяц уже прошёл, а я всё никак не могу сесть и сделать :no:
Ещё 2 месяца прошло - всё никак не могу войти в рабочую колею на новом месте, чтобы успевать и работу делать (на дому) и свои поделки-самоделки...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Shaos wrote:
Shaos wrote:В методе cycle нужно засунуть return в условие для case -4 (строка 129), а то внешние EX-команды небудут нормально работать (PC небудет инкрементироваться):

Code: Select all

        case -4: { // EX: halt and catch fire if not processed
                     if (!do_ex(arg)) {
                       fHalt = true;
                       return;
                     }
                 } break;
и поменять местами if (fHalt) break; // halt and catch fire и if (verbose) display_memory_state(); в конце метода run, чтобы при окончании программы состояние регистров не печаталось два раза для EX -13 (т.к. после хальта PC не проинкрементируется и инкрементировать его нельзя т.к. при этом эмулятор вывалиться по ошибке что PC вылез за пределы программы)
Заслал пулл-реквест про эти две штуки https://github.com/ssloy/triador/pull/3
А между тем мой пул-реквест был смёрджен автором ещё 21 июня 2022 года :o
Пора чтоли начинать писать расширения системы команд...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Вот на чём я остановился по возможным расширениям системы команд Триадора 05 мая 2020:
Shaos wrote:P.S. Вариант без обязательного ADD и с переносом всех "программируемых" команд и пользовательских схем вверх для логичности:

NNNNN - EX -13 -> HLT ( halt and catch fire ; ) <<<<<<< перенесено по просьбе haqreu
NNNNO - EX -12 -> CUSTOM CIRCUIT C (read any registers, writes R1 and C)
NNNNP - EX -11 -> CUSTOM CIRCUIT B (read any registers, writes R1 and C)
NNNON - EX -10 -> CUSTOM CIRCUIT A (read any registers, writes R1 and C) <<<< например это может быть ADD (C,R1=R1+R2)

NNNOO - EX -9 -> PMT-9 (programmable by PEX)
NNNOP - EX -8 -> PMT-8 (programmable by PEX)
NNNPN - EX -7 -> PMT-7 (programmable by PEX)

NNNPO - EX -6 -> OPB-6 (R1 = R1 o R2) - programmable by PEX
NNNPP - EX -5 -> OPB-5 (R1 = R1 o R2) - programmable by PEX
NNONN - EX -4 -> OPB-4 (R1 = R1 o R2) - programmable by PEX
NNONO - EX -3 -> OPB-3 (R1 = R1 o R2) - programmable by PEX
NNONP - EX -2 -> OPB-2 (R1 = R1 o R2) - programmable by PEX
NNOON - EX -1 -> OPB-1 (R1 = R1 o R2) - programmable by PEX

NNOOO - EX 0 -> PEX (program customizable EX instructions above using R1,R2,R3,R4)
NNOOP - EX +1 -> CMP (hardwired OPB)
NNOPN - EX +2 -> MIN (hardwired OPB)
NNOPO - EX +3 -> MAX (hardwired OPB)
NNOPP - EX +4 -> MUL (hardwired OPB) <<< это то что я раньше MSK называл - у людей это MUL
NNPNN - EX +5 -> SUM (hardwired OPB)
NNPNO - EX +6 -> CON (hardwired OPB) <<< консенсус (бывший OVF - для генерации трита переноса при суммировании)

NNPNP - EX +7 -> CLC (hardwired PMT) <<< или очистка флага C слишком простая команда, чтобы под неё целый PMT отводить?
NNPON - EX +8 -> RLC (hardwired PMT)
NNPOO - EX +9 -> RRC (hardwired PMT)

NNPOP - EX +10 -> WMM (write R2,R1 to memory [27*R4+R3])
NNPPN - EX +11 -> RML (read lower triad from memory [27*R4+R3] to R1)
NNPPO - EX +12 -> RMH (read higher triad from memory [27*R4+R3] to R1)

NNPPP - EX +13 -> JPI (store current PC+1 to R12,R11 and jump to R13,R1) <<<< сохранять в R12,R11 и прыгать на R13,R1 вроде логичнее?

PEX может программировать любые команды вверх и у каждой будет 9-тритовый регистр, который может быть использован внутри схемы.
При попытке запрограммировать команды вниз PEX приведёт систему в режим Halt (либо ничего не произойдёт - надо подумать).
Часть регистров PEX (а то может быть и все 13) можно использовать для вывода - например на светодиодный дисплейчик:

Image

(Автор гифки - JeNNeR)
Долго пытался вспомнить что такое PMT и наконец методом вдумчивого перечитывания анналов нашёл вот это изложение от 03 мая 2020:
Shaos wrote: 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 - вот это ваще будет гибкость неописуемая...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Через 7 с лишним лет дошли руки поправить логику флага C в моей реализации триадора для Logisim - теперь флаг не меняется при выполнении OP-инструкций:
Triador2025-04-13.jpg
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

После облегчения модель для Logisim стала постабильнее - как можно видеть на картинке выше, после выполнения относительно длинной программки, заполняющей все регистры значением PPP (13+ инструкций), покраснела только одна цепь.

Теперь буду делать skip-ы (SK) т.к. под них даже уже есть заготовочка, способная подменить вычитанную инструкцию на NOP:
skip-placeholder.png
P.S. Параллельно это всё переносится в VHDL - см. viewtopic.php?t=19839
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Shaos wrote: 24 Nov 2017 17:16
Shaos wrote:Ещё идея - OPB таки убрать в EX, но на её место поставить SKIP-ы:

Code: Select all

NPNNN - skip_if_not_negative_r4
NPNNO - skip_if_not_zero_r4
NPNNP - skip_if_not_positive_r4
NPNON - skip_if_not_negative_r3
NPNOO - skip_if_not_zero_r3
NPNOP - skip_if_not_positive_r3
NPNPN - skip_if_not_negative_r2
NPNPO - skip_if_not_zero_r2
NPNPP - skip_if_not_positive_r2
NPONN - skip_if_not_negative_r1
NPONO - skip_if_not_zero_r1
NPONP - skip_if_not_positive_r1
NPOON - skip_if_borrow
NPOOO - skip_if_no_overflow
NPOOP - skip_if_carry
NPOPN - skip_if_negative_r1
NPOPO - skip_if_zero_r1
NPOPP - skip_if_positive_r1
NPPNN - skip_if_negative_r2
NPPNO - skip_if_zero_r2
NPPNP - skip_if_positive_r2
NPPON - skip_if_negative_r3
NPPOO - skip_if_zero_r3
NPPOP - skip_if_positive_r3
NPPPN - skip_if_negative_r4
NPPPO - skip_if_zero_r4
NPPPP - skip_if_positive_r4
Вроде схемотехника вышеизложенного не должна быть сильно сложной и позволит сразу же задействовать условное ветвление например для циклов (decrement R1, skip if zero, jump)
Суть в том, что следующая инструкция подменяется на NOP (OOOOO) если условие выполняется
В поддержку этой системы скипов предлагаю её железячную реализацию на 11 тримуксах (созданную в соавторстве с DDT):

В связи с перестановкой skip-ов придется несколько переосмыслить эту мою схему 2017 года...

Code: Select all

NPNNN  -67 -> BD - SK -13 ; skip_if_not_positive_r4
NPNNO  -66 -> BE - SK -12 ; skip_if_not_zero_r4
NPNNP  -65 -> BF - SK -11 ; skip_if_not_negative_r4
NPNON  -64 -> C0 - SK -10 ; skip_if_not_positive_r3
NPNOO  -63 -> C1 - SK -9  ; skip_if_not_zero_r3
NPNOP  -62 -> C2 - SK -8  ; skip_if_not_negative_r3
NPNPN  -61 -> C3 - SK -7  ; skip_if_not_positive_r2
NPNPO  -60 -> C4 - SK -6  ; skip_if_not_zero_r2
NPNPP  -59 -> C5 - SK -5  ; skip_if_not_negative_r2
NPONN  -58 -> C6 - SK -4  ; skip_if_not_positive_r1
NPONO  -57 -> C7 - SK -3  ; skip_if_not_zero_r1
NPONP  -56 -> C8 - SK -2  ; skip_if_not_negative_r1
NPOON  -55 -> C9 - SK -1  ; skip_if_borrow
NPOOO  -54 -> CA - SK 0   ; skip_if_no_overflow
NPOOP  -53 -> CB - SK +1  ; skip_if_carry
NPOPN  -52 -> CC - SK +2  ; skip_if_negative_r1
NPOPO  -51 -> CD - SK +3  ; skip_if_zero_r1
NPOPP  -50 -> CE - SK +4  ; skip_if_positive_r1
NPPNN  -49 -> CF - SK +5  ; skip_if_negative_r2
NPPNO  -48 -> D0 - SK +6  ; skip_if_zero_r2
NPPNP  -47 -> D1 - SK +7  ; skip_if_positive_r2
NPPON  -46 -> D2 - SK +8  ; skip_if_negative_r3
NPPOO  -45 -> D3 - SK +9  ; skip_if_zero_r3
NPPOP  -44 -> D4 - SK +10 ; skip_if_positive_r3
NPPPN  -43 -> D5 - SK +11 ; skip_if_negative_r4
NPPPO  -42 -> D6 - SK +12 ; skip_if_zero_r4
NPPPP  -41 -> D7 - SK +13 ; skip_if_positive_r4
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

С помощью DDT получил решение на 18 чипов DG403 (с двумя свободными половинками) или 19 полных мультиплексоров что есть 9.5 сдвоенных тримуксов - задача (на вход подаются 3 младшие трита инструкции, значение знака четырёх регистров R1/R2/R3/R4 и значение флага C):

Code: Select all

#|op2|op1|sign(r4)|sign(r3)|sign(r2)|sign(r1)|flag-c|op0| -> skip
NNNXXXXN=P
NNOXXXXN=P
NNPXXXXN=O
NNNXXXXO=P
NNOXXXXO=O
NNPXXXXO=P
NNNXXXXP=O
NNOXXXXP=P
NNPXXXXP=P
NOXNXXXN=P
NOXOXXXN=P
NOXPXXXN=O
NOXNXXXO=P
NOXOXXXO=O
NOXPXXXO=P
NOXNXXXP=O
NOXOXXXP=P
NOXPXXXP=P
NPXXNXXN=P
NPXXOXXN=P
NPXXPXXN=O
NPXXNXXO=P
NPXXOXXO=O
NPXXPXXO=P
NPXXNXXP=O
NPXXOXXP=P
NPXXPXXP=P
ONXXXNXN=P
ONXXXOXN=P
ONXXXPXN=O
ONXXXNXO=P
ONXXXOXO=O
ONXXXPXO=P
ONXXXNXP=O
ONXXXOXP=P
ONXXXPXP=P
OOXXXXNN=P
OOXXXXON=O
OOXXXXPN=O
OOXXXXNO=O
OOXXXXOO=P
OOXXXXPO=O
OOXXXXNP=O
OOXXXXOP=O
OOXXXXPP=P
OPXXXNXN=P
OPXXXOXN=O
OPXXXPXN=O
OPXXXNXO=O
OPXXXOXO=P
OPXXXPXO=O
OPXXXNXP=O
OPXXXOXP=O
OPXXXPXP=P
PNXXNXXN=P
PNXXOXXN=O
PNXXPXXN=O
PNXXNXXO=O
PNXXOXXO=P
PNXXPXXO=O
PNXXNXXP=O
PNXXOXXP=O
PNXXPXXP=P
POXNXXXN=P
POXOXXXN=O
POXPXXXN=O
POXNXXXO=O
POXOXXXO=P
POXPXXXO=O
POXNXXXP=O
POXOXXXP=O
POXPXXXP=P
PPNXXXXN=P
PPOXXXXN=O
PPPXXXXN=O
PPNXXXXO=O
PPOXXXXO=P
PPPXXXXO=O
PPNXXXXP=O
PPOXXXXP=O
PPPXXXXP=P
Решение:

Code: Select all

/* Generated by DDTc v0.5
   Solution is 18 x DG403
   See www.ternary.info */

#include "ddt.h"

int ddt_skip_big2b(int f, DDT i1, DDT i2, DDT i3, DDT i4, DDT i5, DDT i6, DDT i7, DDT i8, DDT* o1)
{
 DDT r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19;
 int f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19;
 f1 = ddt_e21(f,i1,P,O,&r1);
 if(f1 < 0) return f1;
 f2 = ddt_mux(f,i1,P,O,P,&r2);
 if(f2 < 0) return f2;
 f3 = ddt_e12(f,i1,O,P,&r3);
 if(f3 < 0) return f3;
 f4 = ddt_e12(f,i1,P,O,&r4);
 if(f4 < 0) return f4;
 f5 = ddt_mux(f,i1,O,P,O,&r5);
 if(f5 < 0) return f5;
 f6 = ddt_e21(f,i1,O,P,&r6);
 if(f6 < 0) return f6;
 f7 = ddt_mux(f,i2,r4,r5,r6,&r7);
 if(f7 < 0) return f7;
 f8 = ddt_mux(f,i3,r1,r2,r3,&r8);
 if(f8 < 0) return f8;
 f9 = ddt_mux(f,i3,r4,r5,r6,&r9);
 if(f9 < 0) return f9;
 f10 = ddt_mux(f,i4,r1,r2,r3,&r10);
 if(f10 < 0) return f10;
 f11 = ddt_mux(f,i4,r4,r5,r6,&r11);
 if(f11 < 0) return f11;
 f12 = ddt_mux(f,i5,r1,r2,r3,&r12);
 if(f12 < 0) return f12;
 f13 = ddt_mux(f,i5,r4,r5,r6,&r13);
 if(f13 < 0) return f13;
 f14 = ddt_mux(f,i6,r1,r2,r3,&r14);
 if(f14 < 0) return f14;
 f15 = ddt_mux(f,i6,r4,r5,r6,&r15);
 if(f15 < 0) return f15;
 f16 = ddt_mux(f,i7,r14,r12,r10,&r16);
 if(f16 < 0) return f16;
 f17 = ddt_mux(f,i7,r8,r7,r9,&r17);
 if(f17 < 0) return f17;
 f18 = ddt_mux(f,i7,r11,r13,r15,&r18);
 if(f18 < 0) return f18;
 f19 = ddt_mux(f,i8,r16,r17,r18,&r19);
 if(f19 < 0) return f19;
 if(o1) *o1 = r19;
 return f1+f2+f3+f4+f5+f6+f7+f8+f9+f10+f11+f12+f13+f14+f15+f16+f17+f18+f19;
}
P.S. Схема из 2017 года имеет только 14 мультиплексоров (если не считать мультиплексоры для формирования знака каждого из регистров) - надо поглядеть можно ли новую раскладку так же упростить...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Вроде получилось решение на 11+2=13 чипов DG403 (16 мультиплексоров или 8 сдвоенных тримуксов) - задача:

Code: Select all

#|op2|code1|op1|sign|op0|code0| -> skip
#where code is NX->C,OX->R1,PN->R2,PO->R3,PP->R4
NPNNNP=P
NPNONP=P
NPNPNP=O
NPNNOP=P
NPNOOP=O
NPNPOP=P
NPNNPP=O
NPNOPP=P
NPNPPP=P
NPONNO=P
NPOONO=P
NPOPNO=O
NPONOO=P
NPOOOO=O
NPOPOO=P
NPONPO=O
NPOOPO=P
NPOPPO=P
NPPNNN=P
NPPONN=P
NPPPNN=O
NPPNON=P
NPPOON=O
NPPPON=P
NPPNPN=O
NPPOPN=P
NPPPPN=P
OONNNX=P
OONONX=P
OONPNX=O
OONNOX=P
OONOOX=O
OONPOX=P
OONNPX=O
OONOPX=P
OONPPX=P
ONONNX=P
ONOONX=O
ONOPNX=O
ONONOX=O
ONOOOX=P
ONOPOX=O
ONONPX=O
ONOOPX=O
ONOPPX=P
OOPNNX=P
OOPONX=O
OOPPNX=O
OOPNOX=O
OOPOOX=P
OOPPOX=O
OOPNPX=O
OOPOPX=O
OOPPPX=P
PPNNNN=P
PPNONN=O
PPNPNN=O
PPNNON=O
PPNOON=P
PPNPON=O
PPNNPN=O
PPNOPN=O
PPNPPN=P
PPONNO=P
PPOONO=O
PPOPNO=O
PPONOO=O
PPOOOO=P
PPOPOO=O
PPONPO=O
PPOOPO=O
PPOPPO=P
PPPNNP=P
PPPONP=O
PPPPNP=O
PPPNOP=O
PPPOOP=P
PPPPOP=O
PPPNPP=O
PPPOPP=O
PPPPPP=P
тут я использую код как на картинке из 2017 года - для декодирования этого кода нужно 2 мультиплексора, которые на картинке собирают знаки регистров и флаг C - вот решение с оптимальным перепутыванием входов:

Code: Select all

/* Generated by DDTc v0.5
   Solution is 11 x DG403
   See www.ternary.info */

#include "ddt.h"

int ddt_skip_big2d(int f, DDT i1, DDT i2, DDT i3, DDT i4, DDT i5, DDT i6, DDT* o1)
{
 DDT r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14;
 int f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14;
 f1 = ddt_e21(f,i2,P,O,&r1);
 if(f1 < 0) return f1;
 f2 = ddt_mux(f,i2,P,O,P,&r2);
 if(f2 < 0) return f2;
 f3 = ddt_e12(f,i2,O,P,&r3);
 if(f3 < 0) return f3;
 f4 = ddt_e12(f,i2,P,O,&r4);
 if(f4 < 0) return f4;
 f5 = ddt_mux(f,i2,O,P,O,&r5);
 if(f5 < 0) return f5;
 f6 = ddt_e21(f,i2,O,P,&r6);
 if(f6 < 0) return f6;
 f7 = ddt_mux(f,i3,r1,r2,r3,&r7);
 if(f7 < 0) return f7;
 f8 = ddt_mux(f,i3,r4,r5,r6,&r8);
 if(f8 < 0) return f8;
 f9 = ddt_mux(f,i4,O,r8,O,&r9);
 if(f9 < 0) return f9;
 f10 = ddt_mux(f,i4,r7,O,r8,&r10);
 if(f10 < 0) return f10;
 f11 = ddt_e21(f,i5,O,r7,&r11);
 if(f11 < 0) return f11;
 f12 = ddt_mux(f,i5,r9,r10,O,&r12);
 if(f12 < 0) return f12;
 f13 = ddt_e21(f,i5,O,r8,&r13);
 if(f13 < 0) return f13;
 f14 = ddt_mux(f,i6,r11,r12,r13,&r14);
 if(f14 < 0) return f14;
 if(o1) *o1 = r14;
 return f1+f2+f3+f4+f5+f6+f7+f8+f9+f10+f11+f12+f13+f14;
}
P.S. Хотя если прибавить 3 тримукса, необходимых для перевода кода инструкции в код для мультиплексоров, уже получится 11 тримуксов, что больше чем было т.е. лучше таки оставаться с предыдущим решением, когда сигнал skip вырабатывается прямо из кода инструкции (и знаков регистров и флага C).
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Ну ок - получили мы по одной из схем обсуждённых выше управляющий сигнал, который принимает положительное значение в момент когда код и соответствующее значение знака регистра или флага C устраивает выбранное условие (этот сигнал можно назвать скажем skip1), а что дальше то? Дальше надо передать в следующий цикл сигнал подмены будущей команды на пустую операцию (OOOOO) - вот такая у нас осциллограмма тактов:
Screenshot from 2025-04-16 20-36-12.png
По nclk1 меняется адрес и ПЗУ команд начинает выдавать текущий код операции (также этот же строб используется для сохранения на соответствующих регистрах инкрементированного и декрементированного значений регистра R1). По pclk1 происходят стробы команд dNN...dPP, по которым в частности срабатывают защёлки сохранения новых значений в соответствующих регистрах (и обновлённое значение флага C после инкремента-декремента). А oclk1 используется только для сохранения результата потритовой универсальной операции (даже если инструкция была не OP).

Итак по стробу dNP (который совпадает по времени с pclk1) и при условии, что skip1 взведён, один MEM должен сохранить P, которое сбросится во время следующего pclk1 (когда код текущей операции уже не равен NPxxx). Это самое сохранённое P (назовём это skip2) должно заставить второй MEM сохранить P по следующему nclk1 (и сбросить по последующему nclk1) - именно этот сигнал будет включать подмену текущей команды (это уже и будет тем самым сигналом skip):

Image

Вобщем как-то так...
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Значится так:
skip-nop.jpg
Сигнал skip формируется так (skip0 когда выбрана инструкция SK и далее skip1, skip2 и собственно сам skip):
Screenshot from 2025-04-20 11-29-28.png
И я пока для тесту объединл skip1 и skip0 - потом добавлю логику проверки знаков и флага C для честного формирования skip1:
skip-step.jpg
В логисиме вроде работает - теперь надо будет перенести в VHDL ( см. viewtopic.php?t=19839 )
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Тут такой интересный момент получается - первый MEM устанавливается когда текущая команда SK и условие skip-а выполняется, а сбрасывается, когда текущая (следующая) команда стала не SK (например она стала RR 0 или NOP при выполнении условия) - а что будет если она опять SK? т.е. подряд будут идти 2 команды SK - в этом случае если первый раз условие не выполнилось, то первый MEM останется взведённым на протяжении второй команды SK и будет проверка на второе условие, которое также может скипнуть или не скипнуть следующую команду - т.е. по идее всё должно сработать как ожидается. Где это может пригодиться? Ну например попробуем так:

Code: Select all

SK if_carry
SK if_no_overflow
RR +1
тогда если флаг был
N -> оба условия не сработают и R1 инкрементируется
O -> первое условие не сработает и перейдёт ко второму, которое сработает, скипнув инкремент
P -> первое условие сработает, что вызовет пропуск второго скипа, что далее выведет к инкрементированию R1
т.е. R1 инкрементируется если флаг C был не O, что тоже самое как и

Code: Select all

SK if_no_overflow
RR +1
А если переставить скипы местами?

Code: Select all

SK if_no_overflow
SK if_carry
RR +1
тогда если флаг был
N -> оба условия не сработают и R1 инкрементируется
O -> первое условие сработает, что вызовет пропуск второго скипа, что далее выведет к инкрементированию R1
P -> первое условие не сработает, а второе - сработает, скипнув инкремент
т.е. R1 инкрементируется если флаг C был не P, что тоже самое как и

Code: Select all

SK if_carry
RR +1
т.е. если использовать зависимые взаимоисключающие условия, то оно будет эквивалентно второму условию в цепочке, а если взять независимые?

Code: Select all

SK if_zero_r1
SK if_no_overflow
RR +1
R1!=0 C=N -> R1 инкрементируется
R1!=0 C=O -> R1 не изменится
R1!=0 C=P -> R1 инкрементируется
R1=0 C=X -> R1 инкрементируется (R1=1)

Code: Select all

SK if_zero_r1
SK if_not_zero_r2
RR +1
R1=0 R2=X -> R1 инкрементируется (R1=1)
R1!=0 R2=0 -> R1 инкрементируется
R1!=0 R2!=0 -> R1 не изменится
т.е. в этом случае команда выполнится, если хотя бы один из регистров R1 или R2 был нулевым
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

А если переставить местами отрицание и не отрицание?

Code: Select all

SK if_not_zero_r1
SK if_zero_r2
RR +1
R1=0 R2=0 -> R1 не изменяется (R1=0)
R1=0 R2!=0 -> R1 инкрементируется (R1=1)
R1!=0 R2=X -> R1 инкрементируется
т.е. эдакий OR получается (причём третья инструкция может быть любой)
Я тут за главного - если что шлите мыло на me собака shaos точка net