nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 18 Jul 2018 08:38



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

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

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

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


19 Dec 2017 04:19
Profile
Maniac

Joined: 10 Mar 2017 06:30
Posts: 274
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 03:04
Profile
Maniac
User avatar

Joined: 21 Mar 2017 13:50
Posts: 225
Location: Spb
Reply with quote
Подсказали мне тут очень оригинальную (ИМХО) схему тактового генератора. Вот такое красивое решение:
Image
На второй половинке 4052 можно сделать противофазный (инвертированный) тактовый сигнал.


15 Jun 2018 12:17
Profile
Maniac

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


16 Jun 2018 02:28
Profile
Maniac
User avatar

Joined: 21 Mar 2017 13:50
Posts: 225
Location: Spb
Reply with quote
haqreu wrote:
Правда, использование двоичной техники :)

Ничего не мешает в последствии использовать троичный счётчик :roll: :rotate:
Для отработки технологии весьма неплохо. :wink:


16 Jun 2018 04:17
Profile
Maniac

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

Image

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

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

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

Image


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


10 Jul 2018 13:24
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16706
Location: Colorado
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

и т.д.

_________________
:eugeek: https://twitter.com/Shaos1973


10 Jul 2018 18:00
Profile WWW
Maniac

Joined: 10 Mar 2017 06:30
Posts: 274
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 02:31
Profile
Maniac

Joined: 10 Mar 2017 06:30
Posts: 274
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 04:39
Profile
Admin
User avatar

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

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

_________________
:eugeek: https://twitter.com/Shaos1973


15 Jul 2018 14:34
Profile WWW
Maniac

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


16 Jul 2018 00:40
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 356 posts ]  Go to page Previous  1 ... 20, 21, 22, 23, 24

Who is online

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