Author |
Message |
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22589 Location: Silicon Valley
|
Читай далее: Это про вот это: Такое не банальное расположение ради аппаратной простоты: P.S. A=A+0 (ADI 0) может иметь алиас CLC т.к. она сбрасывает флаг C не меняя содержимое регистра A
|
16 Jan 2016 14:12 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А откуда берутся тогда 3-битные 0...+7..-8...-1, если это команда A=A+/-N как ты говоришь... И как они "предварительно установив C в 0", если у тебя ADC и SBC не умеют это делать сами?
_________________ iLavr
|
16 Jan 2016 14:24 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22589 Location: Silicon Valley
|
N это 3-битное число и есть, сидит в младших трёх битах кода операции (см. первое сообщение топика - все команды занимают 1 байт вместе с данными). ADC/SBC не умеют, а ADI/SDI - умеют (в nedoRISC-1 такая же система) Установка флага C перед каждым инкрементом/демкрементом выглядит глупо, не правда ли?
|
16 Jan 2016 14:48 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Совсем не глупо - я почему и спросил про эти команды. Я их сделал как А=А+0+(С=1) и А=А+0-(С=1) ( С взводится аппаратно). Причем 0 не заносится никуда, просто предыдущий аргумент блокируется и не изменяет состояние А у тебя вроде для простоты взят принцип от 6502, но есть привелегированные команды сложения/вычитания, которые С блокируют. Почему бы в этом случае не манипулировать флагом С аппаратно и для команд ADD и SUB ? И избавиться от атавизма с программной установкой С ?
_________________ iLavr
|
16 Jan 2016 15:21 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22589 Location: Silicon Valley
|
Я имел ввиду програмная установка. Для полновесных сложений-вычитаний ручная установка уместна, а для обычного инкремент-декремента - уже нет. По поводу 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
|
16 Jan 2016 15:38 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22589 Location: Silicon Valley
|
А теперь по скоростям. Скажем приделаю я 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 цикла во второй ступени конвейера (при этом первая ступень должна будет стоять)...
|
16 Jan 2016 15:44 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А может быть как раз +7 и -8 и выкинуть? А на их место и вставить ADD/SUB ? Из статистических соображений ADD/SUB используются куда чаще, нежели +7 и -8... Тем более, все равно оно уже как бы немного 8080 (хотя чего на них оглядываться...)
_________________ iLavr
|
16 Jan 2016 15:50 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22589 Location: Silicon Valley
|
Я пока не хочу усложнений - вся эта линейка от -8 до +7 декодится и исполняется как ОДНА команда - и это мне нравится своей аппаратной простотой
|
16 Jan 2016 16:00 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ну зато куда как более полезные ADD/SUB исполняются с атавизмом 6502... Как хочешь, конечно... интересующий меня момент - я себе уяснил.
_________________ iLavr
|
16 Jan 2016 16:49 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22589 Location: Silicon Valley
|
Ну мне подход 6502 кажется более логичным - посмотрим...
|
16 Jan 2016 17:39 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22589 Location: Silicon Valley
|
То что выше - это "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И-НЕ. Вроде ничего не перепутал...
|
17 Jan 2016 16:13 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22589 Location: Silicon Valley
|
По даташиту 450нс нужно с момента установки адреса (при условии /CE=0) до вывода данных, а сам /RD (/OE) может быть короче - как минимум 120нс... Генератор клока будет примерно такой (составлен из двухступенчатых D-триггеров, которые я описал чуть выше): Ожидаемые сигналы CLK (тактовая частота до 6.66 МГц), CLK2 (частота в 2 раза меньше тактовой), CLK4 (частота в 4 раза меньше тактовой) и /RD для чтения программы из ПЗУ типа 573РФ2 (2716): Осталось проверить в реальности будут ли тут иголки и всякая другая фигня с гонками... P.S. Пожалуй сигналы чтения и сохранения байта надо сгенерить так: Выходит, что у нас остаётся 75 нс в конце цикла, чтобы принять решение о том инкрементировать ли PC, оставить PC как есть или копировать что-то в PC извне...
|
17 Jan 2016 17:01 |
|
|
petrenko
Doomed
Joined: 10 Mar 2012 16:21 Posts: 598 Location: РФ
|
Лучше соединить триггеры в счётчик джонсона (, примерно как это внутри *531гг4 сделано.). Тогда наверняк всё будет в соответствии с ожидаемым.
|
18 Jan 2016 01:41 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22589 Location: Silicon Valley
|
Джонсон это ведь "Ring counter"? Он же считает столько раз, сколько D-триггеров в кольцо подцеплено (почитал - вроде чуть больше, например 5 триггеров перебирают 9 состояний), а мне настоящий счёт нужен - 2^n вариантов...
|
18 Jan 2016 09:12 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Счетчик-делитель твой должен быть синхронным, как ИЕ7, чтобы не возникли " иголки и всякая другая фигня". А он у тебя синхронный?
_________________ iLavr
|
18 Jan 2016 09:23 |
|
|