![]() |
Потихоньку прикручиваю АЛУ (это маленький прямоугольничек у правого края схемы)
Moderator: Shaos
![]() |
Ещё могут быть ситуации, когда следующая за операцией с АЛУ команда будет копирование в регистр A, которая по идее должна затереть то, что посчитало АЛУ - это тоже должно быть поддержано...Shaos wrote:Для этого должна быть возможность при копировании регистров выдавать на их вход не только выходы регистра T (временный регистр, используемый при копировании регистров), но и выход АЛУ (который в обычном случае идёт только на вход аккумулятора, причём минуя всё это кольцо через T). Другой вопрос, что если после операции АЛУ идёт не копирование в регистр, а другая операция АЛУ, использующая аккумулятор в качестве аргумента? Например два сдвига подряд - RRC A, RRC A или что-то типа этого. В этом случае при копировании аргументов для второй RRC должен браться не регистр A, а выход АЛУ...Shaos wrote:Не нравятся мне эти дырки между операциями ALU и копированием аккумулятора куда-то. В-принципе, проц может распознать, что следом за командой, требующей ALU, идёт копирование из аккумулятора, и в результате проц может изменить поведение этой команды копирования, чтобы копировать НЕ аккумулятор, а результат работы ALU ! Причём результат ALU надо записать одновременно в 2 регистра - в регистра аккумулятора и в регистр куда аккумулятор скопировали - по идее должно срастись...Shaos wrote:Вот пример инкремента регистровой пары DE:8 циклов, причём только 2 из них используют вторую ступень конвейера, а в остальные 6 (NOP-ы могут быть заменены на другие более полезные команды, не задевающие аккумулятор) АЛУ может быть задействовано для чего-нибудь ещё...Code: Select all
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
![]() |
Code: Select all
v2.0 raw
40 89 a9 38 a1 99 79 91
76 76 88 b9
![]() |
ЗадействовалShaos wrote:Вот думаю а не отдать ли пока незадействованный строб на RET/RST (сверху провод TODO) под реализацию режима HALT? Будет удобно для тестового прогона спецпрошивки - когда оно пишет очередные результаты на 7-сегментных индикаторах и вводит себя в ступор, а оператор, после сверки результатов, жмёт кнопочку и программа бежит дальше...
![]() |
Не нашёл осцилляторов на 6.666 МГц - купил для экспериментов 5, 6, и 6.144 МГц. А среди кристаллов ещё попались 6.5 МГц и даже 6.5536 МГц - тоже купил по несколько штучек...Shaos wrote:Видимо "slow ALU" небудет (во всяком случае пока), т.е. "fast ALU" уже достаточно медленный, чтобы вместить в себя операции сложения и вычитания:
Стробы второй ступени:Code: Select all
_________________ /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....
Померял осциллоскопом сложение 1111 и 0000 с наличием и отсутствием флага C - вроде не так страшно выходит:Shaos wrote:Ну опять же - надо подкручивать разрешение по времени, чтобы была видна задержка - а она менее 200 нс судя по всему (тестю пиком щас и пока на следующем шаге пика АЛУ уже всё посчитал, а это 200 нс в верхнем пределе), что значит надо гнать сигнал раза в два более быстрый чем 5 МГц, т.е. 10, а в 10 луч будет слабенький...Lavr wrote:А если на ждущей развертке с запуском от исходного сигнала?
Исходный - на первый луч, после задержки - на второй, аккурат задержку и должны увидеть...
P.S. Ха, поподавал входные воздействия не подряд, а в разнобой (то 0x00, то 0xFF) и обнаружил, что в некоторых случаях 200 нс недостаточно чтобы АЛУ отработал и зафиксировал значения на выходах, но вот 400 нс похоже достаточно всегда! Выходит, что моя первоначальная оценка "на всём АЛУ - 4*31.5+4*3.5=140 нс (в худшем случае 180+20=200)" оказалась излишне оптимистичной и реальность несколько хуже худшего случая, но мне сейчас важно, чтобы оно не было хуже 300 нс, но проверить я это смогу только с помощью цифрового осциллоскопа...