nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 29 Mar 2024 07:43



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

Joined: 08 Jan 2003 23:22
Posts: 22422
Location: Silicon Valley
Reply with quote
Lavr wrote:
Shaos wrote:
A=A+1 и A=A-1 (это ADI и SBI с 3-битным числом которые не используют входной флаг C)

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


Читай далее:
Quote:
A=A+N и A=A-N: детектируется как одно и тоже - сложение A с числом без учёта C

Это про вот это:
Code:
---------------------------------------------------------------------------------------------------
Fx|A=A+0|A=A+1|A=A+2|A=A+3|A=A+4|A=A+5|A=A+6|A=A+7|A=A-8|A=A-7|A=A-6|A=A-5|A=A-4|A=A-3|A=A-2|A=A-1|
---------------------------------------------------------------------------------------------------

Такое не банальное расположение ради аппаратной простоты:
Quote:
- сначала складываем млаший ниббл из A и млаший ниббл кода операции, предварительно установив C в 0
- далее складываем старший ниббл из A и 0000 или 1111 в зависимости от бита 3 кода операции (с учётом C от предыдущего шага)


P.S. A=A+0 (ADI 0) может иметь алиас CLC т.к. она сбрасывает флаг C не меняя содержимое регистра A

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


16 Jan 2016 14:12
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Это про вот это:
Code:
---------------------------------------------------------------------------------------------------
Fx|A=A+0|A=A+1|A=A+2|A=A+3|A=A+4|A=A+5|A=A+6|A=A+7|A=A-8|A=A-7|A=A-6|A=A-5|A=A-4|A=A-3|A=A-2|A=A-1|
---------------------------------------------------------------------------------------------------

Такое не банальное расположение ради аппаратной простоты:

А откуда берутся тогда 3-битные 0...+7..-8...-1, если это команда A=A+/-N как ты говоришь...

И как они "предварительно установив C в 0", если у тебя ADC и SBC не умеют это делать сами?

_________________
iLavr


16 Jan 2016 14:24
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22422
Location: Silicon Valley
Reply with quote
Lavr wrote:
А откуда берутся тогда 3-битные 0...+7..-8...-1, если это команда A=A+/-N как ты говоришь...


N это 3-битное число и есть, сидит в младших трёх битах кода операции (см. первое сообщение топика - все команды занимают 1 байт вместе с данными).

Lavr wrote:
И как они "предварительно установив C в 0", если у тебя ADC и SBC не умеют это делать сами?


ADC/SBC не умеют, а ADI/SDI - умеют (в nedoRISC-1 такая же система)

Установка флага C перед каждым инкрементом/демкрементом выглядит глупо, не правда ли?

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


16 Jan 2016 14:48
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Установка флага C перед каждым инкрементом/демкрементом выглядит глупо, не правда ли?

Совсем не глупо - я почему и спросил про эти команды.

Я их сделал как А=А+0+(С=1) и А=А+0-(С=1) (С взводится аппаратно).

Причем 0 не заносится никуда, просто предыдущий аргумент блокируется и не изменяет состояние

А у тебя вроде для простоты взят принцип от 6502, но есть привелегированные команды
сложения/вычитания, которые С блокируют.

Почему бы в этом случае не манипулировать флагом С аппаратно и для команд ADD и SUB ?
И избавиться от атавизма с программной установкой С ?

_________________
iLavr


16 Jan 2016 15:21
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22422
Location: Silicon Valley
Reply with quote
Я имел ввиду програмная установка. Для полновесных сложений-вычитаний ручная установка уместна, а для обычного инкремент-декремента - уже нет. По поводу ADD/SUB - места нету у меня в таблице на них (ADC/SBC всё равно так или иначе остаются). Поэтому оно как бы 6502, но для инкремента-декремента оно как бы немного 8080 (вроде на 6502 тоже есть инкремент-декремент?) и даже лучше т.к. есть +2/-2 +3/-3 и т.д. вплоть до +7 и -8.

P.S. Вот интересная сравнительная таблица инструкций 8080 и 6502:http://www.chrisantonellis.com/files/gameboy/8080_z80_6502.txt

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


16 Jan 2016 15:38
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22422
Location: Silicon Valley
Reply with quote
А теперь по скоростям. Скажем приделаю я 573РФ2 в качестве памяти программ - у неё цикл выборки 450нс, тогда можно взять 150нс тактовый генератор (6.666МГц или меньше) и от него плясать, задав цикл в 4 такта, при которых первая ступень конвейера будет делать выборку команды из памяти:

00 -> 0 - первая треть /RD (150нс) - тут адрес для ПЗУ уже установлен в начале такта (после ресета это 00000000000)
01 -> 0 - вторая треть /RD (150нс)
10 -> 0 - третья треть /RD (150нс)
11 -> 1 - выборка команды из ПЗУ и передача её во вторую стадию конвейера (плюс инкремент PC)
и т.д.

Для копирования, записи числа в регистр или логических операций и сдвигов одного цикла будет достаточно (один шаг АЛУ для сдвигов или логики займет порядка 65нс), а для арифметических потребуется 2 (один шаг АЛУ для арифметики - как минимум по 200нс чтобы carry успел пробежать по всем битам) - в этом случае конвейер застрянет на 1 такт. Команды передачи управления G=x, RST и RET (?) по идее могут быть выполнены почти мгновенно к концу первой стадии конвейера меняя PC сразу же и не имея ничего для второй стадии. Выходит, что при 4 МГц клоке у нас будет один миллион простых операций в секунду (как у 4-мегагерцовых PIC-ов) или полмиллиона арифметических операций. Но - если после арифметической операции будет идти команда передачи управления, то они обе выполнятся за 2 цикла (т.к. арифметика займёт 2 цикла второй ступени конвейера, а передача управления - 0 циклов), выходит арифметическая операция станет как бы в 2 раза быстрее, если после неё имеется передача управления!

P.S. Копирование регистров (с инверсией и без) и заполнение аккумулятора данными не используют АЛУ и могут выполняться паралелльно со вторым циклом арифметической операции - т.е. эффект будет таким же: арифметическая операция и следующая за ней операция копирования между регистрами займут 2 цикла...

P.P.S. С командой RET есть проблема - она должна записать в PC не то что сохранилось из регистров F и G в момент вызова RST, а на единицу большее значение т.к. надо вернуть управление на команду следующую за RST - возможно удастся подсунуть сохранённое в PC непосредственно перед инкрементом, который и так делается после каждой команды "атоматом" либо придётся через то же АЛУ пропускать в 3 захода (т.к. у нас 11-битный адрес) и команда RET займёт как минимум 2 цикла во второй ступени конвейера (при этом первая ступень должна будет стоять)...

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


16 Jan 2016 15:44
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
По поводу ADD/SUB - места нету у меня в таблице на них (ADC/SBC всё равно так или иначе остаются). Поэтому оно как бы 6502, но для инкремента-декремента оно как бы немного 8080 (вроде на 6502 тоже есть инкремент-декремент?) и даже лучше т.к. есть +2/-2 +3/-3 и т.д. вплоть до +7 и -8.

А может быть как раз +7 и -8 и выкинуть? А на их место и вставить ADD/SUB ?
Из статистических соображений ADD/SUB используются куда чаще, нежели +7 и -8...
Тем более, все равно оно уже как бы немного 8080 (хотя чего на них оглядываться...)

_________________
iLavr


16 Jan 2016 15:50
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22422
Location: Silicon Valley
Reply with quote
Я пока не хочу усложнений - вся эта линейка от -8 до +7 декодится и исполняется как ОДНА команда - и это мне нравится своей аппаратной простотой

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


16 Jan 2016 16:00
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Ну зато куда как более полезные ADD/SUB исполняются с атавизмом 6502... :o

Как хочешь, конечно... интересующий меня момент - я себе уяснил.

_________________
iLavr


16 Jan 2016 16:49
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22422
Location: Silicon Valley
Reply with quote
Ну мне подход 6502 кажется более логичным - посмотрим...

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


16 Jan 2016 17:39
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22422
Location: Silicon Valley
Reply with quote
Shaos wrote:
... простейший D-триггер на NAND-ах (1 корпус 7400):

Image

То что выше - это "transparent D-latch" который при C=1 передаёт на выход то, что поступило на вход, и при C=0 сохраняет последнее значение. Для счётчиков надо полноценные "master-slave D-triggers", которые запоминают по фронту C (и хранят во всех остальных случаях) плюс вход сброса /R очень даже не помешает - получилось 3 корпуса 7400:



Для тех кто не въехал как оно работает. В нормальном режиме (C=0) первый D-latch пребывает в "прозрачном" состоянии, т.е. на входе второго D-latch тоже самое, что и на входе схемы - в момент перехода C от 0 к 1 первый D-latch запоминает то, что было у него на входе, а второй переходит в прозрачный режим, передавая на выход то, что было только что на входе схемы, а теперь запомнено в первом D-latch - схема пребывает в таком состоянии пока C=1. Далее при возврате C в 0 первый D-latch опять переходит в "прозрачный" режим, а второй в тоже самое время переходит в запоминающий, продолжая держать на выходе то, что запомнилось при переходе C из 0 в 1. Вход сброса /R нулём сбрасывает второй D-trigger в нулевое состояние (при C=0) - то что там в правом-нижнем углу нагорожено есть просто 3И-НЕ вместо 2И-НЕ. Вроде ничего не перепутал...

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


17 Jan 2016 16:13
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22422
Location: Silicon Valley
Reply with quote
Shaos wrote:
А теперь по скоростям. Скажем приделаю я 573РФ2 в качестве памяти программ - у неё цикл выборки 450нс, тогда можно взять 150нс тактовый генератор (6.666МГц или меньше) и от него плясать, задав цикл в 4 такта, при которых первая ступень конвейера будет делать выборку команды из памяти:

00 -> 0 - первая треть /RD (150нс) - тут адрес для ПЗУ уже установлен в начале такта (после ресета это 00000000000)
01 -> 0 - вторая треть /RD (150нс)
10 -> 0 - третья треть /RD (150нс)
11 -> 1 - выборка команды из ПЗУ и передача её во вторую стадию конвейера (плюс инкремент PC)
и т.д.

По даташиту 450нс нужно с момента установки адреса (при условии /CE=0) до вывода данных, а сам /RD (/OE) может быть короче - как минимум 120нс...

Генератор клока будет примерно такой (составлен из двухступенчатых D-триггеров, которые я описал чуть выше):

Image

Ожидаемые сигналы CLK (тактовая частота до 6.66 МГц), CLK2 (частота в 2 раза меньше тактовой), CLK4 (частота в 4 раза меньше тактовой) и /RD для чтения программы из ПЗУ типа 573РФ2 (2716):
Code:
            _________________
/RST ______|
     ______   _   _   _   _
CLK        |_| |_| |_| |_| |_ 6.666MHz
     ______     ___     ___
CLK2       |___|   |___|   |_ 3.333MHz
     ______         _______
CLK4       |_______|       |_ 1.666MHz
     ______             ___
/RD        |___________|   |_

           | 300ns | 300ns |

Осталось проверить в реальности будут ли тут иголки и всякая другая фигня с гонками...

P.S. Пожалуй сигналы чтения и сохранения байта надо сгенерить так:
Code:
            _________________
/RST ______|
     ______   _   _   _   _
CLK1       |_| |_| |_| |_| |_  6.666MHz
     ______     ___     ___
CLK2       |___|   |___|   |_  3.333MHz
     ______         _______
CLK4       |_______|       |_  1.666MHz

           .       .       .
     ______________       ___
/RD                |_____|     225ns
           .       .    _  .
STO  __________________| |___   75ns (store instruction)
           .       .      _
INC  ____________________| |_   75ns (output incremented address)

           | 300ns | 300ns |
           ^           ^
           |           |
           |           \__data ready
           \___________address ready

Выходит, что у нас остаётся 75 нс в конце цикла, чтобы принять решение о том инкрементировать ли PC, оставить PC как есть или копировать что-то в PC извне...

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


17 Jan 2016 17:01
Profile WWW
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
Лучше соединить триггеры в счётчик джонсона (, примерно как это внутри *531гг4 сделано.).
Тогда наверняк всё будет в соответствии с ожидаемым. :wink:


18 Jan 2016 01:41
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22422
Location: Silicon Valley
Reply with quote
Джонсон это ведь "Ring counter"? Он же считает столько раз, сколько D-триггеров в кольцо подцеплено (почитал - вроде чуть больше, например 5 триггеров перебирают 9 состояний), а мне настоящий счёт нужен - 2^n вариантов...

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


18 Jan 2016 09:12
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Осталось проверить в реальности будут ли тут иголки и всякая другая фигня с гонками...

Счетчик-делитель твой должен быть синхронным, как ИЕ7, чтобы не возникли "иголки и всякая другая фигня".
А он у тебя синхронный?

_________________
iLavr


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

Who is online

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