nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 18 Apr 2024 00:05



Reply to topic  [ 193 posts ]  Go to page Previous  1, 2, 3, 4, 5 ... 13  Next
Самодельный процессор nedoRISC-0 (NEDONAND) 
Author Message
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
а C'=1 может оказаться полезной фичей, позволяющей достаточно просто установить флаг C в 1...

Ну, понятно, что проще... и я не настаиваю ни на чем, просто установка в 0 и была полезной фичей.

Псевдооператор CLC исполнялся как ORA A.

А как у тебя обстоит дело с полезными фичами типа STC и CMC ?

Помнится, мы их обсуждали и признали полезными...

_________________
iLavr


15 Jan 2016 09:02
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22530
Location: Silicon Valley
Reply with quote
Для начала следует сказать, что флаг C я планировал реализовать как в 6502 - при вычитании будет использоваться инвертированный бит переноса, поэтому:
STC (установить флаг C) = NAN 0 (после этого A станет равным 255) либо XOR 0 (после этого значение регистра A не изменится)
CLC (сбросить флаг C) = RLC 0 (после этого A станет 0 или 1 в зависимости от старого значения флага C), а вот если веруть обратно команду ADI 0, то оно делало бы тоже самое БЕЗ изменения содержимого регистра A
CMC (инвертировать флаг C) = попробовал ADC 0 и SBC 0 - НЕ получается по простому...

P.S. Разве что F=~F, но оно ВСЕ флаги проинвертирует (включая 3 бита, используемые при передаче управления)

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


15 Jan 2016 09:19
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Ну вощето даже в 6502 операции с флагами не портили немногочисленных его регистров... :wink:

И хороший трюк с флагами как раз позволил в 6502 пойти на упрощение АЛУ и юзать только ADC и SBC.



Черт побери! Напомнил... а давненько я ничего не программировал для этого милого 6502!
z80 совершенно отвлек...

_________________
iLavr


15 Jan 2016 09:34
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22530
Location: Silicon Valley
Reply with quote
Lavr wrote:
Ну вощето даже в 6502 операции с флагами не портили немногочисленных его регистров... :wink:

Я вроде нашёл способ без порчи регистров: STC = XOR 0, CLC = ADI 0, а вот c CMC незадача получилось - не выходит оно :osad:

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


15 Jan 2016 10:05
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
а вот c CMC незадача получилось - не выходит оно :osad:

Такой вот "каменный цветок" это CMC, Данила мастер! :lol:

Я для простоты совсем не хотел CMC делать, но пришлось - из-за математики с заемом.
Так что оно мне от математики в наследство как бы досталось...

_________________
iLavr


15 Jan 2016 11:23
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22530
Location: Silicon Valley
Reply with quote
Lavr wrote:
Shaos wrote:
а вот c CMC незадача получилось - не выходит оно :osad:

Такой вот "каменный цветок" это CMC, Данила мастер! :lol:

Я для простоты совсем не хотел CMC делать, но пришлось - из-за математики с заемом.
Так что оно мне от математики в наследство как бы досталось...


А пример приведи где оно было бы полезно - я сходу чего-то не могу припомнить...

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


15 Jan 2016 11:42
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22530
Location: Silicon Valley
Reply with quote
В своём АЛУ я и решил использовать "инверсный" подход как в 6502, чтобы не надо было ничего железячно инвертировать как в 8080:
8080: A=A-N-c=A+(~N)+1-c=A+(~N)+!c (есть инверсия в железе для флага C, но с точки зрения программиста выглядит прямо A-N-c)
6502: A=A-N-!c=A+(~N)+1-!c=A+(~N)+c (нет инверсии в железе для флага C, но с точки зрения программиста выглядит инверсно A-N-!c)

P.S. а CMC - это команда для программиста, которая вроде как и не нужна ему по большому счёту...

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


15 Jan 2016 13:33
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22530
Location: Silicon Valley
Reply with quote
Shaos wrote:
P.P.S. В-принципе, можно уже нарисовать и заказать платки "слайсов", которые по приходу можно собрать и воткнуть в бредборду, на которой собрать это 4-битное АЛУ и погонять на разных скоростях, наблюдая за результатом по осциллографу, чтобы оценить пиковое быстродействие...


По-быстрому нарисовал в бесплатной версии Eagle v5 платку ALU-slice (см. eagle-nedonand.zip):



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



И заказал на oshpark.com несколько штучек :)

Image

P.S. Распиновка:
1) GND
2) O0
3) O1
4) O2
5) A
6) B
7) C
8) H
9) L
10) COUT
11) DOUT
12) VCC

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


15 Jan 2016 17:39
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22530
Location: Silicon Valley
Reply with quote
Shaos wrote:
А пример приведи где оно было бы полезно - я сходу чего-то не могу припомнить...

Нагуглил пример кода, где есть несколько CMC:
http://www.autometer.de/unix4fun/z80pack/ftp/imsai/scs1.prn
Но тут явно без CMC можно было обойтись во ВСЕХ случаях...

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


15 Jan 2016 21:07
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22530
Location: Silicon Valley
Reply with quote
Shaos wrote:
Lavr wrote:
Shaos wrote:
тут мне удалось вывести C'=1 в случае логических операций NAN и XOR ;)

Хозяин, конечно, барин... но "в случае логических операций", мне что-то помнится, флаг переноса в 0 сбрасывают... нет?


C'=1 проще ;)
Без этих гейтов на выходе C' выдавал переполнение как при сложении, даже если операция была логическая, то есть оно было то 0, то 1 в зависимости от аргументов :)
А вообще мне надо бы ещё и "overflow" флаг V тут сделать (вумные люди пишут что это просто XOR переполнения из 6 бита и переполнения из 7 бита) - и флаг V тоже вроде как должен обнуляться при логических операциях...

P.S. С другой стороны на V при логических операциях можно наплювать (пусть будет мусор), а C'=1 может оказаться полезной фичей, позволяющей достаточно просто установить флаг C в 1...


А между тем я вчера прикрутил флаг знакового переполнения V' (именно так как описано в цитате чуть выше):



Флаг V имеет смысл только если аргументы для сложения или вычитания предполагались аргументами со знаком - во всех остальных случаях значение этого флага необходимо считать мусором и игнорировать...

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


16 Jan 2016 07:14
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22530
Location: Silicon Valley
Reply with quote
А теперь порассуждаем про скорость выполнения тех или иных команд. Ввиду того, что от идеи делать это как RISC я уже отказался, то будем делать из этого CISC на подобие 6502 или 8080 (ну или скорее z80 т.к. у нас 4-битный АЛУ) - соответственно разные типы команд будут требовать разного количества тактов - например копирование регистров с инверсией и без будет самой быстрой операцией, а сложение-вычитание самой долгой, т.к. бит переноса у нас последовательно распостраняется (это плюс к тому, что надо делать арифметику в 2 захода из-за 4-битности АЛУ)...

P.S. Возможно ради скорости надо будет сделать 2-уровневый конвейер (как в PIC) - чтобы параллельно читать команду из медленного ПЗУ (200нс) и делать один шаг вычислений в 4-битном АЛУ (который тоже 200нс в худшем случае) для предыдущей команды. Хотя для простоты можно начать с последовательного варианта...

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


16 Jan 2016 08:39
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22530
Location: Silicon Valley
Reply with quote
Итак, имеем:
RST: сохранить G и F, передать управление по новому адресу (подменить команду в конвейере на NOP)
RET: восстановить G и F, передав управление по следующему адресу (подменить команду в конвейере на NOP)
A=N: записать в регистр A код операции (однако для N=0 это должно означать NOP)
R1=R2: копирование из регистра в регистр (если R1 и R2 одно и тоже число, то с инверсией, плюс особый случай если R1 это G)
RRC: сдвинуть вправо старший ниббл, сдвинуть вправо младший ниббл (именно так - сначала старший, потом младший)
RLC: сдвинуть влево младший ниббл, сдвинуть влево старший ниббл
NAN: логическая операция NAND со старшим нибблом, затем с младшим нибблом (порядок неважен, но так наверное проще)
XOR: логическая операция XOR с младшим нибблом, затем со старшим нибблом
ADC: сложение A с регистром и C - младший ниббл, затем старший ниббл
SBC: сложение A с инвертированным регистром и C - младший ниббл, затем старший ниббл
A=A+N и A=A-N: детектируется как одно и тоже - сложение A с числом без учёта C:
- сначала складываем млаший ниббл из A и млаший ниббл кода операции, предварительно установив C в 0
- далее складываем старший ниббл из A и 0000 или 1111 в зависимости от бита 3 кода операции (с учётом C от предыдущего шага)

P.S. Особый случай если R1 это G - программный указатель должен получать новое значение после записи в регистр G (соответственно в случае конвейера также надо подменить команду в конвейере на NOP)...

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

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


16 Jan 2016 13:23
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
А INR и DCR имеем, или нет?

_________________
iLavr


16 Jan 2016 13:36
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22530
Location: Silicon Valley
Reply with quote
Lavr wrote:
А INR и DCR имеем, или нет?


A=A+1 и A=A-1 (это ADI и SBI с 3-битным числом которые не используют входной флаг C)

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


16 Jan 2016 13:54
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
A=A+1 и A=A-1 (это ADI и SBI с 3-битным числом которые не используют входной флаг C)

А поподробней насчет "с 3-битным числом которые не используют входной флаг C" - а то как-то
не совсем понятно в рамках твоей системы команд АЛУ:
Quote:
ADC: сложение A с регистром и C - младший ниббл, затем старший ниббл
SBC: сложение A с инвертированным регистром и C - младший ниббл, затем старший ниббл

_________________
iLavr


16 Jan 2016 14:06
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 193 posts ]  Go to page Previous  1, 2, 3, 4, 5 ... 13  Next

Who is online

Users browsing this forum: No registered users and 35 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.