nedoPC.org

Electronics hobbyists community established in 2002
Last visit was: 06 Jun 2024 13:36
It is currently 06 Jun 2024 13:36



 [ 25 posts ]  Go to page 1, 2  Next
Возможные микроархитектуры для 3niti alpha/beta 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22837
Location: Silicon Valley
Озадачился я тут реальной реализацией системы команд 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 троичных мультиплексоров

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


03 Oct 2015 17:12 WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Shaos wrote:
Спасает то, что тактируется оно синусоидой, которая превращается в троичный сигнал NOPONOPO... и мы можем срабатывать как на P, так и на N - т.е. частота срабатывания в два раза больше частоты синусоиды (т.е. в 3 периода синусоиды можно утолкать 6 разных срабатываний конечного автомата).

Вот только не совсем понятно, почему "тактируется оно синусоидой"... :-?
Идеология конечного автомата в устройстве управления и синхронизации
заключается, если я не ошибаюсь, в том, что по тактовым импульсам счетчик
состояний перебирает все возможные состояния в пределах одного цикла.

А троичный счетчик, как мы выяснили, работает вовсе не по "синусоиде", а
скорее уж по "пиле"...
Lavr wrote:
И я вот тут сделал прикидку, как считает троичный счетчик:

Image
Lavr wrote:
А второй глобальный вывод - логические троичные генераторы должны формировать
троичные импульсные последовательности, пропуская через вентиль несимметричную
пилу...

Image

_________________
iLavr


04 Oct 2015 01:48
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22837
Location: Silicon Valley
Ну у кого как, а у меня синхронный троичный счётчик управляется синусоидой ;)

Image

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

P.S. Возможно пилой он тоже сможет управляться, но мне как-то спокойнее от того, что нулевая пауза есть не только между негативным и позитивным импульсами, но и между позитивным и негативным...

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


04 Oct 2015 07:53 WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Shaos wrote:
Ну у кого как, а у меня счётчик управляется синусоидой ;)

Тогда это не счетчик, потому как непонятно что считает.

А картинка
http://ternary.info/ternary/ternary_seconds_counter_9trits.png
почему-то не видна...

_________________
iLavr


04 Oct 2015 08:10
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22837
Location: Silicon Valley
Lavr wrote:
Shaos wrote:
Ну у кого как, а у меня счётчик управляется синусоидой ;)

Тогда это не счетчик, потому как непонятно что считает.


ну он увеличивает число на 1 за каждый период входящей синусоиды

Lavr wrote:
А картинка
http://ternary.info/ternary/ternary_seconds_counter_9trits.png
почему-то не видна...


проверил в опере - вроде видно

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


04 Oct 2015 08:36 WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Shaos wrote:
Lavr wrote:
Shaos wrote:
Ну у кого как, а у меня счётчик управляется синусоидой ;)

Тогда это не счетчик, потому как непонятно что считает.

ну он увеличивает число на 1 за каждый период входящей синусоиды

Забавно... только я никак не пойму, вроде разговор про "3niti alpha",
а троичный счетчик почему-то считает "период входящей синусоиды"?... :o


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


РPS. Ладно... я больше ничего тут не комментирую, а то еще обидишься... :wink:

_________________
iLavr


04 Oct 2015 09:27
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22837
Location: Silicon Valley
не вижу никаких противоречий :)

P.S. вон наш 8080 тоже вполне себе двоичный проц, однако управляется он какими-то странными последовательностями Ф1 и Ф2, а никак не единственным двоичным синхросигналом с 50% скважностью...

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


04 Oct 2015 10:09 WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22837
Location: Silicon Valley
Считает оно вот так:
Code:
       _       _       _       _       _       _
CLK  _| |_   _| |_   _| |_   _| |_   _| |_   _| |_   _...
          |_|     |_|     |_|     |_|     |_|     |_|
           _______                 _______
 T0  _____|       |        _______|       |        ___...
                  |_______|               |_______|
                   _______________________
 T1  _____________|                       |
                                          |___________...
                                           ___________...
 T2  _____________________________________|


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

P.S. По сути это уже и есть PC - надо только прикрутить к нему схемку изменения его значения по командам JMP или LPCD

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


04 Oct 2015 11:44 WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Shaos wrote:
вон наш 8080 тоже вполне себе двоичный проц, однако управляется он какими-то странными последовательностями Ф1 и Ф2, а никак не единственным двоичным синхросигналом с 50% скважностью...

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

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

Не... тут правда больше не следует ничего комментировать... всё откровенно ясно... :wink:

_________________
iLavr


04 Oct 2015 11:54
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22837
Location: Silicon Valley
Ну у меня тоже двухфазная синхронизация, только одним проводом ;)

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


04 Oct 2015 11:56 WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22837
Location: Silicon Valley
Короче 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

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


04 Oct 2015 12:18 WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22837
Location: Silicon Valley
Вобщем как-то так оно видится:
Code:
         _       _       _       _       _       _       _       _       _       _
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, которое будет запоминаться в конце

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


07 Oct 2015 15:02 WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22837
Location: Silicon Valley
Поподбирал значения для I и пришёл вот к такой DDT задаче:
Code:
# 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:
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. Для первого прототипа это всё можно сделать через двоичное ПЗУ...

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


08 Oct 2015 15:44 WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22837
Location: Silicon Valley
Для реализации расширенной системы команд 3niti beta надо ещё завести регистр SP, флаг копирвания туда-обратно, флаг инкремента-декремента SP и флаг использования SP для чтения/записи. Также ещё будет нужен флаг инкремента-декремента DP (схему инкремента-декремента можно сделать общей для PC, SP и DP).

P.S. Похоже надо писать эмулятор с возможностью задавать триты микрокода мышкой (онлайн?) или сделать эдакий компилятор микрокода, который на входе будет получать некое текстовое описание в человеческом виде, а на выходе будет выдавать описание для DDT...

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


28 May 2024 00:35 WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22837
Location: Silicon Valley
Я когда этот микрокодовый подход придумывал в 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 (в общем случае инкрементировать)

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


28 May 2024 22:45 WWW
 [ 25 posts ]  Go to page 1, 2  Next

Who is online

Users browsing this forum: Claude AI [bot] and 15 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

Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.