Аппаратная частьКаким мог бы быть контроллер двоичной памяти для троичной ЭВМ.

В теме "Будет ли создан троичный компьютер?" (http://trinary.ru/discussions/144) я высказал мнение, что для троичного компьютера нужно "разрабатывать архитектуру и прочее, совместно с их двоичной реализацией". В частности потребуется "контроллер памяти, который мог бы в стандартных двоичных модулях памяти хранить троичные данные". Кое-какие намётки реализации я и хочу здесь изложить.
Как хранить троичные данные в двоичной памяти? Запросто, с некоторой потерей КПД его использования.
Например очевидно,что в при помощи 2-х битов (4 значения) можно хранить и/или передавать 1 трит (три значения). Соответственно, при помощи 8-ми битов (256 значений) уже 5 тритов (243 значения), и так далее. Часть возможных значений будет всегда теряться, так как нет и не может быть двух равных между собой степеней двойки и тройки (все положительные степени двойки чётны, все положительные степени тройки нечётны), но коэффициент этих потерь будет уменьшаться по мере того, как будет расти размер порции двоичных битов, отводимых под хранение максимально для них возможного числа тритов. Для примера приведу несколько таких вариантов, из числа самых экономичных комбинаций (незначащие нули спереди у чисел для выравнивания):
Nбит | Mтрит | КПД (3^M/2^N)
002 | 001 | 0,75
008 | 005 | 0,94922
027 | 017 | 0,96217
046 | 029 | 0,97530
065 | 041 | 0,98860
149 | 094 | 0,99067
233 | 147 | 0,99274
317 | 200 | 0,99481
401 | 253 | 0,99689
485 | 306 | 0,99898
Далее, вплоть до комбинации 1155 битов на 729 тритов, комбинаций с более высоким КПД не встречается.

Если создать некий контроллер, который смог бы преобразовывать троичные адреса и троичные данные с одной стороны (назовём эту сторону "интерфейс процессора") в двоичные адреса и двоичные данные (пусть она называется "интерфейс модулей памяти") то проблема создания памяти, подходящей для троичного процессора, будет решена. А с тем, что КПД использования ёмкости двоичных модулей памяти не сможет стать равным 1 придётся смириться, мне эти потери кажутся оправданными.

kvas,

Мнения

  • 001kvas

    Дополнительные функции, которые мне бы хотелось видеть в контроллере памяти ЭВМ. Не обязательно в таком, который описан выше, и даже не обязательно в троичном.

    а) хочется поддержки возможности "зеркалирования" двух модулей памяти, по принципу RAID-1
    б) поддержка значения "неинициализировано" при обращении к ячейке памяти

    Что бы это могло дать ЭВМ?

    Реализация пункта "а" (потребовав уменьшения КПД использования ёмкости модулей памяти вдвое но ведь можно сделать этот режим и отключаемым), очевидно дала бы не только надёжность, которая бы и не снилась не только никаким модулям с CRC но и модулям с ECC. Главное, что это могло бы дать - возможность замены модулей памяти (в том числе и на большие по объёму!) не останавливая работу вычислительной системы. При этом, в случае замены модулей на большие по ёмкости, после того, как будут заменены оба модуля в паре, [псевдо-]гипервизор мог бы обнаружить эти дополнительные объёмы и задействовать их на благо выполняющейся под ним операционной системы (систем).

    В результате операции чтения ячейки памяти контроллер мог бы возвращать в виде флага три значения:
    0) - значение прочитано удачно,
    1) - значение прочитано неверно, но результат успешно скорректирован при помощи ECC и/или "зеркала",
    -1) - значение прочитано неверно и результат скорректировать не удалось.

    В результате операции записи ячейки памяти контроллер мог бы возвращать в виде флага три значения:
    0) - значение записано в оба зеркалируемых модуля
    1) - значение записано в один модуль (с этим адресом работаем не в режиме зеркалирования)
    -1) - записать значение не удалось (никакой памяти по этим адресам нет)

    Как раз в один дополнительный трит уместилось бы.
    Возможно объединение модулей памяти и по принципу уровней RAID более высокого уровня, но вряд ли уровни 2..5 будут эффективны (слишком много обменов с памятью для извлечения одного значения), а уровни 6 и выше уже больше подходят для коррекции ошибки в более чем одном модуле памяти.

    Реализация пункта "б" дала бы совершенно уникальную возможность для отладки программ. Попытка чтения программой памяти по адресу, в который запись ещё не производилась, это весьма достоверный сигнал для ОС, что данная программа либо является ошибочной, либо вредоносной.
    В качестве флага результата операции чтения/записи возможны значения:

    0) обращение к ячейке, в которую данные уже записывались
    1) обращение к ячейке, в которую данные ещё не записывались
    -1) обращение к ячейке, которой вообще нет (памяти по этим адресам нет)

    Опять же, одного трита и на этот флаг хватит.

    А для реализации функций пункта "б" (отчасти - и пункта "а" тоже) вполне можно испоьзовать те значения группы битов, которые не требуются для хранения значений тритов. Так что "лишние" возможные значения оказываются не такими уж и лишними.

    • 002rvnick

      Для условно "простого" троичного компьютера вполне может
      быть достаточно простых методов перекодировки с использованием
      микросхем ПЗУ включенных встречно-параллельно с соответствующими
      прошивками для прямого преобразования из троичного BCT кода в стандартный
      двоичный и обратно. На рисунке приведён черновой вариант проекта
      перекодировщика из троичного 5-разрядного BCT кода в 8-разрядный
      двоичный код модулей памяти. Схема не отработана, могут быть ошибки.

      Насчёт RAID-1, вроде бы этот метод для жёстких дисков только?

      • 003kvas

        1) да, как раз отображение двоичных в троичные данные и обратно через ПЗУ это наиболее простой способ реализации
        2) RAID и расшифровывается собственно как Redundant Arra of Independent Disks (иногда вместо "Independent" ставят слово "Inexpensive"), поэтому аббревиатура RAID заведомо непригодна, я её употребил только для иллюстрации принципа зеркалирования данных на два независимых носителя. Если говорить о памяти, то можно слово "Disks" заменить на "Storages" или "Modules", получим RAIS или RAIM, кому как больше нравится.

        Насколько я знаю, дорогие серваки эту технологию уже используют.

    • 004kvas

      И ещё, раз уж говорить о том, что хочется видеть в троичном компьютере:
      В процессорах Intel-x86 почему-то разделены адреса пространства портов и пространства памяти. И даже команды обращения к ним различны. Не думаю, что это решение оптимальное, скорее уж оно было продиктовано ограниченым количеством адресных линий в оригинальном Intel-8086. А в троичных машинах существует возможность наличия отрицательных адресов памяти, что будет несколько путать непривычных к такому "изыску" программистов.
      Может быть окажется удобнее адресацию в троичных ЭВМ сделать например так: если первый трит
      равен +1, то это обращение к оперативной памяти
      равен -1, то это обращение к портам или отображаемым областям памяти контроллеров,
      равен 0, то это можно на внутренние нужды процессора отдать или как-то иначе использовать.

  • 005kvas

    Коллеги, пытался я найти техническую информацию о контроллерах памяти FB-DIMM и не преуспел. Может кто-то удачливее меня окажется в поисках или у кого есть в загашниках что-то подробное на эту тему? Помогите, если сможете.

    • 006rvnick

      Может такой подойдёт?
      http://download.micron.com/pdf/datasheets/modules/ddr2/HTF9C32_64_128x72F.pdf
      Надо ещё у Samsung поискать,тоже очень крупный производитель памяти.

      • 007kvas

        Спасибо! Буду думать, как к этому микроконтроллер присобачить.