nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 16 Oct 2018 23:05



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

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

Image


13 Dec 2017 06:28
Profile
Doomed

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

вид сверху :

_|_
/|\


13 Dec 2017 06:36
Profile
Supreme God
User avatar

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

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

_________________
iLavr


13 Dec 2017 06:43
Profile
Maniac

Joined: 10 Mar 2017 06:30
Posts: 276
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 07:13
Profile
Maniac

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

Image

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

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


13 Dec 2017 09:28
Profile
Maniac

Joined: 10 Mar 2017 06:30
Posts: 276
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 09:34
Profile
Maniac

Joined: 10 Mar 2017 06:30
Posts: 276
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 14:55
Profile
Maniac

Joined: 10 Mar 2017 06:30
Posts: 276
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 16:36
Profile
Maniac

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

Image

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


14 Dec 2017 16:51
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17000
Location: Colorado
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-команд (как запись в память программ)

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


16 Dec 2017 21:26
Profile WWW
Admin
User avatar

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

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


17 Dec 2017 01:04
Profile WWW
Maniac

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


17 Dec 2017 02:14
Profile
Admin
User avatar

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

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

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


17 Dec 2017 02:15
Profile WWW
Maniac

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


17 Dec 2017 02:19
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17000
Location: Colorado
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. Кстати я всё ещё планирую сделать одноплатный вариант триадора-калькулятора...

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


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

Who is online

Users browsing this forum: No registered users and 1 guest


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.