3niti alpha simu1 - троичный компьютер на двоичном пике

8-битные микроконтроллеры PICmicro (ПИКи) от Microchip и совместимые, а также 16-битные PIC24 и 32-битные PIC32

Moderator: Shaos

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

Post by Shaos »

Shaos wrote:Эпопею с выкатыванием первой версии эмулятора можно считать законченной:

http://nedopc.org/nedopc/16/t1_test3.hex (3K)
http://nedopc.org/nedopc/16/t1_test3.asm (21K)
http://nedopc.org/nedopc/16/PDBLv1.zip (54K)

Прогон команды ADI # (код OOO) по всей памяти в 19,683 триад даёт примерно 52 мкс на команду (это при том, что реально данные читаются не во всех страницах). Также удалось впихнуть в прошивку хак - если переключатели W/R и I/M оба находятся в нижнем положении, то управление передаётся на бутлоадер PDBLv1, через который можно посмотреть состояние переменных и EEPROM.
Эмулятор поддерживает 2 страницы троичной памяти (по 27 триад каждая):
OOO OOO xxx - ПЗУ (хранится в EEPROM)
OPN NNN xxx - ОЗУ (хранится в регистрах)
(на самом деле средняя триада адреса в данный момент игнорируется)
все остальные области памяти читаются как OOO

Программа может быть введена переключателями и сохранена в ОЗУ, затем на неё можно передать управление через переключатель I/M установив адрес и сдвинув переключатель вверх

Для того чтобы ввести программу в ПЗУ в данный момент надо пользоваться бутлоадером PDBLv1 (через переключатели не сделано), например вот программа, которая содержит одну единственную команду JMP 0:
!00=08
!20=00
!18=00
!08=00

P.S Проишвка эмулятора шьётся в пик через бутлоадер PDBLv1 в течение 1 минуты 25 секунд
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Подкорректированный список компонентов:

Code: Select all

component        where to buy            quantity
PIC16F870        jameco.com 246895       1
socket DIP-28    jameco.com 114412       1
tactile switch   jameco.com 153251       1
4-pin header(RA) digikey.com S5479-ND    1
20MHz crystal    mouser.com 815-AB-20-B2 1
v-reg 7805       jameco.com 51262        1
red LED 5mm      mouser.com 78-TLHR5400  1
yellow LED 3mm   mouser.com 604-WP7104LYD 1
power terminal   jameco.com 152347       1
transistor BC557 mouser.com 512-BC557BTF 5
serial mem 24c32 jameco.com 200563       1
socket DIP-8     jameco.com 51626        1
red-green LED CA mouser.com 604-WP59EGW/CA 15
diode 1N914      jameco.com 179207      15
switch SP3T      digikey.com CKN9553-ND or mouser.com 611-OS103012MU2QP1 15
resistor 10K     jameco.com 691104       3
resistor 330     jameco.com 690742       8
resistor 3K3     jameco.com 690988       6
capacitor 22pF   jameco.com 15405        2
capacitor 100uF  jameco.com 29962        1
capacitor 10uF   jameco.com 1946359      1
capacitor 0.1uF  jameco.com 33488        2 (not 33486!) 
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Shaos wrote:Прогон команды ADI # (код OOO) по всей памяти в 19,683 триад даёт примерно 52 мкс на команду (это при том, что реально данные читаются не во всех страницах).
Примерные веремена в мкс для финальной версии:

Code: Select all

        from RAM from ROM
NNN (SAN)     21       28
NNO (SAO)     21       28
NNP (SAP)     21       28
NON (SAF)     18       25
NOO (SPCD)    23       30
NOP (SAB)     18       25
NPN (SAL)     22       29
NPO (SAM)     22       29
NPP (SAH)     22       29
ONN (RLA)     23       32
ONO (ADD)     45       52
ONP (RRA)     23       32
OON (LAI #)   27       41
OOO (ADI #)   55       69
OOP (OPA #)   44       58
OPN (LDI ###) 48       76
OPO (JMP ###) 55       83
OPP (OPB ###) 93      121
PNN (LAN)     22 29*   29 36*
PNO (LAO)     22 29*   29 36*
PNP (LAP)     22 29*   29 36*
PON (LAF)     19       26
POO (LPCD)    24       31
POP (LAB)     19       26
PPN (LAL)     23       30
PPO (LAM)     23       30
PPP (LAH)     23       30
where * means with reading data from ROM
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Надо бы побольше пик сюда воткнуть, причём с I2C, но есть проблема - у больших PIC16F87X аппаратная поддержка I2C на других ногах висит, не на RB6-RB7, а RC3-RC4, которые в нашем случае уже заняты. Есть мысль сделать навесиком платку, куда воткнуть скажем PIC16F877A в PLCC, взяв у него порт RD0...RD7 вместо порта RC0...RC7, а освободившиеся RC3 и RC4 вывести вместо RB6 и RB7 - в таком случае у нас освободятся ноги RB6, RB7, RC0, RC1, RC2 и RC5 (а RC6 и RC7 всё также будут заняты под RS-232), кроме того появятся ноги RE0, RE1 и RE2, которые можно использовать как входы АЦП (троичные входы). RB6 и RB7 можно задействовать по прямому назначению - для программирования через PICKit3. RC5 можно оставить на случай использования SPI. Оставшиеся 3 сигнала RC0,RC1,RC2 можно задействовать как троичные выходы вот по такому сценарию: viewtopic.php?t=362

P.S. Плюс к этому на ту же платку можно преобразователь уровней RS-232 воткнуть или вообще конвертер в USB...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re:

Post by Shaos »

Shaos wrote:
Shaos wrote:Триада - это три трита, каждый из которых представлен двумя битами - младшим битом минуса и старшим битом плюса. Триады у нас перевёрнуты из-за особенностей схемы "3niti alpha simu1", т.е. в старших битах находится младший трит, а в младших - старший:

bit 0 - установлен в "1", если старший трит триады отрицателен
bit 1 - установлен в "1", если старший трит триады положителен
bit 2 - установлен в "1", если средней трит триады отрицателен
bit 3 - установлен в "1", если средней трит триады положителен
bit 4 - установлен в "1", если младшей трит триады отрицателен
bit 5 - установлен в "1", если младшей трит триады положителен
bit 6 - должен быть нулевым
bit 7 - должен быть нулевым
Если таким байтом адресоваться к 27-триадному блоку данных, то в двоичной памяти оно расположится так:

Code: Select all

0x00 (00000000) OOO = 0
0x01 (00000001) NOO = -9
0x02 (00000010) POO = +9
0x03 (00000011)
0x04 (00000100) ONO = -3
0x05 (00000101) NNO = -12
0x06 (00000110) PNO = +6
0x07 (00000111)
0x08 (00001000) OPO = +3
0x09 (00001001) NPO = -6
0x0A (00001010) PPO = +12
0x0B (00001011)
0x0C (00001100)
0x0D (00001101)
0x0E (00001110)
0x0F (00001111)
0x10 (00010000) OON = -1
0x11 (00010001) NON = -10
0x12 (00010010) PON = +8
0x13 (00010011)
0x14 (00010100) ONN = -4
0x15 (00010101) NNN = -13
0x16 (00010110) PPN = +5
0x17 (00010111)
0x18 (00011000) OPN = +2
0x19 (00011001) NPN = -7
0x1A (00011010) PPN = +11
0x1B (00011011)
0x1C (00011100)
0x1D (00011101)
0x1E (00011110)
0x1F (00011111)
0x20 (00100000) OOP = +1
0x21 (00100001) NOP = -8
0x22 (00100010) POP = +10
0x23 (00100011)
0x24 (00100100) ONP = -2
0x25 (00100101) NNP = -11
0x26 (00100110) PNP = +7
0x27 (00100111)
0x28 (00101000) OPP = +4
0x29 (00101001) NPP = -5
0x2A (00101010) PPP = +13
0x2B (00101011)
0x2C (00101100)
0x2D (00101101)
0x2E (00101110)
0x2F (00101111)
Как можно видеть, не используются любые ячейки, в адресе которых встречаются две пары единиц у любой из триад (запрещённая комбинация в binary coded ternary).

В первой версии эмулятора для платы "3niti alpha simu1" предлагается держать 27-триад кода в EEPROM (как бы троичный ROM) с вышеуказанными адресами и 27-триад данных в регистровой памяти (как бы троичный RAM) с вышеуказанными адресами, к которым прибавлено число 0x40, т.е. диапазон переменных 0x40...0x6F (нулевой банк файла региcтров в пике).

В терминах длинных адресов "3niti alpha", этот 27-триадный ROM будет отображаться на область OOOOOOxxx, а 27-триадный RAM - на область OPNNNNxxx (начиная с адреса +1093). В текущей прошивке, над которой я сейчас работаю, внешняя память пока использоваться небудет (её можно будет добавить позже - у схемы есть возможность обновления прошивки через бутлоадер).

P.S. Глядя на этот маппинг троичных адресов на двоичные у меня возникла идея - что если прямо так и хранить во внешней памяти? Можно читать по 48 байт (тогда потеряно будет 44% памяти), убрав последние 5 байт получим 43 байта (37% потерь) или даже брать блоками по 11 байт три раза, где будет всего 2 однобайтных дырки (18% потерь). Проблема лишь в том, что придётся адресоваться к памяти через умножение - надо будет умножать на 48 (00110000), 43 (00101011) или 11 (00001011) - хотя точнее надо бы сказать 33 (00100001), т.к. 3 раза по 11. Формула уможения на 48: (x<<5)+(x<<4). Формула умножения на 43: (x<<5)+(x<<3)+(x<<2)+x. Формула умножения на 11: (x<<3)+(x<<1)+x или (x<<3)+(x<<2)-x (т.е. 12*x-x). Формула умножения на 33: (x<<5)+x. Хотя блоками по 27 тоже умножать надо, причём на некрасивое число 00011011...

P.P.S. Прикинул, что при 3x11-байтовом представлении 27-триадной страницы теоретически будет читаться-писаться по 300 страниц в секунду при 100кГц или 1200 страниц при 400кГц. Но т.к. при записи будет до 10 мс задержка на запись очередной порции (до 32 байт длиной) - то это уменьшит скорость записи до 30 страниц в секунду при 100кГц или 120 страниц при 400 кГц. Напомню, что первоначально оговоренный размер блоков RAM и ROM у 3niti alpha составляет (1093*2+1)/27=81 страница, которые можно прочитать меньше чем за треть секунды и записать за 2.7 или за 1.35 секунды в зависимости от тактовой частоты ПЗУ. Байты "потерянные" при такой оптимизации можно использовать для хранения адреса страницы (для проверки корректности места чтения) и её контрольной суммы (для проверки целостности данных).

P.P.P.S. Внимательно прочитал даташит на I2C память - страничная запись подразумевает запись в 32-байтовые области с фиксированными адресами - т.е. придётся таки писать ровно по 32 байта...
Зато есть память FRAM, в которую можно писать побайтово - уже купил 8K с интерфейсом SPI (обращаться к ней буду по 2 проводам как описал тут). Располагать триады буду по 33 (как описано чуть выше). Можно защитить от записи верхнюю половину - туда поставить ROM, а в нижнюю - соответственно RAM - и то, и другое будет чуть больше чем надо - 124 страницы вместо 81, т.е. ROM будет залезать вниз в область периферии (ниже OON NNN NNN), а RAM будет забираться чуть выше адреса OPP PPP PPP:

Code: Select all

   0 => OPN NNN xxx - адрес первой 27-триадной страницы RAM
2673 => OPP PPP xxx - адрес последней 27-триадной страницы RAM для альфа-версии
4059 => PNO OPN xxx - адрес последней 27-триадной страницы расширенного RAM
4096 => ONO OON xxx - адрес первой 27-триадной страницы расширенного ROM
5482 => OON NNN xxx - адрес первой 27-триадной страницы RORM для альфа-версии
8155 => OOP PPP xxx - адрес послденей 27-триадной страницы ROM для альфа версии
Тут вобщем придётся какую-то хитрую математику делать для преобразования адресов...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 3niti alpha simu1 - троичный компьютер на двоичном пике

Post by Shaos »

Видимо таки начну с I2C по первоначальной схеме - чтобы освободить место в PIC16F870 из прошивки придётся выкинуть бутлоадер (заодно оставив в покое бортовую EEPROM память на 64 байта, подпрограммы чтения-записи в которую весят неприлично много), но какую-то минимальную работу по последовательному порту надо будет оставить - чтобы потом написать софт для ПЦ, который через COM-порт сможет подсматривать за состоянием памяти "3niti alpha" и помогать в отладке троичных программ...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 3niti alpha simu1 - троичный компьютер на двоичном пике

Post by Shaos »

Кстати вот расположение элементов сделал для покупателей ( их внезапно стало больше одного :o )
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net