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

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

Moderator: Shaos

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

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

Post by Shaos »

Девятая плата NEDONAND-9, которая есть 9-входовый гейт И - в nedonand.circ он называется and9:



Сейчас это самая маленькая плата NEDONAND, состоящая всего из 4 микросхем 74F00:



Авторазведёнка:



Уже заказана на OSHPark:

Image

Распиновка:

Code: Select all

1) GND - ground
2) A - 1st input
3) B - 2nd input
4) C - 3rd input
5) D - 4th input
6) E - 5th input
7) F - 6th input
8) G - 7th input
9) H - 8th input
10)I - 9th input
11)AND - output of AND gate
12)VCC - power +5V
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Интерес на хакадее постепенно спадает:
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Shaos wrote:Далее по планам разработки плат на ближайшие дни:
- восьмибитный регистр-защёлка для построения регистров с прямыми и инверсными выходами NEDONAND-5 (2+1+8+16=27 ног);
- восемь мультиплексоров 2:1 с общим управлением NEDONAND-6 (2+1+16+8=27 ног);
- демультиплексор 1:8 распостраняющий единичку NEDONAND-7 (2+3+1+8=14 ног);
- мультиплексор 8:1 под названием NEDONAND-8 (2+3+8+1=14 ног);
- девятивходовый логический элемент AND под названием NEDONAND-9 (2+9+1=12 ног).

Планирую для начала построить версию которая щас есть в логисиме - только первая ступень конвейера (и только 16 байт ПЗУ).
Далее будет 128-байтовая версия (тоже память на диодах), и только потом полноценная версия с 2К на РФ2...
Ну что - все запланированные платки разведены и заказаны. Теперь надо решить как строить первую ступень конвейера дальше:
1) развести мамку в gEDA и заказать настоящую печатку (если что не так - резать проводники)?
2) построить на бредбордовых макетках (т.к. оно скорее всего будет меняться в будущем)?
3) собрать мамку накруткой (wire-wrap)?

Пошаговый план до конца 2016 года пока такой:
- сначала первая ступень конвейера c 16-байтовым ПЗУ на диодах и 7-сегментные индикаторы подцепленные к регистрам A,B,C,D,E (как в симуляции Logisim);
- далее добавить память до 128 байт (тоже на диодах) и RET/RST+SAEFF/SANFF;
- потом приделать вторую ступень конвейера с ALU (сначала в Logisim, потом вживую) и немного ОЗУ (подменив F=~F и F=G);
- подключить РФ2 с 2К ПЗУ команд и ОЗУ до 64Кб на основе которого можно будет приделать вывод на TV или VGA.

Параллельно можно потихоньку писать GPL-ный ассемблер и эмулятор (онлайн?)...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

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

Post by Lavr »

2) построить на бредбордовых макетках (т.к. оно скорее всего будет меняться в будущем)

Даже я проникся, что это удобно и купил себе уже три, хотя после первой за 750 р они у нас последовательно стали 950 р и 1150 р.
Но - реально удобно...
iLavr
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Lavr wrote:2) построить на бредбордовых макетках (т.к. оно скорее всего будет меняться в будущем)

Даже я проникся, что это удобно и купил себе уже три, хотя после первой за 750 р они у нас последовательно стали 950 р и 1150 р.
Но - реально удобно...
с бредбордами всё хорошо, пока собираемое достаточно простое - с некоторого момента начинается такая путаница в проводах, что обратно восстановить схему по пучкам практически невозможно...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

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

Post by Lavr »

Shaos wrote:с некоторого момента начинается такая путаница в проводах, что обратно восстановить схему по пучкам практически невозможно...
Ну так рисуй, чего собираешь на бредборде. По накруткам и по резаной-паяной плате восстановить схему ничуть не легче, на мой взгляд...
iLavr
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Lavr wrote:
Shaos wrote:с некоторого момента начинается такая путаница в проводах, что обратно восстановить схему по пучкам практически невозможно...
Ну так рисуй, чего собираешь на бредборде. По накруткам и по резаной-паяной плате восстановить схему ничуть не легче, на мой взгляд...
Ну тут играет роль тот момент, что поправить (или испортить) очень просто - переткнул провод и всё, а таже накрутка подразумевает предварительную работу с рисованием схемы, отмечанием галочкой проводков которые уже кинул и т.д. Хотя наверное да - намудрить можно с любым способом...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

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

Post by Lavr »

Shaos wrote:предварительную работу с рисованием схемы, отмечанием галочкой проводков которые уже кинул и т.д. Хотя наверное да - намудрить можно с любым способом...
Ну да... особенно, если кидаешь шину. Тут только отмечать проводки на рисунке.
И всё-равно бывает, можно сбиться, сдвинуться на один, что замечаешь в конце, и это особо обидно... :ewink:
iLavr
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Shaos wrote:Вот нагородил 4-битное АЛУ, построенное из четырёх "слайсов" (см. выше)
Может особо не мудрствовать и подцепить 2 такие платки параллельно, сделав 8-битный АЛУ? Тут даже в младшую половинку как минимум одну микросхемку можно не впаивать (IC4, которая флаг V формирует т.к. нас интересует V только из старшей половинки), т.е. 8-битное АЛУ займёт не 2*29=58 корпусов, а 57 и самая длительная задержка, вызванная последовательным распостранением переноса через 8 двоичных разрядов, не должна быть дольше 400 нс, а это вполне соотносится со скоростью вычитки из РФ2. Вообще, наверное всё равно можно прикинуть схемку обвязки 4-битного АЛУ, чтоб он обрабатывал 8-битные данные, и если окажется, что она тяжелее 28 микросхем, то наверное так и сделаю - поставлю два 4-битных АЛУ параллельно...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Shaos wrote:Примерно так будет:

Code: Select all

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

           .       .       .
     __________             _
/OE            |___________|   450 ns
           .        ___    .
REGRD _____________|   |_____  150 ns
           .       .    ___ 
REGWR _________________|   |_  150 ns
           | 300ns | 300ns |
           ^           ^
           |   450ns   |
           |           \data ready
           \address ready

1st stage:

    /OE
00 - 1 updated PC at this point (/CE=0 all the time)
01 - 0
10 - 0 strobe execute simple instruction (A=n, R=~R, R1=R2, RST n) 
11 - 0 strobe result store (higher priority for accumulator) and PC increment (if enabled)

2nd stage - fast ALU function execution (RRC,RLC,NAN,XOR):

     DMUX
00 - 1 connect 1st nibble
10 - 1 strobe accumulator store (1st nibble) / flags
10 - 2 connect 2nd nibble
11 - 2 strobe accumulator store (2nd nibble) / flags

2nd stage - slow ALU function execution (ADC,SBC,ADI,SBI):

00 - 1 connect 1st nibble
01 - 1
10 - 1
11 - 1 strobe accumulator store (low nibble) / flags

00 - 2 connect 2nd nibble
01 - 2
10 - 2
11 - 2 strobe accumulator store (high nibble) / flags
Видимо "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.

По результатам своей работы первая ступень должна сохранить для второй:
- 1 бит признака использования АЛУ (в случае регистровых операций вторая ступень должна простаивать);
- 3 бита кода операции АЛУ;
- 8 бит (прямых или инверсных) второго аргумента (регистр или часть инструкции).

Половинки регистра A всегда будут читаться или писаться как есть - т.е. если следом за A=A+1 идет скажем инструкция G=A, то в результате G получит не A+1, а старшие 4 бита из старого значения A и младшие 4 бита из нового (т.е. неправильное значение в случае переноса из младшего ниббла в старший)...

P.S. Блин, в случае операций сдвига (RRC/RLC) "второй аргумент" это "первый аргумент" т.е. первым аргументом не всегда является аккумулятор как я предполагал - придётся резать плату NEDONAND-4 либо переставлять аргументы логикой, зависящей от кода операции...

P.P.S. Решил в результате переделать плату NEDONAND-4 и перезаказать...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Shaos wrote:Вот нагородил 4-битное АЛУ, построенное из четырёх "слайсов" (см. выше) - тут тоже любая арифметическая операция 1xx осуществляет простое сложение 4-битных входных величин A и B (обнуление флага С для ADI/SBI уже есть, а вот инверсию B для SBC надо будет делаться этажом выше) - всего получилось 4*6+6=30 корпусов 7400:



Всё проверил - работает! Всё - это RRC,RLC,NAN,XOR и A+B+C. Кстати тут мне удалось вывести C'=1 в случае логических операций NAN и XOR (в первом варианте C' выводился как при сложении даже для логических операций, т.е. его значение зависело от аргументов)

P.S. В-принципе, можно уже нарисовать и заказать платки "слайсов", которые по приходу можно собрать и воткнуть в бредборду, на которой собрать это 4-битное АЛУ и погонять на разных скоростях, наблюдая за результатом по осциллографу, чтобы оценить пиковое быстродействие...

P.P.S. На самом деле оценить можно прямо сейчас, прикинув задержки в схеме - т.к. один 74F00 гейт в среднем имеет задержку порядка 3.5 нс (5 в худшем случае), то задержка в одном слайсе будет до 9*3.5=31.5 нс (45 в худшем случае), а на всём АЛУ - 4*31.5+4*3.5=140 нс (в худшем случае 180+20=200) или 1/(2*140e-9)=3.5 МГц (в худшем случае 2.5 МГц)!

P.P.P.S. Чуть позже добавил вычисление флага переполнения V', который используется если аргументы сложения и вычитания были со знаком, а в случае неарифметических операций там будет мусор...

P.P.P.P.S. 23 февраля 2016 года добавил пару NAND-гейтов, чтоб выдавать V'=1 только в случае сложений-вычитаний (когда O2=1) и теперь количество корпусов стало ровным - можно разводить платку ;)

P.P.P.P.P.S. 1 марта 2016 года поправил взятие аргумента для сдвигов RRC/RLC (надо было B вместо A), добавил обнуление флага C в случае операций A=A+n и A=A-n, а также сделал вывод наружу сигнала /ZERO, который сигнализирует нулём, что выполняемая операция это RRC, для которой порядок исполнения нибблов должен быть обратный (сначала старший ниббл, потом младший)...
Поправил, слегка расширив функционал - теперь надо переделать и перезаказать платку NEDONAND-4...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

По-быстрому переделал NEDONAND-4 (см. eagle-nedonand.zip):



Развёл автороутером (всё кроме цепей питания, которые нарисовал вручную):



И перезаказал:

Image

Распиновка:

Code: Select all

1.1) GND - ground
1.2) D0 - output data bit 0
1.3) D1 - output data bit 1
1.4) D2 - output data bit 2
1.5) D3 - output data bit 3
1.6) COUT - output of carry/borrow
1.7) VOUT - output of overflow
1.8) /O0 - inverted O0 (just in case)
1.9) /O1 - inverted O1 (just in case)
1.10) /O2 - inverted O2 (just in case)
1.11) /ZERO - "0" if operation is 000
1.12) VCC - power +5V

2.1) O0 - operation input bit 0
2.2) O1 - operation input bit 1
2.3) O2 - operation input bit 2
2.4) C - carry/borrow input
2.5) A0 - first argument bit 0
2.6) A1 - first argument bit 1
2.7) A2 - first argument bit 2
2.8) A3 - first argument bit 3
2.9) B0 - second argument bit 0
2.10) B1 - second argument bit 1
2.11) B2 - second argument bit 2
2.12) B3 - second argument bit 3
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Вот пример инкремента регистровой пары 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-ы могут быть заменены на другие более полезные команды, не задевающие аккумулятор) АЛУ может быть задействовано для чего-нибудь ещё. Чуть раньше я думал, что пока АЛУ простаивает, то можно аппаратно организовать копирование спрайтов в видеопамяти через АЛУ, делая XOR. Потом я предположил, что было бы неплохо делать какие-то многотактовые вычисления паралелльно с основной программой - например умножение. А сегодня мне в голову пришла мысль, что одно и то же АЛУ могут разделять 2, а то и 3 процессора! Эдакий недо-гипер-трединг получается :) Процы будут иметь разные ПЗУ команд, разные наборы регистров, разные первые ступени конвейера, но общую вторую ступень с АЛУ и общее ОЗУ данных - в этой конфигурации можно делать всякие интересные штуки типа того же копирования спрайтов через XOR или умножения! Ну или просто паралелльные процессы программировать, общающиеся через мьютексы и очереди передачи сообщений...

P.S. По идее второй и третий процы могут быть проще - не иметь RET/RST и SAEFF/SANFF и скажем ограничиваться 256 байт памяти программ - т.е. получаются некие микрокодовые сопроцессоры для несложных задач (типа того же копирования српайтов в видеопамять или вычисления умножений/делений)...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

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

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

Post by Shaos »

Shaos wrote:
Shaos wrote:Вот нагородил 4-битное АЛУ, построенное из четырёх "слайсов" (см. выше)...
....
P.P.P.P.P.S. 1 марта 2016 года поправил взятие аргумента для сдвигов RRC/RLC (надо было B вместо A), добавил обнуление флага C в случае операций A=A+n и A=A-n, а также сделал вывод наружу сигнала /ZERO, который сигнализирует нулём, что выполняемая операция это RRC, для которой порядок исполнения нибблов должен быть обратный (сначала старший ниббл, потом младший)...
Поправил, слегка расширив функционал - теперь надо переделать и перезаказать платку NEDONAND-4...
Тем не менее со дня на день должны прийти три "неправильные" платки NEDONAND-4, заказанные мной ранее, на которых всё же можно потестить большинство функционала АЛУ (разве что придётся тестировать сдвиги через входы A, а не через B, ну и флаг C задавать для всех операций сложения 1xxx). Потестить можно например путём подсоединения к этой NEDONAND-4 (с воткнутыми в неё четырьмя NEDONAND-3) платы с пиком nedoCPU-16, используемой в качестве тестового прибора, задающего входные воздействия и анализирующего выходы на правильность и скорость срабатывания (придётся немножко плату подковырять, подрезав несколько дорожек и бросив несколько проводков):

Code: Select all

 NN4 (bad one) -> nedoCPU-16  
-----------------------------
 1) GND 
 2) D0 ~~~  
 3) D1 ~~~  
 4) D2 ~~~  
 5) D3 ~~~  
 6) COUT-> RA0 (flag C output)
 7) VOUT-> RA1 (flag V output)
 8) /O0    RA2 (wire to D0 output)
 9) /O1    RA3 (wire to D1 output)
10) /O2    RA4 (wire to D2 output)
11) NC*    RA5 (wire to D3 output)
12) VCC -> VCC
13) --- -> GND 
14)      
15) O0  -> RB0 (operation 0 input) 
16) O1  -> RB1 (operation 1 input)
17) O2  -> RB2 (operation 2 input)
18) C   -> RB3 (flag C input)
19) A0  -> RB4 (argument A bit 0 input)
20) A1  -> RB5 (argument A bit 1 input)
21) A2  -> RB6 (argument A bit 2 input)
22) A3  -> RB7 (argument A bit 3 input)
23) B0 ~~~  
24) B1  -> RC0 (argument B bit 1 input) 
25) B2  -> RC1 (argument B bit 2 input)
26) B3  -> RC2 (argument B bit 3 input)
27)        RC3 (wire to B0 input)
28)        RC4 (not connected)
29)        RC5 (not connected)
30)        RC6 (not connected - used for RS232)
           RC7 (not connected - used for RS232)
Я тут за главного - если что шлите мыло на me собака shaos точка net