nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 16 May 2024 05:20



Reply to topic  [ 14 posts ] 
Троичный компьютер "3niti 4000" 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22742
Location: Silicon Valley
Reply with quote
В связи с внезапным успехом по использованию стандартных CMOS микросхем серии 4000 для построения троичных вычислителей я подумал, что наверное было бы неплохо в этом году таки реализовать в железе проект 3niti alpha, который напомню был начат ещё в декабре 2004, т.е. в конце этого года данному проекту стукнет 20 лет :o

P.S. А может быть даже удастся развить это до расширенной спецификации 3niti beta на уровне микрокода :o

P.P.S. Плюсы:
  • Реальный троичный компьютер в железе
  • Относительно дешёвый из-за применения недорогой CMOS-серии 4000
  • Возможна прямая конверсия в ASIC существующих CMOS-процессов для создания чипа
Возможные минусы:
  • Внутри логических блоков каждый троичный вход будет разделяться на два двоичных сигнала, превращая всю конструкцию в гибридный двоично-троичный компьютер
  • Подозреваю, что по скорости это не будут мегагерцы т.к. задержка на одном CMOS вентиле будет 30нс или больше...

P.P.P.S. Внимательный читатель может задаться вопросом, а не является ли 3niti 4000 конкурентом компьютеру ТРИАДОР (и в частности микроконтроллеру Triador-3000)? Отвечаю - нет не является! Главным образом потому, что ТРИАДОР изначально позиционировался как эдакий троичный RISC (который в перспективе может стать первым троичным микроконтроллером в виде чипа), а вот 3niti - это типичный CISC, где ряд инструкций иначе нежели через микрокод и не сделаешь:

 3niti alpha 2008
Регистры:

-4 N: триада из ячейки памяти с адресом DPn (см. ниже);
-3 O: триада из ячейки памяти с адресом DPo (см. ниже);
-2 P: триада из ячейки памяти с адресом DPp (см. ниже);
-1 F: регистр флага (см. ниже);
0 A: регистр аккумулятора;
+1 B: дополнительный регистр;
+2 L: младшая триада текущего регистра DP (см. ниже);
+3 M: средняя триада текущего регистра DP (см. ниже);
+4 H: старшая триада текущего регистра DP (см. ниже).

Регистр F состоит из 3 троичных флагов:
  • Старший трит: RSF (Result Sign Flag) - флаг знака результата
  • Средний трит: DPF (Data Pointer Flag) - флаг указателя данных
  • Младший трит: BCF (Borrow Carry Flag) - флаг переноса-заёма

Также существют три 9-тритовых регистра указателя данных (data pointer = DP) - DPn, DPo, DPp, доступные через имена регистров L/M/H когда флаг DPF имеет значение N, O, P соответственно.

Теневой регистр программного счётчика (program counter = PC) напрямую недоступен - только через команды копирования между PC и текущим DP.

Полный список команд:

#NNN (-13) SAN - сохранить регистр A в регистре N (ячейка памяти с адресом DPn);
#NNO (-12) SAO - сохранить регистр A в регистре O (ячейка памяти с адресом DPo);
#NNP (-11) SAP - сохранить регистр A в регистре P (ячейка памяти с адресом DPp);
#NON (-10) SAF - сохранить регистр A в регистре F;
#NOO (-9) SPCD - сохранить PC в текущем регистре DP;
#NOP (-8) SAB - сохранить регистр A в регистре B;
#NPN (-7) SAL - сохранить регистр A в регистре L (младшая триада текущего DP);
#NPO (-6) SAM - сохранить регистр A в регистре M (средняя триада текущего DP);
#NPP (-5) SAH - сохранить регистр A в регистре H (старшая триада текущего DP);
#ONN (-4) RLA - сдвинуть регистр A влево через флаг BCF;
#ONO (-3) ADD - сложить регистр A с регистром B и флагом BCF, сохранить результат в A и флаге BCF, установить флаг знака RSF;
#ONP (-2) RRA - сдвинуть регистр A вправо через флаг BCF;
#OON (-1) LAI # - загрузить регистр A данными из триады идущей следом;
#OOO (0) ADI # - сложить регистр A с данными из триады идущей следом и флагом BCF, сохранить результат в регистре A и флаге BCF, установить флаг знака RSF;
#OOP (1) OPA # - выполнить унарную потритовую операцию над регистром A (функция устанавливается данными из триады идущей следом), установить флаг знака RSF;
#OPN (2) LDI # # # - загрузить текущий регистр DP данными из 3 триад идущих следом (старшая, средняя, младшая);
#OPO (3) JMP # # # - передать управление на адрес, взятый из 3 триад идущих следом (старшая, средняя, младшая);
#OPP (4) OPB # # # - выполнить бинарную потритовую операцию над регистрами A и B, сохранить результат в регистре A (функция устанавливается данными из 3 триад идущих следом), установить флаг знака RSF;
#PNN (5) LAN - загрузить регистр A из регистра N (ячейка памяти с адресом DPn);
#PNO (6) LAO - загрузить регистр A из регистра O (ячейка памяти с адресом DPo);
#PNP (7) LAP - загрузить регистр A из регистра P (ячейка памяти с адресом DPp);
#PON (8) LAF - загрузить регистр A из регистра F;
#POO (9) LPCD - загрузить PC из текущего регистра DP;
#POP (10) LAB - загрузить регистр A из регистра B;
#PPN (11) LAL - загрузить регистр A из регистра L (младшая триада текущего DP);
#PPO (12) LAM - загрузить регистр A из регистра M (средняя триада текущего DP);
#PPP (13) LAH - загрузить регистр A из регистра H (старшая триада текущего DP).

См. http://ternary.info/wiki/index.php?n=Alpha.InstructionSet

 3niti beta 2023
Является надстройкой над спецификацией 3niti alpha и заключается в добавлении нового 9-тритного регистра SP (указатель стека) и интерпретации некоторых JMP-ов как будто это новые 2-триадные команды (4-триадные в случае CALL):
JMP NNN = RET (возврат из подпрограммы)
JMP NNO = CALL_DP (вызов подпрограммы по адресу в текущем DP)
JMP NNP = POP_DP (вытащить из стека текущий DP)
JMP NON = PUSH_DP (затолкать в стек текущий DP)
JMP NOO = POP_FAB (вытащить из стека триады флагов, A и B)
JMP NOP = PUSH_FAB (затолкать в стек триады флагов, A и B)
JMP NPN = SSPD (сохранить указатель стека в текущий DP)
JMP NPO = LSPD (загрузить указатель стека из текущего DP)
JMP NPP = MODD (инкрементировать/декрементировать текущий DP в зависимости от значения флага BCF с установкой флага RSF по результату)
JMP ONN NNN NNN ... JMP OOO OOO OON - будет означать CALL по инвертированному адресу (т.е. CALL OPP PPP PPP ... CALL OOO OOO OOP) с сохранением адреса возврата на стеке.
А начиная с адреса OOO OOO OOO будет идти обычная память программ и данных (причём данные могут и в отрицательную область памяти уходить, будучи доступны через указатель DP.

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


08 May 2024 02:56
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22742
Location: Silicon Valley
Reply with quote
В идеале хотелось бы, чтобы конечный продукт умещался на одной большой квадратной плате, которую можно было бы вешать на стену как большую интерактивную картину :)
Это значит, что такую плату надо разрабатывать либо в опенсорцной программе pcb из состава пакета gEDA без ограничений на размер, либо автогенерировать через мои DDT и Circuits.CC (которые придётся допиливать). Пример для подражания - https://hackaday.com/2016/05/16/a-dis-integrated-6502/:

Attachment:
Monster6502.jpg
Monster6502.jpg [ 154.47 KiB | Viewed 625 times ]

Либо (как минимум для начала) можно разбить дизайн на платки и "по-быстрому" набросать их в Eagle v5.12 в ограничениях стандартной лицензии (которая у меня легально имеется ещё с 2007 года) 160x100мм, что есть формат Eurocard, под который существуют разнообразные "кроватки" - в качестве примера см. https://hackaday.com/2014/02/26/hackaday-68k-enclosure-backplane-and-power/:

Attachment:
eurocard-example.jpg
eurocard-example.jpg [ 148.83 KiB | Viewed 625 times ]
Вот репа этого проекта с герберами: https://github.com/bbenchoff/BackplaneComputer
(там есть кроватка на 7 разъёмов DIN41612, а также протоплата слота, но из разъёма там используются только 64 контакта по краям).

Вот тут ещё есть герберы для "кроваток" на 4 разъёма DIN41612 (тут разведены все 96 контактов):
https://www.martenelectric.cz/backplane_pcb_din41612_4_slot.html

 pinout
Attachment:
Screenshot from 2024-05-09 00-35-45.png
Screenshot from 2024-05-09 00-35-45.png [ 487.04 KiB | Viewed 610 times ]

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


08 May 2024 23:15
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22742
Location: Silicon Valley
Reply with quote
В качестве ОЗУ можно сразу поставить микросхему SRAM на 32кб, которые будем адресовать через вот такую схему (см. картинку внизу), по вот такой методе, используя из 32 килобайт целых 13122 ячеек (40%) для хранения триад из диапазона ONN NNN NNN ... PPP PPP PPP. Кроме того можно иметь где-то сбоку ПЗУ для начального старта. Схема преобразования из 4 тритов адреса в 7 битов, которая будучи реализована на DG403 весила бы 10 корпусов:



Попробуем реализовать её через 4000 серию. Напомню, что CD4001UBE (4xNOR) и CD4011UBE (4xNAND) каждая могут быть подключены как 4 инвертора со сдвинутыми порогами:



Сразу же можно отметить, что вот это:

Attachment:
Screenshot from 2024-05-09 00-48-31.png
Screenshot from 2024-05-09 00-48-31.png [ 2.78 KiB | Viewed 610 times ]
реализуется через небуферизированный NOR (порог сдвинут влево), а вот это:

Attachment:
Screenshot from 2024-05-09 00-49-00.png
Screenshot from 2024-05-09 00-49-00.png [ 2.68 KiB | Viewed 610 times ]
через NAND (порог сдвинут вправо) с последующей инверсией.

Каждый из 4 троичных входов схемы должен будет подаваться на один вентиль из CD4001UBE и на один вентиль из CD4011UBE, что займёт ровно 2 микросхемы. Сигналы r2 и r3 уже получаются готовы (просто берём выходы соответствующего NOR-гейта). Выходы r1 и r11 потребуют добавить 2 двоичных инвертора (к выходам соответствующих NAND-гейтов), но т.к. CD4052-е дают 2 селектора с общим управлением, то нам будет проще r11 реализовать через переключатель в половинке CD4052, т.к. вторая половинка будет задействована под mux r12. Итого 3 корпуса - идём дальше. Для реализации второй колонки берём ещё 3 микросхемы CD4052 - уже 6 корпусов. Третья колонка - ещё 2 микросхемы CD4052 - итого 8 корпусов. По идее нам надо было бы иметь инвертированный сигнал r1, но на самом деле т.к. это 1 бит адреса для ОЗУ, то нам не важно инвертированный он или нет - главное чтобы 2 разных значения этого бита адресовали разные половинки памяти т.е. без инвертора на выходе r1 у нас получается 8 корпусов - 1 микросхема CD4001UBE, 1 микросхема CD4011UBE и 6 микросхем CD4052.

Для адресации всех 32 килобайт нам потребуется 2 таких схемы (16 корпусов) плюс самый старший трит 9-тритового адреса будет использоваться для выбора половинок ОЗУ (O или P) и по-видимому ПЗУ (N), которое можно расположить в области NON NNN NNN ... NPP PPP PPP и обращаться к нему более простым способом (чтобы упростить программирование) - один трит адреса с троичной шины превращать в 2 бита адреса двоичной микросхемы ПЗУ - 7 тритов в 14 битов плюс ещё один трит, который непосредственно будет программировать старший бит адреса 0 или 1 - т.е. всего 15 битов адреса, что потребует 32-килобайтного ПЗУ (например AT27C256R) из которых будет доступно только 4347 ячеек (13.3% от всего объёма) - такой упрощённый способ адресации освещался вот тут. Логика формирования чипселектов:
Code:
TA8|CSRAM|CSROM
---------------
 N |  1  |  0
 O |  0  |  1
 P |  0  |  1
намекает на то, что надо воспользоваться вентилем NOR для формирования /CSRAM и его инверсией для формирования /CSROM. Далее надо привести диапазон логических уровней из -5В...+5В в 0В...+5В, что можно сделать с помощью диода и резистора.

Для преобразования 3 тритов в биты данных просто берём 3 вентиля NOR и 3 вентиля NAND с дальнейшим приведением уровней и для согласования входов и выходов ОЗУ потребуется как минимум одна буферная микросхема. Выходы же из микросхем памяти пойдут на схему преобразования битов в триты, которая реализуется парой корпусов CD4053 (через CD4052 это бы потребовало трёх микросхем).

Со схемой контроля целостности данных, которая использовала бы старшие 2 бита в байте данных двоичных микросхем памяти, можно пока не заморачиваться - итого получается порядка 23 микросхем (включая чипы ОЗУ и ПЗУ), что и будет первой платой в формате еврокард разработанной для троичного компьютера 3niti 4000...

P.S. А может воткнуть ПЗУ в середину (Oxx xxx xxx), как предполагалось изначально? ОЗУ же займёт области Nxx xxx xxx (данные) и Pxx xxx xxx (код и данные)? В этом случае логику чипселектов надо будет сделать иначе (либо вообще убрать её на плату процессора, которая будет выдавать отдельные чипселекты на шину)...

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


09 May 2024 00:54
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22742
Location: Silicon Valley
Reply with quote
По идее можно ОЗУ и ПЗУ сделать на разных платах т.к. мы выше решили, что ПЗУ не нужно тяжёлое перекодирование адреса и на эту же плату в адресное пространство ПЗУ можно уже в двоичной парадигме добавить периферию, в частности изначально запланированный двухцветный экран 9х9, представляемый 27 ячейками по 3 трита каждая:

Image

Тут же можно сделать несколько GPIO для подключения клавиатуры, звука, внешнего SPI EEPROM и т.д.

P.S. При упрощённом троичном способе обращения к двоичной памяти в ней образуется много дырок, недоступных троичному ядру - попробуем рассчитать размер самой большой непрерываемой дырки при таком подходе. Если преобразовывать каждый трит адреса в 2 бита адреса вот так: P->01, O->00, N->10 (плюс бит 14 будет просто браться из предпоследнего трита из которого мы будем использовать только значения O=0 и P=1), то дырка будет для всех адресов, где есть пары 11 - в частности это целиком последняя четверть в каждой из двух 16-килобайтных половинок имеющяя размер 4К причём к этим 4К будет примыкать дырка из предыдущей четверти, имеющая размер четверть четверти и т.д. т.е. размер самой большой неиспользуемой дырки в конце ПЗУ (и в середине ПЗУ тоже) можно вычислить как 4K+1024+256+64+16+4+1=5403 (две такие дырки будут занимать 33% объёма ПЗУ 32К). В этой дырке можно расположить "мультик", который может играться бортовой логикой на этом самом дисплее 9x9 сразу после ресета (причём таких мультиков может быть ДВА - в конце ПЗУ и в середине ПЗУ - их можно выбирать джампером перед включением компьютера). В одну такую дырку может влезть 200 кадров упакованных (с шагом 27) либо 168 кадров неупакованных (с шагом 32)...

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


09 May 2024 02:40
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22742
Location: Silicon Valley
Reply with quote
Ещё можно вот такой 7-сегментный индикатор поддержать (например на 5 разрядов):



Схема перекодировки в единственном экземпляре будет использоваться только в момент записи из троичного ядра в двоичный регистр (один из пяти), а индикация будет всегда производится из двоичных 8-битных регистров, в которых уже будут лежать преобразованные данные...

P.S. Эти 5 семисегментных индикаторов ( с точкой сегментов будет 8 ) могут также участвовать в мультике на буте - вот и получим 27+5=32 байта на "кадр" (для круглого счёта). Плата ПЗУ с такой индикацией может сама формировать сигнал RESET для всей остальной схемы, не отпуская его пока играется стартовый мульт (кстати каждый байт RG-индикации будет иметь ещё 2 неиспользуемых бита, в которые можно записать "звук" старта)...

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


09 May 2024 20:31
Profile WWW
Fanat

Joined: 06 Nov 2013 14:09
Posts: 67
Location: 82.147.177.70
Reply with quote
Для вывода цифровых значений тhёхтритного кода предлагается следующий метод:
1. 7-сегментный индикатор переворачивается вверх ногами так, чтобы сегмент "точка"
оказался в левом верхнем углу.
2. Цифры 0,1,2...9 отображаются обычным образом. Цифры 10,11,12 и 13 отображаются как
A,b,C,d способом принятом в HEX-коде.
3. Отрицательные цифры -1,-2,-3...-C,-d, отображаются также, но дополнены светящимся
символом "точка" в верхнем левом углу. Пример: -1 будет *1, -2 = *2, -3 = *3,...
-´10 = *A,... -13 = *d.
Так как в logisim 7-сегментный индикатор перевернуть нельзя, то будет приведён просто рисунок


Attachments:
7seg27.gif
7seg27.gif [ 21.73 KiB | Viewed 411 times ]
10 May 2024 18:58
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22742
Location: Silicon Valley
Reply with quote
7-сегментные индикаторы вверх тормашками? Интересный вариант :D

P.S. Кстати меня всегда в таком использовании HEX-цифр бесило, что буквы то строчные, то прописные - что если вот так сделать?
Code:
 ####    ####
#    #  #    #          #                    #
#    #  #    #          #                    #
 ####    ####    ####    ####    ####    ####
#    #       #  #    #  #    #  #       #    #
#    #       #  #    #  #    #  #       #    #
 ####    ####    ####    ####    ####    ####
Хоть маленькая a и похожа тут на маленькую o, но её ни с чем из имеющегося не спутаешь - можно просто запомнить, что это a :mrgreen:

P.P.S. Так как у нас 9-тритный адрес и 3-тритные данные, то 5 разрядов должно хватить и даже ещё содержимое аккумулятора можно вывести...

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


10 May 2024 19:09
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22742
Location: Silicon Valley
Reply with quote
Вот чего я придумал - т.к. хочется иметь и такие буковки, и сякие буковки на наших 7-сегментных индикаторах, то по-видимому будет проще ввести понятие заранее предопределённых "шрифтов"! :eugeek:

Вместо одной схемы преобразования 3 тритов в 8 сегментов надо взять 2К ПЗУ (например 573РФ2) и использовать его как "знакогенератор" - адресовать знаки в нём можно простым способом, превращая один трит в 2 бита (например O->00, P->01, N->10 или 11), т.е. 3 трита кода знака дадут 6 бит адреса, оставляя нам ещё 5 битов для выбора "шрифта", который может задаваться через отдельный регистр триадами от ONN до PPP (18 вариаций). Кроме того некоторые шрифты будут для обычной ориентации индикаторов, а некоторые (как пример выше) - для перевёрнутой - в этом случае пользователь просто перевернёт устройство вверх ногами. :mrgreen:

Ещё один интересный момент вырисовывается - меняя шрифт мы просто перепрограммируем способ как 3 трита при записи в соответствующий регистр будут превращаться в 8 битов для соответствующего 7-сегментного индикатора и т.к. регистры индикаторов будут хранить уже оттранслированные последовательности битов, то можно программно менять шрифт хоть перед записью в каждый регистр! Это даёт возможность иметь разные шрифты в разных разрядах одновременно и выводить туда в том числе произвольные комбинации сегментов - всего у нас может быть 256 комбинаций (с точкой), а триада задаёт только 27 комбинаций, поэтому нужно 10 шрифтов отдать под покрытие всех возможных комбинаций (типа псевдографика), а в оставшихся 8 шрифтах расположить спец.шрифты типа двух упомянутых выше.

P.S. Все комбинации без точки (взято из https://en.wikipedia.org/wiki/Seven-segment_display):

Attachment:
Screenshot from 2024-05-11 00-23-20.png
Screenshot from 2024-05-11 00-23-20.png [ 20.58 KiB | Viewed 351 times ]

(с точкой повторится всё тоже самое, но с точкой)

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


10 May 2024 23:02
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22742
Location: Silicon Valley
Reply with quote
Shaos wrote:
По идее можно ОЗУ и ПЗУ сделать на разных платах т.к. мы выше решили, что ПЗУ не нужно тяжёлое перекодирование адреса и на эту же плату в адресное пространство ПЗУ можно уже в двоичной парадигме добавить периферию, в частности изначально запланированный двухцветный экран 9х9, представляемый 27 ячейками по 3 трита каждая:

Image

Тут же можно сделать несколько GPIO для подключения клавиатуры, звука, внешнего SPI EEPROM и т.д.

P.S. При упрощённом троичном способе обращения к двоичной памяти в ней образуется много дырок, недоступных троичному ядру - попробуем рассчитать размер самой большой непрерываемой дырки при таком подходе. Если преобразовывать каждый трит адреса в 2 бита адреса вот так: P->01, O->00, N->10 (плюс бит 14 будет просто браться из предпоследнего трита из которого мы будем использовать только значения O=0 и P=1), то дырка будет для всех адресов, где есть пары 11 - в частности это целиком последняя четверть в каждой из двух 16-килобайтных половинок имеющяя размер 4К причём к этим 4К будет примыкать дырка из предыдущей четверти, имеющая размер четверть четверти и т.д. т.е. размер самой большой неиспользуемой дырки в конце ПЗУ (и в середине ПЗУ тоже) можно вычислить как 4K+1024+256+64+16+4+1=5403 (две такие дырки будут занимать 33% объёма ПЗУ 32К). В этой дырке можно расположить "мультик", который может играться бортовой логикой на этом самом дисплее 9x9 сразу после ресета (причём таких мультиков может быть ДВА - в конце ПЗУ и в середине ПЗУ - их можно выбирать джампером перед включением компьютера). В одну такую дырку может влезть 200 кадров упакованных (с шагом 27) либо 168 кадров неупакованных (с шагом 32)...
Мультик будет играться сразу в двоичном коде т.е. RG-светодиоды смогут показывать не только красный или зелёный цвета, но и жёлтый! Это было бы не совсем честным для троичного режима, где такой возможности изначально не предусмотрено. И вот я подумал, а не ввести ли нам "палитры"? :eugeek:
Один трит выбора палитры может задавать 3 варианта - N, O или P. При O на сдвоенные светодиоды будут посылаться обычные комбинации N->01 (R), O->11 (O), P->10 (G), а при N или P мы просто будем инвертировать первый или второй бит в паре, соответственно при N это будет N->11 (O), O->01 (R), P->10 (Y), а при P - N->00 (Y), O->10 (G), P->11 (O) т.е.

  • Palette N: Black, Red, Yellow
  • Palette O: Red, Black, Green (default)
  • Palette P: Yellow, Green, Black

В той же триаде могут располагаться другие системные триты - например трит звука, а также трит какого-нибудь внешнего троичного линка (выход на магнитофон?)

При чтении из этой триады можно получать состояние 6 кнопок, причём одна пара кнопок будет расшаривать один трит со входом с внешнего троичного линка (магнитофона?). Кнопки поделены на пары, которые бессмысленно нажимать одновременно в паре: Left/Right, Up/Down, Step/Run - похоже этого набора будет более чем достаточно :mrgreen:

Итак раскладка по памяти в области ПЗУ:

  • ONN NNN NNN (-3280) ... ONN NNN PPP (-3254) - красно-зелёный дисплей 9x9 (всего 27 ячеек по 3 трита каждая - только запись)
  • ONN NNO NNN (-3253) - первый 7-сегментный индикатор (только запись)
  • ONN NNO NNO (-3252) - второй 7-сегментный индикатор (только запись)
  • ONN NNO NNP (-3251) - третий 7-сегментный индикатор (только запись)
  • ONN NNO NON (-3250) - четвёртый 7-сегментный индикатор (только запись)
  • ONN NNO NOO (-3249) - пятый 7-сегментный индикатор (только запись)
  • ONN NNO NOP (-3248) - код шрифта (по умолчанию OOO)
  • ONN NNO NPN (-3247) - системная триада:
    • запись - вых.линк, звук, палитра (по умолчанию OOO)
    • чтение - вх.линк/кнопки
  • ONN NNO NPO (-3246) - зарезервировано
  • ONN NNO NPP (-3245) - идентификатор архитектуры (Oxx- alpha, Pxx - beta, Nxx - gamma)

Вроде ничего не забыл ( даже потом идентификатор архитектуры добавил : )

P.S. Тетрис там тоже планируется быть :lol:
Code:
         ####                    ####
#       #       #               #
#       #       #               #
 ####    ####    ####    ####    ####
#       #       #       #            #
#       #       #       #            #
 ####    ####    ####            ####


P.P.S. Для поддержки калькулятора потребуется отдельная матричная клавиатура...

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


11 May 2024 01:20
Profile WWW
Fanat

Joined: 06 Nov 2013 14:09
Posts: 67
Location: 82.147.177.70
Reply with quote
Как то на разновысотность букв не обращал внимания, но пожалуй строчность выглядит лучше.
Буква "с" просто уменьшается как и было предложено, а большую "А" можно подрезать.
Будет похожа на "п", но привыкнуть тоже легко.

И немного непонятно почему 5 разрядов, 3 трита - адресные, 1 трит - дата, а ещё один?


Attachments:
7segA.gif
7segA.gif [ 9.63 KiB | Viewed 282 times ]
11 May 2024 15:13
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22742
Location: Silicon Valley
Reply with quote
> И немного непонятно почему 5 разрядов, 3 трита - адресные, 1 трит - дата, а ещё один?

Пробел между ними :)
Ну или тире ;)
Это можно другим "шрифтом" писать (я описал выше как можно шрифты переключать хоть для каждого индикатора чтобы свой был)
И кстати не тритов, а триад ;)
Я вообще планировал ограничиться пятью разрядами т.к. кругло выходит для мультика на буте - 27+5=32 байта чтобы один кадр сформировать (дисплей 9х9 и 5 семисегментных индикаторов) и для простого калькулятора 5 разрядов тоже должно хватить...

P.S. Кстати, как я писал выше, для мультика у меня в ПЗУ есть 2 окна по 5К - можно в одно окно записать мультик обычный, а во второе - мультик перевёрнутый, и каким-то датчиком определять как пользователь держит девайс и запускать либо один, либо другой :lol:

P.P.S. Этот "какой-то датчик" называется "Tilt Sensor" - это выключатель, который замыкается, когда смотрит вверх и размыкается, когда смотрит вниз :)

Attachment:
Screenshot from 2024-05-12 02-03-06.png
Screenshot from 2024-05-12 02-03-06.png [ 679.36 KiB | Viewed 222 times ]
Источник: https://learn.adafruit.com/tilt-sensor/testing-a-tilt-sensor

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


11 May 2024 15:29
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22742
Location: Silicon Valley
Reply with quote
> Будет похожа на "п", но привыкнуть тоже легко

Наверное всё-таки такое написание (A,b,C,d) будет более привычным для большинства:

Image

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


12 May 2024 23:55
Profile WWW
Fanat

Joined: 06 Nov 2013 14:09
Posts: 67
Location: 82.147.177.70
Reply with quote
Для индикации значений триады на лед-7сегментнике предлагается использовать матричное преобразование на микросхеме прог-памяти К155РЕ3. Только есть нюанс: BCT-код триады состоит из 6 бит, а адрес в К155РЕ3 всего 5 разрядов. Для преодоления этой ситуации предлагается воспользоваться свойством симметричности положительных и отрицательных цифр в троично-симметричной системе счисления.
Суть метода:
1. На адресные входы К155РЕ3 через 5 двухвходовых
мультиплексоров подаются первые 5 битов BCT-кода триады.
Первые две пары мультиплексоров реверсируют биты в тритах T1 и T2, а 5-ый
мультиплексор просто переключает биты трита T3.
2. При управляющем сигнале "0" мультиплексоров, К155РЕ3 программируется для
индикации BCT-кодов в диапазоне "-d,-C,-b...0...3,4".
3. Для индикации положительных цифр в диапазоне "5,6....A,b,C,d", старший бит триады
принимает значение лог.1 и подаётся одновременно на вход 1 пятого
мультиплексора, на управляющие входы всех пяти мультиплексоров и на схему
блокировки зажигания сегмента "точка"(dp), котрый является символом "-" для
отрицательных цифр.
4. В результате этой инверсии, на выходах К155РЕ3 будут коды
для зажигания отрицательных цифр "-5,-6...-C,-d", но
т.к. символ "-" будет заблокирован, цифры будут отображаться как положительные.
Проект просимулирован в logisim.
Т.к. в логисиме 7-сегментный индикатор нельзя перевернуть, но есть возможность использовать один сегментик лед-матрицы, который будет точкой-минусом, находясь у верхнего левого края 7-сегментного индикатора.
При нажатии на кнопку «такты» будут переключаться цифры на индикаторе.


Attachments:
7seg27.png
7seg27.png [ 24.04 KiB | Viewed 69 times ]
15 May 2024 14:45
Profile
Fanat

Joined: 06 Nov 2013 14:09
Posts: 67
Location: 82.147.177.70
Reply with quote
А да, самое главное, файлы.
В зипе собственно проект в логисиме, пдф с табличкой кодов, и файл без расширения
это прошивка памяти на всякий случай.


Attachments:
7seg27.zip [27.27 KiB]
Downloaded 4 times
15 May 2024 14:47
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 14 posts ] 

Who is online

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