Самодельный процессор 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: Самодельный процессор на 74F00 NEDONAND (nedoPC-00)

Post by Shaos »

Lavr wrote:
Shaos wrote:A=A+1 и A=A-1 (это ADI и SBI с 3-битным числом которые не используют входной флаг C)
А поподробней насчет "с 3-битным числом которые не используют входной флаг C" - а то как-то
не совсем понятно в рамках твоей системы команд АЛУ:
ADC: сложение A с регистром и C - младший ниббл, затем старший ниббл
SBC: сложение A с инвертированным регистром и C - младший ниббл, затем старший ниббл
Читай далее:
A=A+N и A=A-N: детектируется как одно и тоже - сложение A с числом без учёта C
Это про вот это:

Code: Select all

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


P.S. A=A+0 (ADI 0) может иметь алиас CLC т.к. она сбрасывает флаг C не меняя содержимое регистра A
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Самодельный процессор на 74F00 NEDONAND (nedoPC-00)

Post by Lavr »

Shaos wrote:Это про вот это:

Code: Select all

---------------------------------------------------------------------------------------------------
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
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор на 74F00 NEDONAND (nedoPC-00)

Post by Shaos »

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 перед каждым инкрементом/демкрементом выглядит глупо, не правда ли?
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Самодельный процессор на 74F00 NEDONAND (nedoPC-00)

Post by Lavr »

Shaos wrote:Установка флага C перед каждым инкрементом/демкрементом выглядит глупо, не правда ли?
Совсем не глупо - я почему и спросил про эти команды.

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

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

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

Почему бы в этом случае не манипулировать флагом С аппаратно и для команд ADD и SUB ?
И избавиться от атавизма с программной установкой С ?
iLavr
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор на 74F00 NEDONAND (nedoPC-00)

Post by Shaos »

Я имел ввиду програмная установка. Для полновесных сложений-вычитаний ручная установка уместна, а для обычного инкремент-декремента - уже нет. По поводу 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
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор на 74F00 NEDONAND (nedoPC-00)

Post by Shaos »

А теперь по скоростям. Скажем приделаю я 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 цикла во второй ступени конвейера (при этом первая ступень должна будет стоять)...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Самодельный процессор на 74F00 NEDONAND (nedoPC-00)

Post by Lavr »

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
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор на 74F00 NEDONAND (nedoPC-00)

Post by Shaos »

Я пока не хочу усложнений - вся эта линейка от -8 до +7 декодится и исполняется как ОДНА команда - и это мне нравится своей аппаратной простотой
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Самодельный процессор на 74F00 NEDONAND (nedoPC-00)

Post by Lavr »

Ну зато куда как более полезные ADD/SUB исполняются с атавизмом 6502... :o

Как хочешь, конечно... интересующий меня момент - я себе уяснил.
iLavr
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор на 74F00 NEDONAND (nedoPC-00)

Post by Shaos »

Ну мне подход 6502 кажется более логичным - посмотрим...
Я тут за главного - если что шлите мыло на 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:... простейший 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И-НЕ. Вроде ничего не перепутал...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор на 74F00 NEDONAND (nedoPC-00)

Post by Shaos »

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: Select all

            _________________
/RST ______|
     ______   _   _   _   _
CLK        |_| |_| |_| |_| |_ 6.666MHz
     ______     ___     ___
CLK2       |___|   |___|   |_ 3.333MHz
     ______         _______
CLK4       |_______|       |_ 1.666MHz
     ______             ___
/RD        |___________|   |_

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

P.S. Пожалуй сигналы чтения и сохранения байта надо сгенерить так:

Code: Select all

            _________________
/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 извне...
Я тут за главного - если что шлите мыло на me собака shaos точка net
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Re: Самодельный процессор на 74F00 NEDONAND (nedoPC-00)

Post by petrenko »

Лучше соединить триггеры в счётчик джонсона (, примерно как это внутри *531гг4 сделано.).
Тогда наверняк всё будет в соответствии с ожидаемым. :wink:
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самодельный процессор на 74F00 NEDONAND (nedoPC-00)

Post by Shaos »

Джонсон это ведь "Ring counter"? Он же считает столько раз, сколько D-триггеров в кольцо подцеплено (почитал - вроде чуть больше, например 5 триггеров перебирают 9 состояний), а мне настоящий счёт нужен - 2^n вариантов...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Самодельный процессор на 74F00 NEDONAND (nedoPC-00)

Post by Lavr »

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