Author |
Message |
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22729 Location: Silicon Valley
|
Предположим, что нам надо получить большую троичную память для нашего троичного компьютера. В настоящее время нет никакого другого выхода, кроме как задействовать какую-нибудь двоичную память с параллельным доступом. Если применять простейший способ преобразования трита в биты и битов в триты - замена 1 трита на 2 бита и наоборот (двоичная комбинация 11 будет запрещённой), то существующие на сегодняшний день микросхемы памяти могут быть использованы следующим образом:
2K = 11 бит в 8 бит = 5 тритов в 4 трита (243 ячейки - КПД 9%)
8K = 13 бит в 8 бит = 6 тритов в 4 трита (729 ячеек - КПД 7%)
32K = 15 бит в 8 бит = 7 тритов в 4 трита (2187 ячеек - КПД 5%)
64K = 16 бит в 8 бит = 8 тритов в 4 трита (6561 ячейка - КПД 8%)
Теперь предположим, что у нас есть схема, которая преобразует триты адреса в биты адреса самым оптимальным образом, тогда:
2K = 11 бит в 8 бит = 6 тритов в 4 трита (729 ячеек - КПД 28%)
8K = 13 бит в 8 бит = 8 тритов в 4 трита (6561 ячейка - КПД 63%)
32K = 15 бит в 8 бит = 9 тритов в 4 трита (19683 ячейки - КПД 48%)
64K = 16 бит в 8 бит = 10 тритов в 4 трита (59049 ячеек - КПД 71%)
А теперь ещё и данные преобразуем оптимально:
2K = 11 бит в 8 бит = 6 тритов в 5 тритов (729 ячеек - КПД 35%)
8K = 13 бит в 8 бит = 8 тритов в 5 тритов (6561 ячейка - КПД 79%)
32K = 15 бит в 8 бит = 9 тритов в 5 тритов (19683 ячейки - КПД 60%)
64K = 16 бит в 8 бит = 10 тритов в 5 тритов (59049 ячеек - КПД 89%)
Как видно наибольший КПД наблюдается у 8К и 64К вариантов.
Другой вопрос, что 5-тритовой или 4-тритовой шины данных у нас не будет, а будет 3-тритовая или 6-тритовая или 9-тритовая или даже 12-тритовая, поэтому нет смысла преобразовать данные (как минимум в 3 из 4 изложенных случаях). В случае 3-тритовой шины данных - можно взять 8-битную двоичную память, в случае 6-тритовой - уже нужна 16-битная (или две 8-битных), в случае 9-тритовой - можно попробовать сжать их в 16-битную память (нужен преобразователь данных), а в случае 12-тритовой - логичнее всего взять три 8-битных памяти в параллель и общатся с ними напрямую без преобразования данных.
8К с преобразованием адреса адресуются 8 тритами. Схема на преобразование 8 тритов в 13 бит будет достаточно тяжёлой и дорогой, поэтому логичнее и проще преобразовывать адрес через двоичное ПЗУ - в идеале 16 бит в 13 бит т.е. две 64Кбайтные 8-битные микросхемы (или одна 16-битная), однако это также выглядит слегка утяжелённым решением. Вместо этого поделим адресное пространство на 2 части управляемые двумя идентичными преобразователями 4 трита в 7 бит, построенными на галках 16v8, причём седьмой бит предыдущего преобразователя будет идти на дополнительный вход следующего (у первого преобразователя этот дополнительный бит можно обнулить) - итого мы имеем два преобразователя с 9 входами и 7 выходами, что ровно покрывается галкой 16v8.
64К с преобразованием адреса адресуются 10 тритами, что требует преобразователя 20 бит в 16 бит, что теоретически можно покрыть двумя галками 22v10 с одинковыми прошивками, подключёнными так, чтобы получать 10 входов и отдавать 8. Теоретически можно обойтись одной галкой, формируя двоичный адрес ПЗУ в 2 такта - сохраняя половинки адреса на двух 8-битных регистрах (в этом случае оставшиеся 4 входа-выхода галки можно задействовать под логику управления регистрами).
|
28 Jul 2010 20:57 |
|
|
sva
|
если вы использеуте ПЛИС для реализации проекта то там чаще всего блоки памяти идут с дополнительными битами четности что можно использовать как еще один хранимый разряд
т.о.
скажем конфигурация 1k х 32 на самом деле 1k x 36
что при упаковке 2->1 дает 18 тритов или 3 трайта - веьсма удобное слово для троичной машины
к тому же 4е состояние лучше исользовать не как запрещенную комбинацию а как NULL (и тогда лучше комбинацию 00 - считая что чаще всего память по сбросу инициализируется 0-ми) чтобы отмечать неинициализированные данные
это поможет в давльнейшем при программировании
на сегодня нет механизма защиты от обращения к неинициализированным данным что бывает приводит к трудновыявляемым ошибкам работы ПО
|
31 Jul 2010 22:51 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22729 Location: Silicon Valley
|
нет - плис пока использовать не планирую
|
01 Aug 2010 09:06 |
|
|
petrenko
Doomed
Joined: 10 Mar 2012 16:21 Posts: 598 Location: РФ
|
Уж что что, но именно статическая память (IMHO) пока единственное, что при применении тристабильных ячеек будет однозначно выгоднее для хранения данных по сравнению с двоичными в пересчёте на количество элементов ~ площадь кристалла / общий объём хранимой информации.
Именно выгоднее.
Так что уж правильнее будет наоборот - применение троичной статической памяти в двоичных системах.
Просто выводы ИМС вход и выход данных делать переключаемыми или прямой троичный режим или режим переконвертации "на лету" двоичный->троичный->двоичный
Если такие ИМС будут выпускаться. они единственные из всего, что на нынешнее время успели понапридумывать троичного, смогут конкурировать с чисто двоичными статическими ОЗУ и при этом создадут предпосылки для возможного развития троичных систем.
Вот как то так..
|
09 Nov 2012 15:43 |
|
|
Odin P. Morgan
Senior
Joined: 23 Feb 2015 15:37 Posts: 151 Location: OMS
|
А ведь плиску можно использовать целиком как SRAM =) если память не именяет, можно найти очень дешёвый кристал без отладочной платы.
|
16 Mar 2015 05:35 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22729 Location: Silicon Valley
|
вот тут https://habrahabr.ru/post/341328/ в комментариях некто с ником IBAN_II предлагает преобразовывать троичный сигнал в 2 двоичных вот таким вот образом (R1=10k R2=5.6k):
|
24 Nov 2017 20:11 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22729 Location: Silicon Valley
|
Написал программку на Сях, которая генерит прошивку для ПЗУ преобразователя из 8 бит в 5 тритов (представленные как 10 битов) для Logisim: | | | | Code: #include <stdio.h> #include <stdlib.h> #include <string.h>
int tab[256];
int main() { int i,j,k; char top[6] = "NNNNN"; FILE *f; for(i=0;i<256;i++) tab[i] = 0; for(i=-121;i<=121;i++) { j = i; if(j < 0) j+=256; k = 0; if(top[4]=='P') k=1; if(top[4]=='N') k=2; if(top[3]=='P') k|=4; if(top[3]=='N') k|=8; if(top[2]=='P') k|=16; if(top[2]=='N') k|=32; if(top[1]=='P') k|=64; if(top[1]=='N') k|=128; if(top[0]=='P') k|=256; if(top[0]=='N') k|=512; printf("%s %i %2.2X (%3.3X)\n",top,i,i&0xFF,k); tab[j] = k&0x3FF; /* balanced ternary increment */ if(++top[4]=='Q') { top[4] = 'N'; if(++top[3]=='Q') { top[3] = 'N'; if(++top[2]=='Q') { top[2] = 'N'; if(++top[1]=='Q') { top[1] = 'N'; if(++top[0]=='Q') { top[0] = 'N'; } } } } } } f = fopen("8bit5trit.rom","wt"); if(f==NULL) return -1; fprintf(f,"v2.0 raw\n"); for(i=0;i<256;i++) { fprintf(f," %X",tab[i]); if((i&7)==7) fprintf(f,"\n"); } fprintf(f,"\n"); fclose(f); return 0; }
| | | | |
Вот собственно результат её работы:
|
25 Nov 2017 17:12 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22729 Location: Silicon Valley
|
Простейший случай, это когда мы берём стандартную память 2К, 8К или 32К и каждый трит превращаем в 2 бита адреса, но т.к. адресных битов нечётное количество, то старший бит будет покрывать только значения O и P старшего трита (без N):
2K: 11 битов адреса т.е. 5 полных тритов и 1 неполный: Oxx xxx - 243 ячейки Pxx xxx - 243 ячейки Всего: 486 ячеек или 486/2048=23.7% объёма памяти
8K: 13 битов адреса т.е. 6 полных тритов и 1 неполный: O xxx xxx - 729 ячеек P xxx xxx - 729 ячеек Всего: 1458 ячеек или 1458/8192=17.8% объёма памяти
32K: 15 битов адреса т.е. 7 полных тритов и 1 неполный: Ox xxx xxx - 2187 ячеек Px xxx xxx - 2187 ячеек Всего: 4374 ячеек или 4374/32768=13.3% объёма памяти
P.S. В первом сообщении топика цифры меньше получились т.к. я там не учёл, что один бит можно вполне задействовать как неполный трит
|
06 Apr 2023 21:58 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22729 Location: Silicon Valley
|
Если взять вот эту преобразовалку 4-тритного адреса в 7-битный, которую я придумал в мае 2020 года (см. картинку ниже), то можно каждый блок состоящий из 81 троичной ячейки (адресуемых 4 тритами) превращать в 128-байтный блок двоичной памяти (адресуемой 7 битами) - для 2К ОЗУ таких блоков будет 16, для 8К ОЗУ - 64, а для 32К - 256. Для выбора блока можно также использовать эту же схему преобразования 4 тритов в 7 битов, что даст наилучшие результаты в случае 32-килобайтной памяти, покрыв 16 килобайт 6561 троичной ячейкой, а вторые 16 килобайт можно выбирать 9м тритом адреса (который может принимать значение O или P), что даст 13122 троичных ячеек в 32К двоичной памяти, обеспечив 40% использование чипа.
|
08 May 2024 21:44 |
|
|