nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 17:01



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

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Девятая плата NEDONAND-9, которая есть 9-входовый гейт И - в nedonand.circ он называется and9:



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



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



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

Image

Распиновка:
Code:
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

_________________
:dj: https://mastodon.social/@Shaos


27 Feb 2016 22:56
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Интерес на хакадее постепенно спадает:


Attachments:
hackaday160227.png
hackaday160227.png [ 487.95 KiB | Viewed 7255 times ]

_________________
:dj: https://mastodon.social/@Shaos
28 Feb 2016 05:44
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
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-ный ассемблер и эмулятор (онлайн?)...

_________________
:dj: https://mastodon.social/@Shaos


28 Feb 2016 08:12
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
2) построить на бредбордовых макетках (т.к. оно скорее всего будет меняться в будущем)

Даже я проникся, что это удобно и купил себе уже три, хотя после первой за 750 р они у нас последовательно стали 950 р и 1150 р.
Но - реально удобно...

_________________
iLavr


28 Feb 2016 08:27
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Lavr wrote:
2) построить на бредбордовых макетках (т.к. оно скорее всего будет меняться в будущем)

Даже я проникся, что это удобно и купил себе уже три, хотя после первой за 750 р они у нас последовательно стали 950 р и 1150 р.
Но - реально удобно...


с бредбордами всё хорошо, пока собираемое достаточно простое - с некоторого момента начинается такая путаница в проводах, что обратно восстановить схему по пучкам практически невозможно...

_________________
:dj: https://mastodon.social/@Shaos


28 Feb 2016 08:45
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
с некоторого момента начинается такая путаница в проводах, что обратно восстановить схему по пучкам практически невозможно...

Ну так рисуй, чего собираешь на бредборде. По накруткам и по резаной-паяной плате восстановить схему ничуть не легче, на мой взгляд...

_________________
iLavr


28 Feb 2016 08:54
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Lavr wrote:
Shaos wrote:
с некоторого момента начинается такая путаница в проводах, что обратно восстановить схему по пучкам практически невозможно...

Ну так рисуй, чего собираешь на бредборде. По накруткам и по резаной-паяной плате восстановить схему ничуть не легче, на мой взгляд...


Ну тут играет роль тот момент, что поправить (или испортить) очень просто - переткнул провод и всё, а таже накрутка подразумевает предварительную работу с рисованием схемы, отмечанием галочкой проводков которые уже кинул и т.д. Хотя наверное да - намудрить можно с любым способом...

_________________
:dj: https://mastodon.social/@Shaos


28 Feb 2016 09:06
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
предварительную работу с рисованием схемы, отмечанием галочкой проводков которые уже кинул и т.д. Хотя наверное да - намудрить можно с любым способом...

Ну да... особенно, если кидаешь шину. Тут только отмечать проводки на рисунке.
И всё-равно бывает, можно сбиться, сдвинуться на один, что замечаешь в конце, и это особо обидно... :ewink:

_________________
iLavr


28 Feb 2016 10:41
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Shaos wrote:
Вот нагородил 4-битное АЛУ, построенное из четырёх "слайсов" (см. выше)

Может особо не мудрствовать и подцепить 2 такие платки параллельно, сделав 8-битный АЛУ? Тут даже в младшую половинку как минимум одну микросхемку можно не впаивать (IC4, которая флаг V формирует т.к. нас интересует V только из старшей половинки), т.е. 8-битное АЛУ займёт не 2*29=58 корпусов, а 57 и самая длительная задержка, вызванная последовательным распостранением переноса через 8 двоичных разрядов, не должна быть дольше 400 нс, а это вполне соотносится со скоростью вычитки из РФ2. Вообще, наверное всё равно можно прикинуть схемку обвязки 4-битного АЛУ, чтоб он обрабатывал 8-битные данные, и если окажется, что она тяжелее 28 микросхем, то наверное так и сделаю - поставлю два 4-битных АЛУ параллельно...

_________________
:dj: https://mastodon.social/@Shaos


28 Feb 2016 13:36
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Shaos wrote:
Примерно так будет:
Code:
            _________________
/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:
            _________________
/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 и перезаказать...

_________________
:dj: https://mastodon.social/@Shaos


29 Feb 2016 21:49
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
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...

_________________
:dj: https://mastodon.social/@Shaos


01 Mar 2016 00:26
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
По-быстрому переделал NEDONAND-4 (см. eagle-nedonand.zip):



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



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

Image

Распиновка:
Code:
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

_________________
:dj: https://mastodon.social/@Shaos


01 Mar 2016 01:58
Profile WWW
Admin
User avatar

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

P.S. По идее второй и третий процы могут быть проще - не иметь RET/RST и SAEFF/SANFF и скажем ограничиваться 256 байт памяти программ - т.е. получаются некие микрокодовые сопроцессоры для несложных задач (типа того же копирования српайтов в видеопамять или вычисления умножений/делений)...

_________________
:dj: https://mastodon.social/@Shaos


01 Mar 2016 18:23
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Но многокоровность наверное надо отложить на потом, а так получилось бы весело - первая кора получает АЛУ всегда, вторая - только когда АЛУ не занят первой, а третья - только когда АЛУ не занят ни первой, ни второй корами - т.е. третья кора будет пропускать больше циклов и работать меньше всех, именно поэтому туда надо выносить какие-то второстепенные циклические задачи как-то заполнение видеопамяти, отрисовка спрайтов, вычисление умножений и делений и т.д.

_________________
:dj: https://mastodon.social/@Shaos


02 Mar 2016 05:47
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
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:
 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)

_________________
:dj: https://mastodon.social/@Shaos


02 Mar 2016 15:01
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 193 posts ]  Go to page Previous  1 ... 5, 6, 7, 8, 9, 10, 11 ... 13  Next

Who is online

Users browsing this forum: No registered users and 24 guests


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.