nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 21 Oct 2017 08:11



Reply to topic  [ 191 posts ]  Go to page Previous  1 ... 8, 9, 10, 11, 12, 13  Next
Самодельный процессор nedoRISC-0 (NEDONAND) 
Author Message
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15560
Location: Colorado
Reply with quote
Обновил архивчик: http://nedopc.io/nedopc/files/logisim-nedonand.zip



Потихоньку прикручиваю АЛУ (это маленький прямоугольничек у правого края схемы)

_________________
:eugeek: https://twitter.com/Shaos1973


18 Mar 2016 04:06
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15560
Location: Colorado
Reply with quote
Shaos wrote:
Shaos wrote:
Shaos wrote:
Вот пример инкремента регистровой пары DE:
Code:
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 надо инвертировать)

_________________
:eugeek: https://twitter.com/Shaos1973


18 Mar 2016 09:59
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15560
Location: Colorado
Reply with quote
Потихоьнку горожу в Logisim обёртку вокруг 4-битного АЛУ, подсоединяющую его к 8-битной системе, и что-то кол-во микросхем в этой обёртке уже перевалило за половину количества, составляющего само АЛУ - так что наверное будет проще второй такой-же 4-битный АЛУ подцепить параллельно и не мучиться...

P.S. Хотя микросхем всё равно меньше с одним АЛУ - в АЛУ их 30, а в схеме обёртки порядка 20, т.е. это 30+20=50 (одно АЛУ плюс обёртка) против 30+30=60 (два АЛУ в параллель)...

_________________
:eugeek: https://twitter.com/Shaos1973


19 Mar 2016 13:26
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15560
Location: Colorado
Reply with quote
Вроде прикрутил 4-битное АЛУ: http://nedopc.io/nedopc/files/logisim-nedonand.zip



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

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

Image

Снизу нанды подключены как ИЛИ, а сверху - как мультиплексор 2:1 плюс небольшая задержка, чтобы спад строба поймал данные, которые по этому же спаду исчезнут...

_________________
:eugeek: https://twitter.com/Shaos1973


19 Mar 2016 18:48
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15560
Location: Colorado
Reply with quote
Logisim позволяет подгружать в ПЗУ прошивку в виде вот таких вот файлов:
Code:
v2.0 raw
40 89 a9 38 a1 99 79 91
76 76 88 b9

Это программка "HELLO" - кто хочет, может "дизассемблировать" ;)

P.S. Вычитал в помощи к логисиму, что в таких файлах можно писать комменты после #
Это значит я уже могу писать программки для НЕДОНАНДА за пределами логисима :)

_________________
:eugeek: https://twitter.com/Shaos1973


19 Mar 2016 19:02
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15560
Location: Colorado
Reply with quote
Перезалил симуляцию т.к. в предыдущей версии регистр 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...

_________________
:eugeek: https://twitter.com/Shaos1973


19 Mar 2016 22:01
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15560
Location: Colorado
Reply with quote
Вроде обработал все пограничные случаи как копирование из аккумулятора следом за командой АЛУ (в этом случае копирование из АЛУ идёт одновременно и в аккумулятор, и в регистр назначения) и следом друг за другом идущие команды АЛУ, которые в качестве аргумента должны брать не предыдущее значение аккумулятора, а выход предыдущей команды АЛУ. Инверсию в случае NAN R и A=~A тоже поддержал...

P.S. Пришлось для АЛУ не просто сохранять значения аккумулятора и второго аргумента в специальных регистрах, а сохранять их в двойных master-slave регистрах A' с A'' и R' с R'', чтобы небыло зацикливания и самовозбуждения в некоторых хитрых случаях...

_________________
:eugeek: https://twitter.com/Shaos1973


19 Mar 2016 22:56
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15560
Location: Colorado
Reply with quote
Прикрутил поддержку NOP с кодом 0x88 (бывшая A=0 где 0 это регистр): http://nedopc.io/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 ампер...

_________________
:eugeek: https://twitter.com/Shaos1973


20 Mar 2016 02:56
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15560
Location: Colorado
Reply with quote
Вот думаю а не отдать ли пока незадействованный строб на RET/RST (сверху провод TODO) под реализацию режима HALT? Будет удобно для тестового прогона спецпрошивки - когда оно пишет очередные результаты на 7-сегментных индикаторах и вводит себя в ступор, а оператор, после сверки результатов, жмёт кнопочку и программа бежит дальше...

_________________
:eugeek: https://twitter.com/Shaos1973


20 Mar 2016 14:11
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15560
Location: Colorado
Reply with quote
Shaos wrote:
Вот думаю а не отдать ли пока незадействованный строб на RET/RST (сверху провод TODO) под реализацию режима HALT? Будет удобно для тестового прогона спецпрошивки - когда оно пишет очередные результаты на 7-сегментных индикаторах и вводит себя в ступор, а оператор, после сверки результатов, жмёт кнопочку и программа бежит дальше...

Задействовал :)

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


_________________
:eugeek: https://twitter.com/Shaos1973


26 Mar 2016 20:37
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15560
Location: Colorado
Reply with quote
Shaos wrote:
Видимо "slow ALU" небудет (во всяком случае пока), т.е. "fast ALU" уже достаточно медленный, чтобы вместить в себя операции сложения и вычитания:

Code:
            _________________
/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 МГц - тоже купил по несколько штучек...

_________________
:eugeek: https://twitter.com/Shaos1973


27 Mar 2016 06:09
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15560
Location: Colorado
Reply with quote
Взял табличку с википедии т.к. там использовано такое же как и у меня распределение сегментов на биты (https://en.wikipedia.org/wiki/Seven-segment_display) и пририсовал к табличке шестнадцатиричные коды, чтобы быстро можно было код "символа" вычислить, а также подсветил цифры и символы, похожие на буквы:

Image

_________________
:eugeek: https://twitter.com/Shaos1973


27 Mar 2016 08:39
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15560
Location: Colorado
Reply with quote
Мысль - а что если предполагаемый доступ к памяти (когда 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 - это также может иногда пригодиться...

_________________
:eugeek: https://twitter.com/Shaos1973


27 Mar 2016 16:35
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15560
Location: Colorado
Reply with quote
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 - вроде не так страшно выходит:


Attachments:
AnalogDiscovery2-1MHz-ALU4.png
AnalogDiscovery2-1MHz-ALU4.png [ 29.31 KiB | Viewed 862 times ]

_________________
:eugeek: https://twitter.com/Shaos1973
31 Mar 2016 22:26
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15560
Location: Colorado
Reply with quote
Может быть виновато странное недотягивание до уровня 5В?...

_________________
:eugeek: https://twitter.com/Shaos1973


31 Mar 2016 22:27
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 191 posts ]  Go to page Previous  1 ... 8, 9, 10, 11, 12, 13  Next

Who is online

Users browsing this forum: No registered users and 1 guest


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.