PDA

Просмотр полной версии : Z80 временные диаграммы



Lethargeek
24.12.2020, 20:07
Полагаю, многим спектрумистам знакомы подобные картинки:

http://www.primrosebank.net/computers/mtx/components/memory/dram/Z80_memory_rw_600.jpg

...происхождением из фирменных мануалов и даташитов, которые кочуют с сайта на сайт.

При этом везде подробно рассмотрены и описаны только трёхтактовые (не считая wait) машинные циклы чтения/записи, в том числе и в фирменных документах. Но циклы чтения бывают также четырёхтактовые, а циклы записи - пятитактовые (пример команды, в которой есть циклы всех размеров - "ex (sp),hl"). Причём дополнительные такты - явно не wait, а вычисления уже после чтения или записи. Что же точно происходит с шинными сигналами в это время? Смущает, что в отдельные одно-двухтактовые внутренние машциклы эти дополнительные такты в доках не выделяют.

dvarkin
27.12.2020, 10:29
В https://forums.nesdev.com/viewtopic.php?t=14723 есть идея, что такие циклы чтения/записи/выборки из n тактов можно представить как 3 такта обычного цикла чтения/записи или 4 такта выборки + (n-3) или (n-4) такта внутренних операций после.

Lethargeek
27.12.2020, 18:44
В https://forums.nesdev.com/viewtopic.php?t=14723 есть идея, что такие циклы чтения/записи/выборки из n тактов можно представить как 3 такта обычного цикла чтения/записи или 4 такта выборки + (n-3) или (n-4) такта внутренних операций после.
да идей-то несколько может быть, но все без документального подтверждения
кстати, и для внутренних операций в мануалах тоже нет диаграмм
(состояние слишком очевидным считается?)

AlexG
27.12.2020, 19:25
https://github.com/gdevic/A-Z80/blob/master/tools/dongle/xx.html
и так далее.
Тов. снял по тактовые диаграммы для всех команд ардуинкой.
пс: но сама реализация процессора не на 100% соответствует оригиналу.

Bolt
27.12.2020, 20:12
Что же точно происходит с шинными сигналами в это время?
Не совсем понятен вопрос. Что происходит в это время внутри процессора?

АЛУ 4-битное, и 8-битные операции выполняются за 2 такта. Для 4-тактных инструкций 2 такта это refresh, 2 такта чтение опкода, а выполнение во время следующего refresh. 16-битное сложение выполняется за 4 такта, по 4 бита.
Адрес при IX+смещение тоже считает АЛУ за 4 такта и сохраняет во временном 16-битном регистре. Названия у него нет, но он есть.
16-битный inc/dec выполняется отдельным блоком, по-моему за 2 такта с записью во временный регистр. При push/pop выполняется два inc/dec, один из них и даёт лишний такт при push, потому что сначала надо сделать dec, а потом всё остальное.

То есть база это 2 такта refresh плюс 2 такта чтение опкода, 3 такта на чтение-запись байта памяти, 4 такта на чтение-запись порта. Остальное это внутренние действия, которые распараллелить ну никак не получилось.

- - - Добавлено - - -

Ой, сначала же читается опкод, потом refresh. 8-битная арифметика выполняется во время чтения следующего опкода. Причём, по-моему, 2 такта вычисление, а флаги пишутся аж на 3-м такте, на refresh. Флаги передаются по той же внутренней шине. Отсюда же растут ноги флагов F3 и F5 - этими двумя проводами при записи флагов никто не управляет, что осталось на линиях от предыдущей внутренней операции, то и записали.

- - - Добавлено - - -

И ещё нюанс. В Z80 есть моменты из серии "ну, так получилось" :) На кристалле есть парочка явно лишних проводников, которые потом были порезаны. Не помню что этим исправили, по-моему лишние такты там тоже были.

HardWareMan
27.12.2020, 20:25
16-битный inc/dec выполняется отдельным блоком, по-моему за 2 такта с записью во временный регистр. При push/pop выполняется два inc/dec, один из них и даёт лишний такт при push, потому что сначала надо сделать dec, а потом всё остальное.
Интересно. А у ВМ80 16ти битный INC/DEC организован комбинаторикой с быстрым переносом, та самая, которая инкрементирует или декрементирует адрес PC или SP. Именно поэтому, эти INC/DEC регистровых пар не трогают флаги АЛУ. И оно за один такт идёт - эта схема приаттачена к регистровому файлу, а тот уже организован так, чтобы пары эти сразу к схеме и подключались. У Z80 по-другому?

Bolt
27.12.2020, 20:40
Нет, так же. Я может как-то не так выразился, назвав отдельным блоком? Только по-моему всё-таки за 2 такта, на одном туда, на другом обратно. А как иначе по одной шине? И "временный регистр" это, насколько помню, защёлка рядом с этой схемой быстрого переноса.

- - - Добавлено - - -

Ну, всё-таки ошибся. Есть latch, а есть "регистр" WZ
http://www.righto.com/2014/10/how-z80s-registers-are-implemented-down.html

Lethargeek
27.12.2020, 20:42
Не совсем понятен вопрос. Что происходит в это время внутри процессора?
нет, что

с шинными сигналами
что на ножках

- - - Добавлено - - -


https://github.com/gdevic/A-Z80/blob/master/tools/dongle/xx.html
и так далее.
Тов. снял по тактовые диаграммы для всех команд ардуинкой.
пс: но сама реализация процессора не на 100% соответствует оригиналу.
хорошо, но оговорка не радует

Bolt
27.12.2020, 21:03
что на ножках
Ничего особенного, просто "лишние" такты между циклами. Для чего это так важно?

Вот ещё таблица http://www.z80.info/z80ins.txt

Lethargeek
27.12.2020, 21:06
Ничего особенного, просто "лишние" такты между циклами. Для чего это так важно?
для внешнего устройства на шине


Вот ещё таблица http://www.z80.info/z80ins.txt
мне она, конечно, известна и ответа на вопрос в ней, конечно, нет

dvarkin
30.12.2020, 09:12
Ничего особенного, просто "лишние" такты между циклами. Для чего это так важно?

Согласен.

Моё представление происходящего: три такта циклов чтения/записи происходят согласно картинке в #1, а после каждого цикла иногда Z80 необходимо совершать внутренние операции (в EX (SP), HL могут быть что-то типа перевыбора L на H и инкремента SP), во время которых шины остаются такими же, как в конце третьего такта (а зачем их менять?). Вроде, всё именно так, а как может быть иначе?

Lethargeek
30.12.2020, 17:28
во время которых шины остаются такими же, как в конце третьего такта
как сие понять? адрес и данные так и будут те же висеть на шине в дополнительные такты? или не будут?


(а зачем их менять?)
не "зачем", а "потому что так получилось"


Вроде, всё именно так, а как может быть иначе?
да как угодно

dvarkin
30.12.2020, 18:02
как сие понять? адрес и данные так и будут те же висеть на шине в дополнительные такты? или не будут?

Т. к. "…the WR signal goes inactive one-half T state before the address and data bus contents are changed…" — не будут. Но данные, видимо, спадут только во время "четвёртого" такта.


не "зачем", а "потому что так получилось"

Именно.


да как угодно
Три такта оно должно отработать по датащиту, о проблемах с этим я не слышал :) . И, очевидно, внутренние операции не сопровождаются никакими действиями вовне ("потому что так получилось") :) .

Lethargeek
30.12.2020, 18:10
. к. "…the WR signal goes inactive one-half T state before the address and data bus contents are changed…" — не будут.
или наоборот - и адрес с данными задержатся, и WR - что не противоречит цитате


И, очевидно, внутренние операции не сопровождаются никакими действиями вовне ("потому что так получилось")
не очевидно

dvarkin
30.12.2020, 18:42
или наоборот - и адрес с данными задержатся, и WR - что не противоречит цитате

WR по картинке, очевидно, становится неактивным в середине третьего цикла. Кстати, в https://www.zilog.com/docs/z80/ps0178.pdf для Z84C00 указано, когда именно это всё делается.

NEO SPECTRUMAN
30.12.2020, 18:49
для Z84C00
у каждого производителя z80 может быть свой даташит со своими дополнительными подробностями
но прочесать их все...

dvarkin
30.12.2020, 19:04
у каждого производителя z80 может быть свой даташит со своими дополнительными подробностями
но прочесать их все...

Да, должна быть очень специфичная периферия, чтобы учитывать такие подробности :)

zebest
30.12.2020, 22:12
Тов. снял по тактовые диаграммы для всех команд ардуинкой.
пс: но сама реализация процессора не на 100% соответствует оригиналу.
ну на сто процентов да жи у Соргелиг-а не соответствует.
А эта реализАция тоже довольно неплохая, Спек на ней работает, тайминги конечно оставляют желать.
Но я сейчас не об этом.
У этого же товарища есть визуальный симулятор Z80. И даже спек на нем он запускал, вроде на 800 кГц, практически в реальном времени можно диаграммы смотреть. Все не дойдут руки попробовать :)

Lethargeek
31.12.2020, 09:29
WR по картинке, очевидно, становится неактивным в середине третьего цикла.
очевидно только для трёхтактовых циклов - A и D по ней изменятся только в следующем машцикле


Кстати, в https://www.zilog.com/docs/z80/ps0178.pdf для Z84C00 указано, когда именно это всё делается.
даже более туманно - "the WR line is active when the data bus is stable" - так оно аж вон где stable еще

сам-то я подозреваю, что RD/WR всегда на третьем (не считай вэйты) такте снимаются, но одно дело подозревать...

dvarkin
01.01.2021, 09:47
Причина ввода дополнительных тактов — Z80 внутри нужно изменить "адрес" источника/назначения. Делать это во время операций с ними нельзя (потому и вводится доп такты), значит во время доп тактов Z80 игнорирует D, то есть не принимает оттуда ничего внутрь стробом RD и не отправляет туда ничего изнутри стробом WR. Поэтому RD и WR нужно дезактивировать в третьем такте.

Трогать A D одномоментно с дезактивацией WR нельзя, т. к. на внешних устройствах их содержимое может измениться раньше дезактивации WR, поэтому вводят задержку в пол такта после и говорят, что данные и адрес стабильны весь WR. Шина данных вырубается (по датащиту, через полтакта после WR) ровно в конце третьего такта, но выходные буферы отключаются не мгновенно, а с полагающейся мощным транзисторам задержкой.

В датащите ситуацию можно понимать так: трёхтактовый цикл чтения/записи содержится в инструкции в сложном n-тактовом цикле чтения/записи. Описание первого — для работы с периферией, второго — для расчёта задержек. То есть трёхтактовый цикл чтения/записи не то же самое, что цикл в инструкции.

Z80 незачем вырубать шину адреса, поэтому там может быть что угодно.

з.ы.: а где визуальный симулятор Z80 найти?

zebest
01.01.2021, 11:22
а где визуальный симулятор Z80 найти?
https://baltazarstudios.com/z80explorer/
там же ниже про любимый Спектрум :) ну и видео

https://www.youtube.com/watch?v=_dyngzTEnvw&feature=youtu.be
Лепота-а-а-а.....

Lethargeek
01.01.2021, 12:40
Причина ввода дополнительных тактов — Z80 внутри нужно изменить "адрес" источника/назначения. Делать это во время операций с ними нельзя (потому и вводится доп такты),
во-1, адреса как раз НЕ надо изменять (кроме операций со стеком, но на них доптактов как раз НЕ тратится)
во-2, они должны же быть защёлкнуты всё равно


значит во время доп тактов Z80 игнорирует D, то есть не принимает оттуда ничего внутрь стробом RD
внутрь не тащит, а на ножки принимает, почему нет?


и не отправляет туда ничего изнутри стробом WR.
почему не отправляет? какая разница - адрес с данными защёлкнул к отправке и до нового машцикла про них забыл


Поэтому RD и WR нужно дезактивировать в третьем такте.
или в последнем


Трогать A D одномоментно с дезактивацией WR нельзя, т. к. на внешних устройствах их содержимое может измениться раньше дезактивации WR, поэтому вводят задержку в пол такта после и говорят, что данные и адрес стабильны весь WR. Шина данных вырубается (по датащиту, через полтакта после WR) ровно в конце третьего такта, но выходные буферы отключаются не мгновенно, а с полагающейся мощным транзисторам задержкой.
не противоречит, опять же

dvarkin
03.01.2021, 07:27
во-1, адреса как раз НЕ надо изменять (кроме операций со стеком, но на них доптактов как раз НЕ тратится)
во-2, они должны же быть защёлкнуты всё равно

Имелись ввиду внутренние "адреса", для H - один адрес, для L - другой.


внутрь не тащит, а на ножки принимает, почему нет?

А он так умеет?)


почему не отправляет? какая разница - адрес с данными защёлкнул к отправке и до нового машцикла про них забыл

А он так не умеет)

AlexG
03.01.2021, 23:01
zebest #18
да. видел. но нет до сих пор транзисторной схемы.

Lethargeek
04.01.2021, 00:20
Имелись ввиду внутренние "адреса", для H - один адрес, для L - другой.
и зачем к ним обращаться в дополнительном такте?


А он так умеет?)
а он так не умеет?


А он так не умеет)
пруфы в студию

dvarkin
04.01.2021, 08:39
К H и L как раз не нужно бы обращаться в дополнительном такте, а в обычных - нужно.

Пруфов нет, но в визуальном симуляторе найти можно попробовать)
:v2_conf2:

Lethargeek
04.01.2021, 14:25
К H и L как раз не нужно бы обращаться в дополнительном такте, а в обычных - нужно.
соответственно, неверно заявление

Причина ввода дополнительных тактов — Z80 внутри нужно изменить "адрес" источника/назначения.
но даже в обычных тактах (этого машцикла чтения или записи) обращаться к именованным регистрам тоже не нужно
адрес еще в прошлом машцикле был переслан в memptr (wz) и там еще, возможно, довычислялся


Пруфов нет, но в визуальном симуляторе найти можно попробовать)
симулятор тоже неизвестно насколько точный

AlexG
04.01.2021, 23:55
симулятор тоже неизвестно насколько точный
декларируют что реализовано по топологии кристалла - так что точнее наверно не возможно (без учёта задержек сигналов).

Lethargeek
05.01.2021, 00:00
всё же где-то ошибиться могли или неразборчивое додумать

AlexG
05.01.2021, 00:25
тогда бы глючило бы.

Lethargeek
05.01.2021, 00:29
так может быть и глючит, только редко и некритично

dvarkin
05.01.2021, 04:09
К H и L как раз не нужно бы обращаться в дополнительном такте, а в обычных - нужно.
Имелся ввиду тот факт, что обычно при одномоментном выключении одного буфера и включении другого буфера, сидящих на одной шине данных, на стыке происходит конфликт. А задержку как раз обычно вводят, чтобы произвести на начало задержки выключение первого, а к концу задержки на гарантированно свободную шину пустить второй буфер, поэтому во время задержки ни к чему не обращаются, а вне её - куда угодно.

Ладно, такая теория оказалаь далека от реальности.

Решил поюзать Z80Explorer, остался доволен :D.

Оказалось возможным с помощью команды засунуть в память перед стартом свои данные. Засунул команду EX (SP), HL на старт и 0xB9, 0xBA по указателю стека, что у меня стал 0x4009.
Также при пристальном всматривании в Register File обнаружил там стробы ко всем нужным регистрам (загорались при обращении к ним) и поместил их на диаграмму над содержимым регистров.

Машинный цикл 2, чтение SP:
https://i54.servimg.com/u/f54/20/29/53/37/110.png

Машинный цикл 3, чтение SP+1:
https://i54.servimg.com/u/f54/20/29/53/37/210.png
Видно, что четвёртый тактовый цикл введён для записи в половинку регистра WZ SP+1.

Машинный цикл 4, запись SP+1:
https://i54.servimg.com/u/f54/20/29/53/37/310.png

Машинный цикл 5, запись SP:
https://i54.servimg.com/u/f54/20/29/53/37/410.png
Видно, что в доп тактах идёт пересылка данных из "пустого стакана" WZ (четвёртый такт) в HL (пятый такт).

Видно, что каждый цикл обращения к памяти - трёхтактовый и размещён в начале маш цикла.

Lethargeek
05.01.2021, 11:49
Видно, что четвёртый тактовый цикл введён для записи в половинку регистра WZ SP+1.
в скобки (sp+) надо брать, если речь об адресуемом байте, а то сразу и не распарсишь


Видно, что каждый цикл обращения к памяти - трёхтактовый и размещён в начале маш цикла.
видно подозрительную хрень наверху - почему в циклах записи ошмётки $BA болтаются на DB?

dvarkin
05.01.2021, 17:24
ошмётки $BA болтаются на DB
Кажется, что эксплорер имеет виртуальную "защёлку", подключенную к внешней шине данных как бы через резисторы и всегда работающую, в которую ложит данные как можно позднее для наглядности процессов во внутренних шинах. И $BA болтается из неё.
Захотел я узнать наверняка сабж по части шины данных. Обратим внимание, например, на пин DB6. Над ним есть два мощных транзистора, один подает питание (на красном), а другой - землю (на зелёном) на этот пин. Их затворы связаны с проводниками сбоку (если это не они же). Если нажать ПКМ по пину D6 и кликнуть "Driven by", то эти проводники подсветятся синим:
https://i54.servimg.com/u/f54/20/29/53/37/e_ua_a10.png

Обозначив их vcc_d6 и vss_d6, выведем на диаграмму исследуемой инструкции (где t1 - начало машцикла), и о Боже:
https://i54.servimg.com/u/f54/20/29/53/37/d6pin10.png