Мне интересно. У меня "шкурный интерес" - verilog model. Чем могу - посодействую. Сейчас в "две смены пашу" на работе и дома... так что времени вообще нету :v2_dizzy_tired2:
Вид для печати
Мне интересно. У меня "шкурный интерес" - verilog model. Чем могу - посодействую. Сейчас в "две смены пашу" на работе и дома... так что времени вообще нету :v2_dizzy_tired2:
Я уже писал , что у неё "два клока" (как здесь написали - для эмуляции латчей) - а оное "дурно" влияет на фактическую частоту проекта. и не факт что она пройдёт "другие" тесты (которые здесь тестят)
ОФФТОП: я жадный, я ОЧЕНЬ ЖАДНЫЙ.
при 100 эффективная будет не более 25. (я не помню соотношение частот в том проекте). А на 100 "разводить" несколько сложновато ("дороже по ресурсам").
Честно ? Пока никакого. а первоначально "Хоббит"
Товарищи с емураши правильно заметили, что чем больше преобразований относительно транзисторной схемы, тем больше шансов накосячить.
Поэтому если хочется сохранить прям эталонную модель, то это тут надо брать верилог с Nuked-MD, а еще лучше Z80 Explorer)
Каждая ступень оптимизации может дать свои косяки просто из-за банальной ошибки.
А уж преобразование в синхронную модель и отказ от двунаправленных шин, да и иных полу-аналоговых элементов схемы, требует не просто оптимизации а переделывания частей схемы.
Например, никак нельзя оставить двухпортовый регистровый файл со всеми его фичами, такими как произвольное обьединение LBUS и HBUS, возможность слияния шин основного набора регистров и набора регистров-указателей.
Его приходится полностью переписать на функциональный аналог, но не копию, т.к. она невозможна на этом уровне.
А уж всякие остаточные заряды на шинах, из-за которых получаются 3 и 5 флаги и всякие другие фичи - никак не сохранить в первозданном виде.
Их приходится написать заново, где условные 'заряды' будут хранится в триггерах.
В общем, чем дальше переводишь схему на современные и оптимальные рельсы, тем больше привносишь своего, что хоть и должно являться функциональным аналогом, но может нести ошибку.
- - - Добавлено - - -
Кстати, все эти особенности шин регистрового файла позволяют делать такие вещи, как, например.
1. Одновременно читать регистр A, записывать регистр F, и снова его читать в одном и то же такте.
2. Записывать по шине HBUS регистр WZL (младший байт внутреннего регистра-указателя, его еще называют MEMPTR) в главную часть регистрового файла, и при этом одновременно читать WZ целиком (и младшую и старшую часть) из другой части регистрового файла, которые на это такт специально обьединяются мостом.
Чур меня на это:
"а еще лучше Z80 Explorer"
бредовая реализация...
Вот это не понял:
"Например, никак нельзя оставить двухпортовый регистровый файл со всеми его фичами"
двух портовость в плисе "аппаратная"
А это ни одна из выше упомянутых реализаций тоже не имеет:
"А уж всякие остаточные заряды на шинах, из-за которых получаются 3 и 5 флаги и всякие другие фичи - никак не сохранить в первозданном виде."
А в случае КМОП - так это (я так понял) вообще статическая вещь - без всяких плавающих флагов.
Да и следующие (мне так кажется) тоже реализуемо
Кстати, все эти особенности шин регистрового файла позволяют делать такие вещи, как, например.
1. Одновременно читать регистр A, записывать регистр F, и снова его читать в одном и то же такте.
2. Записывать по шине HBUS регистр WZL (младший байт внутреннего регистра-указателя, его еще называют MEMPTR) в главную часть регистрового файла, и при этом одновременно читать WZ целиком (и младшую и старшую часть) из другой части регистрового файла, которые на это такт специально обьединяются мостом.
Это не та двухпортовость.
Тут функционал гораздо шире. Начиная с того, что можно одновременно писать в любое количество регистров. И при этом читать другие.
- - - Добавлено - - -
На CMOS прекрасно обнаружены те же самые плавающие 3 и 5 биты в командах SCF/CCF.
Статика никак не влияет на причину плавающих флагов.
- - - Добавлено - - -
Конечно все эти прекрасно реализуемо.
Но это как бы уже не копия оригинала, а функциональный аналог.
Ну значит "двухпортовость" собирается на отдельных триггерах - и "делай с ними что хошъ"(с)
Копия - это на транзисторах спаянное (как 6502).
Обратил внимание, что в некоторых описаниях работа команды DAA описана уж очень сложным языком.
Тогда как в железной реализации она очень проста:
DAA:
Цикл M1:
T1-T2 - выборка кода команды и завершение предыдущей ALU-операции
T3 - стандартная загрузка A в ALUA и ALUB
T4 - если ALUA[3..0] > 9 или флаг H = 1, то ALUB[3..0] = 0x6
если ALUA > 99 или флаг C = 1, то ALUB[7..4] = 0x6, и флаг C результата равен 1
далле выполняем сложение ALUA и ALUB, если N = 0, и вычитание, если N = 1
Все остальные флаги устанавливаются как при обычном сложении/вычитании, за исключением того, что флаг P/V показывает признак четности
- - - Добавлено - - -
А вообше, скажу оффтопно - Vivado хоть и классная студия для моделирования, но после первого запуска симуляции начинает весь комп подтормаживать, хотя симуляция стоит на паузе.
Причем, закрываешь симуляцию или нет, уже не влияет. Приходится выйти из студии и снова войти.
Вот почему я люблю программирование и VisualStudio, а не симуляторы)
случайно наткнулся на большую подборку тестов z80
https://github.com/redcode/Z80/wiki/Tests
Интересно, а какое начальное состояние у регистров Z80 и какие регистры прописываются сбросом?
Почему visual6502 при сбросе прописывает регистры значением 0x55 (кроме pc и ir, которые прописываются 0x00)?
я про Z80: http://www.visual6502.org/JSSim/expert-z80.html
Видимо кнопка сброса не совсем сброс делает, а просто инициализирует начальное состояние.
Разобрался.
А какие варианты сброса у Z80 есть? Помню читал есть короткий сброс и длинный. Сколько минимум тактов нужно держать активным _reset для первого и второго варианта?
можно поподробнее, что значит M1.T2.2 и M1.T2.4?
Речь идет о двух полуциклах M1-T2, когда процессор читает опкод с шины данных, но не включая следующего полуцикла M1-T3 (последний полуцикл чтения опкода)?
Кстати еще вопрос - в какой именно момент происходит захват слова с шины данных при чтении из памяти? На примере выполнения выполнения NOP:
как видно, выборка #00 с шины данных db идет 3 полуцикла, но в какой момент происходит фиксация данных?Код:cycle ab db _m1 _rd _wr _mreq _iorq State pc Fetch
0 0000 ff 1 1 1 1 1 m1 t1 0000
0 0000 ff 0 1 1 1 1 m1 t1 0000
1 0000 00 0 0 1 0 1 m1 t2 0001 NOP
1 0000 00 0 0 1 0 1 m1 t2 0001 NOP
2 0000 00 0 0 1 0 1 m1 t3 0001 NOP
2 0000 ff 1 1 1 1 1 m1 t3 0001
3 0000 ff 1 1 1 0 1 m1 t4 0001
3 0000 ff 1 1 1 0 1 m1 t4 0001
M1 - это цикл M1.
T2 - это второй такт цикла M1
.2 - это означает, что это второй полутакт такта T2
- - - Добавлено - - -
https://pic.maxiol.com/images2/17345...d121820240.png
Я выше в теме писал, что если какой-то процесс инициируется циклом, например, M2, то все последующие действия отсчитываются от него.
На практике M1.T2.4 скорее всего совпадет с M1.T3.2, однако, если поступит сигнал WAIT, то между T2 и T3 будет пауза, и M1.T2.4 уже не совпадет с M1.T3.2.
А можно вот про это поподробнее? Что за механизм запрета?
И кстати насчет режима IM, вы разбирали как работает установка режима? Если я правильно нашел сигналы, то получается такая картина:
IM0: 0 0
IM1: 1 0
IM2: 1 1
Как-то странно, я ожидал увидеть для IM2 0 1, почему оба сигнала одинаковые? Как это работает?
Механизм очень прост. Блок выбора кода команды выдает 0, вместо кода команды.
Это сделано, чтобы, например, во время обработки прерываний, в регистре опкода была нейтральная команда типа NOP, которая не активирует никаких линий, и не помешает декодерам прерываний.
- - - Добавлено - - -
Не совсем понял, в чем именно вопрос)
Вот причесанная схема декодера IM:
https://pic.maxiol.com/images2/17345...d121820240.png
- - - Добавлено - - -
Ко мне можно и нужно на ты)
Его и нет.
Так как IM0 фактически это просто выполнение команды с шины данных.
Но вообще, сами блоки выполнения прерываний я пока не разбирал. Нарисовал, но не разбирал подробности работы.
- - - Добавлено - - -
Это биты 3 и 4 регистра опкода.
- - - Добавлено - - -
REQ_DIS_BASE_SET - это запрос запрета декодера команд. О чем я писал уже выше.
проверил - да, действительно, опкоды ed46 (im0), ed4e (*im0), ed56 (im1) и ed5e (im2), сохраняют разное состояние режима.
Т.е. внутри процессора есть разница между ed46 (im0) и ed4e (*im0). :)
с нижней частью схемы понятно, а для чего в верхней NMI_ACK с IM1 объединяется - что это за сигнал уходит направо за границу схемы с выхода U44?
Еще такой вопрос - есть ли в схеме физически регистр IFF2 или он как-то виртуально получается?
Нет, разницы-то как раз нет) im0 и im0* воспринимаются процессором абсолютно одинаково.
- - - Добавлено - - -
Это выбор сигнала, который одинаков для NMI, RST, IM1, т.к. они обрабатываются схожим образом:
https://pic.maxiol.com/images2/17345...d121820240.png
- - - Добавлено - - -
Разумеется есть:
https://pic.maxiol.com/images2/17345...d121820240.png
однако режим хранится по разному :)
Может и в обработке есть разница, судя по схеме один бит используется в блокировке декодера, второй нет. Получается можно как-то заметить эту разницу?
где примерно эта цепь IFF2 на кристалле находится? может ктото подскажет номер цепи в visual6502 z80 симуляторе?
Как насчет регистра Q, который для недок флагов в SCF/CCF используется? Он есть физически?
Никакой разницы нет.
Схема была спроектирована для того, чтобы различать im0, im1, im2.
im0* - это просто побочный недокументированный опкод.
И у im0, и у im0* 4-й бит опкода равен нулю. Что блокирует U45 и U46.
А следовательно обе эти команды выполняются абсолютно одинаково.
- - - Добавлено - - -
Номера транзисторов могу подсказать:
https://pic.maxiol.com/images2/17345...d121920240.png
- - - Добавлено - - -
Я не оперирую терминами в которых есть регистр Q. Это кто-то там придумал, и не знаю точно, что он под этим имел в виду.
Особенности SCF/CCF в этой ветке у меня оооочень хорошо описаны, как и почему такое происходит. Просто надо все прочитать)
хм, не нахожу. Пробовал методом перебора путём выбора нодов которые соответствуют значению нода IFF1 на последовательности EI, NOP, DI, NOP, EI, NOP, DI, NOP. В результате осталась только одна нода IFF1. Толи в симуляторе нет этой цепи, толи IFF2 при выполнении EI/DI устанавливается и сбрасывается не одновременно с IFF1. Странно это.
нашел только инверсную ноду IFF1:
iff1 = 231
_iff1 = 1166
Однако при выполнении NMI/RETI флаг IFF1 восстанавливается. Значит где-то сохраняется, получается, что IFF1 и IFF2 устанавливаются на разных циклах.
в коде симулятора есть такой комент:
Вопрос - что это за Z80Simulator? Где его взять?Код:// * This file is automatically generated by Z80Simulator. *
// * Please do not manually edit! Instead, find a transistor *
// * that uses the new signal and use FindTransistor(x,y) in *
// * Z80Simulator to cause that signal to be added. *
// * This seems a pain, but it has two advantages: *
// * - all signals are then available in Z80Simulator *
// * - it avoids renumbering issues if/when the PNGs change *
Ты не написал, где ты и в каком проекте ищешь.
На каком сайте.
Что запускаешь.
Я когда-то просто скачал Z80 Explorer, и в нем есть список всех транзисторов и координаты каждого транзистора на схеме.
- - - Добавлено - - -
Но вообще, на моей схеме видно же, когда и чего устаналивается.
- - - Добавлено - - -
Разберем схему:
Триггер IFF1 сбрасывается по:
1. Reset
2. Прием NMI
3. Прием INT
Триггер IFF2 сбрасывается по:
1. Reset
2. Прием NMI
Оба триггера устанавливаются/сбрасываются по EI/DI
Триггер IFF2 копируется в IFF1 RETN/RETI, если не активен прием NMI
Всё!
Проект visual6502: https://github.com/trebonian/visual6502
Вот сама страница с симулятором: http://www.visual6502.org/JSSim/expert-z80.html
там есть мелкие ошибки в дизассемблере, но они легко исправляются.
- - - Добавлено - - -
проблема в том, что я пробовал перебором искать node, которая в каждом цикле соответствует IFF1 (node 231) для цепочки инструкций EI,NOP,DI,NOP, однако ничего не нашел, находится только инверсный сигнал _IFF1 (node 1166). Если оба триггера устанавливаются/сбрасываются по EI/DI одновременно, то такой подход должен был найти node для IFF2, ведь IFF1 и IFF2 на такой цепочке инструкций должны дублироваться в каждом цикле. Но ничего не находит. Как такое может быть?
При этом проверил обработку NMI логика сохранения IFF1 в этом симуляторе работает.