nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 03:26



Reply to topic  [ 410 posts ]  Go to page Previous  1 ... 19, 20, 21, 22, 23, 24, 25 ... 28  Next
Давайте думать над железкой (TRIADOR) 
Author Message
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Без памяти программ мой триадор будет иметь меньше 250 тримуксов, то есть меньше 500 муксов. А если сделать память программ с запоминанием по уровню (вроде бы, я даже представляю как), то влезет с хорошим запасом.


17 Dec 2017 01:19
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
haqreu wrote:
Без памяти программ мой триадор будет иметь меньше 250 тримуксов, то есть меньше 500 муксов. А если сделать память программ с запоминанием по уровню (вроде бы, я даже представляю как), то влезет с хорошим запасом.

Вообще-то да, я в своём логисимовском варианте (с двоичной памятью, где нету пока ни джампов, ни скипов) насчитал 272 мультиплексора - так что можем и влезть :)

P.S. Оставаясь в DIP48 минимальная распиновка может быть такой:
1 земля
1 питание
1 вход тактирования
6 адрес для внешней памяти
5 слово из внешней памяти
3 тестовых выхода (подцепляются к внутренним точкам в зависимости от тестового адреса)
3 тестовый адрес (чтобы покрыть 27 тестовых триад идущих изнутри схемы для тестовых целей)
3 входы для R13 (по умолчанию цепляются к выходам R13) - это нужно для организации клавиатуры калькулятора (можно это автоматом зацепить на R13 если скажем тестовый адрес будет NNN)
вместо вывода содержимого ВСЕХ регистров одновременно, просто цепляем их на тестовые выходы при выборе специального тестового адреса (скажем от OOP до PPP будут цепляться к регистрам, OOO и OON к половинкам PC и т.д.)
всего получилось 23 ноги
для организации EX снаружи нужно будет ещё 4 ноги отвести под ввод результата (для записи в регистр R1 и флаг C) и 5й сигнал управления куда пишем - в регистр R1 (+1), никуда (0) или в PC (-1)
в этом случае получится 28 ног (остальные ноги будут задействованы под другие тестовые схемы) - если всё с ходу заработает, то можно будет остатки кристаллов запаковать в DIP28 и раздавать как законченный троичный микроконтроллер :roll:

P.P.S. Забыл про вход сброса. Кроме того можно предусмотреть несколько сигналов для наращивания разрядности (путем подключения нескольких модулей в параллель) - как минимум надо иметь 2 входа для инкремента и декремента (от соседней младшей секции), а также что-то придумать со знаком в скипах (например вход определения знака от соседней старшей секции).
Только я пока не понял хватит ли одного входа или надо иметь 4 входа для всех четырех регистров (скорее всего всех 4х). Ещё копирование числа в регистр - старшую половинку регистров надо обнулять - для этого ещё один вход будет нужен. Точнее не обнулять, а заполнять знаком записываемым в младшую половинку числом (берётся из кода команды)...
В любом случае мы уже вылезаем за пределы DIP28, но остаемся в пределах DIP40...

P.P.P.S. Кстати я всё ещё планирую сделать одноплатный вариант триадора-калькулятора...

_________________
:dj: https://mastodon.social/@Shaos


17 Dec 2017 15:15
Profile WWW
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Я тут подумал, что в принципе можно обойтись без регистра инструкций. Его единственное назначение - сделать задержку в выборке новой инструкции при изменениях в счётчике (это важно для безусловных переходов). Но внутри счётчика ведь стоят ячейки памяти с запоминанием по фронту NOP, ведущая и ведомая защёлки. В данный момент при записи в счётчик я пишу одно и то же значение и в ведущую, и в ведомую. А ведь можно сделать запись только в ведущую, и ведомая получит новое значение только после клока. Вот вам и необходимая задержка....
И ведь когда-то Shaos мне объяснял, что так делать не надо, правда, в несколько другом контексте. Только не могу вспомнить, почему.

Буду думать и, возможно, резать дорожки на текстолите :)
Если получится, то это ж целых 10 тримуксов экономии.

UPDATE "на всякий случай". Мда ;)
http://www.nedopc.org/forum/viewtopic.php?f=79&t=11303&start=15#p135556


19 Dec 2017 03:19
Profile
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Пришло время описать очередной кусок АЛУ. В железе ещё не тестировал, но ошибиться там негде. Итак, инструкция SK.

Начинается всё с того, что нам нужно из оперативной памяти вытащить регистр R1, R2, R3 или R4. Выбор регистра зависит от старших двух тритов операнда команды (OC3 и OC2).

Image

Обратите внимание, что когда OC3=OC2=0, то в моей аппаратной реализации будет выбран регистр R1, но это не суть важно, т.к. в таком случае всё равно результат операции будет зависеть не от регистров, но от флага заёма-переноса.

Итак, в память мы обратились, из памяти получили число Q. Теперь готовим 9 линий c условиями:

Image

И используем эти условия в зависимости от знака числа (OC3 OC2) (он посчитан на верхней картинке) и младшего трита OC1:

Image

Особенностью аппаратной реализации является то, что на линии skip next появляется хоть какой-то сигнал только если нужно пропускать команду. Если ничего пропускать не нужно, то линия ни к чему не подключена. Ну а дешифратор команд сам слабо подтягивает эту линию к -5 В, это используется как раз для сброса флага переноса.

В следующих сериях ждите последний (самый толстый) срез АЛУ: команды копирования.


24 Dec 2017 02:04
Profile
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Симпатично, и заодно будут одинаковой длительности ступеньки. Правда, использование двоичной техники :)


16 Jun 2018 01:28
Profile
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Вот так должен будет выглядеть АЛУ, вид с высоты птичьего полёта:

Image

В нём пять срезов, отвечающих каждый за свою операцию, и одна ячейка памяти - флаг переноса. Флаг переноса недоступен снаружи АЛУ. Его значение устанавливается только срезом RR, а читается только срезом SK.

Каждый срез нарисован коробочкой, в которой входные сигналы обозначены слева, а генерируемые выходные сигналы обозначены справа.
Так, например, в срезе SK (я его рисовал на уровне тримуксов на предыдущей странице), реальный выход только один - сигнал SKIP_NEXT, но в то же время этот срез обязан обратиться к регистрам, поэтому он на выходах Rhi, Rmi, Rlo генерирует номер регистра для платы памяти, и потом на входах Qhi, Qmi, Qlo читает его значение.

Все входы-выходы АЛУ соответствуют общей схеме триадора:

Image


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


10 Jul 2018 12:24
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Shaos wrote:
По поводу EX - по идее программировать надо только OPB и их будет больше одного (например один запрограммировать как потритовый MAX, другой как потритовый MIN и т.д.) поэтому - EX 0 отведём под программирование OPB - в R1 будет код какой EX программируем (1,2,3 и т.д.), в R2,R3,R4 соответственно 9-тритовый код универсальной бинарной троичной операции. Кроме того надо добавить доступ к памяти и ALU:

NNNNN - EX -13 -> RML (read lower triad from memory [R3,R4] to R1)
NNNNO - EX -12 -> WMM (write R2,R1 to memory [R3,R4])
NNNNP - EX -11 -> RMH (read higher triad from memory [R3,R4] to R1)
NNNON - EX -10 -> RRC (rotate R1 right through C)
NNNOO - EX -9 -> SUB (C,R1=R1-R2)
NNNOP - EX -8 -> SBC (C,R1=R1-R2+C)
NNNPN - EX -7 -> RLC (rotate R1 left through C)
NNNPO - EX -6 -> ADD (C,R1=R1+R2)
NNNPP - EX -5 -> ADC (C,R1=R1+R2+С)
NNONN - EX -4 -> TSK (ternary skip on R4 sign) ??? \
NNONO - EX -3 -> TSK (ternary skip on R3 sign) ??? -} не, не нравится мне двойной скип...
NNONP - EX -2 -> TSK (ternary skip on R2 sign) ??? /
NNOON - EX -1 -> JPI (store current PC+1 to R3,R4 and jump to R13,R2)
NNOOO - EX 0 -> PEX (program OPB instances below)
NNOOP - EX +1 -> OPB №1 (R1=R1 o R2)
NNOPN - EX +2 -> OPB №2 (R1=R1 o R2)
NNOPO - EX +3 -> OPB №3 (R1=R1 o R2)
NNOPP - EX +4 -> OPB №4 (R1=R1 o R2)
...

P.S. Команда JPI может быть использована, чтобы сымитировать CALL и RET

Возвращаясь к сообщению от 27 ноября прошлого года про возможную программируемость EX инструкций - на самом деле программировать можно не только логические операции (OPB), но и арифметические - и вот каким образом:
Напомню, что PEX программирует команды в EX беря триады из R1,R2,R3 и R4
В случае логической команды (OPB) R1-R2-R3 могут задавать 9-тритовый код бинарной операции, а R4 - код команды, которую мы собственно меняем в блоке EX (это логичнее того, что я писал в процитированном выше)
В случае арифметической команды R4 всё также может задавать код команды, а вот другие регистры могут интерпретироваться следующим образом:
R1 и R2 задают входные аргументы - отрицательное число означает регистр берётся с отрицанием, -1 и +1 всё также будут означать R1-1 и R1+1 и 0 будет означать R1
R3 несёт в себе 3 трита, которые программируют разные опциональные вещи для арифметики, например:

старший трит:
+1 означает, что мы прибавляем флаг C
0 означает игнорирование флага C (и на входе, и на выходе)
-1 означает, что мы вычитаем флаг C (а имеет ли это смысл?)
средний трит:
+1 означает, что мы сдвигаем первый аргумент влево на 1 трит (с использованием флага C, если предыдущий трит не равен нулю)
0 означает неизменный первый аргумент
-1 означает, что мы сдвигаем первый аргмуент вправо на 1 трит (с использованием флага C, если предыдущий трит не равен нулю)
младший трит:
+1 означает, что второй аргумент мы считаем числом, а не указателем на регистр
0 означает неизменный второй аргумент
-1 означает использование теневых регистров (?)
в результате арифметической операции всегда будет устанавоиваться флаг C (и результат всегда будет сохраняться в R1)

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

R1 = R13 + R1 + 1

или

R1 = 3 * R12 - R11 + С

или

R1 = R4 / 3 + 0

и т.д.

_________________
:dj: https://mastodon.social/@Shaos


10 Jul 2018 17:00
Profile WWW
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Начинаю рисовать последний срез АЛУ: операцию RR. Как и раньше, внешние сигналы подписаны оранжевым, а внутренние сигналы подписаны фиолетовым. Напоминаю, чем занимается эта операция:

Code:
    OONNN — copy R1 to R13
    OONNO — copy R1 to R12
    OONNP — copy R1 to R11
    OONON — copy R1 to R10
    OONOO — copy R1 to R9
    OONOP — copy R1 to R8
    OOPON — copy R1 to R7
    OOPOO — copy R1 to R6
    OOPOP — copy R1 to R5
    OOONN — copy R1 to R4
    OOONO — copy R1 to R3
    OOONP — copy R1 to R2
    OOOON — decrement R1, set borrow/carry flag
    OOOOO — no operation
    OOOOP — increment R1, set borrow/carry flag
    OOOPN — copy R2  to R1
    OOOPO — copy R3  to R1
    OOOPP — copy R4  to R1
    OOPNN — copy R5  to R1
    OOPNO — copy R6  to R1
    OOPNP — copy R7  to R1
    OOPON — copy R8  to R1
    OOPOO — copy R9  to R1
    OOPOP — copy R10 to R1
    OOPPN — copy R11 to R1
    OOPPO — copy R12 to R1
    OOPPP — copy R13 to R1


OC4 и OC5 у всех опкодов равны OO, поэтому они участвуют только в генерации сигнала EN_RR на уровне дешифратора инструкций, и в АЛУ не используются. Младшие же три трита говорят, откуда куда нужно копировать. Если младшие три трита образуют отрицательное число, то мы копируем из из R1 в минус OC3-1, а если младшие три трита OC3-1 дают положительное число, то мы копируем из OC3-1 в R1.

Поэтому вот первый кусок среза АЛУ, который занимается генерацией адресов регистров. Перво-наперво мы сразу готовим минус OC3-1; затем в зависимости от знака OC3-1 мы готовим шесть сигналов FROM и TO:

Image

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

Image

Как и раньше, синим покрашены мультиплексоры, которые не участвуют непосредственно в вычислениях, но устраняют конфликты между срезами АЛУ в генерации различных выходных сигналов АЛУ. Пойду рисовать остаток среза.


11 Jul 2018 01:31
Profile
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Итак, окончание среза RR. Напоминаю, что на цикле N мы получаем инструкцию, на цикле O мы копируем из памяти во внутренний буфер, а на цикле P копируем результат обратно в память. Это означает, что если цикл = P и присутствует сигнал EN_RR, то мы пропускаем клок в карту памяти:

Image

Адресация карты памяти была разобрана ранее, теперь нам осталось только подготовить вход A карты памяти и borrow/carry флаг.
Вот остаток среза:

Image

На цикле O мы копируем из выбранного регистра в три ячейки буфера, а затем, если знак OC3-2 ненулевой, подаём этот буфер на вход карты памяти A. Если же OC3-2 нулевой, то нам нужно увеличить/уменьшить на единичку значение в буфере. Пропускаем буфер через каскад полусумматоров, и его выход снова идёт на вход памяти.

Ну и в качестве финального аккорда второй выход каскада полусумматоров идёт на вход ячейки borrow/carry, и мы клокаем его только если OC3=0 и OC2=0 и OC1!=0.

На всякий случай, упрощённая версия этого среза подробно расписана тут:
https://habr.com/post/337606/

В сумме этот срез требует 59 мультиплексоров (30 платок тримукса). Теперь АЛУ полностью документирован, осталось развести и паять.


12 Jul 2018 03:39
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
haqreu wrote:
В сумме этот срез требует 59 мультиплексоров (30 платок тримукса). Теперь АЛУ полностью документирован, осталось развести и паять.

Общее количество тримуксов уже известно?

_________________
:dj: https://mastodon.social/@Shaos


15 Jul 2018 13:34
Profile WWW
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
На весь триадор? С точностью до +- 10 могу посчитать, да. Единственная не нарисованная ещё схема - это схема инициализации.


15 Jul 2018 23:40
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
haqreu wrote:
По знаку можно иметь три разных джампа - jump zero, jump positive, jump negative...

Я не готов это детально прокомментировать сейчас, но мне казалось, в троичной системе должен быть
один условный джамп на три условия
.

Я тут по случаю читал цикл статеек: История языков программирования
Так оказывается один условный джамп на три условия был ещё в FORTRAN-e: :wink:
Quote:
При этом Фортран оставался языком, приближенным к машинам.
Например, там существовало такое:

if (выражение) doneg, dozero, dopos

Насколько я припоминаю, и в старых BASIC-ax похожая конструкция была...

_________________
iLavr


04 Dec 2019 09:32
Profile
Devil

Joined: 26 May 2003 06:57
Posts: 859
Reply with quote
Lavr wrote:
Так оказывается один условный джамп на три условия был ещё в FORTRAN-e

Был ещё в Фокале.

_________________
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/


04 Dec 2019 10:59
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Shaos wrote:
Shaos wrote:
По поводу EX - по идее программировать надо только OPB и их будет больше одного (например один запрограммировать как потритовый MAX, другой как потритовый MIN и т.д.) поэтому - EX 0 отведём под программирование OPB - в R1 будет код какой EX программируем (1,2,3 и т.д.), в R2,R3,R4 соответственно 9-тритовый код универсальной бинарной троичной операции. Кроме того надо добавить доступ к памяти и ALU:

NNNNN - EX -13 -> RML (read lower triad from memory [R3,R4] to R1)
NNNNO - EX -12 -> WMM (write R2,R1 to memory [R3,R4])
NNNNP - EX -11 -> RMH (read higher triad from memory [R3,R4] to R1)
NNNON - EX -10 -> RRC (rotate R1 right through C)
NNNOO - EX -9 -> SUB (C,R1=R1-R2)
NNNOP - EX -8 -> SBC (C,R1=R1-R2+C)
NNNPN - EX -7 -> RLC (rotate R1 left through C)
NNNPO - EX -6 -> ADD (C,R1=R1+R2)
NNNPP - EX -5 -> ADC (C,R1=R1+R2+С)
NNONN - EX -4 -> TSK (ternary skip on R4 sign) ??? \
NNONO - EX -3 -> TSK (ternary skip on R3 sign) ??? -} не, не нравится мне двойной скип...
NNONP - EX -2 -> TSK (ternary skip on R2 sign) ??? /
NNOON - EX -1 -> JPI (store current PC+1 to R3,R4 and jump to R13,R2)
NNOOO - EX 0 -> PEX (program OPB instances below)
NNOOP - EX +1 -> OPB №1 (R1=R1 o R2)
NNOPN - EX +2 -> OPB №2 (R1=R1 o R2)
NNOPO - EX +3 -> OPB №3 (R1=R1 o R2)
NNOPP - EX +4 -> OPB №4 (R1=R1 o R2)
...

P.S. Команда JPI может быть использована, чтобы сымитировать CALL и RET

Возвращаясь к сообщению от 27 ноября прошлого года про возможную программируемость EX инструкций - на самом деле программировать можно не только логические операции (OPB), но и арифметические - и вот каким образом:
Напомню, что PEX программирует команды в EX беря триады из R1,R2,R3 и R4
В случае логической команды (OPB) R1-R2-R3 могут задавать 9-тритовый код бинарной операции, а R4 - код команды, которую мы собственно меняем в блоке EX (это логичнее того, что я писал в процитированном выше)
В случае арифметической команды R4 всё также может задавать код команды, а вот другие регистры могут интерпретироваться следующим образом:
R1 и R2 задают входные аргументы - отрицательное число означает регистр берётся с отрицанием, -1 и +1 всё также будут означать R1-1 и R1+1 и 0 будет означать R1
R3 несёт в себе 3 трита, которые программируют разные опциональные вещи для арифметики, например:

старший трит:
+1 означает, что мы прибавляем флаг C
0 означает игнорирование флага C (и на входе, и на выходе)
-1 означает, что мы вычитаем флаг C (а имеет ли это смысл?)
средний трит:
+1 означает, что мы сдвигаем первый аргумент влево на 1 трит (с использованием флага C, если предыдущий трит не равен нулю)
0 означает неизменный первый аргумент
-1 означает, что мы сдвигаем первый аргмуент вправо на 1 трит (с использованием флага C, если предыдущий трит не равен нулю)
младший трит:
+1 означает, что второй аргумент мы считаем числом, а не указателем на регистр
0 означает неизменный второй аргумент
-1 означает использование теневых регистров (?)
в результате арифметической операции всегда будет устанавоиваться флаг C (и результат всегда будет сохраняться в R1)

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

R1 = R13 + R1 + 1

или

R1 = 3 * R12 - R11 + С

или

R1 = R4 / 3 + 0

и т.д.

Два года уж как скоро будет - подходит такое решение то? :eugeek:

P.S. Не надо удивляться тому, что это сообщение возникло ниоткуда - это сделано специально, чтобы сдвинуть первое видео из троичного сериала от haqreu на следующую страницу :)

_________________
:dj: https://mastodon.social/@Shaos


25 Mar 2020 10:39
Profile WWW
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Вам это может показаться удивительным, но я жив и от своих планов не отказывался!
Давайте праздновать сто пятидесятый день рождения дедушки Ленина!

В принципе, никакой новой информации, просто я наконец-то закончил плату памяти с тринадцатью трёхтритными ячейками памяти, что подробно описываю.


30 Mar 2020 15:38
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 410 posts ]  Go to page Previous  1 ... 19, 20, 21, 22, 23, 24, 25 ... 28  Next

Who is online

Users browsing this forum: No registered users and 16 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

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