nedoPC.org

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



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

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

Итак, память инструкций. Один сегмент из себя представляет железку, принимающую на вход три трита адреса (offset), а на выход выдающую пять тритов самой инструкции:

Image

Внутри сидит пять раз повторённая вот эта схема:

Image


13 Dec 2017 04:16
Profile
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Дальше, программный счётчик имеет 9 входящих линий и 7 выходящих:

Image

7 выходящих линий V0-V6 дают семиразрядный троичный счётчик. При этом V4,V5,V6 даёт номер сегмента памяти программ, V1,V2,V3 смещение (номер инструкции внутри сегмента), а V0 - это номер текущего цикла. То есть, у меня каждая инструкция будет иметь три цикла.

На вход CLK идёт троичная пила, при этом счётчик увеличивает своё значение при каждом восходящем фронте N-O-P.

Счётчик считает импульсы CLK только если на линии Rewrite подана -1. Если на Rewrite не -1 (0 или 1), то значение счётчика переписывается на то, что дано на входных линиях R0-R6.

Внутри счётчик выглядит следующим образом:
Image


13 Dec 2017 04:22
Profile
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Дальше, если у нас есть код инструкции, то взяв старшие два трита (OC5 и OC4), можно сгенерировать пять сигналов, которые включат куски АЛУ, соответствующие пяти инструкциям базовой архитектуры. Я их расположил по порядку, -1 на линии включает АЛУ.

Image


13 Dec 2017 05:28
Profile
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
haqreu wrote:
... Как мне эти 6 пластин организовать в пространстве .. ? .. Какие будут идеи ? ..

вид сверху :

_|_
/|\


13 Dec 2017 05:36
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
haqreu wrote:
Плоский вариант размещения самый простой, но плох своей немобильностью.

Как раз, будучи оформлен в виде плоского стенда с прозрачной открывающейся крышкой,
занимает наименьший объем, визуально весь доступен, мобилен, если сверху приделать
ручку, не мешает в помещении, т.к. всегда может быть размещен на стене или у стены.

_________________
iLavr


13 Dec 2017 05:43
Profile
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Продолжаем разговор. Следующий логический блок - это оперативная память. Называть регистрами я её не буду, т.к. она содержит блок адресации, и прямого доступа к ячейкам у меня нет. В моей памяти 13 трёхтритных ячеек = 39 ячеек памяти с запоминанием по нисходящему фронту PON. Все 39 ячеек получаются одинаковой схемой при помощи двух тримуксов:

Image

В этой схеме две ячейки с запоминанием по уровню собраны в пару ведущая-ведомая, в итоге оно запоминает по фронту PON.


Вся память представляет собой логический блок следующего вида:

Image

Входных линий семь: три линии адреса, одна линия CLK, три линии A (то, что нужно в память записать при подаче PON на CLK). Три выходных линии Q (это то, что хранится в памяти). Внимание, тремя линиями адреса теоретически можно адресовать 27 ячеек, но у нас только 13. Поэтому "регистры" выбираются положительными значениями на линии адреса. Все невалидные адреса в моей железке приводят к выбору R1.

Итого плата памяти представляет собой 39 ячеек с запоминанием по ниспадающему фронту, и 7 мультиплексоров 1:13.


13 Dec 2017 06:13
Profile
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Вот грубо нарисованная схема моей имплементации триадора:

Image

На каждую инструкцию нужно три цикла, на первом цикле код инструкции копируется в регистр команд, и сразу же после этого декодер готовит линии ENABLE_**. На втором цикле АЛУ читает нужный адрес оперативной памяти и производит необходимые вычисления. На третьем цикле у АЛУ есть три варианта: (а) сохранить результат в оперативную память, (б) сохранить адрес перехода в счётчик команд, (в) дать декодеру сигнал пропустить следующую команду.

Тонкость: пропуск команд происходит на уровне декодера, на этой схеме я нарисовал что декодер просто не генерирует ни одной линии ENABLE_**, а АЛУ всё равно получает код инструкции. В моём текущем исполнении сделано несколько не так: у меня декодер генерирует фальшивый код инструкции (OOOOO), то есть, АЛУ получает опкод не из регистра команд, а непосредственно от декодера.
В принципе, оба подхода эквивалентны.


13 Dec 2017 08:28
Profile
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Показываю ещё пару картинок:

Image

Верхний график - это тактирующий сигнал, нижние два графика - это младшие два трита программного счётчика. Напоминаю, что счётчик семиразрядный, самый младший разряд даёт цикл (три цикла на кажду инструкцию).

Счётчик увеличивается на каждом восходящем фронте N-O-P (красные пунктирные линии). Вся память у меня с запоминанием по ниспадающему фронту P-O-N (зелёные пунктирные линии). На слабую долю хлопает :)
Это сделано для того, чтобы все переходные процессы уже давно устаканились. Вот схема моего компьютера, на ней нарисованы практически все провода.

Image

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

Специальное внимание нужно уделить инициализации компьютера при старте:

1) клок должен обязательно начинаться с состояния P (чтобы не пропустить ниспадающий клок цикла N), это одна ячейка памяти и one time fire схемка на паре мультиплексоров. Поэтому нужно инициализировать эту ячейку памяти.
2) нужно записать N NNN NNN в счётчик инструкций
3) регистр инструкций на всякий случай нужно обнулить в ничего не делающую инструкцию OOOOO.
4) флаг пропуска инструкции в декодере нужно тоже обнулить.

Оперативная память и все внутренние буферы АЛУ при старте будут получать мусор. Вроде ничего не забыл.


Тонкость: пропуск команд происходит на уровне декодера: у меня декодер генерирует фальшивый код инструкции (OOOOO), то есть, АЛУ получает опкод не из регистра команд, а непосредственно от декодера.

Можно сделать иначе: декодер может просто не генерировать ни одной линии ENABLE_**, а АЛУ всё равно получает код инструкции непосредственно из регистра команд. В принципе, оба подхода эквивалентны.


14 Dec 2017 08:34
Profile
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Давайте покажу, как у меня работает универсальная унарная операция над R1.

Напоминаю, что это опкод ONttt, и оно осуществляет потритовую операцию. Сама логика работы очень простая:
если у нас число Q (состоящее из трёх тритов Qhi Qmi Qlo), и есть младшие три трита опкода OC3 OC2 OC1, то можно получить результирующее трёхтритное число A следующим образом:

Image

Ещё раз: OC задаёт команду, Q - параметр, A - результат. Если с OC понятно, просто берём младшие три трита из регистра команд, то число Q нужно получить из ячейки R1 оперативной памяти. Посему чисто этой схемы не хвататет, нужно ещё немного синхронизации с внешним миром.

Напоминаю, что декодер инструкций нам даёт входящий сигнал EN_OP (нужно включить этот кусок АЛУ, когда этот сигнал равен -1). Тогда на адресный вход нашей оперативки можно подать адрес OOP при условии, что EN_OP=-1:

Image

Это нам гарантирует, что два разных куска АЛУ не обратятся одновременно к разным кускам памяти, создав короткое замыкание на адресной линии. Таким образом, входы мультиплексоров, висящие в воздухе (обозначены как n.c.) - это очень важная часть схемы.

Линии Q нам экранировать не надо, т.к. они идут только на чтение. А вот линии A для сохранения результата и линию клока памяти C (напоминаю, память сохраняет по нисходящему клоку P-O-N) нужно тоже аккуратно экранировать от неосторожного включения в неподходящий момент.

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

Image

Здесь чёрными показаны мультиплексоры, выполняющие непосредственно вычисления, а синим мультиплексоры, занимающиеся синхронизацией сигналов. Обратите внимание, что сигнал CLK пропускается на тактовый вход оперативки только в третьем цикле инструкции. То, что я применил память с запоминанием по фронту, позволяет мне спокойно и читать, и писать в одно и то же место памяти.

Итого пять с половиной тримуксов на полный срез АЛУ, занимающийся потритовой унарной операцией.


14 Dec 2017 13:55
Profile
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Любопытно выглядит кусок АЛУ, отвечающий за команду безусловного перехода (JP). Вычислений в нём нет вообще никаких, одна синхронизация (я покрасил все мультплексоры в синий цвет). Итак, как она работает. Во-первых, нам надо на входы R4-R6 (сегмент) счётчика команд подать содержимое регистра R13. Для этого при условии того, что наш срез АЛУ включен (EN_JP=-1), подаём на адресную линию памяти число PPP. Затем необходимый адрес берём из линии Q оперативной памяти (сегмент) и младших трёх тритов опкода (смещение). Этот адрес заводится на счётчик команд через мультиплексоры для того, чтобы не было конфликта во время нажатия кнопки резет. Резет обнулит регистр команд, таким образом, даже если EN_JP был включен, он обнулится и позволит переинициализировать счётчик. Разумеется, токоограничительные резисторы всё же приветствуются.

Сама команда перезаписи подаётся на линию Rewrite программного счётчика (всё, что отлично от -1) при двух условиях: а) EN_JP=-1 и б) CLK=1. Напоминаю, что новый опкод у нас копируется по ниспадающему фронту P-O-N, таким образом, EN_JP подготовится при CLK=-1. Условие перезаписи счётчика при CLK=1 - это просто задержка, которая позволит памяти выбрать регистр R13. Таким образом, JP - это единствення операция, которая исполняется в один цикл вместо трёх (у меня линия R0 счётчика жёстко заведена на -1), поэтому любая перезапись счётчика приводит к перезаписи цикла = N.

Image


14 Dec 2017 15:36
Profile
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Ну и напоследок из реально запаянного команды R1,R2,R3,R4 (прямая запись в регистры R1-R4).

Image

Думаю, что после предыдущих комментариев тут писать особо нечего. Разве что отметить, что запись в память произойдёт два раза: на цикле O и на цикле P, что, впрочем, никак не отразится на работоспособности. Из базовых команд АЛУ мне осталось сделать SK и RR. Схемы у меня уже в блокноте нарисованы, но не проверены в железе. Впрочем, ошибиться там негде :)


14 Dec 2017 15:51
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Прикинул тут, что в 2x2мм чип влезет только 500 троичных мультиплексоров, т.е. триадор в него не влезет :(
А скажем если заказывать 3x3мм, то оно будет несколько дороже, но зато на 1300 троичных мультиплексоров, которых на триадор должно хватить за глаза (даже с памятью)
Кроме того кристалл большего размера сможет вместить в себя больше падов - например тот же 3x3 сможет до 76 ног поддержать :o
Можно скажем в PLCC68 упаковаться, для которого сгодится 2.7x2.7мм, куда примерно 1000 троичных мультиплексеров (с хвостиком) влезет!

P.S. Вот так к примеру можно распиновку PLCC68 организовать:
1 земля
1 питание
1 вход тактирования
6 адрес для внешней памяти
5 слово из внешней памяти
39 выходы всех регистров R1...R13!!!
3 входы для R13 (по умолчанию цепляются к выходам R13)
и после этого ещё остаётся 12 ног на тест и например на организацию внешних EX-команд (как запись в память программ)

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


16 Dec 2017 20:26
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Триадор на хакадее https://hackaday.io/project/28579-homebrew-ternary-computer за день получил 25 тысяч просмотров скорее всего вот по этому :roll:

https://www.reddit.com/r/programming/comments/7k6duz/the_only_ternary_computer_made_for_real_in_the/

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


17 Dec 2017 00:04
Profile WWW
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
500 муксов может хватить. А что ты собирался в чип закатывать от триадора? Не целиком же компьютер. Память программ явно снаружи должна быть, например...


17 Dec 2017 01:14
Profile
Admin
User avatar

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

500 отдельных мультиплексоров - не сдвоенных тримуксов, а память да - снаружи (см. выше P.S. который я только что добавил)
можно попробовать EX-ы снаружи организовать (потребуется некоторая привязка - как минимум 3-тритный ввод данных)

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


17 Dec 2017 01:15
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 410 posts ]  Go to page Previous  1 ... 18, 19, 20, 21, 22, 23, 24 ... 28  Next

Who is online

Users browsing this forum: No registered users and 7 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:  
cron
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.