Самодельный процессор nedoRISC-0 (NEDONAND)

Публичный форум для http://www.nedopc.org/nedopc

Moderator: Shaos

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

Re: Самодельный процессор nedoRISC-0 (NEDONAND)

Post by Shaos »

Обновил архивчик: http://nedopc.org/nedopc/files/logisim-nedonand.zip



Потихоньку прикручиваю АЛУ (это маленький прямоугольничек у правого края схемы)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор nedoRISC-0 (NEDONAND)

Post by Shaos »

Shaos wrote:
Shaos wrote:
Shaos wrote:Вот пример инкремента регистровой пары DE:

Code: Select all

A=E ; no ALU
A=A+1 ; used ALU (2nd stage of pipeline)
NOP ; no ALU (required because A is not yet ready)
E=A ; no ALU
A=0 ; no ALU
ADC D ; used ALU (2nd stage of pipeline)
NOP ; no ALU (required because A is not yet ready)
D=A ; no ALU
8 циклов, причём только 2 из них используют вторую ступень конвейера, а в остальные 6 (NOP-ы могут быть заменены на другие более полезные команды, не задевающие аккумулятор) АЛУ может быть задействовано для чего-нибудь ещё...
Не нравятся мне эти дырки между операциями ALU и копированием аккумулятора куда-то. В-принципе, проц может распознать, что следом за командой, требующей ALU, идёт копирование из аккумулятора, и в результате проц может изменить поведение этой команды копирования, чтобы копировать НЕ аккумулятор, а результат работы ALU ! Причём результат ALU надо записать одновременно в 2 регистра - в регистра аккумулятора и в регистр куда аккумулятор скопировали - по идее должно срастись...
Для этого должна быть возможность при копировании регистров выдавать на их вход не только выходы регистра T (временный регистр, используемый при копировании регистров), но и выход АЛУ (который в обычном случае идёт только на вход аккумулятора, причём минуя всё это кольцо через T). Другой вопрос, что если после операции АЛУ идёт не копирование в регистр, а другая операция АЛУ, использующая аккумулятор в качестве аргумента? Например два сдвига подряд - RRC A, RRC A или что-то типа этого. В этом случае при копировании аргументов для второй RRC должен браться не регистр A, а выход АЛУ...
Ещё могут быть ситуации, когда следующая за операцией с АЛУ команда будет копирование в регистр A, которая по идее должна затереть то, что посчитало АЛУ - это тоже должно быть поддержано...

P.S. Хотя этим случаем можно пренебречь и скажем если программист сразу после A=A+1 пишет A=0, то он как говорится "сам дурак" (в этом случае A=0 будет проигнорировано т.к. в тоже самое время АЛУ запишет значение в A из второй ступени конвейера)

P.P.S. Однако последовательности NAN B и затем A=~A таки будут (эта пара команд реализует AND B) - можно скажем только такой особый случай поддержать (при этом инверсию можно делать прямо на выходе АЛУ, т.е. команда A=~A по обычному пути через временный регистр T в этом случае выполняться небудет, а будет являтся как бы суффиксом, говорящим второй ступени конвейера, что вывод АЛУ перед записью в регистр A надо инвертировать)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор nedoRISC-0 (NEDONAND)

Post by Shaos »

Потихоьнку горожу в Logisim обёртку вокруг 4-битного АЛУ, подсоединяющую его к 8-битной системе, и что-то кол-во микросхем в этой обёртке уже перевалило за половину количества, составляющего само АЛУ - так что наверное будет проще второй такой-же 4-битный АЛУ подцепить параллельно и не мучиться...

P.S. Хотя микросхем всё равно меньше с одним АЛУ - в АЛУ их 30, а в схеме обёртки порядка 20, т.е. это 30+20=50 (одно АЛУ плюс обёртка) против 30+30=60 (два АЛУ в параллель)...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор nedoRISC-0 (NEDONAND)

Post by Shaos »

Вроде прикрутил 4-битное АЛУ: http://nedopc.org/nedopc/files/logisim-nedonand.zip



Пока не все случаи проверял - может чего и не работает...

P.S. Для флагов изобрёл схему "Select-Delay" - это чтобы каждый флаг мог записываться из двух разных источников двумя различными стробами (т.е. если пришёл строб C1, то на далее стоящем "прозрачном" D-триггере должен записаться D1, а если пришёл C2 - то D2):

Image

Снизу нанды подключены как ИЛИ, а сверху - как мультиплексор 2:1 плюс небольшая задержка, чтобы спад строба поймал данные, которые по этому же спаду исчезнут...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор nedoRISC-0 (NEDONAND)

Post by Shaos »

Logisim позволяет подгружать в ПЗУ прошивку в виде вот таких вот файлов:

Code: Select all

v2.0 raw
40 89 a9 38 a1 99 79 91
76 76 88 b9
Это программка "HELLO" - кто хочет, может "дизассемблировать" ;)

P.S. Вычитал в помощи к логисиму, что в таких файлах можно писать комменты после #
Это значит я уже могу писать программки для НЕДОНАНДА за пределами логисима :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор nedoRISC-0 (NEDONAND)

Post by Shaos »

Перезалил симуляцию т.к. в предыдущей версии регистр A у меня не записывался по результатам работы АЛУ...

P.S. Наткнулся на интересную фичу - если сразу после команды АЛУ поставить команду копирования регистра флагов F, то оно скопирует неготовые флаги т.к. вторая ступень ещё не успела отработать до конца, например сразу после XOR 0 оно скопирует из F значение 0x08 (полуперенос H=1), а не 0x18 (H=1 и C=1), а вот в следующем такте уже будет скопировано 0x18 ;)

P.P.S. Получается, что команда XOR 0 (алиас SEC) не только флаг C устанавливает, но и флаг H, что логично...

P.P.P.S. Команда NAN 0 может иметь алиас A=-1 т.к. это именно то, что она делает ;)
Плюс она устанавливает флаги S, C, H и сбрасывает флаги Z и V...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор nedoRISC-0 (NEDONAND)

Post by Shaos »

Вроде обработал все пограничные случаи как копирование из аккумулятора следом за командой АЛУ (в этом случае копирование из АЛУ идёт одновременно и в аккумулятор, и в регистр назначения) и следом друг за другом идущие команды АЛУ, которые в качестве аргумента должны брать не предыдущее значение аккумулятора, а выход предыдущей команды АЛУ. Инверсию в случае NAN R и A=~A тоже поддержал...

P.S. Пришлось для АЛУ не просто сохранять значения аккумулятора и второго аргумента в специальных регистрах, а сохранять их в двойных master-slave регистрах A' с A'' и R' с R'', чтобы небыло зацикливания и самовозбуждения в некоторых хитрых случаях...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор nedoRISC-0 (NEDONAND)

Post by Shaos »

Прикрутил поддержку NOP с кодом 0x88 (бывшая A=0 где 0 это регистр): http://nedopc.org/nedopc/files/logisim-nedonand.zip



Теперь работают все команды кроме RST n, RET, SAEFF и SANFF :roll:

P.S. Точнее вместо SAEFF и SANFF выполняются изначально запланированные G=F и G=~G (по сути бесполезные)

P.P.S. На самом деле этого более чем достаточно, чтобы начать кодить - пусть это будет NEDONAND lite :mrgreen:

P.P.P.S. Насчитал в этом дизайне 333 микросхемы 74F00 на платках NEDONAND и ещё 51 микросхема 74F00 надо поставить на макетку, для того чтобы все эти платки соединить, т.е. всего 384 микросхемы (или 1536 NAND-гейтов), которые должны жрать порядка 5 ампер...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор nedoRISC-0 (NEDONAND)

Post by Shaos »

Вот думаю а не отдать ли пока незадействованный строб на RET/RST (сверху провод TODO) под реализацию режима HALT? Будет удобно для тестового прогона спецпрошивки - когда оно пишет очередные результаты на 7-сегментных индикаторах и вводит себя в ступор, а оператор, после сверки результатов, жмёт кнопочку и программа бежит дальше...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор nedoRISC-0 (NEDONAND)

Post by Shaos »

Shaos wrote:Вот думаю а не отдать ли пока незадействованный строб на RET/RST (сверху провод TODO) под реализацию режима HALT? Будет удобно для тестового прогона спецпрошивки - когда оно пишет очередные результаты на 7-сегментных индикаторах и вводит себя в ступор, а оператор, после сверки результатов, жмёт кнопочку и программа бежит дальше...
Задействовал :)

http://nedopc.org/nedopc/files/logisim-nedonand.zip

Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор nedoRISC-0

Post by Shaos »

Shaos wrote:Видимо "slow ALU" небудет (во всяком случае пока), т.е. "fast ALU" уже достаточно медленный, чтобы вместить в себя операции сложения и вычитания:

Code: Select all

            _________________
/RST ______|
     ______   _   _   _   _
CLK        |_| |_| |_| |_| |_  6.666 MHz
     ______     ___     ___
CLK1       |___|   |___|   |_  3.333 MHz
     ______         _______
CLK2       |_______|       |_  1.666 MHz


1st stage:
     __________             _
/OE            |___________|   450 ns
           .        ___    .
REGRD _____________|   |_____  150 ns
           .       .    ___
REGWR _________________|   |_  150 ns

           | 300ns | 300ns |
           ^           ^
           |   450ns   |
           |           \data ready
           |
           \address ready

2nd stage:
            _______        .
HALF1 _____|       |_________  300 ns
           .    ___        .
ASTO1 _________|   |_________  150 ns
           .        _______
HALF2 _____________|       |_  300 ns
           .       .    ___
ASTO2 _________________|   |_  150 ns

           | 300ns | 300ns |
Стробы второй ступени:

HALF1 - это подача на вход АЛУ младшего ниббла аргументов (в случае RRC - старшего);
ASTO1 - сохранение младшего ниббла аккумулятора (в случае RRC - старшего) и флага H;
HALS2 - это подача на вход АЛУ старшего ниббла аргументов (в случае RRC - младшего);
ASTO2 - сохранение старшего ниббла аккумулятора (в случае RRC - младшего) и флагов C,V,Z и S....
Не нашёл осцилляторов на 6.666 МГц - купил для экспериментов 5, 6, и 6.144 МГц. А среди кристаллов ещё попались 6.5 МГц и даже 6.5536 МГц - тоже купил по несколько штучек...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор nedoRISC-0 (NEDONAND)

Post by Shaos »

Взял табличку с википедии т.к. там использовано такое же как и у меня распределение сегментов на биты (https://en.wikipedia.org/wiki/Seven-segment_display) и пририсовал к табличке шестнадцатиричные коды, чтобы быстро можно было код "символа" вычислить, а также подсветил цифры и символы, похожие на буквы:

Image
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор nedoRISC-0 (NEDONAND)

Post by Shaos »

Мысль - а что если предполагаемый доступ к памяти (когда F=~F подменяется на A=[DE] и F=G на [DE]=A) сделать через префиксы - скажем MEMRD (вместо F=~F) и MEMWR (вместо F=G), которые меняют источник или приёмник в следующей следом команде (подобным образом вроде бы работает HPC46003)? т.е. например если перед A=B стоит MEMRD, то A=B будет исполнена как A=[DE], а скажем A=~A как A=~[DE], и тоже самое для MEMWR - если оно стоит перед A=B, то оно превращается в [DE]=B. Плюс в том, что когда прочиталась инструкция префикса, система уже знает, что в течение 2 циклов будет обращение к памяти и уже можно выдавать /CS и 16-битный адрес из DE на внешнюю память в первом же из этих циклов. Инструкции по работе с АЛУ также могут быть изменяемыми подобным образом (как минимум те, где используется второй регистр в качестве аргумента, а не только A). Потерянную информацию о регистре (регистре-источнике в случае MEMRD и регистре-приёмнике в случе MEMWR) из преобразованной следом идущей команды можно заюзать как дополнительные 3 бита адресации, что расширит непосредственно адресуемое адресное пространство с 64Кб до 512Кб...

P.S. MEMWR пожалуй к АЛУ по прямому назначению неприменим т.е. результат работы АЛУ непосредственно во внешнюю память в следующем цикле записать будет невозможно т.к. оно будет готово только через один цикл - скорее всего оно будет работать как сохранение второго аргумента по адресу DE - это также может иногда пригодиться...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор nedoRISC-0 (NEDONAND)

Post by Shaos »

Shaos wrote:
Lavr wrote:А если на ждущей развертке с запуском от исходного сигнала?
Исходный - на первый луч, после задержки - на второй, аккурат задержку и должны увидеть...
Ну опять же - надо подкручивать разрешение по времени, чтобы была видна задержка - а она менее 200 нс судя по всему (тестю пиком щас и пока на следующем шаге пика АЛУ уже всё посчитал, а это 200 нс в верхнем пределе), что значит надо гнать сигнал раза в два более быстрый чем 5 МГц, т.е. 10, а в 10 луч будет слабенький...

P.S. Ха, поподавал входные воздействия не подряд, а в разнобой (то 0x00, то 0xFF) и обнаружил, что в некоторых случаях 200 нс недостаточно чтобы АЛУ отработал и зафиксировал значения на выходах, но вот 400 нс похоже достаточно всегда! Выходит, что моя первоначальная оценка "на всём АЛУ - 4*31.5+4*3.5=140 нс (в худшем случае 180+20=200)" оказалась излишне оптимистичной и реальность несколько хуже худшего случая, но мне сейчас важно, чтобы оно не было хуже 300 нс, но проверить я это смогу только с помощью цифрового осциллоскопа...
Померял осциллоскопом сложение 1111 и 0000 с наличием и отсутствием флага C - вроде не так страшно выходит:
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор nedoRISC-0 (NEDONAND)

Post by Shaos »

Может быть виновато странное недотягивание до уровня 5В?...
Я тут за главного - если что шлите мыло на me собака shaos точка net