Применение двоичной памяти в троичном компьютере

Уравновешенная троичная система счисления - форум переехал с http://ternary.info

Moderator: haqreu

User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Применение двоичной памяти в троичном компьютере

Post by Shaos »

Предположим, что нам надо получить большую троичную память для нашего троичного компьютера. В настоящее время нет никакого другого выхода, кроме как задействовать какую-нибудь двоичную память с параллельным доступом. Если применять простейший способ преобразования трита в биты и битов в триты - замена 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 входа-выхода галки можно задействовать под логику управления регистрами).
sva

Re: Применение двоичной памяти в троичном компьютере

Post by sva »

если вы использеуте ПЛИС для реализации проекта то там чаще всего блоки памяти идут с дополнительными битами четности что можно использовать как еще один хранимый разряд
т.о.

скажем конфигурация 1k х 32 на самом деле 1k x 36
что при упаковке 2->1 дает 18 тритов или 3 трайта - веьсма удобное слово для троичной машины

к тому же 4е состояние лучше исользовать не как запрещенную комбинацию а как NULL (и тогда лучше комбинацию 00 - считая что чаще всего память по сбросу инициализируется 0-ми) чтобы отмечать неинициализированные данные
это поможет в давльнейшем при программировании
на сегодня нет механизма защиты от обращения к неинициализированным данным что бывает приводит к трудновыявляемым ошибкам работы ПО
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Применение двоичной памяти в троичном компьютере

Post by Shaos »

нет - плис пока использовать не планирую
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Post by petrenko »

Уж что что, но именно статическая память (IMHO) пока единственное, что при применении тристабильных ячеек будет однозначно выгоднее для хранения данных по сравнению с двоичными в пересчёте на количество элементов ~ площадь кристалла / общий объём хранимой информации.
Именно выгоднее.
Так что уж правильнее будет наоборот - применение троичной статической памяти в двоичных системах.
Просто выводы ИМС вход и выход данных делать переключаемыми или прямой троичный режим или режим переконвертации "на лету" двоичный->троичный->двоичный
Если такие ИМС будут выпускаться. они единственные из всего, что на нынешнее время успели понапридумывать троичного, смогут конкурировать с чисто двоичными статическими ОЗУ и при этом создадут предпосылки для возможного развития троичных систем.
Вот как то так..
Odin P. Morgan
Senior
Posts: 151
Joined: 23 Feb 2015 15:37
Location: OMS

Re: Применение двоичной памяти в троичном компьютере

Post by Odin P. Morgan »

Shaos wrote:нет - плис пока использовать не планирую
А ведь плиску можно использовать целиком как SRAM =) если память не именяет, можно найти очень дешёвый кристал без отладочной платы.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Применение двоичной памяти в троичном компьютере

Post by Shaos »

вот тут https://habrahabr.ru/post/341328/ в комментариях некто с ником IBAN_II предлагает преобразовывать троичный сигнал в 2 двоичных вот таким вот образом (R1=10k R2=5.6k):
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Применение двоичной памяти в троичном компьютере

Post by Shaos »

Написал программку на Сях, которая генерит прошивку для ПЗУ преобразователя из 8 бит в 5 тритов (представленные как 10 битов) для Logisim:

Code: Select all

#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;
}
Вот собственно результат её работы:

Code: Select all

v2.0 raw
 0 1 6 4 5 1A 18 19
 12 10 11 16 14 15 6A 68
 69 62 60 61 66 64 65 4A
 48 49 42 40 41 46 44 45
 5A 58 59 52 50 51 56 54
 55 1AA 1A8 1A9 1A2 1A0 1A1 1A6
 1A4 1A5 18A 188 189 182 180 181
 186 184 185 19A 198 199 192 190
 191 196 194 195 12A 128 129 122
 120 121 126 124 125 10A 108 109
 102 100 101 106 104 105 11A 118
 119 112 110 111 116 114 115 16A
 168 169 162 160 161 166 164 165
 14A 148 149 142 140 141 146 144
 145 15A 158 159 152 150 151 156
 154 155 0 0 0 0 0 0
 0 0 0 0 0 0 0 2AA
 2A8 2A9 2A2 2A0 2A1 2A6 2A4 2A5
 28A 288 289 282 280 281 286 284
 285 29A 298 299 292 290 291 296
 294 295 22A 228 229 222 220 221
 226 224 225 20A 208 209 202 200
 201 206 204 205 21A 218 219 212
 210 211 216 214 215 26A 268 269
 262 260 261 266 264 265 24A 248
 249 242 240 241 246 244 245 25A
 258 259 252 250 251 256 254 255
 AA A8 A9 A2 A0 A1 A6 A4
 A5 8A 88 89 82 80 81 86
 84 85 9A 98 99 92 90 91
 96 94 95 2A 28 29 22 20
 21 26 24 25 A 8 9 2
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Применение двоичной памяти в троичном компьютере

Post by Shaos »

Простейший случай, это когда мы берём стандартную память 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. В первом сообщении топика цифры меньше получились т.к. я там не учёл, что один бит можно вполне задействовать как неполный трит
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Применение двоичной памяти в троичном компьютере

Post by Shaos »

Если взять вот эту преобразовалку 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% использование чипа.

Я тут за главного - если что шлите мыло на me собака shaos точка net