Z80 Finite State Machine

Микропроцессоры и микроконтроллеры от фирмы Zilog, а также компьютеры на них построенные

Moderator: Shaos

pfgx
Senior
Posts: 137
Joined: 20 Mar 2013 03:36
Location: Ростов-на-Дону

Post by pfgx »

С счётчиками тактов-циклов для команд без префиксов вроде разобрался, но... все источники утверждают, что команды условных переходов при невыполнении условия выполняются за 5 тактов. Эту часть схемы всю перерыл, но так и не нашёл ничего, что могло бы M1 прервать на 5-м такте. M1 или 4 такта, или 6. И вообще в блоке C0h...FFh много странного.

А работа с частями шины данных и флагами - вообще жесть.
pfgx
Senior
Posts: 137
Joined: 20 Mar 2013 03:36
Location: Ростов-на-Дону

Post by pfgx »

Нашёл интересный файл, "MOSTEK, Z80 microcomputer software, programming guide, Z80 programming manual", внутри есть длительности M-циклов в тактах.
https://archive.org/details/Z80ProgrammingManual

И вот такая ещё ссылка http://mpsystems.narod.ru/downloads.htm
User avatar
Stan
Banned
Posts: 397
Joined: 04 Jan 2013 10:09
Location: 95.24.178.158

Post by Stan »

pfgx wrote:Нашёл интересный файл...
https://archive.org/details/Z80ProgrammingManual
Спасибо! Хорошая ссылочка!
pfgx wrote:И вот такая ещё ссылка http://mpsystems.narod.ru/downloads.htm
А вот тут, хотя и хорошая подборка, но часть ссылок подпрокисла уже. :(
pfgx
Senior
Posts: 137
Joined: 20 Mar 2013 03:36
Location: Ростов-на-Дону

Post by pfgx »

Stan wrote:часть ссылок подпрокисла уже. :(
Да, действительно. Я не всё оттуда качал.

О результатах на сегодняшний день.
http://yadi.sk/d/dRjadx5UM7bxy
Verilog с комментариями. Жду ваших вопросов и комментариев :)

Code: Select all

// что есть в этом файле:
	// регистр текущей инструкции, декодер инструкций, группировка инструкций, прочая логика декодера
	// счётчик M-циклов и T-тактов (почти рабочий)
	// формирование сигналов управления блоком регистров: выбор регистров, управление буферами чтения-записи
	// ошибки :)

// чего нет в этом файле:
	// формирования сигналов управления АЛУ, самого АЛУ, формирования флагов
	// внутренних шин, коммутаторов на шинах, управления коммутаторами
	// внешних шин (адреса, данных)
	// внешних сигналов управления (M1, REFRESH, IRQ, NMI...), блока обработки и формирования этих сигналов
	// прочей управляющей логики (условные переходы, обмен регистров, префиксы и т.п.)
pfgx
Senior
Posts: 137
Joined: 20 Mar 2013 03:36
Location: Ростов-на-Дону

Post by pfgx »

Stan wrote:А из Ваших разработок не видно пока, как выполняется команда DAD RP?
Судя по тому, что АЛУ 4-битное, там должно быть 4 прохода через АЛУ, нет?
АЛУ 4-битное, но оно всё-таки работает с байтами.

Что известно о выполнении DAD RP на данный момент (всё может быть сдвинуто на полтакта или такт, так как я пока не уверен в работе синхронных частей схемы):
M1T1 - выполняется предыдущая инструкция
M1T2 - защёлкивается опкод 09h
M1T3 - чтение A и F
M1T4 - чтение L
M4T1 - чтение C
M4T2 - нет операций с регистрами
M4T3 - запись L
M4T4 - чтение H
M5T1 - чтение B
M5T2 - нет операций с регистрами
M5T3 - запись H
M1T1 - нет операций с регистрами
M1T2 - нет операций с регистрами
M1T3 - чтение A, запись F
M1T4 - выполняется следующая инструкция
pfgx
Senior
Posts: 137
Joined: 20 Mar 2013 03:36
Location: Ростов-на-Дону

Post by pfgx »

Изучаю управление АЛУ. Опять новый стиль рисования триггеров, а местами вообще на первый взгляд каша из транзисторов, даже входы/выходы определить не удаётся, пока не вникну в работу схемы.

Или процессор рисовало несколько человек, каждый свой блок в своём стиле, или по ходу рисования внезапно обнаруживалась более эффективная реализация того или иного триггера, и переходили на неё. Склоняюсь к первому варианту, потому что очень уж выделяются отдельные блоки процессора и построение схемы в каждом блоке.
pfgx
Senior
Posts: 137
Joined: 20 Mar 2013 03:36
Location: Ростов-на-Дону

Post by pfgx »

Нашёл интересную вещь...

В некоторых инструкциях M-цикл занимает 5 тактов, например, относительный условный переход выполняется за 4+3+5 тактов, причём последние 5 выполняются только при реальном переходе. То есть чтение опкода (4 такта) и смещения (3 такта) выполняется всегда, а 5 тактов вычисления адреса только если условие выполнено. Вычисляется адрес, кстати, при помощи АЛУ.

Есть и другие инструкции с 5-тактовыми циклами, но у меня они все выполнялись за 6-тактов. 6 тактов это максимум, на 6-м такте всегда происходит переход на следующий M-цикл. Причём T6 заведён только на схему "переноса" и больше никуда, то есть T6 вроде как холостой, никаких действий не производится, но с этим надо ещё разбираться.

T5 в схему переноса заведён только в одном месте - "T5 and M5 and w249". w249 равен 0 для некоторых инструкций, в которых есть 6-тактовые циклы, при их выполнении импульс во время T5 не формируется, происходит переход на T6, после чего начинается новый M-цикл. И произойти это может только на M5! А вот если убрать один транзистор, то "T5 and w249" выполняется корректно и 5-тактовым может быть любой M-цикл, не только M5.

Не та ли это "закладка" для защиты от копирования? Копия работать будет, но, например, условный переход будет выполняться не за 7/12, а за 7/13 тактов, и тестами можно определить оригинальный это процессор или копия. Могло быть так задумано?

Картинки и ответ местного художника :) там: http://forum.emu-russia.net/viewtopic.php?f=13&t=5380

добавлено
Сейчас подумал... это же все операции с IX+nn и IY+nn будут на 1 такт дольше выполняться!
pfgx
Senior
Posts: 137
Joined: 20 Mar 2013 03:36
Location: Ростов-на-Дону

Post by pfgx »

Как всегда есть вероятность наличия ошибки, но вроде ничего не забыл.

При выполнении mov R,R между отключением драйверов от внутренней шины данных (это происходит в момент перепада M1 1->0, то есть при начале чтения следующей иструкции) и началом записи проходит 1,5 такта (запись в регистр назначения завершается при перепаде M1 0->1, то есть при окончании чтения следующей инструкции). Если процессор работает на низкой частоте или в этот момент остановить тактирование, то шина может разрядиться и в регистр назначения запишется FFh (шина данных инвертирована).

Схема http://yadi.sk/d/QmxKHFc8NuBTq
// при CLK 1->0 :
// сигналы выборки sel*, записи reg_wr*, чтения reg_rd* "отрываются" от своих источников
// то есть используется те сигналы, которые были в момент CLK=1, при этом через небольшое время сигналы (которые до транзисторов) изменяются (!)
// активируются драйвера записи (драйвера чтения не меняют режим работы)
// регистры подключаются к шинам, происходит запись ИЛИ на 8-разрядных шинах появляются данные
// при CLK 0->1 :
// сигналы выборки, записи, чтения опять подключаются к источникам
// за счёт "ИЛИ-НЕ CLK" сразу же отключаются драйвера записи (данные на шинах регистров сохраняются какое-то время за счёт ёмкости проводников)
// за счёт "ИЛИ-НЕ CLK" регистры сразу же отключаются от шин
// из-за "замкнувшегося" транзистора сразу же активируются/деактивируются драйвера чтения (но выдают на шину данных какую-то хрень?)
// через некоторое время (4 инвертора) прямые и инверсные провода шины основных регистров подключается к "+" питания (precharge?)
// если активны драйвера чтения - через драйвера чтения этот "+" питания (лог. 1) попадает на 8-разрядные шины данных
pfgx
Senior
Posts: 137
Joined: 20 Mar 2013 03:36
Location: Ростов-на-Дону

Post by pfgx »

Хм, сейчас задумался - а может оно не в ёмкости проводников, а в АЛУ хранится? Надо всё-таки им заняться...

И ещё: специалисты по Verilog есть? Кто-нибудь может помочь описать шины со всеми их зарядами и коммутаторами?
Bronto
Writer
Posts: 17
Joined: 19 May 2014 03:47
Location: Челябинск

Post by Bronto »

pfgx wrote:О микрокоде (там обсуждалось viewtopic.php?t=7790 )
Если микрокодом считать регулярную структуру логических элементов, которая что-то декодирует и выдаёт управляющие сигналы, то там таких структур, если не придираться к регулярности, аж три штуки.
У вас скорее "hardware decoding"
чем микрокодирование...
Микрокодинг в дикретных процах изготовлялся ввиде полей из диодов...
почти как ферритовая память (если видели)....
только без ферритов )))
Bronto
Writer
Posts: 17
Joined: 19 May 2014 03:47
Location: Челябинск

Post by Bronto »

pfgx wrote:Хм, сейчас задумался - а может оно не в ёмкости проводников, а в АЛУ хранится? Надо всё-таки им заняться...

И ещё: специалисты по Verilog есть? Кто-нибудь может помочь описать шины со всеми их зарядами и коммутаторами?
Не проще-ли на реальном проце проверить?
И достоверность будет полная, в отличие от верилоговской модели.
Отладочный модуль же очень прост - D-триггер и всё. Выход его на сигнал готовности проца.
pfgx
Senior
Posts: 137
Joined: 20 Mar 2013 03:36
Location: Ростов-на-Дону

Post by pfgx »

Что на реальном проце проверить?
pfgx
Senior
Posts: 137
Joined: 20 Mar 2013 03:36
Location: Ростов-на-Дону

Post by pfgx »

http://yadi.sk/d/pDm0-qI6QxwdW

// что есть в этом файле:
// регистр текущей инструкции, декодер инструкций, группировка инструкций, прочая логика декодера
// логика условных инструкций (переходы, возвраты, ldir/lddr)
// счётчик M-циклов и T-тактов (почти рабочий)
// управление коммутаторами внутренней шины данных
// входы INT и NMI, выход HALT (частично) TODO
// вход BUSRQ и выход BUSACK (частично) TODO
// выходы M1, REFRESH, MREQ, IORQ, RD, WR
// формирование сигналов управления АЛУ (частично)
// формирование сигналов управления блоком регистров: выбор регистров, управление буферами чтения-записи
// todo и ошибки

// чего нет в этом файле:
// регистров
// АЛУ, формирования флагов
// внутренних шин, коммутаторов на шинах
// внешних шин (адреса, данных)
// прочей управляющей логики (обмен регистров, префиксы, прерывания и т.п.)
pfgx
Senior
Posts: 137
Joined: 20 Mar 2013 03:36
Location: Ростов-на-Дону

Post by pfgx »

Добрался до IFF1/IFF2 и что-то мне кажется, что описание ошибки http://ivr.webzone.ru/articles/ldar_new/index.htm не совсем точное...
pfgx
Senior
Posts: 137
Joined: 20 Mar 2013 03:36
Location: Ростов-на-Дону

Post by pfgx »

Нет, там всё верно, IFF1 и IFF2 при прерывании сбрасываются на последнем такте текущей инструкции, а флаги сохраняются при чтении следующей (конвейер...). Меня сбило с толку то, что при IFF2=0 блокируется выход декодера для инструкций ld a,r и ld a,i. У декодера 3 таких выхода, блокируется только тот, который отвечает за копирование IFF2 в флаг чётности. У авторов была идея блокировать прерывания на время выполнения этой инструкции, но потом они почему-то передумали (удалён проводник в слое металлизации). На время выполнения ei/di прерывания блокируются, но с учётом особенностей синхронизации прерывание будет обработано только после выполнения следующей за ei/di инструкции.

Ещё я не нашёл разницы между retn и reti. Обе (или 8, если считать и недокументированные, декодер их не различает) выполняются как обычный ret, но при этом копируют IFF2 в IFF1.