Возможные микроархитектуры для 3niti alpha/beta

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

Moderator: haqreu

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

Возможные микроархитектуры для 3niti alpha/beta

Post by Shaos »

Озадачился я тут реальной реализацией системы команд 3niti и понял, что это задача далеко нетривиальная - пытаюсь утолкать всё в 3 такта на короткую 1-триадную инструкцию (и соответственно 6 тактов на 2-триадную и 12 тактов на 4-триадную). Спасает то, что тактируется оно синусоидой, которая превращается в троичный сигнал NOPONOPO... и мы можем срабатывать как на P, так и на N - т.е. частота срабатывания в два раза больше частоты синусоиды (т.е. в 3 периода синусоиды можно утолкать 6 разных срабатываний конечного автомата).

Выдумалась микроархитектура, где добавляются несколько скрытых регистров:
I - старшая триада расширенной инструкции (используется для отработки многотриадных команд);
T0 - временный регистр для сохранения инструкции вычитанной из памяти;
T1 - временный регистр для сохранения младшей триады 9-тритового слова из памяти;
T2 - временный регистр для сохранения средней триады 9-тритового слова из памяти;
T3 - временный регистр для сохранения старшей триады 9-тритового слова из памяти;
TP - 9-тритовый псевдорегистр, составленный из T1,T2,T3.

P.S. На самом деле основная задача понять, влезает ли полноценная реализация 3niti alpha в ограничение на 1000 троичных мультиплексоров
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16682
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Микроархитектура 3niti alpha

Post by Lavr »

Shaos wrote:Спасает то, что тактируется оно синусоидой, которая превращается в троичный сигнал NOPONOPO... и мы можем срабатывать как на P, так и на N - т.е. частота срабатывания в два раза больше частоты синусоиды (т.е. в 3 периода синусоиды можно утолкать 6 разных срабатываний конечного автомата).
Вот только не совсем понятно, почему "тактируется оно синусоидой"... :-?
Идеология конечного автомата в устройстве управления и синхронизации
заключается, если я не ошибаюсь, в том, что по тактовым импульсам счетчик
состояний перебирает все возможные состояния в пределах одного цикла.

А троичный счетчик, как мы выяснили, работает вовсе не по "синусоиде", а
скорее уж по "пиле"...
Lavr wrote:И я вот тут сделал прикидку, как считает троичный счетчик:
Image
Lavr wrote:А второй глобальный вывод - логические троичные генераторы должны формировать
троичные импульсные последовательности, пропуская через вентиль несимметричную
пилу...
Image
iLavr
User avatar
Shaos
Admin
Posts: 24027
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Микроархитектура 3niti alpha

Post by Shaos »

Ну у кого как, а у меня синхронный троичный счётчик управляется синусоидой ;)

Image

Левые мемы срабатывают по положительному импульсу, а правые - по отрицательному, а кнопка C сбрасывает всё в ноль

P.S. Возможно пилой он тоже сможет управляться, но мне как-то спокойнее от того, что нулевая пауза есть не только между негативным и позитивным импульсами, но и между позитивным и негативным...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16682
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Микроархитектура 3niti alpha

Post by Lavr »

Shaos wrote:Ну у кого как, а у меня счётчик управляется синусоидой ;)
Тогда это не счетчик, потому как непонятно что считает.

А картинка
http://ternary.info/ternary/ternary_sec ... 9trits.png
почему-то не видна...
iLavr
User avatar
Shaos
Admin
Posts: 24027
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Микроархитектура 3niti alpha

Post by Shaos »

Lavr wrote:
Shaos wrote:Ну у кого как, а у меня счётчик управляется синусоидой ;)
Тогда это не счетчик, потому как непонятно что считает.
ну он увеличивает число на 1 за каждый период входящей синусоиды
Lavr wrote:А картинка
http://ternary.info/ternary/ternary_sec ... 9trits.png
почему-то не видна...
проверил в опере - вроде видно
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16682
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Микроархитектура 3niti alpha

Post by Lavr »

Shaos wrote:
Lavr wrote:
Shaos wrote:Ну у кого как, а у меня счётчик управляется синусоидой ;)
Тогда это не счетчик, потому как непонятно что считает.
ну он увеличивает число на 1 за каждый период входящей синусоиды
Забавно... только я никак не пойму, вроде разговор про "3niti alpha",
а троичный счетчик почему-то считает "период входящей синусоиды"?... :o


PS. Я хоть и не вижу по-прежнему картинки, но догадываюсь, что ты показываешь.
Обсуждали, помнится...


РPS. Ладно... я больше ничего тут не комментирую, а то еще обидишься... :wink:
iLavr
User avatar
Shaos
Admin
Posts: 24027
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Микроархитектура 3niti alpha

Post by Shaos »

не вижу никаких противоречий :)

P.S. вон наш 8080 тоже вполне себе двоичный проц, однако управляется он какими-то странными последовательностями Ф1 и Ф2, а никак не единственным двоичным синхросигналом с 50% скважностью...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24027
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Микроархитектура 3niti alpha

Post by Shaos »

Считает оно вот так:

Code: Select all

       _       _       _       _       _       _
CLK  _| |_   _| |_   _| |_   _| |_   _| |_   _| |_   _...
          |_|     |_|     |_|     |_|     |_|     |_|
           _______                 _______
 T0  _____|       |        _______|       |        ___...
                  |_______|               |_______|
                   _______________________
 T1  _____________|                       |
                                          |___________...
                                           ___________...
 T2  _____________________________________|

Клок проходит через все каскады и не обязан быть троичным - все же остальные каскады считают вполне себе троично, причём синхронно

P.S. По сути это уже и есть PC - надо только прикрутить к нему схемку изменения его значения по командам JMP или LPCD
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16682
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Микроархитектура 3niti alpha

Post by Lavr »

Shaos wrote:вон наш 8080 тоже вполне себе двоичный проц, однако управляется он какими-то странными последовательностями Ф1 и Ф2, а никак не единственным двоичным синхросигналом с 50% скважностью...
Дерёёёёвня... :( Постыдился бы такое писать... :oops: Типичная двухфазная синхронизация - классика жанра...
Почитал хотя бы пару книг из нашей библиотеки, прежде чем так позориться! :o
Надо же! Пол-века еще не прошло, а Ф1 и Ф2 вдруг стали "какими-то странными последовательностями"! :lol:

Ну не синусоидами все же они стали? А, Shaos? Ну надо же такое ляпануть! :o

Не... тут правда больше не следует ничего комментировать... всё откровенно ясно... :wink:
iLavr
User avatar
Shaos
Admin
Posts: 24027
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Микроархитектура 3niti alpha

Post by Shaos »

Ну у меня тоже двухфазная синхронизация, только одним проводом ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24027
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Микроархитектура 3niti alpha

Post by Shaos »

Короче PC будет начинаться со второго каскада, а первый просто перебирает такты внутри одной инструкции - всего с учётом клока получается 6 тактов:
1) CLK=N MEM=N - вывод нового PC на шину адреса
2) CLK=P MEM=N - тут может быть чтение триады инструкции и её декодировании, с сохранением флагов микрокода
3) CLK=N MEM=O - тут может быть выставление на шину адреса и данных чего-то в соответствии с флагами, снятыми с декодера инструкции
4) CLK=P MEM=O - тут может быть чтение из памяти либо регистров в соответствии с флагами, снятыми с декодера инструкции, в том числе запись регистра I произвольным числом
5) CLK=N MEM=P - тут может быть выставление на шину адреса чего-то ещё (опять же в соответствии с флагами), плюс инкремент регистра I либо его сброс
6) CLK=P MEM=P - тут опять чтение-запись плюс подготовка к переходу в случае JMP или LPCD
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24027
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Микроархитектура 3niti alpha

Post by Shaos »

Вобщем как-то так оно видится:

Code: Select all

         _       _       _       _       _       _       _       _       _       _
CLK    _| |_   _| |_   _| |_   _| |_   _| |_   _| |_   _| |_   _| |_   _| |_   _| |_   _
     _|     |_|     |_|     |_|     |_|     |_|     |_|     |_|     |_|     |_|     |_|
                     _______                 _______                 _______
 T0          _______|       |        _______|       |        _______|       |        ___
     _______|               |_______|               |_______|               |_______|
                                                     _______________________
 T1                          _______________________|                       |
     _______________________|                                               |___________

 T2                                                                          ___________
     _______________________________________________________________________|

     ^   ^   ^   ^   ^   ^
     |   |   |   |   |   |
     |   |   |   |   |   \--- Optional Read/Write, increment/clear I and storing PC+1
     |   |   |   |   \------- Optional address bus
     |   |   |   \----------- Write/Read data
     |   |   \--------------- Set something to address bus and/or date bus
     |   \------------------- Read triade from memory, decode and store microcode
     \----------------------- PC on address bus
SAN:
  I=OOO NNN A/DPn->m -   -    (I=OOO)
SAO:
  I=OOO NNO A/DPo->m -   -    (I=OOO)
SAP:
  I=OOO NNP A/DPp->m -   -    (I=OOO)
SAF:
  I=OOO NON  A   ->F -   -    (I=OOO)
SPCD:
  I=OOO NOO  ->   DP -   -    (I=OOO)
SAB:
  I=OOO NOP  A   ->B -   -    (I=OOO)
SAL:
  I=OOO NPN  A   ->L -   -    (I=OOO)
SAM:
  I=OOO NPO  A   ->M -   -    (I=OOO)
SAH:
  I=OOO NPP  A   ->H -   -    (I=OOO)
RLA:
  I=OOO ONN  A  ->T0 RL ->A   (I=OOO)
ADD:
  I=OOO ONO  A  ->T0 AB ->A   (I=OOO) set RFC
RRA:
  I=OOO ONP  A  ->TO RR ->A   (I=OOO)
LAI #:
  I=OOO OON NPO ->I  -   -    (I=NPP) inc I
  I=NPP ttt  m  ->T0 T0 ->A   (I=OOO) clr I
ADI #:
  I=OOO OOO ONN ->I  -   -    (I=ONO) inc I
  I=ONO ttt  m  ->T0 AT ->A   (I=OOO) clr I set RFC
OPA #:
  I=OOO OOP ONP ->I  -   -    (I=OON) inc I
  I=OON ttt  m  ->T0 OA ->A   (I=OOO) clr I set RFC
LDI # # #:
  I=OOO OPN OPN ->I  -   -    (I=OPO) inc I
  I=OPO xxx  m  ->H  -   -    (I=OPP) inc I
  I=OPP yyy  m  ->M  -   -    (I=PNN) inc I
  I=PNN zzz  m  ->L  -   -    (I=OOO) clr I
JMP # # #:
  I=OOO OPO PNO ->I  -   -    (I=PNP) inc I
  I=PNP xxx  m  ->T1 -   -    (I=PON) inc I
  I=PON yyy  m  ->T2 -   -    (I=POO) inc I
  I=POO zzz  m  ->T3 TD ->PC  (I=OOO) clr I store TD instead of PC+1
OPB # # #:
  I=OOO OPP POP ->I  -   -    (I=PPN) inc I
  I=PPN xxx  m  ->T1 -   -    (I=PPO) inc I
  I=PPO yyy  m  ->T2 -   -    (I=PPP) inc I
  I=PPP zzz  m  ->T3 OB ->A   (I=OOO) clr I set RFC
LAN:
  I=OOO PNN DPn ->T0 T0 ->A   (I=OOO)
LAO:
  I=OOO PNO DPo ->T0 T0 ->A   (I=OOO)
LAP:
  I=OOO PNP DPp ->T0 T0 ->A   (I=OOO)
LAF:
  I=OOO PON  F  ->T0 T0 ->A   (I=OOO) 
LPCD:
  I=OOO POO  -   -   DP ->PC  (I=OOO) store DP instead of PC+1
LAB:
  I=OOO POP  B  ->T0 T0 ->A   (I=OOO)
LAL:
  I=OOO PPN  L  ->T0 T0 ->A   (I=OOO)
LAM:
  I=OOO PPO  M  ->T0 T0 ->A   (I=OOO)
LAH:
  I=OOO PPP  H  ->T0 T0 ->A   (I=OOO)
По идее вместо T0 можно задействовать T1 - тогда количество временных регистров уменьшится...

Потом вместо явных inc I и clr I можно просто в каждом машинном цикле на базе старого значения I выдавать новое значение I, которое будет запоминаться в конце
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24027
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Микроархитектура 3niti alpha

Post by Shaos »

Поподбирал значения для I и пришёл вот к такой DDT задаче:

Code: Select all

# Microcode for "3niti alpha"
#I OP =I' Flags
OOONNN=OOOPNNOOOOOOOOO
OOONNO=OOOPONOOOOOOOOO
OOONNP=OOOPPNOOOOOOOOO
OOONON=OOOOONPONOOOOOO
OOONOO=OOONONPOOOOOOPO
OOONOP=OOOOONPOPOOOOOO
OOONPN=OOOOONPPNOOOOOO
OOONPO=OOOOONPPOOOOOOO
OOONPP=OOOOONPPPOOOOOO
OOOONN=OOOOONNOOOONNOO
OOOONO=OOOOONNOOOONOOP
OOOONP=OOOOONNOOOONPOO
OOOOON=ONNOONPOOOOOOOO
OOOOOO=OONOONPOOOOOOOO
OOOOOP=OPNOONPOOOOOOOO
OOOOPN=PNNOONPOOOOOOOO
OOOOPO=PONOONPOOOOOOOO
OOOOPP=PPNOONPOOOOOOOO
OOOPNN=OOOPNONOONNOOOO
OOOPNO=OOOPOONOONNOOOO
OOOPNP=OOOPPONOONNOOOO
OOOPON=OOOOOPNONNNOOOO
OOOPOO=OOOOONPOOOOOONO
OOOPOP=OOOOOPNOPNNOOOO
OOOPPN=OOOOOPNPNNNOOOO
OOOPPO=OOOOOPNPONNOOOO
OOOPPP=OOOOOPNPPNNOOOO
#LAI
ONNXXX=OOONOOPNNNNOOOO
#ADI
OONXXX=OOONOOPNNOOPNOP
#OPA
OPNXXX=OOONOOPNNOOPOOP
#LDI
PNNXXX=PNONOOPPPOOOOOO
PNOXXX=PNPNOOPPOOOOOOO
PNPXXX=OOONOOPPNOOOOOO
#JMP
PONXXX=POONOOPNNOOOOOO
POOXXX=POPNOOPNOOOOOOO
POPXXX=OOONOOPNPOOOOON
#OPB
PPNXXX=PPONOOPNNOOOOOO
PPOXXX=PPPNOOPNOOOOOOO
PPPXXX=OOONOOPNPOOPPOP
#Flags:
#abus1/1 - PC,nothing,DPx
#abus1dp/1 - DPn,DPo,DPp used if abus1=DPx
#dbus1s/1 - A,mem,reg (source)
#dbus1d/1 - T1,mem,reg (destination)
#dbus1reg/2 - used if dbus1s=reg or dbus1d=reg (T1,T2,T3 instead of N,O,P)
#dbus2s/2 - T1,T2,T3,F,O,B,L,M,H
#dbus2o/2 - used if dbus2s=O (RL,AB,RR,A,A,A,AT,OA,OB)
#pcsto/1 - optional flag to copy PC to DP (P) or DP to PC (N)
#pcrfc/1 - optional flag to set RFC (P) or copy TD to PC (N)
которая была успешно решена с помощью ddtc - получилось 80 DG403х для неоптимизированного варианта и 63 для оптимизированного (через ddtp):

Code: Select all

6 inputs detected (worst solution is 5460)

OLD 5|4|3|2|1|0 e12=81 e21=77 DG403=80
NEW 5|4|3|1|2|0 e12=76 e21=77 DG403=77
NEW 5|4|3|1|0|2 e12=77 e21=75 DG403=77
NEW 5|4|2|1|0|3 e12=77 e21=68 DG403=73
NEW 5|4|1|2|0|3 e12=73 e21=70 DG403=72
NEW 5|3|2|1|4|0 e12=74 e21=70 DG403=72
NEW 5|3|2|1|0|4 e12=67 e21=63 DG403=66
NEW 5|3|1|2|0|4 e12=62 e21=63 DG403=63
NEW 5|3|1|0|2|4 e12=63 e21=61 DG403=63

Optimal solution has 63 chips instead of 80
Ratio optimal/worst is 1%
103 functions were used
Оптимальное решение имеет 49 полных троичных мультиплексоров и 33 полумультиплексора (17 E12 и 16 E21).

P.S. Для первого прототипа это всё можно сделать через двоичное ПЗУ...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24027
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Микроархитектура 3niti alpha/beta

Post by Shaos »

Для реализации расширенной системы команд 3niti beta надо ещё завести регистр SP, флаг копирвания туда-обратно, флаг инкремента-декремента SP и флаг использования SP для чтения/записи. Также ещё будет нужен флаг инкремента-декремента DP (схему инкремента-декремента можно сделать общей для PC, SP и DP).

P.S. Похоже надо писать эмулятор с возможностью задавать триты микрокода мышкой (онлайн?) или сделать эдакий компилятор микрокода, который на входе будет получать некое текстовое описание в человеческом виде, а на выходе будет выдавать описание для DDT...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24027
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Возможные микроархитектуры 3niti alpha/beta

Post by Shaos »

Я когда этот микрокодовый подход придумывал в 2015 году, то хотел добиться чтобы большинство инструкций выполнялось бы за один цикл (три периода тактирующей пилы) и только сложные многотриадные инструкций занимали бы несколько циклов (выше можно видеть, что это LAI, ADI, OPA, LDI, JMP и OPB). Возможно я тогда переупростил и кое-какие из "простых" инструкций должны занимать больше одного цикла - например ADD т.к. она кроме сложения ещё меняет состояние двух флагов. Для 3niti beta добавятся несколько ещё более сложных "многоцикловых" инструкций типа CALL и RET, которые подразумевают инкремент-декремент 9-тритового регистра SP и многократное обращение к памяти.

Вместо непонятного регистра I я ещё тогда пошёл по пути адресации микропрограмм кодом инструкции - в простейшем случае инструкция выполнялась бы микропрограммой, расположенной по адресу OOOxxx, но при необходимости исполнение уходило бы на другой адрес - сейчас можно этот подход несколько упростить и сделать более логичным, задавая адрес перескока не тремя тритами устанавливающими старшие 3 трита из 6, а скажем четырьмя, причём все 4 трита будут использованы для адресации микропрограмм (при этом простейшие микропрограммы будут расположены по адресам Oxxx).

Например по адресу ONNN в памяти микропрограмм будет микропрограмма для инструкции SAN (сохранить A по адресу DPn):
- установить на шине адреса 9-тритное значение из DPn
- выложить на шину данных 3-тритное значение из A и сформировать строб записи
далее будет общая часть для всех окончаний микропрограмм:
- установить на шине адреса 9-тритное значение проинкрементированного PC либо 9-тритное значение из TP (для инструкций передачи управления)
- сформировать строб чтения из памяти, чтобы прочитать код следующей инструкции в регистр T0
- выполнить следующую микропрограмму начиная с адреса O|T0
и т.д.

Микропрограмма для выполнения инструкции ADD должна быть расположена по адресу OONO:
- подключить второй вход сумматора к регистру B (первый вход всегда будет запитан от регистра A)
- запомнить выход сумматора (T2 для суммы и T3 для флагов?)
- записать сохранённые данные в регистры A и F
- установить на шине адреса 9-тритное значение проинкрементированного PC
- сформировать строб чтения из памяти, чтобы прочитать код следующей инструкции в регистр T0
- выполнить следующую микропрограмму начиная с адреса O|T0

В случае ADI микропрограмма по адресу OOOO должна сделать чуть больше, чем микропрограмма для ADD:
- подключить второй вход сумматора к регистру Т1 (первый вход всегда будет запитан от регистра A)
- установить на шине адреса 9-тритное значение проинкрементированного PC
- сформировать строб чтения из памяти, чтобы прочитать следующую триаду в регистр T1
- запомнить выход сумматора (T2 для суммы и T3 для флагов?)
- записать сохранённые данные в регистры A и F
- установить на шине адреса 9-тритное значение проинкрементированного PC
- сформировать строб чтения из памяти, чтобы прочитать код следующей инструкции в регистр T0
- выполнить следующую микропрограмму начиная с адреса O|T0

Одна строчка тритов микроинструкции должна описывать то, что надо сделать за 3 периода тактовой пилы (или синусоиды) - простые инструкции типа SAN должны уложиться в одну микроинструкцию, а вот ADD наверное уже не уложится т.е. из первой микроинструкции этой микропрограммы надо будет перескочить за пределы зоны Oxxx для выполнения остальных микроинструкций этой микропрограммы. Перескок, как я уже писал выше, будет происходить на 4-тритный адрес в памяти микропрограмм - можно скажем принять, что если адрес перескока Oxxx, то это означает перескок на O|T0 (и для 3niti beta наверное можно поддержать спец.значение Nxxx, означающее перескок на N|T1 если старший трит регистра T1 равен N - это для реализации новых инструкций), а перескоки на Pxxx будут брать все 4 трита из кода микроинструкции (также все 4 трита будут браться в случае Nxxx когда старший трит регистра T1 был не равен N, т.е. был равен O или P).

P.S. Хотя всё-таки вычитка инструкции из памяти должна быть в начале цикла, а не в конце - простейшая микропрограмма в одну микростроку может выглядеть примерно так:
- прочитать триаду с шины данных (нужный PC к этому моменту уже должен быть подключен к шине адреса) и защёлкнуть её в регистре T0
- передать управление на адрес микропрограммы O|T0
- подключить регистр источник и регистр приёмник к внутренней шине данных
- осуществить строб записи для сохранения необходимых данных и если надо флагов, а также обновить PC (в общем случае инкрементировать)
Я тут за главного - если что шлите мыло на me собака shaos точка net