nedoPC.org

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



Reply to topic  [ 8 posts ] 
Применение двоичной памяти в троичном компьютере 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Предположим, что нам надо получить большую троичную память для нашего троичного компьютера. В настоящее время нет никакого другого выхода, кроме как задействовать какую-нибудь двоичную память с параллельным доступом. Если применять простейший способ преобразования трита в биты и битов в триты - замена 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
Profile WWW
Reply with quote
если вы использеуте ПЛИС для реализации проекта то там чаще всего блоки памяти идут с дополнительными битами четности что можно использовать как еще один хранимый разряд
т.о.

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

к тому же 4е состояние лучше исользовать не как запрещенную комбинацию а как NULL (и тогда лучше комбинацию 00 - считая что чаще всего память по сбросу инициализируется 0-ми) чтобы отмечать неинициализированные данные
это поможет в давльнейшем при программировании
на сегодня нет механизма защиты от обращения к неинициализированным данным что бывает приводит к трудновыявляемым ошибкам работы ПО


31 Jul 2010 22:51
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
нет - плис пока использовать не планирую


01 Aug 2010 09:06
Profile WWW
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
Post 
Уж что что, но именно статическая память (IMHO) пока единственное, что при применении тристабильных ячеек будет однозначно выгоднее для хранения данных по сравнению с двоичными в пересчёте на количество элементов ~ площадь кристалла / общий объём хранимой информации.
Именно выгоднее.
Так что уж правильнее будет наоборот - применение троичной статической памяти в двоичных системах.
Просто выводы ИМС вход и выход данных делать переключаемыми или прямой троичный режим или режим переконвертации "на лету" двоичный->троичный->двоичный
Если такие ИМС будут выпускаться. они единственные из всего, что на нынешнее время успели понапридумывать троичного, смогут конкурировать с чисто двоичными статическими ОЗУ и при этом создадут предпосылки для возможного развития троичных систем.
Вот как то так..


09 Nov 2012 15:43
Profile
Senior

Joined: 23 Feb 2015 15:37
Posts: 151
Location: OMS
Reply with quote
Shaos wrote:
нет - плис пока использовать не планирую

А ведь плиску можно использовать целиком как SRAM =) если память не именяет, можно найти очень дешёвый кристал без отладочной платы.


16 Mar 2015 05:35
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
вот тут https://habrahabr.ru/post/341328/ в комментариях некто с ником IBAN_II предлагает преобразовывать троичный сигнал в 2 двоичных вот таким вот образом (R1=10k R2=5.6k):


Attachments:
ternary2binary.jpeg
ternary2binary.jpeg [ 32.96 KiB | Viewed 7776 times ]

_________________
:dj: https://mastodon.social/@Shaos
24 Nov 2017 20:11
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Написал программку на Сях, которая генерит прошивку для ПЗУ преобразователя из 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;
}


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

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


25 Nov 2017 17:12
Profile WWW
Admin
User avatar

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

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


06 Apr 2023 21:58
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 8 posts ] 

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:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.