Вход

Просмотр полной версии : Реверс-инжиниринг Z80



Страницы : 1 2 [3] 4

Titus
09.10.2024, 18:09
Не очень понял как можно сломать схему, если перепутать название (полярность) сигнала, ну да ладно :)
В смысле как? Если я вместо, допустим, 2ИЛИ-НЕ впилю 2ИЛИ, то схема сломается.

org
09.10.2024, 20:40
В смысле как? Если я вместо, допустим, 2ИЛИ-НЕ впилю 2ИЛИ, то схема сломается.

А почему должен впиливаться какой-то другой вентиль? Если переименовать провод он по другому работать не будет. Тут судя по всему не в полярности проводов дело, а в том что трансы перегоняются в вентили неправильно. Полярность сигнала тут причём?

Titus
09.10.2024, 21:00
И наконец, особенности установки 5 и 3 бит регистра флагов после выполнения команды BIT r,(HL).

В команде BIT n,(HL) в отличие от команд типа ALU (HL) цикл чтения аргумента из памяти (M4) длится 4, а не 3 такта!
Почему такое происходит, при том что команды абсолютно однотипные?
Дело в том, что все команды с префиксом CB активизируют сигнал GRP_OFFSET, как и команды работающие только с индексной адресацией. Очевидно, это сделано для универсализации работы набора CB с индексной адресацией. А быть может просто вследствие ошибки. Если бы не эта совершенно ненужная особенность, команда BIT n,(HL) выполнялась бы не 12, а 11 тактов.
Сигнал GRP_OFFSET в основном влияет на циклы M2 и M3, отвечающие за индексную адресацию. Но при этом он еще и влияет на длительность цикла M4, продлевая его с 3 до 4 тактов. И этот 4-й такт совершенно для нашей команды бесполезен!
Но самое главное, что в такте M4.T4.2 всегда активно чтение старшего байта выбранного регистра на шину HBUS. А какой же регистр у нас выбран? А выбран WZ, т.к. когда не выбран никакой регистр, всегда выбирается WZ. В результате на обьединенной шине HBUS/LBUS оказывается не содержимое рабочего регистра r, как в команде BIT n,r, а старший байт регистра WZ, который используется другими командами для вычисления исполнительного адреса при индексной адресации.
Возникает вопрос, ведь в последнем такте любой команды должен выбираться регистр PC, и это должно блокировать выбор WZ?
Нет, не блокирует, т.к. выбор регистра PC для чтения кода операции управляется отдельной линией, и не блокирует выбор WZ. Иными словами, в первом такте следующей за BIT n,(HL) команды одновременно читается регистр PC из дополнительного регистрового блока (регистры PC и IR) для выборки кода команды, и читается регистр WZ.H из основного регистрового блока на шину HBUS/LBUS, откуда через несколько тактов и попадает в 5 и 3 биты флагового регистра.

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


А почему должен впиливаться какой-то другой вентиль? Если переименовать провод он по другому работать не будет. Тут судя по всему не в полярности проводов дело, а в том что трансы перегоняются в вентили неправильно. Полярность сигнала тут причём?
При чем тут название провода. От имени ничего не меняется. Когда я перегоняю трансы в вентили, либо же когда оптимизирую схему, соединяя несколько вентилей в триггер, или меняя полярность какой-то линии, т.к. в оригинале она инверсная, а для лучшего понимания схемы следует линию сделать прямой. Вот тут и может закрасться ошибка. Повторюсь еще раз, я не делаю схему для клонирования ее в ФПГА. Прежде всего я делаю схему, чтобы она была наглядной и понятной, поэтому вследствие этих оптимизаций и может закрасться ошибка перепутанной полярности.

org
09.10.2024, 21:33
При чем тут название провода. От имени ничего не меняется. Когда я перегоняю трансы в вентили, либо же когда оптимизирую схему, соединяя несколько вентилей в триггер, или меняя полярность какой-то линии, т.к. в оригинале она инверсная, а для лучшего понимания схемы следует линию сделать прямой. Вот тут и может закрасться ошибка. Повторюсь еще раз, я не делаю схему для клонирования ее в ФПГА. Прежде всего я делаю схему, чтобы она была наглядной и понятной, поэтому вследствие этих оптимизаций и может закрасться ошибка перепутанной полярности.

Понял. Мы этот процесс называем "деморганизация". За годы убедились что оно подвержено ОЧЕНЬ большому количеству ошибок и поэтому лично я де-Моргана не проворачиваю. Оставляю как есть.

Titus
09.10.2024, 21:41
За годы убедились что оно подвержено ОЧЕНЬ большому количеству ошибок и поэтому лично я де-Моргана не проворачиваю. Оставляю как есть.
Ну ведь они же выявятся, когда схема не заработает? И исправятся)

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

Да, через 'деморганизацию' у меня прошла вся схема вдоль и поперек.

org
09.10.2024, 22:06
Ну ведь они же выявятся, когда схема не заработает? И исправятся)

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

Да, через 'деморганизацию' у меня прошла вся схема вдоль и поперек.

Нет деморгана - нет дополнительных ошибок. Исправятся, да, но зачем вносить лишние ошибки

Titus
09.10.2024, 22:15
Нет деморгана - нет дополнительных ошибок. Исправятся, да, но зачем вносить лишние ошибки

У меня нет другого варианта преобразовать схему в самый дружественный и понятный вид, кроме как таким образом.

org
10.10.2024, 07:27
У меня нет другого варианта преобразовать схему в самый дружественный и понятный вид, кроме как таким образом.
Ну опять же возвращаясь к теме "понимания". Комбинаторно-последовательностная логика, в которой ты копаешься - понимается путём изучения временных диаграмм.
Это brainchild разработчиков чипа.
Даже если ты красиво восстановишь схему - тот кто будет искать практическое применение не будет изучать вентили - "ммм а тут у нас AND, тот OR агась потом это идёт на этот FF". Ему интересней будет понимать какие диаграммы порождает данный кусок логики. Схему никто "читать" не будет, только в крайнем случае, если возникнут вопросы, на которые нельзя ответить просматривая вейвы.
Это тоже самое что восстанавливать дизассемблированный код умножения двух матриц написанный на SSE. Не нужно понимать почему одна SSE следует за другой. Нужно понимать просто как работает каждая инструкция ("вентили") и что в итоге делает весь кусок кода ("логики").

И к другим новостям. Я начал восстанавливать топо верхнего левого угла тошибовского з80. Там находится клоковый гена, буферы для DB интерфейса и АЛУ.

Titus
10.10.2024, 10:41
Ну опять же возвращаясь к теме "понимания". Комбинаторно-последовательностная логика, в которой ты копаешься - понимается путём изучения временных диаграмм.
Изучение диаграмм - это смотреть только на последствия, но не на причину.
Для простого повторения чипа в ФПГА и контроля идентичности - вполне подходяще. Экономит время и деньги.
Однако, для моих целей - детального изучения особенностей работы Z80 смотреть только на последствия - не информативно.
Попробуй найти, почему шумит команда SCF/CCF по диаграммам? Диаграммы даже не покажут этот шум.
Почему OUT (c),0 выдает ноль? Почему BIT n,(HL) выставляет так флаги, и как?
Видя схему, это понимается достаточно легко и быстро.
Диаграммы модели в проекте Z80 Explorer существуют уже 10 лет. Но как-то это не особо продвинуло в понимании некоторых загадок Z80, которые без видения причин, а не последствий отгадать можно только умозрительно и предположительно.
Твой подход хорош для твоих целей. А мой для моих. Каждому своё)

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


И к другим новостям. Я начал восстанавливать топо верхнего левого угла тошибовского з80. Там находится клоковый гена, буферы для DB интерфейса и АЛУ.
Лучше картинки не прикреплять средствами форума, они несмотрибельные.
Лучше на сторонний хостинг. Мы использовали pic.maxiol.com, хотя по стечению обстоятельств, он сегодня первый день, как не работает)

Titus
10.10.2024, 16:50
Упрощенное описание команд LDI(R)/LDD(R):


В такте M1.T4 сбрасываются флаги N и H.

В такте M2.T1 содержимое HL записывается в PCR и на шину адреса для чтения содержимого памяти по адресу (HL).
В такте M2.T3 инкрементированное (для LDI(R)) или декрементированное (для LDD(R)) содержимое PCR обратно записывается в регистр HL.

В такте М3.T1 содержимое DE записывается в PCR и на шину адреса для записи байта в память по адресу (DE).
В такте M3.T3 инкрементированное (для LDI(R)) или декрементированное (для LDD(R)) содержимое PCR обратно записывается в регистр DE.
В такте M3.T4 содержимое BC записывается в PCR. Если BC = 1, то флаг P=0, иначе флаг P=1. Если BC = 1 или команда LDI/D, то этот цикл является последним циклом команды.
В такте M3.T5 декрементированное содержимое PCR записывается обратно в регистр BC. Также в этом такте + 1 на шину HBUS выдается результат работы АЛУ. В нашем случае (точно пока не изучал) АЛУ должно было сложить содержимое регистра A и байта, который копировался из (HL) в (DE). Таким образом, 5 и 3 биты регистра флагов берутся из A + (HL).

В такте M4.T1 содержимое PC записывается в PCR.
В такте M4.T3 декрементированное содержимое PCR записывается обратно в PC и снова читается в PCR
В такте M4.T5 декрементированное содержимое PCR записывается обратно в PC.

AlexG
10.10.2024, 21:24
Мои пять копеек. Нарисовать "транзисторную схему" - значит понять ВСЕ нюансы поведения схемы. Особенно если применить аналоговое моделирование (что то типа Verilog-AMS). Если рисовать сходу "логическую схему" - то потеряется ВСЯ информация об UB (неопределённое поведение). Посему можно добиться "правильного поведения" при "правильных входных воздействиях", но если создать "не штатную ситуацию" - "логическая схема" даст сбой в поведение (она не будет на все 100% совпадать с оригиналом.).
Задача сего топика - это полноценное вскрытие "чОрного ящика" для полноценного раскрытия оного UB.
ПС: а для целей создания сеги/несов итд это излишнее знание...

org
11.10.2024, 20:01
Мои пять копеек. Нарисовать "транзисторную схему" - значит понять ВСЕ нюансы поведения схемы. Особенно если применить аналоговое моделирование (что то типа Verilog-AMS). Если рисовать сходу "логическую схему" - то потеряется ВСЯ информация об UB (неопределённое поведение). Посему можно добиться "правильного поведения" при "правильных входных воздействиях", но если создать "не штатную ситуацию" - "логическая схема" даст сбой в поведение (она не будет на все 100% совпадать с оригиналом.).
Задача сего топика - это полноценное вскрытие "чОрного ящика" для полноценного раскрытия оного UB.
ПС: а для целей создания сеги/несов итд это излишнее знание...

Никто не запрещает модули где есть UB разметить специальным образом, в том числе тупо трансами.

AlexG
11.10.2024, 20:51
Оба правы. Давайте жить дружно. У каждого свои цели и способы (адекватные к задачам). Лично мне нравится способ ТС.

Titus
12.10.2024, 02:03
Лично мне нравится способ ТС.
Товарищ Vslav, который и заварил всю эту кашу с реверсами на форуме, делал вообще только транзисторную схему, а уже с нее Verilog-модель. И если что, сверялся только с транзисторной. Я так не могу, мне нужна транзисторная, как базис, и логическая, как удобная для быстрого анализа и оптимизации.

org
12.10.2024, 23:35
Заполнены разделы по клоковому гене и по интерфейсу с внешней шд.

https://github.com/emu-russia/SEGAChips/blob/main/T84C/clkgen.md
https://github.com/emu-russia/SEGAChips/blob/main/T84C/db.md

(включая анализ падов)

Также подглядывая в NMOS Z80, сформировалось 2 подозрения (пока нет 100% уверенности):
- чип в Visual Z80 лежит вверх ногами
- сигнал clk в Visual Z80 на самом деле _clk (active-low), т.к. из того что я вижу у себя в регблоке - на время clk=0 производится подзарядка бит лайнов ячеек SRAM и регистры в этом время использовать нельзя ("команды" reg_load_xxx).

https://i.imgur.com/lwBCOnv.png

Такие картинки у нас показывал ув. М.Гамаев, где явно видно что reg_load_af активируется на clk=0, что мне очень подозрительно.

Titus
12.10.2024, 23:45
- сигнал clk в Visual Z80 на самом деле _clk (active-low), т.к. из того что я вижу у себя в регблоке - на время clk=0 производится подзарядка бит лайнов ячеек SRAM и регистры в этом время использовать нельзя ("команды" reg_load_xxx).
А в чем несостыковка? Внешний вход /CLK инверсный, затем внутри он инвертируется. Т.е. при внешнем CLK = 0 заряжаются лайны.

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


- чип в Visual Z80 лежит вверх ногами
В смысле вверх ногами? Чип крутят так, как удобно, у него нет ни верха, ни низа) А то, что надписи на кристалле ориентированны в какую-то сторону, это еще ничего не значит.

org
12.10.2024, 23:56
А в чем несостыковка? Внешний вход /CLK инверсный, затем внутри он инвертируется. Т.е. при внешнем CLK = 0 заряжаются лайны.

Несостыковка в том, что по даташитам - он Active High. И как раз с учётом всех инверсий в CMOS Z80 - внутренний clk такой же полярности, что и внешний.

https://github.com/emu-russia/SEGAChips/raw/main/T84C/logisim/clkgen.png

Titus
13.10.2024, 00:29
Несостыковка в том, что по даташитам - он Active High.
В даташите от Zilog'а он инверсный:
https://pic.maxiol.com/images2/1728768537.1595414782..png

org
13.10.2024, 00:51
В даташите от Zilog'а он инверсный:
https://pic.maxiol.com/images2/1728768537.1595414782..png

Я вот сижу и думаю - что это значит если CLK - Active Low.

Также сижу втыкаю в z80 remix и в упор не вижу, чтобы входной пад назывался _clk:

https://i.imgur.com/CESj5sL.png

Titus
13.10.2024, 00:57
Также сижу втыкаю в z80 remix и в упор не вижу, чтобы входной пад назывался _clk:
Видимо, назвали пин, как в старых даташитах без инверсии.

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


Я вот сижу и думаю - что это значит если CLK - Active Low.
Это загадка, но ее надо просто принять)

AlexG
13.10.2024, 02:29
Где то когда то что то слышал что: клок можно оставлять в неизменном состоянии только в одном логическом состоянии. Примерно так: клок==0 то все состояния в проце в зафиксированном состоянии, а при ==1 состояние изменяется и не может находится в устойчивом состоянии. Как то вот так - малость мутно мысль моя...

Titus
13.10.2024, 02:58
Где то когда то что то слышал что: клок можно оставлять в неизменном состоянии только в одном логическом состоянии. Примерно так: клок==0 то все состояния в проце в зафиксированном состоянии, а при ==1 состояние изменяется и не может находится в устойчивом состоянии.
Да, оставлять можно только в '1', т.е. внешний инверсный уровень - это '0'.
Иначе внутренние динамические латчи, сделанные за счет удержания заряда на емкостях затворов, разрядятся и все.

org
13.10.2024, 19:42
В смысле вверх ногами? Чип крутят так, как удобно, у него нет ни верха, ни низа) А то, что надписи на кристалле ориентированны в какую-то сторону, это еще ничего не значит.

Сорь не ответил.
Таки у чипа есть "верх" и "низ" - это то, как он сориентирован по отношению к лид фрейму и выводам пекеджа:

https://i.imgur.com/92T6IyO.png

В случае з80 - слева вверху находится CLK (который между прочим в старых даташитах Active High), затем по часовой идут пады A15, A14, и т.д.
Такой же layout сохраняется и для CMOS версий сабжа.

Titus
14.10.2024, 11:11
Решил все же ознакомиться немного с Verilog'ом.

Попробовал найти этот бесплатный популярный ModelSim. Оказывается, его нет в свободном доступе.
Нашел на торрентах какой-то из последних (хотя это 2018 год) modelsim-win64-10.6d-se, посмотрю, что это. Если это вообще то.

org
14.10.2024, 15:05
Попробуй Icarus Verilog.
https://bleyer.org/icarus/

Titus
14.10.2024, 15:31
Попробуй Icarus Verilog.
https://bleyer.org/icarus/
Я уже начал ModelSim пробовать. Тем более, как я понял, он самый популярный.

Titus
14.10.2024, 17:54
Оказалось, сходу так не войдешь в мир Verilog и ModelSim) Сразу то тут непонятно, то сям)

Понятно, что можно проштудировать кучу док, и постепенно во все вьехать, но не хочется тратить на старте много времени.

Несколько таких быстрых вопросов по ModelSim:

Сделал прям простейший тест счетчика


module counter (
input wire clk,
output reg [7:0]data
);

always @ (posedge clk)

data <= data + 8'h01;

initial
data = 8'h55;

endmodule



`timescale 1ms/1ms

module testbench;

reg clk;
wire [7:0] data;

counter TESTCTR(clk, data);

always
#10 clk = ~clk;

initial
begin
clk = 0;
end


initial
$monitor("clk=%b, data=%b", clk, data);


endmodule


1. Как заставить ModelSim запоминать расположение окон? Каждый раз при запуске приходится расставлять размеры и позиции вручную.
2. Почему работает только меню 'Simulation without optimization'? При запуске через 'Simulatioin' или 'Simulation with full Optimization' руается:

''# ** Fatal: Internal Error - vopt returned success but vsim could not find a design to simulate!. Please contact customer support for further assistance.
# Error loading design'

3. Есть ли горячие клавиши на 'Run -Next' и прочие Run'ы?
4. Что означает 'Run 100'?

5. Почему при переносе сигналов из окна Objects в окно Wave у них появляются длинные имена типа testbench/clk? Мне нужны короткие - clk.

https://pic.maxiol.com/images2/1728917506.1595414782.clipboard101420240.jpg

org
14.10.2024, 21:39
оффтоп же.

По верилогу рекомендую книгу Соловьёва.
"Основы языка проектирования цифровой аппаратуры Verilog | Соловьев Валерий Васильевич"


Я уже начал ModelSim пробовать. Тем более, как я понял, он самый популярный.
для икаруса кроме блокнота для набора верилога больше ничего не нужно. В состав входит GTKWave, для просмотра .vcd дампов.

ModelSim и подобные (Quartus, PlanAhead/Vivado) - это монструозные комбайны на несколько гигабайт.

Titus
14.10.2024, 21:51
ModelSim и подобные (Quartus, PlanAhead/Vivado) - это монструозные комбайны на несколько гигабайт.
Это я уже понял) Но раз уж он пользуется такой популярностью, решил начинать с него.

AlexG
14.10.2024, 23:02
ModelSim к сожалению ничего не подскажу. лет 10 назад пробовал использовать. С тех пор у вивады свой симулятор - не скажу что прелесть - но на мои нужды хватает. Другими то же не пользовался. (я не фанатичный фанат "свободного софта"). В программах симуляции надо быть внимательным с точки зрения "где код, для которого можно выполнить синтез, а где код только для симуляции". Иначе можно создать "сферического коня".

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

В догонку.
1 - возможно есть "кнопка" сохранить wavewindow.cfg
2 - хз
3 горячие кноки кажется были - надо хелп смотреть или настройки
4 'Run 100' кажется время выполнения моделирования в единицах us (гдето в настройках было).
пс
давно это было

пспс: конечно можно ограничиться только моделированием, но (моё имхо) лучше совмещать реализацию и симуляцию

Titus
14.10.2024, 23:08
лучше совмещать реализацию и симуляцию
Что это означает?

AlexG
15.10.2024, 00:22
собственно сообщение 527.

в module counter должен быть ТОЛЬКО синтезируемый код.
а в module testbench всё что относится к тестированию.
Собственно там так и сделано - норм.
По module counter (в вивадо или алтера) можно посмотреть "схему" во что превращается описание. Какие есть возможности у других программ - я без понятия.

and1981
15.10.2024, 10:15
Да, оставлять можно только в '1', т.е. внешний инверсный уровень - это '0'.
Иначе внутренние динамические латчи, сделанные за счет удержания заряда на емкостях затворов, разрядятся и все.

Затворные емкости в любом случае разрядятся со временем, ибо существует ток утечки затворной емкости в нашем неидеальном мире :smile: И для чипов использующих динамические латчи в доках обычно прописывается минимально возможная частота клока, при которой динамические латчи работают без амнезии :biggrin:. Также возможны варианты построения ДФФ на паре SLATCH + DLATCH, в этом случае статический латч обычно идет первым в цепочке и сохраняет свое состояние при отсуствии клока очень продолжительное время, а следующий динамический латч повторяет входные данные с первого слатча.

Titus
15.10.2024, 10:47
Пока никто не прояснил мои вопросы (https://zx-pk.ru/threads/34173-revers-inzhiniring-z80.html?p=1205039&viewfull=1#post1205039) по ModelSim, спрошу еще по Verilog'у:
Как обычно реализуют модули с двунаправленными шинами? Например, как шина данных на Z80?

and1981
15.10.2024, 11:39
Пока никто не прояснил мои вопросы (https://zx-pk.ru/threads/34173-revers-inzhiniring-z80.html?p=1205039&viewfull=1#post1205039) по ModelSim, спрошу еще по Verilog'у:
Как обычно реализуют модули с двунаправленными шинами? Например, как шина данных на Z80?
Если это внешняя двунаправленная шина то через примитив TRI.

assign DATA[7:0] = ~RW ? DOR[7:0] : 8'hZZ; Также, драйвить шину могут несколько источников, необходимо разрулить доступ к шине без конфликтов в таком случае.

Titus
15.10.2024, 11:56
Также, драйвить шину могут несколько источников, необходимо разрулить доступ к шине без конфликтов в таком случае.
Как именно обычно это делают?

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


Если это внешняя двунаправленная шина то через примитив TRI.
В виде чего DATA обозначается в параметрах модуля? У него же только Input или Output параметры.

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

Можно привести маленький пример модуля с двунаправленной шиной?

SegaBoy
15.10.2024, 12:28
В виде чего DATA обозначается в параметрах модуля? У него же только Input или Output параметры.

Ещё есть Inout

and1981
15.10.2024, 12:29
DATA объявляется так :
inout[7:0] DATA;

Вот наш с Оргом общий проект старого верилога 6502 https://github.com/andkorzh/OLD-Verilog-MOS6502/blob/main/Verilog/Core6502.v
Топ модуль содержит двунаправленную шину DATA[7:0].

От конфликтов избавится можно путем разделения доступа с помощью комбинаторики, чтобы исключалась возможность одновременного присуствия двух и более драйверов на шине. Обычно процессоры в своей внутренней логике уже содержат подобные блокировки, и оно будет работать "из коробки" если точно повторять внутреннюю структуру чипа. Например декодер портов чтения, который имеет только одно значение на выходе и управляет загрузкой данных на шину из разных источников, это избавляет от этой проблемы полностью.

Titus
15.10.2024, 12:41
Обычно процессоры в своей внутренней логике уже содержат подобные блокировки, и оно будет работать "из коробки" если точно повторять внутреннюю структуру чипа.
Как это делается в настоящих процессорах, я прекрасно знаю)
Меня интересует именно Verilog описание версии, которая годится для FPGA. Т.е. без настоящих Z-состояний.

AlexG
15.10.2024, 21:57
module top(
input clk,
input rd,
input wr,
inout data
);

reg data_out;
wire data_in;

always @(posedge clk)
if (wr)
data_out = data_in;


assign data = rd ? data_out : 1'bz;
assign data_in = data;

endmodule
81408

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

module top(
input clk,
input csA,
input csB,
input dataA,
input dataB,
output data
);

reg data;

always @(posedge clk)
begin
case ({csA,csB})
2'b10: data = dataA;
2'b01: data = dataB;
2'b00: data = data;
default: data = 1'b1;
endcase
end

endmodule
81409 81410

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

Ну или вот такое извр

always @(posedge clk)
begin
data <= csA ? dataA : csB ? dataB : 1'bz;
end
81411 81412

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

Можно - но НЕ нужно использовать значение 1'bz внутри схемы.
1'bz - это для ВНЕШНИХ буферов (физический вывод).
ПС: примеры не самые изящные - айэмсорри (с)

Titus
15.10.2024, 22:09
Можно - но НЕ нужно использовать значение 1'bz внутри схемы.
1'bz - это для ВНЕШНИХ буферов (физический вывод).
Ну да, понятно, что если процессор находится в составе какого-то компьютера, и все это на одном FPGA, то ему реальные Z-состояния не нужны.

aviator
15.10.2024, 23:27
ModelSim это всегда был кровавый энтерпрайз и проприетарщина от Mentor Graphics, а потом вроде как от Сименса.
На старой работе его покупали вместе с Квартусом, в лохматых нулевых, за какие-то сумасшедшие деньги.

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

ИМХО, с наскока, без книжек, в нём никак. Монструозный комбайн.
Сейчас посмотрел несколько скриншотов новых версий - отдалённо напоминает, что было. Но переиначили всё сильно.

Titus
15.10.2024, 23:37
ИМХО, с наскока, без книжек, в нём никак. Монструозный комбайн.
Значит не я такой тупой, что сходу не могу вьехать в нормальную работу с ним)

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

Может действительно лучше Икарус ставить или Вивадо сразу?

AlexG
15.10.2024, 23:58
1) ну как бы да. Mentor Graphics - это всегда Монстр. Ужасный инсталятор, куча каталогов в корне диска итд итп.
2) За икаруса не скажу (не фанат фрихалявы , или что там с лицензией). Если разобраться то возможно норм.
3) квартус - работает быстрее вивады, но тоже монстр. разные версии умеют разные плисы, гдето есть симулятор , гдето возможно и нет (запутано там всё) - лекарства простого нет (это если приспичит)
4) вивадо если брать современную версию - то качать 100гб (но это абсолютно всё - все виды плис, все компиляторы, и до кучи инсталятор для виндов и для линуха). Лекарство простенькое, но по жизни в 99% не требуется. другими словами "халява сэр".
пс есть нюанс - вивада (современная) только 64бит. квартус аналогично.

Titus
16.10.2024, 00:03
пс есть нюанс - вивада (современная) только 64бит. квартус аналогично.
Мне все равно, сколько весит, и 64 бита мне подходит.
Главное, чтобы удобно и понятно работать в среде.
А работа моя на минималках - погонять простой проект на графиках, посмотреть в виде схемы.

AlexG
16.10.2024, 00:20
ну как вариант
"азбука как устанавливать в картинках"
https://docs.amd.com/r/en-US/ug973-vivado-release-notes-install-license/Installing-the-Vivado-Design-Suite-Tools
Брать можно торренте - быстрее и проще.
В общем случае требуется только
Xilinx_Unified_2024_1_0522_2023.iso
ПС: как всегда есть нюансы. на торенте перепакованный из tar.gz (оригинальный формат распространения) архива (100гб) в образ сд-диска iso (типо так удобнее). Я беру (качаю только с сайта оригинал - посему всегда уверен в качестве товара)
ПС: для скачки оригинала требуется почта буржуйская и впн (для регистрации на сайте)

Titus
16.10.2024, 00:23
ПС: как всегда есть нюансы. на торенте перепакованный из tar.gz (оригинальный формат распространения) архива (100гб) в образ сд-диска iso (типо так удобнее). Я беру (качаю только с сайта оригинал - посему всегда уверен в качестве товара)
Так откуда брать, с торрента, или оттуда не надо?

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


ну как вариант
"азбука как устанавливать в картинках"
Хорошо бы в картинках, как собрать и посмотреть графики самого простого проекта.

AlexG
16.10.2024, 00:39
1) торент не требует заморечек с почтой и впн. но на счёт зппп я не вкурсе. тк я пользуюсь официальными услугами.
2) как вариант
https://docs.amd.com/r/en-US/ug888-vivado-design-flows-overview-tutorial/Using-the-Project-Design-Flow
но там есть излишняя инфа для первых шагов.
проще спросить
3) есть ещё мультики
https://www.xilinx.com/video/hardware/getting-started-with-the-vivado-ide.html
но это для 2015 версии (на половину устарело по актуальности).

Titus
16.10.2024, 15:56
но там есть излишняя инфа для первых шагов.
проще спросить
Поставил виваду, гораздо все дружественней, чем в ModelSim. Добавил два своих тестовых файла - счетчик и тесбенч, и он сразу понял, кто из них какого уровня, как компилить. Нажимаешь симуляцию, и все просимулировал сам. Красота. С ModelSim не сравнится по удобству. Во всяком случае пока что.
Правда, пришлось поставить хотя бы одну девборду, без нее не хотел создавать проект.
И еще при запуске Run Syntesis (видимо под эту борду) он когда происинтезировал и открыл, то завис и закрылся. Видимо, потому что борды нет и кабеля нет.
Вопрос такой - какие функции мне нужно использовать в виваде для моих начальных целей? Как симулировать вроде в общих чертах понятно. Как посмотреть логическую схему?
Что еще нужно основного знать или какие клавиши?

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

Хм, может я рано порадовался?
Запустил Schematic, он просинтезировал схему, открыл и тут же закрылся. Как и с синтезированием на борду.
Едва успел поймать скриншот экрана перед зависанием (закрытием):
https://pic.maxiol.com/images2/1729083310.1595414782.clipboard101620240.png

Titus
16.10.2024, 18:00
В общем, нашел проблему. Видимо, надо было установить пакет для какой-то реальной борды. Установил на спартан-7, выбрал борду наобум и все заработало стабильно.

AlexG
16.10.2024, 20:50
1) какая операционка на хосте (на компе)? вин или линух ? номер версии ?
2) демо плату совсем не обязательно устанавливать/использовать. Можно просто указать тип плисы: пример xc7s50csga324-1 (там в окошке выбирается)
3) Сколько памяти ? своп в наличии ?
4) слева есть FLOW Navigator - там все основные "нужные" кнопки
5) загляни в DOCNAV (красивая красная иконка)- там офигеный каталог документации. Единственно он потом докачивает из инета pdf-ки.
6) ug893 vivado Design Suite UserGuideUsing the Vivado IDE - тута в картинках где нужные кнопки и куда смотреть.
7) и да местами синтез энд компани струдом переваривают "заворо кишок" таки как на скриншоте. вход с выходом закорочен. может по этому вылетать. Аксакалы уровня 3+ такие схемы обычно уже не рисуют.
Алгоритм (очень усреднённо)
1) после наколачивания текстов запускаю eleborated/schematic
2) думать. если надо см п1
3) симулятор behavearal
4) думать. если надо см п1

По началу этого за глаза и уши хватит.
ПС если не устанавливать файл с лицензиями - то вивадо умеет работать токмо с младшими семействами плис Спарта/Артикс/Кинтекс (это если кратенько) . Но опять же этого выше крыши для бытовых целей.

Titus
16.10.2024, 21:03
1) какая операционка на хосте (на компе)? вин или линух ? номер версии ?
Windows 10


2) демо плату совсем не обязательно устанавливать/использовать. Можно просто указать тип плисы: пример xc7s50csga324-1 (там в окошке выбирается)
Так и сделал


3) Сколько памяти ? своп в наличии ?
Памяти 32Гиг

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

В общем, мое впечатление от вивады пока что прекрасное по сравнению с модельсимом. Дружественно человеку.

На счет двунаправленных шин я так решил - не надо делать то, что не реализуемо в железе (ПЛИС). Надо сделать отдельно шину DataIn, отдельно DataOut. Ну и всякие дополнительные сигналы типа DataZ. А уж внешние модули сами будут решать, как обьединить процессор, память и т.д. Либо же, если порты проброшены на реальные порты ПЛИС, то там уже будет реальная двунаправленная шина с Z-состоянием.

Titus
17.10.2024, 17:46
Еще несколько вопросов по Verilog:

1. Какова область видимости модулей? Сколько может быть модулей верхнего уровня в одном проекте, и как IDE определяет, какой модуль является верхним?
2. Зачем при определении регистров в примерах иногда есть присвоения, например: reg [7:0] reg1 = 8'h0? В какой момент исполнения идет это присвоение? Если один раз при старте проекта, то чем оно отличается от присвоения в блоке initial? Эти начальные присвоения нужны только для тестирования в симуляторе, или же они работают так же в реальной FPGA? Если в реальной тоже, то в какой момент времени и как эти начальные значения загружаются в регистры?э
3. Какие правила 'хорошего тона' в именовании цепей и именовании модулей? Каков стандарт табуляции, сколько пробелов? Ну и другие правила хорошего тона в написании.

backa
17.10.2024, 19:17
Сколько может быть модулей верхнего уровня в одном проекте
я далеко не профи (тоже учусь в этой области, правда VHDL) но, как говорится , в правильно поставленном вопросе есть ПОЛОВИНА ответа)))
Так вот - на то он и верхний уровень - он сверху над всеми и значит ОН - ОДИН)))


как IDE определяет, какой модуль является верхним
юзер САМ ОБЯЗАН его указать IDE.

AlexG
17.10.2024, 21:04
1) Общее правило. Один модуль == Один файл == Одинаковое название.
2) Топ всегда единственен. ИДЕ (если включено автоматическое обновление иерархии - обычно по умолчанию включено) сам выбирает ТОП. если есть варианты - то предлагает выбрать. Можно ручками указать. ПКМ на файле с нужным модулем и "set as top".
3) reg [7:0] reg1 = 8'h0 оное подразумевает исходное однократное инициализация триггеров. Должно работать в реальной плисе.
initial - это в общем случае я использую только для симуляции. Более точнее область применения надо читать ГОСТ на язык.
initial "выполняется" с "нулевого времени симуляции". initial может быть больше одного. Выполняются в параллель.
4) эстетику можно посмотреть где-то здесь
C:\Xilinx\Vivado\2024.1\data\ip\xilinx\axi_tft_v2_ 0\hdl\axi_tft_v2_0_rfs.v
ПС: я больше "топлю" за systemverilog. Повторюсь: это работа "над ошибками" в реализации verilog. Плюс добавлено куча всего для тестирования (это вообще заоблачный экспириенс).
из явного и простого:
1) можно "забыть" про wire и reg ибо всё есть logic
2) многомерные массивы
3) можно явно указывать где схема просто логическая, а где с триггерами
4) зачётное понятие интерфейсы. это чтото типа
struct {
wire [15:0] adr;
wire [7:0] data;
wire rd;
wire wr;
} bus;

а потом использовать bus.rd или bus.data

backa
17.10.2024, 21:10
ИДЕ (если включено автоматическое обновление иерархии - обычно по умолчанию включено) сам выбирает ТОП. если есть варианты - то предлагает выбрать. Можно ручками указать
будем знать)

AlexG
17.10.2024, 22:00
Про видимость я не понял вопроса.
1) в любом модуле можно использовать любой другой.
2) в ниже стоящем нельзя использовать ТОП
3) Рекурсия запрещена.
4) если одно описание модуля используется несколько раз в других - значит создаётся столько же реальных экземпляров этого модуля.

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

В догонку. ТОП - это модуль, порты которого можно цеплять в выводам самой плисы.
Для проектов, которые предназначены только для отладки отдельных частей цеплять порты на выводы совсем не обязательно. да и имплемент тоже совсем не обязательно делать.
И да. аналогично назначается ТОП и для симуляции.


Про симулятор:
Глобально у симулятора три "режима"
- поведенчиский
- после синтеза (кажется с учётом задержек по элементам)
- после имплемента с учётом всех временных задержек (логики+дорожки).
первый самый быстрый
последний самый тормоз по симуляции

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

про видимость
по крайней мере в модуле для tb (точно работает в sv, в верилоге не в курсе) можно "вытаскивать наружу" любой сигнал из любого модуля из любого уровня вложенности

Titus
17.10.2024, 22:05
Как реализовать ОЗУ, в котором изначально в некоторые ячейки записаны какие-то значения?

Просто тупо в блоке initial присвоить?

AlexG
17.10.2024, 23:06
Один из вариантов (initial $readmemb("ram.mif", reg_array);)

module ram_xil(clk, addr, we, data_in, data_out);
parameter n = 4;

input wire clk, we;
input wire [n-1:0] addr;
input wire [7:0] data_in;
output reg [7:0] data_out;

reg [7:0] reg_array [2**n-1:0];

initial $readmemb("ram.mif", reg_array);

always_ff @(posedge clk)
begin
if (we == 1) begin
reg_array[addr] <= data_in;
end
data_out = reg_array[addr];
end

endmodule

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

Ну или (это общий стиль, сам пример по значениям ошибочен)
reg [15:0] cache_lru [0:3]; =
'{{2'h0, 2'h0, 2'h0, 2'h0, 2'h0, 2'h0, 2'h0, 2'h0, 2'h0, 2'h0, 2'h0, 2'h0, 2'h0, 2'h0, 2'h0, 2'h0},
{2'h1, 2'h1, 2'h1, 2'h1, 2'h1, 2'h1, 2'h1, 2'h1, 2'h1, 2'h1, 2'h1, 2'h1, 2'h1, 2'h1, 2'h1, 2'h1},
{2'h2, 2'h2, 2'h2, 2'h2, 2'h2, 2'h2, 2'h2, 2'h2, 2'h2, 2'h2, 2'h2, 2'h2, 2'h2, 2'h2, 2'h2, 2'h2},
{2'h3, 2'h3, 2'h3, 2'h3, 2'h3, 2'h3, 2'h3, 2'h3, 2'h3, 2'h3, 2'h3, 2'h3, 2'h3, 2'h3, 2'h3, 2'h3}};

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

вот только не помню initial здесь синтезируемая конструция или нет - старый стал , склероз мучает ;-)

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

но для симулятора точно работает

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

В меню tools-> language template можно смотреть примеры кода.

andrews
18.10.2024, 06:24
А дата изготовления?
у чипов DC год неделя, только британцы по своему выеживаются

Titus
18.10.2024, 10:48
у чипов DC год неделя, только британцы по своему выеживаются
Вообще не понял, на что этот ответ)

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

Еще несколько вопросов по vivad'е:

1. Как компилировать проект без запуска симуляции, чтобы просто проверить на ошибки?
2. Можно ли счетчику (регистру, вход которого соединен с выходом), не задавать никакого начального значения? Это используется в Z80, например, для выбора набора регистров, общий набор/альтернативный. Там абсолютно все равно, какой набор включен при старте процессора, т.к. наборы равнозначные. В vivad'е если такому регистру не установить начальное значение, то он всегда будет в неопределенном состоянии. Можно ли, чтобы при запуски в нем просто было случайное значение любое?
3. По поводу встроенных в ПЛИС модулей памяти. Когда я пишу вот такой простейший модуль памяти:


module ram(
input clk, // Тактовый сигнал для синхронного чтения
input [7:0] data_in, // Шина данных (8 бит) (ввод)
output reg [7:0] data_out, // Шина данных (8 бит) (вывод)
input [15:0] adr, // Шина адреса (16 бит)
input mreq, // Запрос доступа к памяти (на шине адреса установлен адрес для доступа к памяти)
// input rd, // Запрос чтения памяти
input wr // Запрос записи в память
);

reg [7:0] ram [0:15]; // ОЗУ на 16 байт

initial $readmemh("ram_image.mem", ram); // Загрузить дамп данных из файла в память

always @(negedge clk) // Активность по отрицательному фронту clk
begin
if (wr & mreq) // Если активны сигналы WR (запись) и MREQ (запрос памяти),
ram[adr] <= data_in; // то записать байт в память по адресу adr
else // Всегда, когда не записи, идет чтение памяти
data_out <= ram[adr]; // то выдать байт из памяти по адресу adr на выходной регистр шины данных
end

endmodule

Из него получается вот такая схема:
https://pic.maxiol.com/images2/1729236888.1595414782..png

Меня смущает, что RTL_RAM тактируется фронтом на входе WCLK, а сгенерированный регистр RTL_REG тактируется (но спадом). Тогда по логике, память работает по фронту CLK, а выходной регистр по спаду. Но это не соответствует моему коду. Почему так? Если у встроенной памяти есть на выходе защелка, зачем компилятор ставит дополнительную (RTL_REG)? И зачем тут вообще этот RTL_MUX?

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

4. Да, и как запомнить положение и соотношение окон в проекте? А то каждый раз при запуске симуляции все сьезжает.
5. И наконец снова не нарадуюсь, на сколько Vivado дружественней, чем ModelSim.
6. Как настроить, чтобы при запуске симуляции она запускалась сразу на какое-то количество временных отрезков заданное мною, чтобы я сразу видел результат в окне. Да и как сделать, чтобы окно симулятора запомнило, какие сигналы я хочу смотреть, какие надо скрыть?

Titus
18.10.2024, 20:14
Написал счетчик T-циклов и он даже сразу заработал) Удивительно, учитывая, что я ноль в verilog'е и делаю первые чайниковские шаги)


always @ (negedge clk) // Счетчик T-циклов
begin
reg_t1 <= res_tclk_bus_z; // T1
t2 <= t1 & (!res_tclk_bus_z); // T2
reg_t3 <= (reg_t3 | t2) & (!t3) & (!res_tclk_bus_z); // T3
t4 <= t3 & (!res_tclk_bus_z); // T4
t5 <= t4 & (!res_tclk_bus_z); // T5
t6 <= t5 & (!res_tclk_bus_z); // T6
end

https://pic.maxiol.com/images2/1729271405.1595414782.clipboard101820240.png

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

Единственное, не могу посмотреть schematic, как построился счетчик T-циков. Видимо, потому что наружу процессора результат их работы никак не выведен.
Разве нельзя построить schematic для конкретного модуля?

AlexG
18.10.2024, 21:02
Алгоритм (очень усреднённо)
1) после наколачивания текстов запускаю eleborated/schematic
2) думать. если надо см п1
3) симулятор behavearal
4) думать. если надо см п1


1. Как компилировать проект без запуска симуляции, чтобы просто проверить на ошибки?
чтоб проверить на ошибки есть 100500 способов
1) включить "реалтайм" подсветку ошибок в окне редактирования (text editor->sintax cheking. выбрать sigasi)
2) в RTL Analysis RunLinter - текстовые указания глюков семантических (к примеру объявлена переменная, которая не используется)
3) рядом ( в open elaborated design) есть report DRC и Metodology. тут же можно посмотреть "схему" по исходному коду (без всяких синтезов и симуляций итд)
когда на этом этапе довольно мало "глюков" идём дальше
4) Syntesis
тут тоже есть аналогичные отчёты + ряд других +схема после синтеза
когда на этом этапе довольно мало "глюков" идём дальше
5) implement
тут тоже есть аналогичные отчёты + ряд других +схема после имплемента (то что реально в будет в плисе)

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


2. Можно ли счетчику (регистру, вход которого соединен с выходом),
можно.
после загрузки прошивки плисы - все триггера в исходной позиции "0", если не было указано иное в исходниках.
однако для симулятора оный счётчик будет в состоянии хххх (красным цветом).
Посему в данном случае добавляем исходное значение для симулятора.
ПС:
но что значит "вход которого соединен с выходом" ?

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


3. По поводу встроенных в ПЛИС модулей памяти.
если не указывать явно способ реализации памяти - то синтезатор в данном случае сгенерит на элементах памяти 32*1 бит с инвертированным клоком.
пс: у вас то что в rtl (это некоторая абстракция)

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


Из него получается вот такая схема:
Меня здесь смущает "генератор на инверторе" - вот это жесть.
"Чисто поржать" - можно увидеть "весь" код ТОПа и tb ?

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


4. Да, и как запомнить положение и соотношение окон в проекте?
В общем случае ни разу не заморачивался.
Однако для разных режимов есть меню layout -> save as...
А если конкретно для симулятора. то есть такой волшебный файл ?????_behav.wcfg (для его "поиска" нажать на дискетку в окне с диаграмами, рядом с лУпой). его рекомендуется сохранить в каталоге рядом с исходниками. И добавить его в проект как "файл исходников"
тогда при открытии окна диаграмм - все требуемые сигналы (их можно добавлять и убирать, менять кодировку итд) будут на месте.

Titus
18.10.2024, 21:03
Меня здесь смущает "генератор на инверторе" - вот это жесть.


always
#10 clk = ~clk; // Каждые 10 тиков меняем полярность clk


Да это так, для теста просто.

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


но что значит "вход которого соединен с выходом" ?
Ну когда инверсный выход триггера соединен с его входом.

AlexG
18.10.2024, 21:27
ну или выложи свои исходники, гляну - подправлю.

Titus
18.10.2024, 21:29
Во первых кусок кода не полноцнен.
а во вторых. Если какой либо сигнал не выходит из ТОПа наружу - то он и все его "родители" анулируются после синтеза. и в "идеале" можно получить схему вообще пустую.

Ну у меня из топа вообще наружу ничего не выходит, а схема рисуется из тех фрагментов, которые заведены сигналами в топ. А те, что к топу не подключены не рисуются.

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


Дык это самое оная строчка должна быть в другом файле (отличном от файла, где описан модуль). и это файл должен распологаться в "категории" simulation source и быть "там" в топе.
Эта строчка находится в топе. Зачем ее куда-то выносить, если топ - это тестбенч.

HardWareMan
18.10.2024, 21:29
Меня здесь смущает "генератор на инверторе" - вот это жесть.
Не особая жесть. Маршрут закольцовывания LAB/LE таков, что создаётся необходимый сдвиг фазы и генерация стабильна. Я на Arria2GX получал ~1ГГц на коротком инверторе. Эту частоту использовать нельзя - сложная схема не работала, но поделив 1 раз на 2 и получив ~500МГц уже моя достаточно сложная IP завелась и работала стабильно. Понятно, что генерация не стабильна: она зависит от грейда чипа, от его архитектуры, от температуры и прочих параметров, которые приведут к дрейфу частоты, но генерация при этом не сорвётся. Но можно пойти дальше и вывести пару таких "инвертора" на ноги и навесить на них стандартные RC да кварцевый резонатор и вот вы уже сэкономили на генераторе. Результат подаём на CLK вход (а иногда можно прямо внутри чипа даже конфигурацией) и вот оно уже закварцованное и стабильное.

AlexG
18.10.2024, 21:41
Эта строчка находится в топе. Зачем ее куда-то выносить, если топ - это тестбенч.
Отделяем мух от котлет.
должны быть файлы для синтеза (топ модуль с "реальным списком портов" для реальной плисы)
и
должны быть файлы для моделирования (тут свой топ с "пустым списком портов") и в этом ТОПе внутри подключен ТОП для синтеза.

Иначе ломается "логика" работы утилит САПРа

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


Не особая жесть.
Ну да при цене плисы в несколько сотен уе делать такой генератор это "Не особая жесть".
Параметры такого генератора даже на кварце будут так себе... да на таких частотах - ну его нафик

Вот так с помощью не хитрых приспособлений буханка хлеба превращается в троллейбус (с)
А оно стоит того чтоб экономить на нормальном генераторе частоты ??

------------------
вроде на всё ответил ??? ничего не пропустил ??

Titus
18.10.2024, 21:45
должны быть файлы для синтеза (топ модуль с "реальным списком портов" для реальной плисы)
У меня нет реальной плис, поэтому наверху топ для теста вообще без портов. Это работает для симуляции, и это для меня пока главное.

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


вроде на всё ответил ??? ничего не пропустил ??
Вроде все! )

AlexG
18.10.2024, 21:56
У меня нет реальной плис, поэтому наверху топ для теста вообще без портов. Это работает для симуляции, и это для меня пока главное.
нукактотаконотожеможетчто тоделать.
Но всё же повторю
"Иначе ломается "логика" работы утилит САПРа"
и ряд тулзов вряд ли будут работать адекватно.

Titus
18.10.2024, 22:36
нукактотаконотожеможетчто тоделать.
Пока мне нужно просто вьехать в тему. Такая структура не мешает мне потихоньку писать Z80. И смотреть, чего получается.

org
18.10.2024, 23:19
Ну раз топик превратился в "помоги Титусу освоить верилог" добавлю от себя:
для простейшей симуляции можно вообще всё делать без always блоков, тупо соединяя вентили нетлистом. Сейчас сразу набегут сторонники православного синтеза, но таки наша утилита Deroute именно такой верилог и выгружает (модульный) - и запихать always блоки внутри DFF примитивов тоже можно.

Пример модульного ядра SM83 из DMG SoC:
https://github.com/emu-russia/dmgcpu/blob/main/HDL/sm83/Top.v

Оно вполне себе работает в икарусе и этого обычно достаточно для "понимания".

https://raw.githubusercontent.com/emu-russia/dmgcpu/refs/heads/main/imgstore/waves/opcode_77_ldhl.png

P.S. Ещё рекомендую изучить гига-лики от Nintendo (лежат в открытом доступе как ни странно на archive.org) и посмотреть как делалось "по-взрослому", например исходники RСP от Nintendo 64. Ещё можно полазить по OpenCores и приуныть немного, хотя тоже полезно.

Titus
18.10.2024, 23:33
ля простейшей симуляции можно вообще всё делать без always блоков, тупо соединяя вентили нетлистом.
Хоть я и начинающий вериложник, но у меня задача сразу делать красиво и правильно. Я имею в виду Z80. Только синхронная схема, все оптимально и красиво чтобы было.

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


OpenCores и приуныть немного
Приуныть от чего?

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


рекомендую изучить гига-лики от Nintendo
Лучше не выражаться сленгом, а давать конкретные ссылки с уточнениями.

org
19.10.2024, 07:29
Может так получиться что когда начнешь делать красиво и правильно, то что-то получится, но уже не z80.
Ссылки которые можно давать я даю, которые нельзя я не даю, leak - сам понимаешь, гугли.
На OpenCores много ядер и другого железа на верилоге, есть кстати и z80 сделанный по мотивам чипа, так что как минимум можно приуныть что уже всё сделано до нас.
https://opencores.org/projects/a-z80

HardWareMan
19.10.2024, 08:01
Ну да при цене плисы в несколько сотен уе делать такой генератор это "Не особая жесть".
Параметры такого генератора даже на кварце будут так себе... да на таких частотах - ну его нафик

Вот так с помощью не хитрых приспособлений буханка хлеба превращается в троллейбус (с)
А оно стоит того чтоб экономить на нормальном генераторе частоты ??
Эх... То, что я игрался на Arria2GX это было баловство "а что если". А вот генератор на инверторах ПЛИС я активно использовал (и видел как использовали другие) на FLEX и, особенно, на CPLD типа MAX7000/MAX3000. Можно было заводить схему на разных нестандартных частотах нативно.

Titus
19.10.2024, 12:45
Может так получиться что когда начнешь делать красиво и правильно, то что-то получится, но уже не z80.
Я всегда стараюсь сохранить максимальную аутентичность оригиналу. Но, естественно, моделировать потранзисторную схему на Verilog'е.
Раз правила хорошего тона для ПЛИС - это логика плюс триггеры по фронту, шины без Z состояний, значит перевожу Z80 в этот формат.

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


На OpenCores много ядер и другого железа на верилоге, есть кстати и z80 сделанный по мотивам чипа, так что как минимум можно приуныть что уже всё сделано до нас.
Эти видел.
Нет, до меня еще никто не делал логическую модель по точному реверсу.
А даже если бы и сделали, мне все равно интересно сделать свою конфетку. Может она будет компактнее и быстрее. И точнее.

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

Вообще, я смотрю, логическую схему с триггерами перевести на Verilog вообще не сложно. Гораздо проще, чем писать программный эмулятор.
Но пока что в схеме есть узкие места, например, триггеры, работающие и по фронту и по спаду такта одновременно. Вот это надо сперва по умному переделать, а потом описывать.

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

Для случая, когда длительность импульса ресета очень короткая (меньше 1 такта), есть участки схемы, которые поведут себя весьма косячно.
Внутренний импульс RES всегда выравнивается на границу такта, поэтому самый короткий внешний импульс все равно будет равен 1 такту внутреннего RES.

Смотрим на такой фрагмент схемы:
https://pic.maxiol.com/images2/1729330985.1595414782.clipboard101920240.png

Как видим, если RES равен 1 такту и совпал по времени с T3, то сначала RS-триггер перейдет в третье состояние, когда оба выхода равны нулю. А после одновременного снятия T3 и RES перейдет в неопределенное состояние вообще. Думаю, что с большей вероятностью пересилит правое плечо, т.к. там больше емкость затворов подключенных к нему транзисторов. Но все же.

Titus
19.10.2024, 16:14
Я так понял, что чтобы в режиме Schematic все не перепутывалось друг с другом, надо помельче дробить модули?

Titus
19.10.2024, 18:33
Еще обратил внимание, что в цикле чтения данных, который длится на один полутакт дольше, чем цикл чтения кода операции, реально данные все равно защелкиваются через тот же промежуток времени, что при чтении кода операции.
Т.е. этот лишний продленный полутакт чтения непонятно зачем. Возможно, для совместимости с 8080?

https://pic.maxiol.com/images2/1729351929.1595414782.clipboard101920240.png

HardWareMan
19.10.2024, 19:03
Еще обратил внимание, что в цикле чтения данных, который длится на один полутакт дольше, чем цикл чтения кода операции, реально данные все равно защелкиваются через тот же промежуток времени, что при чтении кода операции.
Зависит от типа регистра: прозрачная защёлка или защёлка или тактируемый D-триггер.

Titus
19.10.2024, 19:12
Зависит от типа регистра: прозрачная защёлка или защёлка или тактируемый D-триггер.
Тут нет разницы, в чем защелкиваются данные.
Я говорю о том, что не смотря на то, что длительность циклов обращения к внешней памяти для чтения опкода (1 такт) и данных (1.5 такта) - разная, внутренний цикл (внутри Z80) все равно остается одинаковым, и равен 1 такту. Поэтому увеличенный на 0.5 такта внешний цикл не играет никакой роли, все равно внутри процессора данные защелкиваются на 0.5 такта раньше, чем окончится внешний цикл.

Меня интересует, зачем это сделано? Я думаю, что до совместимости с предыдущей линейкой (i8080). Иного обьяснения у меня нет.

AlexG
19.10.2024, 20:36
Я так понял, что чтобы в режиме Schematic все не перепутывалось друг с другом, надо помельче дробить модули?
Как бы да...
На самом низу - собственно реализация - получаем набор модулей, которые между собой соединяются между собой - получаем ТОП.
Там, где цыпляем между собой модули - логики лучше не рисовать.
ПС: раннее я предлагал поделить всю схему на блоки - обозвать их. и потом собирать из этих кубиков ТОП

Titus
19.10.2024, 21:21
ПС: раннее я предлагал поделить всю схему на блоки - обозвать их. и потом собирать из этих кубиков ТОП
Ну просто Z80 не такой большой процессор, чтобы бить его на модули.
Я смотрел, некоторые реализации так и сделаны, одним файлом.
Некоторые разбиты на АЛУ и прочее.

AlexG
19.10.2024, 22:33
по мне блочный дизайн проще исправлять, редактировать (да и моделировать сперва по частям). не требуется бегать по паре тыщ строк в поисках нужной части кода/схемы

Titus
20.10.2024, 02:28
Переделал блок управления памятью в полностью синхронный вариант.

Пришлось пол-дня повозиться, крепкий орешек.
Все дело в том, что это самый кривосинхронный блок в процессоре. Одни циклы длятся 2, другие 3, третьи 4 ПОЛУ-такта, не такта. Да и еще в зависимости от разных условий. Самым оптимальным оказалось добавить на выходные линии простые обрезалки сигналов в нужные фазы. Тут пол-такта отрезаем, сям пол-такта. Тут режем, тут не режем, а тут рыбу заворачивали. Зато вынеся нестандартности за скобки, внутри схемы остался качественный синхронный дизайн.

Изначально попробовал - как Vivado отнесется к RS-триггерам, у которых что-то устанавливается по спаду CLK, что-то по фронту? Оказалось, что никак вообще. И это к лучшему.

https://pic.maxiol.com/images2/1729379793.1595414782.clipboard102020240.png

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

Да, кроме того, в оригинальной схеме каждый из трех триггеров мог встать 'р@ком', если в неподходящие T-циклы приходил ресет. Особенно короткий ресет. Но повторять это нет смысла, потому что все равно плавающее кратковременное состояние не повторишь, а при ресете длинной >1 такта и так все нормализуется. Даже в оптимизированной текущей схеме еще не убран кофликт R и S при неподходящем времени ресета.

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

Интересно, как себя ведет Xilinx, если на R и S поданы 1?

and1981
20.10.2024, 12:35
Интересно, как себя ведет Xilinx, если на R и S поданы 1?
Если посмотреть технологическую карту после синтеза, то можно заметить, что любой из триггеров T, JK, SR, - получается из D триггера. В данном случае будет кольцо из DFF + OR + AND. И тут главное при описании на верилоге правильно расставить приоритеты для R и S. И в таком случае один из входов будет проигнорирован, ибо у него меньший приоритет (т.е. он дальше от ДФФ). А вот при использовании прозрачной D защелки, она собирается без участия ресурса DFF на одной комбинаторике и по сути своей асинхронна, на что получим сразу предупреждение от TimeQuest-a. По крайней мере в Квартусе так, подозреваю, что для Xilinx-a все аналогично.

Titus
20.10.2024, 12:41
И тут главное при описании на верилоге правильно расставить приоритеты для R и S.
Как проставить приоритет?

Прозрачные защелки я не использую.

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


В данном случае будет кольцо из DFF + OR + AND.
Как выглядит это кольцо?

and1981
20.10.2024, 13:21
Как проставить приоритет?

Прозрачные защелки я не использую.

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


Как выглядит это кольцо?

https://pic.maxiol.com/thumbs2/1729419445.1389483554.sr.png (https://pic.maxiol.com/?v=1729419445.1389483554.sr.png&dp=2)

Касаемо триггеров и приоритетов HardWareMan достаточно хорошо описал это здесь: https://zx-pk.ru/threads/27091-potaktovyj-klon-dendi-na-fpga.html?p=890718&viewfull=1#post890718

Titus
20.10.2024, 14:22
https://pic.maxiol.com/thumbs2/1729419445.1389483554.sr.png (https://pic.maxiol.com/?v=1729419445.1389483554.sr.png&dp=2)
При таком построении, R имеет высший приоритет.

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


Касаемо триггеров и приоритетов HardWareMan достаточно хорошо описал это здесь:
Правда, я так и не понял, что будет в ПЛИС, если R и S подать одновременно)

and1981
20.10.2024, 14:26
Да, можно тусовать OR и AND местами, и приоритет будет у того, кто ближе к DFF.

При одновременной подаче единиц на входы S и R, будет запомнено состояние более приоритетного входа.

https://pic.maxiol.com/thumbs2/1729424030.1389483554.srprio.png (https://pic.maxiol.com/?v=1729424030.1389483554.srprio.png&dp=2)

Titus
20.10.2024, 14:41
При одновременной подаче единиц на входы S и R, будет запомнено состояние более приоритетного входа.
Какой будет более приоритетный вход, если на Verilog'е я напишу так:


begin
always @ (posedge clk)
if (set)
Q = 1;
else if (reset)
Q = 0;
end

and1981
20.10.2024, 14:47
Какой будет более приоритетный вход, если на Verilog'е я напишу так:


begin
always @ (posedge clk)
if (set)
Q = 1;
else if (reset)
Q = 0;
end

Set

https://pic.maxiol.com/thumbs2/1729424853.1389483554.srprio2.png (https://pic.maxiol.com/?v=1729424853.1389483554.srprio2.png&dp=2)

HardWareMan
20.10.2024, 15:05
Какой будет более приоритетный вход, если на Verilog'е я напишу так:


begin
always @ (posedge clk)
if (set)
Q = 1;
else if (reset)
Q = 0;
end

Тут даже без компиляции понятно, что первое условие (Set) приоритетнее, потому что (Reset) стоит в блоке ELSE у (Set). Внезапно, да?

Titus
20.10.2024, 16:42
Тут даже без компиляции понятно, что первое условие (Set) приоритетнее, потому что (Reset) стоит в блоке ELSE у (Set). Внезапно, да?

На всякий случай надо уточнить. Я же очень начинающий вериложник)
Забыл, я там хотел неблокирующее присваивание написать, <= вмест =.

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

Проанализировал по схем блок запроса шины. Если сравнивать с оригинальной документацией, то тайминги все навраны.

1. /BUSREQ защелкивается в другом полутакте, чем описано в документации.
2. Шины переводятся в Z-состояние тоже не в том полутакте.
3. Ну и возвращается все обратно тоже в другом полутакте.

https://pic.maxiol.com/images2/1729431704.1595414782.realbusreqackcycle.png

aviator
20.10.2024, 17:54
Ну от этого внешняя логика не пострадает.
Описание версталось параллельно, и, видимо, не все изменения попали в него. А потом посмотрели - и забили, как на не особо критичные.

Titus
20.10.2024, 18:14
Ну от этого внешняя логика не пострадает.
В основном-то да.

Интересно, есть спектрумы, где процессор тормозится через BUSREQ?

aviator
20.10.2024, 18:41
Интересно, есть спектрумы, где процессор тормозится через BUSREQ?
Надеюсь, что нет. Это был бы какой-то лютый костылинг... Это ж для DMA-контроллеров.

Titus
21.10.2024, 16:29
Написал небольшой кусочек управления шинами и чтения кода команды в полностью синхронном дизайне.
Все тайминги совпадают с теоретически предсказанными, что не может не радовать)

https://pic.maxiol.com/images2/1729517305.1595414782.clipboard102120240.png

Вот фрагмент кода управления шиной для примера.
Если есть концептуальные косяки, можно сделать замечание)

//----------------------------------------------------------------------
//
// Управление внешней шиной
//
//----------------------------------------------------------------------

assign stop_rd_cycle = ((!m1) & t3) | t4 | res; // Сигнал окончания циклов MREQ, IORQ, RD для чтения/записи данных
// По сигналу RES
// По T4 любого цикла
// По Т3 любого цикла кроме M1

// Сигнал нначала цикла памяти
assign start_mem_cycle = ((!m1) & t1 & (!grp_io) | // По сигналу GRP_IO и T1 любого цикла, кроме M1
(m1 & t1 & (!int_ack))) & // По M1.T1, кроме INT_ACK (цикл чтения кода команды)
(!dis_bus); // При этом сигнал DIS_BUS не должен быть активен

// Вспомогательные сигналы
assign m1_t3_mask = t3_del & m1 & t3; // Сигнал маски по M1.T3.2


always @ (negedge clk) // Управление триггером mreq_rs (/CLK)
begin
if (stop_rd_cycle) // Если сигнал окончания записи,
mreq_rs <= 0; // то mreq_rs = 0 (высший приоритет),
else if (start_mem_cycle) // Иначе, если сигнал начала цикла памяти,
mreq_rs <= 1; // то mreq_rs = 1
end

assign mreq = mreq_rs & (!m1_t3_mask); // Внешний сигнал запроса памяти формируется с учетом врезки окончания цикла чтения кода операции


always @ (posedge clk) // Управление разрешением RD (CLK)
begin
disable_rd_port <= (int_ack & m1) | // В m1.int_ack,
req_write | // В цикле записи
dis_bus; // В цикле без доступа к памяти
end

always @ (negedge clk) // Управление триггером rd_rs (/CLK)
begin
if (stop_rd_cycle | // Если сигнал окончания записи,
(m1 & t3)) // или начало цикла регенерации памяти M1.T3,
rd_rs <= 0; // то mreq_rs = 0 (высший приоритет),
else if (start_mem_cycle & (!disable_rd_port)) // Иначе, если сигнал начала цикла памяти и сигнал RD не запрещен,
rd_rs <= 1; // то mreq_rs = 1
end

assign rd = rd_rs & (!(t3_del & m1)); // Внешний сигнал чтения памяти формируется с учетом удлиненной врезки окончания цикла чтения кода операции

org
21.10.2024, 21:19
Если есть концептуальные косяки, можно сделать замечание)


Замечаний нет, есть немного обмена опытом.
После assign можно написать #n (n - число), чтобы сделать задержку при симуляции.

Только CLK в тестбенче нужно делать не always #1 CLK = ~CLK;, а подольше, можно даже примерно подогнать тайминги под timescale.

Например на самом верху пишем: `timescale 1ns/1ns (1 шаг равен 1 нс), а для дергания CLK пишем always #120 CLK = ~CLK; -- что равно 120 нс на полупериод (240 нс - 1 цикл).
Что даёт возможность делать задержки сигнала в симуляции с шагом 1/120 нс.
Таким образом можно имитировать все эти ваши "транзисторные особенности" :)

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

P.S. Немного читнул ранее про "ПОЛУ-такты". Да, это так. Большая часть ядер ретро-чипов (да что там.. скорее даже все) реализует оба полупериода (полуцикла), ещё их называют "фазами". Это абсолютная нормальность на таком уровне, если есть какой-то психологический "запор" в восприятии, то его необходимо как можно быстрее "пробить" :)

AlexG
21.10.2024, 23:50
Все манипуляции с " #1 CLK = ~CLK; `timescale 1ns/1ps " абсолютно не важно до тех пор пока "мы" не начнём учитывать реальные времянки логических элементов. Вот тут две дороги:
1) мы моделируем абстрактные времянки абстрактной ЛА3 - и это будет абсолютно не синтезируемая модель поведения.
или
2) мы не мудрим с этими абстракциями, а задаём рельную частоту клока и реальны тип плисы.
При этом #1 и еже с ними используется для моделирования поведения внешнего окружения (как то sdarm память - реальная микросхема, аль ещё чего...) - но ни разу не используется в синтезируемой части кода.

ПС:
Это типовое значение и именно nS и pS
`timescale 1ns/1ps

ПС:ПС:
#1 CLK = ~CLK
здесь по первости можно указывать #5 чтоб получить "красивую" частоту в 100 МГц. и чтоб проще "отсчитывать" какой щаз период времени (хотя это можно сделать в автоматическом режиме отображение номера периода со счётчик оного клока).

Titus
22.10.2024, 10:41
Ребята, я вовсе не собираюсь на верилоге моделировать работу реальных транзисторов. Наоборот, весь мой код и реализация заточены под реальные возможности ПЛИС, синхронную архитектуру. Поэтому вопрос по коду на верилоге был задан именно исходя из этого. Правильно ли я пишу, пока не написал много, чтобы потом не пришломсь все переделывать.

Titus
24.10.2024, 11:59
В общих чертах все более-менее правильно описано было в этой (http://www.primrosebank.net/computers/z80/z80_special_reset.htm) статье.

Так как подробные схемы и диаграммы в этой теме не пользуются популярностью, расскажу лишь кратко.

1. Вовсе не обязательно выдерживать длительность сигнала специального ресета такой, как описано в патенте. Импульс может быть длинной даже менее полутакта. Главное, чтобы во время фиксации ресета (в M1.T2.2) он был активен, а в M1.T2.4 уже не активен.
2. Импульс специального ресета устанавливается по М1.Т2, далее по M1.T1 следующего цикла происходит сброс регистра PC, а по M1.T2 импульс специального ресета снимается.
3. Импульс специального ресета задействует механизм запрета декодирования кода команды, который также используется в IM1,2, NMI, HALT. В этом режиме любая команда воспринимается декодером команд, как 00 (NOP).
4. Если специальный ресет поступил во время выполнения любой команды с префиксом, то выполнение специального ресета откладывается до окончания выполнения этой команды.
5. Также специальный ресет снимает режим HALT.
6. Если обычный ресет пришел во время M1.T2, то он задерживается на 1 такт.

AlexG
24.10.2024, 21:28
КО. там упомянут один из двух патентов
https://patentimages.storage.googleapis.com/a2/09/1a/8a9fea5f2255fd/US4486827.pdf
про что второй - склероз...

Titus
24.10.2024, 21:58
https://patentimages.storage.googlea.../US4486827.pdf
Я все читать не стал, но по картинке там только схема ресета в этом документе.

Titus
25.10.2024, 12:17
Интересную вещь рассказал nukeykt с эмураши.
Он сохраняет в верилоге оригинальный дизайн, а асинхронные латчи эмулирует так:


always @(posedge MCLK)
begin
if (CLK)
x <= a;
end

Т.е. MCLK (мастерклок) превышает CLK в разы.

HardWareMan
25.10.2024, 14:18
Titus, я про это изначально всегда говорил. Ньюк эту идею подхватил когда я там был пару лет назад, когда он сначала дербанил декап YM2612 а затем Сегу-Денди.

Titus
26.10.2024, 12:06
Потихонечку пишу модули на верилоге.

Пример модуля (пока набросок):

//----------------------------------------------------------------------
//
// Модуль управления внешней шиной
//
//----------------------------------------------------------------------

module Bus_control(
input clk, // Тактовый сигнал
input res, // Сигнал сброса
input [98:0] pla, // Шина ПЛМ
input m1, // Машинный цикл M1
input t1, // Такт T1
input t3, // Такт T3
input t3_del, // Такт T3 с задержкой
input t4, // Такт T4
input grp_io, // Сигнал GRP_IO
input int_ack, // Сигнал INT_ACK
input dis_bus, // Сигнал DIS_BUS
input bus_z, // Сигнал BUS_Z
input req_write, // Сигнал запроса записи
input [15:0] pcr, // Регистр PCR
output mreq, // Сигнал запроса памяти MREQ
output rd, // Сигнал чтение памяти или портов ввода-вывода RD
output reg p_m1, // Сигнал машинного цикла M1
output reg rfsh, // Сигнал рефреша памяти RFSH
output reg [15:0] adr // Шина адреса (16 бит)
);


wire start_mem_cycle; // Сигнал запуска цикла чтения/записи MREQ, RD

reg mreq_rs; // Триггер сигнала MREQ
reg rd_rs; // Триггер сигнала RD
reg disable_rd_port; // Триггер запрета вывода в порт RD (для циклов записи, холостых циклов и прерываний)

//----------------------------------------------------------------------

assign stop_rd_cycle = ((!m1) & t3) | t4 | res; // Сигнал окончания циклов MREQ, IORQ, RD для чтения/записи данных
// По сигналу RES
// По T4 любого цикла
// По Т3 любого цикла кроме M1

// Сигнал нначала цикла памяти
assign start_mem_cycle = ((!m1) & t1 & (!grp_io) | // По сигналу GRP_IO и T1 любого цикла, кроме M1
(m1 & t1 & (!int_ack))) & // По M1.T1, кроме INT_ACK (цикл чтения кода команды)
(!dis_bus); // При этом сигнал DIS_BUS не должен быть активен

// Вспомогательные сигналы
assign m1_t3_mask = t3_del & m1 & t3; // Сигнал маски по M1.T3.2


always @ (negedge clk) // Управление триггером mreq_rs (/CLK)
begin
if (stop_rd_cycle) // Если сигнал окончания записи,
mreq_rs <= 0; // то mreq_rs = 0 (высший приоритет),
else if (start_mem_cycle) // Иначе, если сигнал начала цикла памяти,
mreq_rs <= 1; // то mreq_rs = 1
end

assign mreq = mreq_rs & (!m1_t3_mask); // Внешний сигнал запроса памяти формируется с учетом врезки окончания цикла чтения кода операции


always @ (posedge clk) // Управление разрешением RD (CLK)
begin
disable_rd_port <= (int_ack & m1) | // В m1.int_ack,
req_write | // В цикле записи
dis_bus; // В цикле без доступа к памяти
end


always @ (negedge clk) // Управление триггером rd_rs (/CLK)
begin
if (stop_rd_cycle | // Если сигнал окончания чтения,
(m1 & t3)) // или начало цикла регенерации памяти M1.T3,
rd_rs <= 0; // то mreq_rs = 0 (высший приоритет),
else if (start_mem_cycle & (!disable_rd_port)) // Иначе, если сигнал начала цикла памяти и сигнал RD не запрещен,
rd_rs <= 1; // то mreq_rs = 1
end

assign rd = rd_rs & (!(t3_del & m1)); // Внешний сигнал чтения памяти формируется с учетом удлиненной врезки окончания цикла чтения кода операции



always @ (posedge clk) // Управление портом M1 (CLK)
begin
if (t3 | bus_z) // В такте T3 любого цикла (а на самом деле в M1.T3) или же по сигналу BUS_Z
p_m1 <= 0; // порт M1 переводится в 0
else if (m1 & t1) // В такте M1.T1 порт M1 переводится в 1, что означает начало цикла M1
p_m1 <= 1; //
end


always @ (posedge clk) // Управление портом RFSH (CLK)
begin
rfsh <= m1 & (t3 | t4); // Цикл рефреша памяти в тактах M1.T3 и M1.T4
end


always @ (posedge clk) // Управление шиной адреса (CLK)
begin
if (((m1 & t3) | t1) & (!dis_bus)) // Если нет сигнала запрета чтения/записи (dis_bus), то
adr <= pcr; // в такте T1 любого цила активен общий цикл чтения/записи,
// либо в такте M1.T3 активен цикл записи IR на шину адреса
end


endmodule

goodboy
26.10.2024, 13:26
я правильно понимаю ситуацию после запуска процессора (PC=0, прерывания IM1 разрешены ?, во всех регистрах нули)

Titus
26.10.2024, 14:54
я правильно понимаю ситуацию после запуска процессора (PC=0, прерывания IM1 разрешены ?, во всех регистрах нули)

Ты имеешь в виду посл ресета, а не запуска?
В регистрах конечно не нули. Ни после запуска, ни после ресета.
А после ресета PC равен нулю.

Titus
26.10.2024, 19:23
Кстати, EXX и EX AF,AF' меняет индексы группы регистров в M1.T2, а EX AF,AF' меняет в M1.T1. Интересно, зачем так по-разному сделано:v2_neutr:

И при постепенном переводе схемы на синхронный дизайн, схема становится намного нагляднее и компактнее. Большое количество латчей просто выкидывается.

HardWareMan
27.10.2024, 06:39
Кстати, EXX и EX AF,AF' меняет индексы группы регистров в M1.T2, а EX AF,AF' меняет в M1.T1. Интересно, зачем так по-разному сделано:v2_neutr:
Осмелюсь предположить, как и в случае с ВМ80, регистр А и тем более флаги - особые. Они не находятся в общем регистровом файле (у ВМ80 регистр А физически в АЛУ, а флаги вообще просто набор отдельных триггеров, раскиданных вокруг АЛУ), а значит задействуют несколько другие сигналы управления.

Titus
27.10.2024, 11:43
Осмелюсь предположить, как и в случае с ВМ80, регистр А и тем более флаги - особые.
В случае Z80 как раз AF хранится в общем регистровом файле, а флаги кэшируются непосредственно перед выполнением очередной команды.
Но думаю, что задумка была именно такая, подальше разнести момент обмена AF (такт T1) и загрузка AF по умолчанию в начале следующей команды (такт T2).
Думаю, если перенести EX AF,AF' с T1 на T2, все работало бы так же прекрасно.
Впрочем, если хотелось так заранее все сделать, никто не мешал авторам и EXX сделать в T1, а не T2.
В общем, как сделали, так и сделали)

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

Кстати, поговорил с ребятами с эмураши (nukeykt), они рассказали, как реверсили Z80.
Сперва NMOS в августе 2022, затем сейчас CMOS уже почти сделали (примерно месяц на реверс процессора!).
Схема на уровне вентилей перегонялась сперва на Си, затем на Verilog.
Т.к. версия оставалась асинхронной, то делался дополнительный мастер-клок (MCLK), в несколько раз превышающий CLK, и с помощью него эмулировались латчи примерно так, как я уже писал выше:


always @(posedge MCLK)
begin
if (CLK)
x <= a;
end

Плюс этого подхода, что схема фактически оставалась оригинальной, без вмешательств. Меньше поле для косяков, когда ручками переделываешь на синхронный дизайн.
Минус - завышенная тактовая, что приводит к дополнительной трате ресурсов.
Кроме того, такой подход не требует детального понимания работы схемы. Фактически это клонирование и симуляция.
Вот так понял я из общения с ними.

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

Я люблю максимально все оптимизировать, поэтому без глобального разбирательства в принципах работы схемы и переделывания на синхронный дизайн исходя из этого не обойтись.
Но это да, значительно затратнее по времени и всему остальному.

and1981
27.10.2024, 16:34
Плюс этого подхода, что схема фактически оставалась оригинальной, без вмешательств. Меньше поле для косяков, когда ручками переделываешь на синхронный дизайн.
Минус - завышенная тактовая, что приводит к дополнительной трате ресурсов.
Кроме того, такой подход не требует детального понимания работы схемы. Фактически это клонирование и симуляция.
Вот так понял я из общения с ними.

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

Я люблю максимально все оптимизировать, поэтому без глобального разбирательства в принципах работы схемы и переделывания на синхронный дизайн исходя из этого не обойтись.
Но это да, значительно затратнее по времени и всему остальному.

Мои все проекты на аналогичном принципе работают, по поводу ресурсов особо не парюсь, т.к. даже камни с 150к ячеек вполне себе доступны на Али, не говоря уже о 6-ти или 10-ти тысячных Циклонах IV .
Так например те же ядра процессоров Денди (PPU + APU) можно вполне себе вместить в Циклон II с 5к ячеек. Но при оптимизации дебаг будет заметно веселее, так как мест, где можно косякнуть будет заметно больше. :smile:
Единственное, что я оптимизировал, так это инверсную логику.

Titus
27.10.2024, 16:49
Мои все проекты на аналогичном принципе работают, по поводу ресурсов особо не парюсь, т.к. даже камни с 150к ячеек вполне себе доступны
Вопрос не только в количестве ячеек, но и в максимальной рабочей скорости симулируемого устройства.

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


Но при оптимизации дебаг будет заметно веселее, так как мест, где можно косякнуть будет заметно больше.
Да, тут безусловно все так)

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


Мои все проекты на аналогичном принципе работают
Какие у тебя проекты?

and1981
27.10.2024, 17:03
Вопрос не только в количестве ячеек, но и в максимальной рабочей скорости симулируемого устройства.

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


Да, тут безусловно все так)

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


Какие у тебя проекты?

ядро 6502 и чипы APU и PPU NES

Пока скорости хватает, ибо старым железякам оно не сильно чтобы нужно. А более новые чипы уже все и так оптимизированы еще на стадии проектирования и изготовления.

Titus
27.10.2024, 17:18
Пока скорости хватает, ибо старым железякам оно не сильно чтобы нужно. А более новые чипы уже все и так оптимизированы еще на стадии проектирования и изготовления.
Я согласен, что это ускоряет процесс разработки и уменьшает число багов.
Но мой характер оптимизатора или перфекциониста, не знаю, что тут играет роль, заставляет всегда стремиться к оптимизации, если я вижу ее возможной.
Хочется из любой вещи слепить конфетку. Чтобы смотреть и любоваться)
Хотя это человекоресурсоемко, и далеко не на все хватает усидчивости)
Поэтому и получаются эмуляторы без интерфейсов типа EmuStudio. Типа, хотел, чтобы еще на тех старых PC (2005 года) все летало синхронно с разверткой, чтобы поиграться в любимые игры детства. Сделал, поигрался, удовлетворил потребность, и все.

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

Кстати, наверное это вопрос к Alex_G, можно ли в Vivado сделать так, чтобы участок памяти ПЛИС отображался в виде какой-то графики в окне? Т.е. визуальное наблюдение за битовым массивом в виде картинки хочу.

Titus
27.10.2024, 23:09
Реализовал синхронный модуль специального ресета.
Некоторая проблема в перевода в синхронный дизайн была в том, что в основе модуля асинхронный RS-триггер, который управлялся как CLK, так и /CLK-синхронными сигналами.
Но в итоге все же перевел в полностью синхронный дизайн, и все диаграммы полностью совпали с теоретическими:v2_dizzy_ok:

reset - внешний сигнал сброса, не синхронный с CLK.
reset_c - тот же сигнал, но синхронизированный с CLK.
res - внутренний сигнал сброса, синхронный с /CLK (при специальном ресете так и остался в нуле)
spec_res - сигнал специального ресета. Активизировался, т.к. короткий сигнал внешнего сброса пришел во время такта M1.T2. И длится сигнал до следующего машинного цикла, такта М1.Т2.

https://pic.maxiol.com/images2/1730059350.1595414782.clipboard102720240.png

AlexG
29.10.2024, 21:25
"можно ли в Vivado сделать так, чтобы участок памяти ПЛИС отображался в виде какой-то графики в окне?"

Теоретически - да (как бы в теории сия фишка была придумана для ускорения моделирования, и вряд ли для работы с графикой . хотя чем чОрт не шутит...).
Практически:
- это требуется exp lvl 50+
- знание Си (CLANG /gcc) (НЕ С++ ?)
- знание api wimdows (наверно уровня win32 - простейшие функции по работе с окнами)
- ключевые слова DPI. (для начала почитать UG900)
- возможно потребуется применение каких либо особенностей systemverilog (там вагон и тележка функционала применительно к тестированию).

Выглядит как DLLка. с точки зрения симулятора оно видится как реализация некоторого "модуля" (только не на языке верилог , а на Си - заранее скомпилированного)

ПС: такой потребности у меня ещё не было - обходился "модулями на верилоге" (для эмуляции/моделирования внешних устройств)
ПС:ПС: возможно существуют и другие возможности...
вот что первое на гуглил
https://www.doulos.com/knowhow/systemverilog/systemverilog-tutorials/systemverilog-dpi-tutorial/

Вот пример на русском для старой версии вивады
https://fpga-systems.ru/publ/xilinx/xilinx_vivado/metodika_raboty_s_si_moduljami_v_simuljacii_standa rtnymi_sredstvami_vivado/8-1-0-49

Titus
29.10.2024, 23:34
Вопрос задавал на емураше, но чего-то однозначного ответа не получил:

У меня такая дилемма, как реализовать банк регистров.
Или же генерить адрес регистра, с которым я работаю (0..13), и тогда удобнее использовать массив регистров reg [7..0] reg_block [16].
Либо же генерить 14 линий, и каждая линия выбирает свой регистр reg_AF, или reg_HL и т.д. Но тогда им на выходе нужно много логики, чтобы все выходы 14 8-битных регистров обьеденить в одну шину. Если бы реализовал на базе массива регистров, то это бы не понадобилось, т.к. там выбирается по адресу.
Поэтому и спрашиваю, что будет быстрее работать?

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

И еще, я спрашивал, как сделать так, чтобы компилятор не превращал многовходовый элемент типа 10-ИЛИ в кучу каскадно включенных элементов 2-ИЛИ. А чтобы группировал их параллельно. Мне предложили ключ KEEP="TRUE', но это никак не отразилось в Schematic)

AlexG
30.10.2024, 01:39
максимально компактно память реализуется на примитиве BRAM - по сути это ОЗУ N*M
А вот во что реализуется память на рассыпухе - это "секрет".
По факту проще реализовать оба варианта и посмотреть что после синтеза получилось (не после елаборатион, а именно после синтеза).
То что выглядит "страшно" в коде - может быть "изящным в примитивах" и на оборот.
С другой стороны "этот кусок схемы" "живёт" в окружении других схем. По сему и выбирать "конкретный" вариант схемы.

Про атрибуты (* KEEP="TRUE' *) и еже с ними - их достаточно много для разных применений.
см UG901 глава 3. и да, есть атрибуты и для имплемента.

Про: KEEP "предложение" несколько не применимое к 10-ИЛИ.
"10-ИЛИ в кучу каскадно включенных элементов 2-ИЛИ." По факту превратится в два слоя примитивов (мне так видится на вскидку) два примитива 5 входовых и второй слой из 2 входной логики.
и сиё не зависит от этого аттрибута тк в плисе не существует единого примитива. Можно попробовать применить BRAM (это изврат)

ПС: 1) любое применение атрибутов приводит к потери "переносимости" кода verilog между разными производителями плис.
2) некоторы аттрибуты устарели
3) и временами важно где именно размещается атрибут (у имени цепи или у места определения модуля) - короче есть нюансы.

ПСПС% ну и на последок: вполне возможно (очевидно) что результат синтеза на этапе уже учитывает времянки и синтезатор может по разному синтезировать схему (и не забываем что и от имплементация ещё зависит конечный результат), Конечно если цель получить прошивку для конкретной плис и конкретной тактовой. а Если "забить на времянки" то зачем волноваться за "красоту" которую никто не увидит (да и излишне она будет для симуляции)

Titus
30.10.2024, 23:37
Чем больше я разбираюсь в Z80, тем больше понимаю, что фактически большая часть процессора (кроме работы с портами/памятью и кое-чего еще) спроектирована под нормальный синхронный дизайн без всякой ощутимой активности во время полутактов. Но, в силу специфичности элементной базы и невозможности синхронно переключать латчи, были добавлены промежуточные латчи для смещения сигналов на пол-такта, чтобы к моменту прихода /CLK не было гонки сигналов. А после того, как схема авторами была оптимизирована, эти латчи еще и размазались, делая понимание логики работы более сложным.

Что же касается управления памятью/портами, то там да, много активности и в полутактах. Возможно, где-то из-за того, что пытались уместить в 4 классических такта и чтение опкода, и регенерацию памяти. Поэтому чтение 1.5 такта, регенерация 1 такт. А может по каким-то еще причинам.

Но вообще, авторы - монстры. Не даром процессор столько лет живее всех живых)

HardWareMan
31.10.2024, 21:08
Titus, ну они смогли переключиться с двухфазовой модели на однофазную и это реально прорыв.

Titus
31.10.2024, 22:21
Titus, ну они смогли переключиться с двухфазовой модели на однофазную и это реально прорыв.

Двухфазная - это ты про 8080?

HardWareMan
01.11.2024, 09:50
Двухфазная - это ты про 8080?
Именно.

Titus
01.11.2024, 11:24
Именно.
Кстати, зачем нужно было двухфазное тактирование?

HardWareMan
01.11.2024, 18:07
Кстати, зачем нужно было двухфазное тактирование?
Прозрачные латчи nMOS. На них трудно построить синхронный D триггер. Он просто не экономный выходит.

Titus
07.11.2024, 22:55
Очередной шедевр, когда сразу две единицы подаются на RS-триггер.

В случае активного ресета (RES = 1), на RES_TCLK тоже подается 1.
Сама подача RES в этом случае теряет смысл, т.к. она не просто загоняет триггер в ненужное состояние, да еще и не сбрасывает его.

Триггер находится в цепи управления остановки инкремента PCR в режиме обработки прерываний или HALT.

https://pic.maxiol.com/images2/1731009211.1595414782.clipboard110720240.png

AlexG
07.11.2024, 23:22
тут наверно надо смотреть времянки между RES и RES_TCLK кто из них раньше (позже) относительно клока.

Titus
07.11.2024, 23:30
тут наверно надо смотреть времянки между RES и RES_TCLK кто из них раньше (позже) относительно клока.
Это не важно, т.к. триггер синхронный, и гонка сигналов на него не влияет.

AlexG
08.11.2024, 01:05
оффтоп
сорри. пьян.

Titus
09.11.2024, 16:51
Еще одна интересная особенность Z80, которая выяснилась при моделировании. Вернее, она видна и по схеме, но не приходило в голову об этом подумать.

Во время сброса процессора, сбрасывается не только счетчик PC, но еще и IR.
Это происходит из-за того, что во время ресета принудительно выбраны PC и IR одновременно. Поэтому при любой записи в PC (в такте T2) или IR (в такте T4), запись идет в оба этих регистра. А так как при сбросе обнуляется регистр инкремента PCR, то каждый цикл записи идет запись 0 в PC и IR, пока не сняли ресет.

Titus
10.11.2024, 18:24
Дошел до модели АЛУ, и тут наткнулся на подозрение, что такая конструкция переводится в схему не так, как казалось бы должно:


always @ (negedge clk) // RS-триггер выбора фазы работы АЛУ
begin
if (start_alu)
sel_alu_low = 1;
else if (req_alu_high)
sel_alu_low = 0;
end


always @ (negedge clk) // Регистр фиксации младшего полубайта результата
begin //
if (sel_alu_low) //
alu_low <= alu_out[7:4]; //
end //


Но второй триггер почему-то защелкивает результат на 1 такт CLK раньше чем должен.
Совершенно непонятно, как это может быть.

https://pic.maxiol.com/images2/1731252286.1595414782.clipboard111020240.png

Titus
10.11.2024, 21:34
Все, отбой, разобрался.
Это из-за использования неблокирующего присваивания в первом триггере. Странно, что на графике выход триггера выглядит абсолютно правильно, а симулируется неправильно.

Titus
16.11.2024, 22:31
Одна из самых нестандартных команд для Z80. Для работы сделаны множество патчей в тех или иных блоках Z80.

Описание на примере команды ADD/ADC HL,DE:

Цикл M1:

T1-T3 - выборка кода команды и завершение предыдущей ALU-операции
T4 - ALUA = L
* Загрузка в регистр PCR текущей выбранной регистровой пары HL (побочка от какой команды?)

Цикл M4:

T1 - ALUB = E
* Инкремент PCR
T2 - сложение младших полубайтов
* Запись PCR в выбранный по умолчанию регистр WZ (фактически в WZ записывается HL + 1)
(побочка от функционала записи декрементированного PC для блочных команд, чтоибы вернуться к началу блочной команды)
T3 - сложение старших полубайтов и запись результата в L
влияние на флаги P/V, Z, S (только для ADC/SBC)
влияние на флаг C
T4 - ALUA = H
флаг C записать во флаг H

Цикл M5:

Т1 - ALUB = D
T2 - сложение младших полубайтов
T3 - сложение старших полубайтов и запись результата в H

Цикл М1:

Т1 - нет стандартного ALU-цикла
T2 - влияние на флаги P/V, Z, S (только для ADC/SBC)
влияние на флаг C
Т3 - нет стандартной записи результата
T4 - сохранение флагов в регистре F

Замечание: флаг N устанавливается для любой стандартной АЛУ-операции
флаг H устанавливается для любой АЛУ-операции

Titus
17.11.2024, 21:50
Не смотря на не очень высокий интерес массовой публики к подробным (а уже не подробные, лаконичные) разборам особенностей выполнения команд, все же буду выкладывать интересное)
А именно егодня начал распутываться загадочный клубок с побочной записью/чтением регистра WZ (в некоторых документах его называют MEMPTR).
Обновил чуть выше уже опубликованный сценарий работы команд ADD/ADC/SBC HL,dd, с добавлением комментариев, где, как и почему происходит влияние на регистр WZ.

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

Фактически, после окончания цикла M1, в котором блок PCR был занят инкрементом PC, а затем IR, блок брошен на произвол судьбы, как пропеллер сорвавшийся с вентилятора) И как только ему попадается какое-то число, он его инкрементирует или декрементирует и обратно выплевывает на шину PCRBUS. В большинстве случаев от этого ничего плохого не происходит, если вдруг какой-то участок схемы, где применялось неполное декодирование условий, вдруг взял и сработал не тогда, когда надо. В нашем случае он сработал два раз, первый раз в такте M1.T4 (тут еще не знаю, побочка от какого функционала), а второй раз в такте M4.T2. Вот тут совершенно четко понятно из-за чего. В этом такте (а так же M4.T4) блочные команды откатывают PC на два шага назад, чтобы вернуться к начальному адресу блочной команды. Но как оказалось, цикл M4 использует для вычислений и команда ADD, функционал которой реализован массовыми патчами разных участков схемы. Работе команды ADD это не помешало, так как запись младшего байта результата происходит в M4.T3, т.е. посередине между M4.T2 и M4.T4. Видимо, авторы проверили, все норм работает, а то, что там попутно куда-то полетели данные в WZ, ну и фиг с ними)

Titus
18.11.2024, 14:07
Да уж, тема заглохла)

Можно закрывать лавочку за отсутствием интересующихся)

Lethargeek
18.11.2024, 16:30
Можно закрывать лавочку за отсутствием интересующихся)
или за отсутствием у них времени на достаточное погружение в тему
ведь чтоб задать правильный вопрос, надо знать б0льшую часть ответа
да еще отрывочно излагаешь, надо бы оформить в статью нормальную

Titus
18.11.2024, 17:42
да еще отрывочно излагаешь, надо бы оформить в статью нормальную
Излагаю по мере исследования.
И так уже пишу самым простым языком, и группируя по командам.
Вот такая команда, вот такая особенность.

yashcher
18.11.2024, 18:37
Да уж, тема заглохла)

Можно закрывать лавочку за отсутствием интересующихся)
Мне интересно, просто я слишком далёк от таких инженерных тонкостей. Другим было бы не интересно, не было бы столько просмотров (сейчас уже 92469). Понятно, что ТС хотелось бы обратной связи (т.е. диалога и вопросов), но иногда может это и к лучшему: не отвлекает от проекта.

Titus
18.11.2024, 21:59
хотелось бы обратной связи (т.е. диалога и вопросов), но иногда может это и к лучшему: не отвлекает от проекта.
У меня так, если нет обратной связи, то это никому не нужно, и я сам теряю интерес)

ZXMAK
18.11.2024, 23:04
почему-же интересно, просто я отладкой TZX формата занимался. До доработки внутренностей Z80 пока руки не дошли, нужно вначале графический интерфейс для linux доработать.

AlexG
19.11.2024, 01:16
Мне интересно. У меня "шкурный интерес" - verilog model. Чем могу - посодействую. Сейчас в "две смены пашу" на работе и дома... так что времени вообще нету :v2_dizzy_tired2:

Titus
19.11.2024, 12:23
Мне интересно. У меня "шкурный интерес" - verilog model. Чем могу - посодействую. Сейчас в "две смены пашу" на работе и дома... так что времени вообще нету :v2_dizzy_tired2:

Для какого проекта тебе нужна Veriolog-модель?
Почему не попробуешь Z80 из проекта Nuked-MD? Там точно списана модель с NMOS, как они говорят, и проходит тесты ZXALL.

AlexG
19.11.2024, 21:35
Я уже писал , что у неё "два клока" (как здесь написали - для эмуляции латчей) - а оное "дурно" влияет на фактическую частоту проекта. и не факт что она пройдёт "другие" тесты (которые здесь тестят)

Titus
19.11.2024, 21:43
Я уже писал , что у неё "два клока" (как здесь написали - для эмуляции латчей) - а оное "дурно" влияет на фактическую частоту проекта. и не факт что она пройдёт "другие" тесты (которые здесь тестят)

Ну все зависит от того, в каком проекте ты хочешь использовать. Тебе нужны частоты 100МГц?

AlexG
19.11.2024, 22:22
ОФФТОП: я жадный, я ОЧЕНЬ ЖАДНЫЙ.
при 100 эффективная будет не более 25. (я не помню соотношение частот в том проекте). А на 100 "разводить" несколько сложновато ("дороже по ресурсам").

Titus
19.11.2024, 22:25
ОФФТОП: я жадный, я ОЧЕНЬ ЖАДНЫЙ.
при 100 эффективная будет не более 25. (я не помню соотношение частот в том проекте). А на 100 "разводить" несколько сложновато ("дороже по ресурсам").

Тогда еще интереснее стало, что у тебя за проект) Колись)

AlexG
19.11.2024, 22:41
Честно ? Пока никакого. а первоначально "Хоббит"

Titus
19.11.2024, 22:42
Честно ? Пока никакого. а первоначально "Хоббит"
Для хоббита не нужно 25Мгц)
Зато процессор от Нюка полностью соответствует схеме, в отличие от моей версии. Т.к. нельзя сохранить оригинал переходя на синхронный плисовский дизайн.

Titus
20.11.2024, 02:39
Товарищи с емураши правильно заметили, что чем больше преобразований относительно транзисторной схемы, тем больше шансов накосячить.
Поэтому если хочется сохранить прям эталонную модель, то это тут надо брать верилог с Nuked-MD, а еще лучше Z80 Explorer)

Каждая ступень оптимизации может дать свои косяки просто из-за банальной ошибки.
А уж преобразование в синхронную модель и отказ от двунаправленных шин, да и иных полу-аналоговых элементов схемы, требует не просто оптимизации а переделывания частей схемы.
Например, никак нельзя оставить двухпортовый регистровый файл со всеми его фичами, такими как произвольное обьединение LBUS и HBUS, возможность слияния шин основного набора регистров и набора регистров-указателей.
Его приходится полностью переписать на функциональный аналог, но не копию, т.к. она невозможна на этом уровне.
А уж всякие остаточные заряды на шинах, из-за которых получаются 3 и 5 флаги и всякие другие фичи - никак не сохранить в первозданном виде.
Их приходится написать заново, где условные 'заряды' будут хранится в триггерах.
В общем, чем дальше переводишь схему на современные и оптимальные рельсы, тем больше привносишь своего, что хоть и должно являться функциональным аналогом, но может нести ошибку.

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

Кстати, все эти особенности шин регистрового файла позволяют делать такие вещи, как, например.
1. Одновременно читать регистр A, записывать регистр F, и снова его читать в одном и то же такте.
2. Записывать по шине HBUS регистр WZL (младший байт внутреннего регистра-указателя, его еще называют MEMPTR) в главную часть регистрового файла, и при этом одновременно читать WZ целиком (и младшую и старшую часть) из другой части регистрового файла, которые на это такт специально обьединяются мостом.

AlexG
20.11.2024, 23:41
Чур меня на это:
"а еще лучше Z80 Explorer"
бредовая реализация...


Вот это не понял:
"Например, никак нельзя оставить двухпортовый регистровый файл со всеми его фичами"
двух портовость в плисе "аппаратная"

А это ни одна из выше упомянутых реализаций тоже не имеет:
"А уж всякие остаточные заряды на шинах, из-за которых получаются 3 и 5 флаги и всякие другие фичи - никак не сохранить в первозданном виде."
А в случае КМОП - так это (я так понял) вообще статическая вещь - без всяких плавающих флагов.




Да и следующие (мне так кажется) тоже реализуемо
Кстати, все эти особенности шин регистрового файла позволяют делать такие вещи, как, например.
1. Одновременно читать регистр A, записывать регистр F, и снова его читать в одном и то же такте.
2. Записывать по шине HBUS регистр WZL (младший байт внутреннего регистра-указателя, его еще называют MEMPTR) в главную часть регистрового файла, и при этом одновременно читать WZ целиком (и младшую и старшую часть) из другой части регистрового файла, которые на это такт специально обьединяются мостом.

Titus
21.11.2024, 01:02
двух портовость в плисе "аппаратная"
Это не та двухпортовость.
Тут функционал гораздо шире. Начиная с того, что можно одновременно писать в любое количество регистров. И при этом читать другие.

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


"А уж всякие остаточные заряды на шинах, из-за которых получаются 3 и 5 флаги и всякие другие фичи - никак не сохранить в первозданном виде."
А в случае КМОП - так это (я так понял) вообще статическая вещь - без всяких плавающих флагов.

На CMOS прекрасно обнаружены те же самые плавающие 3 и 5 биты в командах SCF/CCF.
Статика никак не влияет на причину плавающих флагов.

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


Да и следующие (мне так кажется) тоже реализуемо
Кстати, все эти особенности шин регистрового файла позволяют делать такие вещи, как, например.

Конечно все эти прекрасно реализуемо.
Но это как бы уже не копия оригинала, а функциональный аналог.

AlexG
21.11.2024, 21:05
Ну значит "двухпортовость" собирается на отдельных триггерах - и "делай с ними что хошъ"(с)
Копия - это на транзисторах спаянное (как 6502).

Titus
21.11.2024, 21:17
Копия - это на транзисторах спаянное (как 6502).

Все это относительно)

Каждый подьем на более высокий слой абстракции может породить какую-то новую несовместимость)

Titus
23.11.2024, 18:38
Обратил внимание, что в некоторых описаниях работа команды 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, а не симуляторы)

Reobne
24.11.2024, 17:16
T4 - если ALUA[3..0] > 9 или флаг H = 1, то ALUB[3..0] = 0x6
иначе ALUB[3..0] = 0 (а не загруженный из А в предыдущем цикле, как кто-то может подумать) ?

Titus
24.11.2024, 17:27
иначе ALUB[3..0] = 0 (а не загруженный из А в предыдущем цикле, как кто-то может подумать) ?
Да, если не 0x6, то 0x0.
Что уж совсем логично)

goodboy
30.11.2024, 20:51
случайно наткнулся на большую подборку тестов z80
https://github.com/redcode/Z80/wiki/Tests

Titus
30.11.2024, 22:25
случайно наткнулся на большую подборку тестов z80
https://github.com/redcode/Z80/wiki/Tests

На них уже ссылался Злой Киллер. Там даже мой тест есть)

ZXMAK
18.12.2024, 13:38
Интересно, а какое начальное состояние у регистров Z80 и какие регистры прописываются сбросом?

Почему visual6502 при сбросе прописывает регистры значением 0x55 (кроме pc и ir, которые прописываются 0x00)?

Titus
18.12.2024, 13:52
Интересно, а какое начальное состояние у регистров Z80 и какие регистры прописываются сбросом?

Почему visual6502 при сбросе прописывает регистры значением 0x55 (кроме pc и ir, которые прописываются 0x00)?

Про 6502 ничего не могу сказать.
А Z80 при сбросе обнуляет PC и IR (неожиданно).
Все остальные регистры остаются без изменений.

ZXMAK
18.12.2024, 14:26
Про 6502 ничего не могу сказать.

я про Z80: http://www.visual6502.org/JSSim/expert-z80.html

Видимо кнопка сброса не совсем сброс делает, а просто инициализирует начальное состояние.
Разобрался.

А какие варианты сброса у Z80 есть? Помню читал есть короткий сброс и длинный. Сколько минимум тактов нужно держать активным _reset для первого и второго варианта?

Titus
18.12.2024, 15:16
А какие варианты сброса у Z80 есть? Помню читал есть короткий сброс и длинный. Сколько минимум тактов нужно держать активным _reset для первого и второго варианта?
Специальный сброс тебе не нужно реализовывать.
Без специального внешнего железа, который делает сброс синхронным с циклом M1, такой сброс не реализовать.

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


В общих чертах все более-менее правильно описано было в этой (http://www.primrosebank.net/computers/z80/z80_special_reset.htm) статье.

Так как подробные схемы и диаграммы в этой теме не пользуются популярностью, расскажу лишь кратко.

1. Вовсе не обязательно выдерживать длительность сигнала специального ресета такой, как описано в патенте. Импульс может быть длинной даже менее полутакта. Главное, чтобы во время фиксации ресета (в M1.T2.2) он был активен, а в M1.T2.4 уже не активен.
2. Импульс специального ресета устанавливается по М1.Т2, далее по M1.T1 следующего цикла происходит сброс регистра PC, а по M1.T2 импульс специального ресета снимается.
3. Импульс специального ресета задействует механизм запрета декодирования кода команды, который также используется в IM1,2, NMI, HALT. В этом режиме любая команда воспринимается декодером команд, как 00 (NOP).
4. Если специальный ресет поступил во время выполнения любой команды с префиксом, то выполнение специального ресета откладывается до окончания выполнения этой команды.
5. Также специальный ресет снимает режим HALT.
6. Если обычный ресет пришел во время M1.T2, то он задерживается на 1 такт.

Читай выше.

ZXMAK
18.12.2024, 16:29
лавное, чтобы во время фиксации ресета (в M1.T2.2) он был активен, а в M1.T2.4 уже не активен.

можно поподробнее, что значит M1.T2.2 и M1.T2.4?

Речь идет о двух полуциклах M1-T2, когда процессор читает опкод с шины данных, но не включая следующего полуцикла M1-T3 (последний полуцикл чтения опкода)?

Кстати еще вопрос - в какой именно момент происходит захват слова с шины данных при чтении из памяти? На примере выполнения выполнения NOP:


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


как видно, выборка #00 с шины данных db идет 3 полуцикла, но в какой момент происходит фиксация данных?

Titus
18.12.2024, 18:33
можно поподробнее, что значит M1.T2.2 и M1.T2.4?

Речь идет о двух полуциклах M1-T2, когда процессор читает опкод с шины данных, но не включая следующего полуцикла M1-T3 (последний полуцикл чтения опкода)?

M1 - это цикл M1.
T2 - это второй такт цикла M1
.2 - это означает, что это второй полутакт такта T2

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


Кстати еще вопрос - в какой именно момент происходит захват слова с шины данных при чтении из памяти? На примере выполнения выполнения NOP:

https://pic.maxiol.com/images2/1734535950.1595414782.clipboard121820240.png

ZXMAK
18.12.2024, 20:03
2 - это означает, что это второй полутакт такта T2

тогда что значит M1.T2.4? Четвертый полутакт? Их-же два, дальше идет T3, разве не так?

Titus
18.12.2024, 20:11
тогда что значит M1.T2.4? Четвертый полутакт? Их-же два, дальше идет T3, разве не так?

Я выше в теме писал, что если какой-то процесс инициируется циклом, например, M2, то все последующие действия отсчитываются от него.
На практике M1.T2.4 скорее всего совпадет с M1.T3.2, однако, если поступит сигнал WAIT, то между T2 и T3 будет пауза, и M1.T2.4 уже не совпадет с M1.T3.2.

ZXMAK
18.12.2024, 21:05
Импульс специального ресета задействует механизм запрета декодирования кода команды, который также используется в IM1,2, NMI, HALT. В этом режиме любая команда воспринимается декодером команд, как 00 (NOP).

А можно вот про это поподробнее? Что за механизм запрета?

И кстати насчет режима IM, вы разбирали как работает установка режима? Если я правильно нашел сигналы, то получается такая картина:
IM0: 0 0
IM1: 1 0
IM2: 1 1

Как-то странно, я ожидал увидеть для IM2 0 1, почему оба сигнала одинаковые? Как это работает?

Titus
18.12.2024, 21:43
А можно вот про это поподробнее? Что за механизм запрета?
Механизм очень прост. Блок выбора кода команды выдает 0, вместо кода команды.
Это сделано, чтобы, например, во время обработки прерываний, в регистре опкода была нейтральная команда типа NOP, которая не активирует никаких линий, и не помешает декодерам прерываний.

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


Как-то странно, я ожидал увидеть для IM2 0 1, почему оба сигнала одинаковые? Как это работает?
Не совсем понял, в чем именно вопрос)

Вот причесанная схема декодера IM:
https://pic.maxiol.com/images2/1734547328.1595414782.clipboard121820240.png

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


вы разбирали
Ко мне можно и нужно на ты)

ZXMAK
18.12.2024, 22:04
Вот причесанная схема декодера IM:

IA3 и IA4 - это что за сигналы?
Не вижу SEL_IM0. И не понятно, зачем NMI_ACK с IM1 объединяется по ИЛИ на U44 - для чего это?

Titus
18.12.2024, 22:10
Не вижу SEL_IM0.
Его и нет.
Так как IM0 фактически это просто выполнение команды с шины данных.

Но вообще, сами блоки выполнения прерываний я пока не разбирал. Нарисовал, но не разбирал подробности работы.

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


IA3 и IA4 - это что за сигналы?
Это биты 3 и 4 регистра опкода.

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


зачем NMI_ACK с IM1 объединяется по ИЛИ на U44 - для чего это?
REQ_DIS_BASE_SET - это запрос запрета декодера команд. О чем я писал уже выше.

ZXMAK
18.12.2024, 22:38
Это биты 3 и 4 регистра опкода.

проверил - да, действительно, опкоды ed46 (im0), ed4e (*im0), ed56 (im1) и ed5e (im2), сохраняют разное состояние режима.

Т.е. внутри процессора есть разница между ed46 (im0) и ed4e (*im0). :)


REQ_DIS_BASE_SET - это запрос запрета декодера команд. О чем я писал уже выше.

с нижней частью схемы понятно, а для чего в верхней NMI_ACK с IM1 объединяется - что это за сигнал уходит направо за границу схемы с выхода U44?

Еще такой вопрос - есть ли в схеме физически регистр IFF2 или он как-то виртуально получается?

Titus
18.12.2024, 23:13
Т.е. внутри процессора есть разница между ed46 (im0) и ed4e (*im0).
Нет, разницы-то как раз нет) im0 и im0* воспринимаются процессором абсолютно одинаково.

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


с нижней частью схемы понятно, а для чего в верхней NMI_ACK с IM1 объединяется - что это за сигнал уходит направо за границу схемы с выхода U44?

Это выбор сигнала, который одинаков для NMI, RST, IM1, т.к. они обрабатываются схожим образом:

https://pic.maxiol.com/images2/1734552731.1595414782.clipboard121820240.png

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


Еще такой вопрос - есть ли в схеме физически регистр IFF2 или он как-то виртуально получается?

Разумеется есть:

https://pic.maxiol.com/images2/1734552815.1595414782.clipboard121820240.png

ZXMAK
18.12.2024, 23:26
Нет, разницы-то как раз нет) im0 и im0* воспринимаются процессором абсолютно одинаково.

однако режим хранится по разному :)

Может и в обработке есть разница, судя по схеме один бит используется в блокировке декодера, второй нет. Получается можно как-то заметить эту разницу?



Разумеется есть:


где примерно эта цепь IFF2 на кристалле находится? может ктото подскажет номер цепи в visual6502 z80 симуляторе?


Как насчет регистра Q, который для недок флагов в SCF/CCF используется? Он есть физически?

Titus
19.12.2024, 00:06
однако режим хранится по разному :)

Может и в обработке есть разница, судя по схеме один бит используется в блокировке декодера, второй нет. Получается можно как-то заметить эту разницу?

Никакой разницы нет.
Схема была спроектирована для того, чтобы различать im0, im1, im2.
im0* - это просто побочный недокументированный опкод.
И у im0, и у im0* 4-й бит опкода равен нулю. Что блокирует U45 и U46.
А следовательно обе эти команды выполняются абсолютно одинаково.

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


где примерно эта цепь IFF2 на кристалле находится? может ктото подскажет номер цепи в visual6502 z80 симуляторе?

Номера транзисторов могу подсказать:

https://pic.maxiol.com/images2/1734555871.1595414782.clipboard121920240.png

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


Как насчет регистра Q, который для недок флагов в SCF/CCF используется? Он есть физически?

Я не оперирую терминами в которых есть регистр Q. Это кто-то там придумал, и не знаю точно, что он под этим имел в виду.
Особенности SCF/CCF в этой ветке у меня оооочень хорошо описаны, как и почему такое происходит. Просто надо все прочитать)

ZXMAK
19.12.2024, 02:37
Номера транзисторов могу подсказать:

не нахожу, а можно такую-же схему с номерами транзисторов для IFF1?

Titus
19.12.2024, 02:46
не нахожу, а можно такую-же схему с номерами транзисторов для IFF1?


https://pic.maxiol.com/images2/1734565596.1595414782.clipboard121920240.png

ZXMAK
19.12.2024, 04:03
хм, не нахожу. Пробовал методом перебора путём выбора нодов которые соответствуют значению нода IFF1 на последовательности EI, NOP, DI, NOP, EI, NOP, DI, NOP. В результате осталась только одна нода IFF1. Толи в симуляторе нет этой цепи, толи IFF2 при выполнении EI/DI устанавливается и сбрасывается не одновременно с IFF1. Странно это.

нашел только инверсную ноду IFF1:

iff1 = 231
_iff1 = 1166

Однако при выполнении NMI/RETI флаг IFF1 восстанавливается. Значит где-то сохраняется, получается, что IFF1 и IFF2 устанавливаются на разных циклах.

ZXMAK
19.12.2024, 10:57
в коде симулятора есть такой комент:


// * 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 *


Вопрос - что это за Z80Simulator? Где его взять?

Titus
19.12.2024, 12:45
хм, не нахожу.
Ты не написал, где ты и в каком проекте ищешь.
На каком сайте.
Что запускаешь.

Я когда-то просто скачал Z80 Explorer, и в нем есть список всех транзисторов и координаты каждого транзистора на схеме.

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

Но вообще, на моей схеме видно же, когда и чего устаналивается.

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

Разберем схему:

Триггер IFF1 сбрасывается по:
1. Reset
2. Прием NMI
3. Прием INT

Триггер IFF2 сбрасывается по:
1. Reset
2. Прием NMI

Оба триггера устанавливаются/сбрасываются по EI/DI

Триггер IFF2 копируется в IFF1 RETN/RETI, если не активен прием NMI

Всё!

ZXMAK
19.12.2024, 13:42
Ты не написал, где ты и в каком проекте ищешь.
На каком сайте.
Что запускаешь.

Проект visual6502: https://github.com/trebonian/visual6502

Вот сама страница с симулятором: http://www.visual6502.org/JSSim/expert-z80.html

там есть мелкие ошибки в дизассемблере, но они легко исправляются.

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


Оба триггера устанавливаются/сбрасываются по EI/DI

проблема в том, что я пробовал перебором искать node, которая в каждом цикле соответствует IFF1 (node 231) для цепочки инструкций EI,NOP,DI,NOP, однако ничего не нашел, находится только инверсный сигнал _IFF1 (node 1166). Если оба триггера устанавливаются/сбрасываются по EI/DI одновременно, то такой подход должен был найти node для IFF2, ведь IFF1 и IFF2 на такой цепочке инструкций должны дублироваться в каждом цикле. Но ничего не находит. Как такое может быть?

При этом проверил обработку NMI логика сохранения IFF1 в этом симуляторе работает.

Titus
19.12.2024, 14:04
проблема в том, что я пробовал перебором искать node
Зачем ее искать?
Я нарисовал схему прямо по списку транзисторов, который использует этот симулятор.
На схеме все четко видно. И все правильно.

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


Проект visual6502: https://github.com/trebonian/visual6502
Я использовал вот это:
https://github.com/gdevic/Z80Explorer

ZXMAK
19.12.2024, 14:34
Зачем ее искать?
Я нарисовал схему прямо по списку транзисторов, который использует этот симулятор.
На схеме все четко видно. И все правильно.

я хочу видеть в симуляторе сигнал IFF2. Исходя из вышесказанного, там не все так просто, иначе сигнал можно было бы легко найти сравнением состояния на каждом цикле при выполнении цепочки ei:nop:di:nop.

Проблема в том, что я не знаю как генерируются эти списки цепей и как они связаны с номерами транзисторов, поэтому не могу найти node id, чтобы смотреть состояние сигнала в симуляторе.

В списке известных имен IFF1 и IFF2 нет. Node id для IFF1 я нашел - это node=231. А вот IFF2 найти не получается.


Я использовал вот это:
https://github.com/gdevic/Z80Explorer

посмотрел, там почти такой-же nodenames.js с таким-же комментарием про Z80Simulator и FindTransistor(x,y):
https://github.com/gdevic/Z80Explorer/blob/master/resource/nodenames.js

Правда некоторые node id отличаются (для bc,de,hl и еще по мелочи), видимо файлы генерировались на основе разных датасетов.

Что это за Z80Simulator?

Titus
19.12.2024, 15:03
Что это за Z80Simulator?
Не знаю)
Я скачивал Z80 Explorer ради списка транзисторов.
В качестве симулятора никогда его не использовал, мне это не нужно, по схеме и так все понятно)

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


Проблема в том, что я не знаю как генерируются эти списки цепей и как они связаны с номерами транзисторов
Мои номера транзисторов взяты из Z80Explorer, и только некоторые номера я поменял (подтягивающие транзисторы поменял, т.к. добавлял их позже).

ZXMAK
19.12.2024, 16:43
Не знаю)
Я скачивал Z80 Explorer ради списка транзисторов.
В качестве симулятора никогда его не использовал, мне это не нужно, по схеме и так все понятно)

скачал Z80Explorer, после допиливания напильником (у меня Qt version 5.15.8, а версия в гитхабе заточена похоже на Qt 6.7.2), наконец собралась и запустилась на raspberry pi. Запустил, но пока не понимаю как сопоставить номер транзистора и node id. Также пока непонятно как открыть куски схем, как на скриншотах. Вобщем пока непонятно как этим всем пользоваться.

Почитав немного инет, похоже разобрался, теперь могу искать цепи по номеру транзисторов к которым она подключена и смотреть в симуляторе visual6502 :)

На скрине симуляция NOP,EI,NOP, затем активируется NMI:
https://i.imgur.com/8n1u0fk.png

Последний столбик - это состояние NMI линии, перед ним идут два IFF1 и IFF2 с вашей схемы. А перед ними (сразу за опкодом) тот сигнал, что я считал IFF1 :)

Причина проблемы как оказалось в том, что я считал за IFF1 другой сигнал, чем указан на твоём фрагменте схемы.

Интересно, что это за сигнал? Т.к. он весьма точно повторяет состояние IFF1 с твоей схемы, но с задержкой установки.

Он идет на затвор транзистора T4246. Что это?

Titus
19.12.2024, 17:12
открыть куски схем, как на скриншотах.
Куски схем, как на моих скриншотах?
Их нельзя открыть, я их сам нарисовал в P-CAD'е)

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

Т4246 - это выход U485:



https://pic.maxiol.com/images2/1734552815.1595414782.clipboard121820240.png

А именно запрет сигнала с IFF1, если текущая команда DI или EI.
Как раз из-за этого цепочка EI блокирует прерывание.

ZXMAK
19.12.2024, 17:29
Куски схем, как на моих скриншотах?
Их нельзя открыть, я их сам нарисовал в P-CAD'е)

я про скриншоты на сайте Z80Explorer, там открыты окна со схемами. Но как их открыть, скажем для заданного транзистора - не понятно.

А у тебя есть транзисторная схема триггеров где IM режим хранится (со схемы выше)? Интересуют номера транзисторов на выходах триггеров. Ты где-то выкладывал эти схемы?

Кстати интересный момент заметил, после выполнения DI, IFF1/IFF2 все-еще активен до M1.T2 следующего опкода. Может ли прерывание в этот момент сработать? (между DI и следующим опкодом)
https://i.imgur.com/OfQeipW.png

Update: похоже, что не может, из-за вышеозначенного сигнала блокировки (последняя колонка на следующем скрине), который сбрасывает разрешение прерываний прямо сразу после чтения опкода DI:
https://i.imgur.com/2CFjrGo.png

Titus
19.12.2024, 18:45
А у тебя есть транзисторная схема триггеров где IM режим хранится (со схемы выше)? Интересуют номера транзисторов на выходах триггеров. Ты где-то выкладывал эти схемы?
Выкладывал не последнюю версию в этой теме, но ссылка за неделю потухает.

NMOS Z80 - Transistor sketch rev 2.25.pdf (https://dropmefiles.com/6tGse)

ZXMAK
19.12.2024, 19:16
Выкладывал не последнюю версию в этой теме, но ссылка за неделю потухает.

NMOS Z80 - Transistor sketch rev 2.25.pdf

не загружается - кликаешь, страница перезагружается и ничего не происходит.

А в kicad можно сконвертить? На моём компе pdf с крупной схемой врядли получится открыть - процессор слабый и памяти мало. По крайней мере файлы pdf со схемой реверса ВГ93 не открывает - долго думает и зависает.


Любопытно видеть как этот сигнал блокировки (последняя колонка) срабатывает на серии опкодов EI :)
https://i.imgur.com/k8ShAc8.png

Titus
19.12.2024, 19:45
не загружается - кликаешь, страница перезагружается и ничего не происходит.
Только что проверил, все загружается.

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


А в kicad можно сконвертить?
Нет, в это конвертера не имею.

ZXMAK
19.12.2024, 20:15
Только что проверил, все загружается.

у меня при клике на DOWNLOAD пишет в статусе transferring, потом через секунду странца просто перезагружается заново и всё. :(

Titus
19.12.2024, 20:18
у меня при клике на DOWNLOAD пишет в статусе transferring, потом через секунду странца просто перезагружается заново и всё. :(

https://transfiles.ru/f19jo

ZXMAK
19.12.2024, 20:36
https://transfiles.ru/f19jo

Спасибо, скачал, правда посмотреть не получается. В мелком масштабе загружается за 30-40 секунд, но как масштаб увеличиваешь - начинает долго думать, вот все что через пару минут нарисовалось: https://i.imgur.com/ELnnDpG.png

А возможность сохранить в одном из следующих форматов есть? У меня такие варианты импорта в KiCad доступны:
- Altium schematic files (*.SchDoc)
- CADSTAR schematic archive (*.csa)
- Eagle XML schematic files (*.sch)
- EasyEDA (JLCEDA) Std files (*.json)
- EasyEDA (JLCEDA) Pro files (*.epro; *.zip)
- LTspice schematic files (*.asc)

Titus
19.12.2024, 21:26
А возможность сохранить в одном из следующих форматов есть? У меня такие варианты импорта в KiCad доступны:

На сколько я вижу, у PCAD-2006 нет способа сохранить ни в каком формате, кроме его собственного .sch.

ZXMAK
19.12.2024, 21:38
На сколько я вижу, у PCAD-2006 нет способа сохранить ни в каком формате, кроме его собственного .sch.

а в формате pcad можешь выложить?

вот пару конвертеров нашел, попробую сконвертить, также вроде пишут KiCad должен и сам P-CAD ASCII files импортировать
https://bazaar.launchpad.net/~kicad-gost-committers/kicad/kicad/files/4496/extra/pcad2kicadsch
https://github.com/Ibavaresco/PCADSch2KiCAD

Titus
19.12.2024, 22:07
а в формате pcad можешь выложить?

https://transfiles.ru/cg2v0

Текущая ревизия.
Думаю, что ошибок в ней нет, просто это еще не финальная по подписыванию, группированию и вылизыванию.

ZXMAK
21.12.2024, 00:08
https://transfiles.ru/cg2v0

Текущая ревизия.
Думаю, что ошибок в ней нет, просто это еще не финальная по подписыванию, группированию и вылизыванию.

спасибо. конвертер к сожалению не берет - падает прямо вначале файла получает токен II, далее ожидает увидеть строку начинаюуюся с ", а там 0x02.. Похоже проблема в том что это бинарный формат, а конвертер ожидает PCAD ASCII. В PCAD нет возможности сохранить в PCAD ASCII?

Titus
21.12.2024, 00:47
нет возможности сохранить в PCAD ASCII?
https://transfiles.ru/9ngnu

ZXMAK
21.12.2024, 01:05
https://transfiles.ru/9ngnu

уже лучше, процесс конвертации идет, но падает. А файл не битый? Подозрительно маленький размер 600 кБ по сравнению с бинарным на 18 МБ...

Подебажил немного конвертер, оказалось падал он на каком-то странном коде при попытке распознать единицы измерения mm. Переделал код, конвертер сконвертил, при конвертации есть ворнинги "Warning: KiCAD does not have port "NoAngle_Sgl_Vert", passive model used.". Но открывается :)

Правда схемы почему-то далеко за пределами листа, это так и в оригинале? (В центре - это лист где должна быть схема)
https://i.imgur.com/wD0LzqJ.png

Также вылезла еще одна проблема - номера транзисторов почему-то не сконвертились, они точно в файле сохранились?
https://i.imgur.com/6OGoz8b.png

Titus
21.12.2024, 04:22
Также вылезла еще одна проблема - номера транзисторов почему-то не сконвертились, они точно в файле сохранились?

Во всяком случае в текстовом файле есть названия транзисторов, значит сохранились)

Мне кажется, вместо заката солнца вручную проще поставить PCAD2006 и не мучиться)

ZXMAK
21.12.2024, 08:15
Мне кажется, вместо заката солнца вручную проще поставить PCAD2006 и не мучиться)

помоему для моей платформы на ARM Cortex A72 его просто не существует в природе... :)

Вобщем пришлось основательно продебажить и допилить конвертер, добавил генерацию uuid-ов для символов и проекта, чтобы заработали имена (Reference) компонентов. Теперь транзисторы и имена остальных компонентов сохраняются... :)

Правда на некоторых схемах встречаются странные длинные проводники вдоль всей схемы, висящие в воздухе - что это?
https://i.imgur.com/EidM0KR.png

это так в оригинале было?
https://i.imgur.com/we8J79X.png

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

Кстати, вопрос - для какого варианта Z80 netlist в симуляторе Z80Explorer/visual6502? И есть ли netlist для других процессоров?

Titus
21.12.2024, 13:36
Правда на некоторых схемах встречаются странные длинные проводники вдоль всей схемы, висящие в воздухе - что это?
Я думаю, эти вертикальные проводники - глюк конвертера.

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


помоему для моей платформы на ARM Cortex A72 его просто не существует в природе...

Переходи на платформу КПСС PC :-)

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


Кстати, вопрос - для какого варианта Z80 netlist в симуляторе Z80Explorer/visual6502? И есть ли netlist для других процессоров?

В каком смысле для какого варианта? NMOS или CMOS? Конечно NMOS.

Другие процессоры ты имеешь в виду Z80?

ZXMAK
21.12.2024, 14:35
Я думаю, эти вертикальные проводники - глюк конвертера.

попробую продебажить откуда он берется. Можешь проверить нет ли в PCAD версии на этом месте какого-то висящего провода или чего-то подозрительно похожего?


Переходи на платформу КПСС PC :-)

не могу :)

KiCad хорошо и достаточно шустро работает, т.к. использует ускорение аппаратного графического акселератора. Есть встроенный симулятор.



В каком смысле для какого варианта? NMOS или CMOS? Конечно NMOS.

Другие процессоры ты имеешь в виду Z80?

Да, другие варианты Z80 (NMOS/CMOS, Zilog/ST и т.д.).

В visual6502 похоже NMOS, т.к. OUT (C),0 выводит 0 в порт. Но непонятно - какая именно разновидность. На изображении есть вот такие полигоны с идентификацией:
https://i.imgur.com/AlLCqbv.png

Чем-то напоминает фотку кристалла Z0840004PSC (https://s.zeptobars.com/z80-Z0840004PSC-HD.jpg), но есть отличия - нет буквы J в конце, полигоны отличаются. Правда непонятно - эти отличия при оцифровке появились или это другой кристалл?

Есть ли netlist файлы для других вариантов Z80? И какие варианты Z80 удалось идентифицировать?

Также непонятно - из какого источника брались эти netlist? Например в netlist от visual6502 максимальный номер транзистора T8880, а у тебя на схеме NMI_ACK есть транзистор T9087. Почему в netlist нет T9087, но есть соседний T4030? Выход NMI_ACK с T4030 в симуляторе проверил - работает. Однако непонятно почему в netlist нет T9087?

Titus
21.12.2024, 15:02
В visual6502 похоже NMOS, т.к. OUT (C),0 выводит 0 в порт.
Не похоже, а точно.

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


Можешь проверить нет ли в PCAD версии на этом месте какого-то висящего провода или чего-то подозрительно похожего?
Да нет ничего там такого.

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


Есть ли netlist файлы для других вариантов Z80? И какие варианты Z80 удалось идентифицировать?
Товарищ Nuked с эмураши делал в сентябре нетлист от CMOS версии t84c00. Вроде бы от Тошибы. Но он сразу это все писал на Си, и не в виде транзисторов а в виде логических примитивов. Не знаю, можно ли это вытащить в виде нетлиста.

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


Также непонятно - из какого источника брались эти netlist? Например в netlist от visual6502 максимальный номер транзистора T8880
У меня больше номеров транзисторов, т.к. в нетлисте Z80Explorer'а нет подтягивающих транзистотров. Они находятся в отдельном списке и без номеров. Поэтому я их потом добавлял вручную, и с них набежало еще немало.

ZXMAK
21.12.2024, 15:13
Товарищ Nuked с эмураши делал в сентябре нетлист от CMOS версии t84c00. Вроде бы от Тошибы. Но он сразу это все писал на Си, и не в виде транзисторов а в виде логических примитивов. Не знаю, можно ли это вытащить в виде нетлиста.

так ведь на любом языке удобнее netlist из текстового файла загрузить и уже из него генерировать логические примитивы, си код или что нужно. Есть ссылка на его netlist?

Непонятно откуда все берут эти netlist, чем из чего генерируют?

Получается кроме netlist этой неидентифицированной NMOS разновидности Z80 8400 больше ничего в открытом доступе нет?

В Z80Explorer netlist идентичен visual6502 - файлы полностью идентичны. В visualz80remix используется свой формат перегенерированный в сишный h файл, но судя по начальным и конечным транзисторам похоже тот-же самый netlist, что и в Z80Explorer, полигоны идентификации тоже идентичные, только в Z80Explorer они немного "разъеденные":
https://i.imgur.com/SDPj1BD.png

Хотелось бы найти netlist для другой разновидности Z80.

Titus
21.12.2024, 15:37
Непонятно откуда все берут эти netlist, чем из чего генерируют?

Сами рисуют по фотографии кристалла, разумеется.
Кто-то рисует в виде транзисторов (как в Z80Explorer), кто-то рисует сразу логическими вентилями.

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


Получается кроме netlist этой неидентифицированной NMOS разновидности Z80 8400 больше ничего в открытом доступе нет?

Не думаю, что есть смысл особо идентифицировать NMOS-версию. По разводке кристалла видно, что это ранняя оригинальная версия кристалла, такая, как у z80-Z0840004PSC.

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


так ведь на любом языке удобнее netlist из текстового файла загрузить и уже из него генерировать логические примитивы, си код или что нужно. Есть ссылка на его netlist?

https://github.com/nukeykt/Nuked-MD/blob/main/t84c00.c

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

Тот же Nyked делал года два назад такой же сишный вариант с NMOS-версии.

https://github.com/nukeykt/Nuked-MD-FPGA/blob/main/z80.v - верилог версия

https://github.com/nukeykt/Nuked-MD/blob/main/z80.c - Си версия

ZXMAK
21.12.2024, 18:18
Не думаю, что есть смысл особо идентифицировать NMOS-версию. По разводке кристалла видно, что это ранняя оригинальная версия кристалла, такая, как у z80-Z0840004PSC.

Насколько я понимаю, NMOS весьма разные бывают, например в Zilog NMOS и в NEC NMOS флаги F3, F5 совершенно по разному работают (в Zilog с так называемым регистром Q, в NEC без), однако и то и то NMOS.

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


https://github.com/nukeykt/Nuked-MD/blob/main/t84c00.c

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

Тот же Nyked делал года два назад такой же сишный вариант с NMOS-версии.

https://github.com/nukeykt/Nuked-MD-...lob/main/z80.v - верилог версия

https://github.com/nukeykt/Nuked-MD/blob/main/z80.c - Си версия

я это видел, но это эмулятор, вероятно написанный по результатам изучения netlist, но насколько понимаю - это далеко не netlist симулятор и поведение его может сильно отличаться от реального процессора.

Пока вижу так, что есть только один netlist-симулятор Z80 - это visual6502, все остальное - это его клоны с тем-же netlist. Поправьте, если не прав.

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

Вот нашел ссылку, где вроде как были снимки кристалла, с которого реверсили netlist для visual6502:
https://web.archive.org/web/20130909121059/http://uxul.org/~noname/visual6502/z80/

Но файлы уже не доступны. Может кто знает, что там было или у кого-то остались снимки?

Вот остался покоцанный скриншот, но в очень плохом качестве - ничего не видно (исходное изображение было на 400 МБ):
https://static.righto.com/images/z80/z80_labeled_bus_addr.png


Мне думается первым делом нужно научиться идентифицировать какой именно Z80, чтобы понимать что именно мы тестируем. Без этого все разговоры тут похожи на притчу про слона и слепых людей, которые трогают слона за разные части тела но при этом только какую-то одну из них, каждый описывает слона по-разному, при этом на самом деле ни одно из описаний не является верным. :)

Очень много результатов было приведено, но все они по сути бесполезны, т.к. не содержат ни информации о конкретном процессоре, ни конкретной версии теста которым производилось тестирование. Были упомнания конкретных процессоров с результатами, но тесты которыми производилось тестирование уже недоступны, поэтому эта информация тоже бесполезна. Именно эта информация в связке и является ключевой.

Вижу очень многие слепо ориентируются на netlist симулятор, но при этом неизвестно - для какой именно версии процессора netlist используется. Поэтому, как мне кажется, нужно вначале строго классифицировать информацию о вариантах процессора Z80 и при обсуждении особенностей и результатов тестов указывать как конкретный тип процессора, так и ссылку на конкретную версию тестов и конкретные результаты. Потому, что один и тот-же тест двух ревизий может давать совершенно противоположные результаты (сам это на днях наблюдал для scfccf тестов).

Для начала хорошо-бы определить - что за версия процессора Z80 была использована для реверса netlist в visual6502, т.к. это по сути единственный рабочий симулятор который у нас есть.

Titus
21.12.2024, 19:43
Насколько я понимаю, NMOS весьма разные бывают, например в Zilog NMOS и в NEC NMOS флаги F3, F5 совершенно по разному работают (в Zilog с так называемым регистром Q, в NEC без), однако и то и то NMOS

Я не думаю, что основные производители NMOS чипов схематехнически отличаются. Отличаются нормы, по которым сделан кристалл, а так же немного трассировка.
Естественно, что из-за этого плавающие флаги (5 и 3) плавают по разному. Это показывает мой Test SCF.
Пока что я не видел никакой разницы в исполнении этого теста по сути. Менялись только пороги, и это видно на картах теста. А суть одинаковая.
Возможно, в некоторых чипах еще что-что подшаманили или переделали. Но пока об этом говорить сложно.

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


Вот остался покоцанный скриншот, но в очень плохом качестве - ничего не видно (исходное изображение было на 400 МБ):
Дай прямую ссылку на покоцанный.

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


я это видел, но это эмулятор, вероятно написанный по результатам изучения netlist, но насколько понимаю - это далеко не netlist симулятор и поведение его может сильно отличаться от реального процессора.

Да, это эмулятор на уровне вентилей на основе нетлиста. Nyked так и пишет.

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


Пока вижу так, что есть только один netlist-симулятор Z80 - это visual6502, все остальное - это его клоны с тем-же netlist. Поправьте, если не прав.
Все так.

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


Вот остался покоцанный скриншот, но в очень плохом качестве - ничего не видно (исходное изображение было на 400 МБ):
Увеличь, там посередине написано Zilog )

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


Потому, что один и тот-же тест двух ревизий может давать совершенно противоположные результаты (сам это на днях наблюдал для scfccf тестов).
Почему тесты SCF/CCF дают разные результаты я не просто знаю, а абсолютно точно знаю.
И это нормально.

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


Для начала хорошо-бы определить - что за версия процессора Z80 была использована для реверса netlist в visual6502, т.к. это по сути единственный рабочий симулятор который у нас есть.
Напиши авторам, спроси, какую точно модель они реверсили.
Понятно, что это одна из классических ранних. Тем более с надписью Zilog.

И не надейся на точность этого симулятора, плавающие флаги он тебе, я думаю, он не покажет, т.к. на этом уровне он не симулирует.

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

Чтобы просимулировать плавающие флаги, нужно симулировать физические процессы наводок одних проводников на другие, температуру процессора и т.д.
Но этого всего делать не надо. Т.к. все уже давно с ними понятно и протестировано.

ZXMAK
21.12.2024, 19:44
Я не думаю, что основные производители NMOS чипов схематехнически отличаются. Отличаются нормы, по которым сделан кристалл, а так же немного трассировка.
Естественно, что из-за этого плавающие флаги (5 и 3) плавают по разному. Это показывает мой Test SCF.

в том-то и дело, что поведение флагов разное у разных производителей - у одних (с Q-регистром) оно зависит от состояния флагов предыдущих операций и еще от каких-то плавающих состояний, у других никак не зависит. И оба NMOS, но разных производителей. Ясно, что схемы АЛУ отличаются. Это разные схемы, поэтому не стоит их смешивать и рассматривать как один и тот-же кристалл только потому что оба NMOS.

Titus
21.12.2024, 19:49
в том-то и дело, что поведение флагов разное у разных производителей - у одних (с Q-регистром)
В какой команде-то?

ZXMAK
21.12.2024, 19:57
Увеличь, там посередине написано Zilog )

Да, действительно - это хорошо, я сразу и не заметил эту надпись в симуляторе, она под полигоном grounded diffusion спрятана :)
https://i.imgur.com/RuPVgdY.png

правда что конкретно за чип был всеравно непонятно. У Zilog тоже разные ревизии были.



Почему тесты SCF/CCF дают разные результаты я не просто знаю, а абсолютно точно знаю.

я тоже знаю - автор теста просто в следующей альфа-ревизии теста поменял неправильный результат на правильный. Однако в результате имеем два теста, казалось бы даже одной версии, но дающие совершенно противоположные стабильные результаты на одном и том-же процессоре, просто за счет того, что ревизия теста отличается... :D


Напиши авторам, спроси, какую точно модель они реверсили.
Понятно, что это одна из классических ранних. Тем более с надписью Zilog.

авторов наверное найти уже не получится, последние сообщения от них в ноябре 2015 года про ARM1. Уже почти 10 лет прошло.



В какой команде-то?

SCF/CCF

Также поведение у Zilog разных ревизий отличается для команд LD A,I/R

И OUT (C),0 тоже у Zilog разных ревизий отличается (так называемые NMOS/CMOS)

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

Ты вроде писал раньше, что значения флагов для SCF/CCF зависит от двух шин которые переключаются, подскажи - где эта часть схемы находится? Хочу найти этот пресловутый регистр Q :)

Titus
21.12.2024, 23:49
я тоже знаю - автор теста просто в следующей альфа-ревизии теста поменял неправильный результат на правильный.
В смысле поменял? Я автор теста Test SCF 9, и ничего я там не менял)

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


SCF/CCF
С этой командой все абсолютно понятно, и поведение на всех NMOS процессорах однотипное, отличается только порогами и итоговой битовой картой.

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


И OUT (C),0 тоже у Zilog разных ревизий отличается (так называемые NMOS/CMOS)

NMOS и CMOS - это разные технологические базы, поэтому и отличается. Это нормально.

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


Ты вроде писал раньше, что значения флагов для SCF/CCF зависит от двух шин которые переключаются, подскажи - где эта часть схемы находится? Хочу найти этот пресловутый регистр Q
Прочитай внимательно всю эту тему, и еще эту (https://zx-pk.ru/threads/35936-zagadka-plavayushchikh-flagov-scf-ccf-raskryta!.html)тему, тогда 90% вопросов отпадет)

ZXMAK
22.12.2024, 01:28
В смысле поменял? Я автор теста Test SCF 9, и ничего я там не менял)

Я про вот этот тест писал: https://github.com/raxoft/z80test/blob/v1.2a/src/z80ccf.asm

с твоим тестом тоже приколы - первая версия что ты выложил удалена, а большинство результатов выложены имено под нее. Я вот смотрел скрины людей, хотел протестить именно на той версии, а не на новой, чтобы сравнить с выложенными результатами. Но теста нет. А для Test SCF 9 результаты сравнивать почти не с чем...


С этой командой все абсолютно понятно, и поведение на всех NMOS процессорах однотипное, отличается только порогами и итоговой битовой картой.

ну как-же однотипное, если разное. Zilog NMOS и NEC NMOS совершенно по разному обрабатывают флаги, тут об этом еще ZjoyKiLer писал (https://zx-pk.ru/threads/34173-revers-inzhiniring-z80.html?p=1204370&viewfull=1#post1204370). Речь не о нестабильности, NEC NMOS Z80 работает стабильно, но флаги ставит по другому, это другой чип с другой схемой.

Zilog nMOS и NEC nMOS используют разную логику и разные схемы для установки флагов. В NEC nMOS (NEC D780C-1) нет никаких порогов и плавающих битов, он абсолютно стабильно работает, но в отличие от Zilog NMOS флаги F3 и F5 берет из аккумулятора. Именно этот Z80 по дефолту в ZXMAK2 эмулируется.

Итого, я вижу 4 разновидности Z80, поправь если их больше:
1) ZILOG NMOS
2) ZILOG CMOS
3) NEC NMOS
4) ST CMOS

Из них NEC NMOS - самый стабильный и предсказуемый, т.к. использует аккумулятор A вместо пресловутого Q регистра и плавающих шин, хотя и менее распростанен, чем остальные.

Насколько понимаю, netlist в visual6502 от первого варианта (ZILOG NMOS).

В каких из них проявляется нестабильность мне пока непонятно - это какие-то отдельные ревизии или или просто отбраковка одного из вышеуказанных видов. Насколько понимаю, речь о нестабильности идет про специфические ревизии первого варианта.

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

PS: По поводу схем, подчистил немного код конвертера, в нем неправильно вычислялись размеры листа, плавающий провод после этого вроде исчез.

Titus
22.12.2024, 02:18
Я про вот этот тест писал: https://github.com/raxoft/z80test/bl...src/z80ccf.asm
Этот тест устарел, его я даже не рассматриваю.

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


с твоим тестом тоже приколы - первая версия что ты выложил удалена, а большинство результатов выложены имено под нее. Я вот смотрел скрины людей, хотел протестить именно на той версии, а не на новой, чтобы сравнить с выложенными результатами. Но теста нет. А для Test SCF 9 результаты сравнивать почти не с чем...
Все версии, кроме 9-й были одинаковыми по сути, но менее полными. Поэтому я их и удалил, чтобы не отвлекали на себя внимание.
Большинство результатов (а их десятки) выложены именно под Test SCF 9.

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


ну как-же однотипное, если разное. Zilog NMOS и NEC NMOS совершенно по разному обрабатывают флаги, тут об этом еще ZjoyKiLer писал. Речь не о нестабильности, NEC NMOS Z80 работает стабильно, но флаги ставит по другому, это другой чип с другой схемой.

Мои тесты не показывают никакой разницы в принципе работы Zilog и NEC. NEC не противоречит теории, просто другие пороги. Все уходы за пределы порогов в плюс или в минус от той линии, через которую тесты могут визуализировать паттерн шума зависит от технологии изготовления, напряжения питания и много чего еще.

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


Zilog nMOS и NEC nMOS используют разную логику и разные схемы для установки флагов. В NEC nMOS (NEC D780C-1) нет никаких порогов и плавающих битов, он абсолютно стабильно работает, но в отличие от Zilog NMOS флаги F3 и F5 берет из аккумулятора.
Еще раз повторю, что стабильность в тесте не означает иную схемотехнику.
У меня полно стабильных NMOS'ов других производителей. Причем, как с переходом флага в 1, так и в 0 относительно середины.

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


Итого, я вижу 4 разновидности Z80, поправь если их больше:
1) ZILOG NMOS
2) ZILOG CMOS
3) NEC NMOS
4) ST CMOS

Отбрасывая пока CMOS, оставляя только NMOS скажу, что разновидностей гораздо больше. Но все они сделаны ПО ОДНОЙ схеме.

Попробую перечислить классы:

1) NEC JAPAN - D780C - протестирован только один экземпляр, поля теста стабильные 0:0 у zebest

2) Zilog Z0840004PSC - 4 штуки дают стабильные поля 1:1 в компьютере от DDp
3 штуки дают стабильные поля 1:0 у zebest, SoftLight и DDp
2 штуки дают паттерн класса A (назовем разные паттерны буквами A,B,C,D и т.д.) у товарища П321 и DDp

3) Zilog Z8400APS - 1 штука, поля 1:1 у haywire

4) ST Z8400AB1 - 1 штука, поля 1:1 у DDp
1 штука дают поля 1:0 у zebest
2 штуки дают поля класса A у товарищей zebest и creator

5) Angstrem КР1858ВМ1 - 1 штука, поля 1:0 от creator
1 штука поля класса B от DDp

6) LH0080B Z80B-CPU - SHARP - 1 штука, поля 1:0 от zebest

7) Angstrem Т34ВМ1 - 1 штука, поля класса B от SoftLight

8) GoldStar Z8400A PS - 1 штука, поля класса B от SoftLight

9) TSL 80H-CPU - 1 штука, поля класса B от DDp

10) ГДР - 80A-CPU - 1 штука, поля класса B от DDp


И это только то, что наши форумчане не поленились потестить. Уверен, если бы энтузиастов на реале нашлось побольше, то мы бы имели более интересную статистику.
Как видишь, один и тот же процессор может в одном компьютере и условиях поле с определенным распределением, либо же статическую картинку.
Поэтому всякий стабильный процессор является таковым, пока не поставлен в условия, когда паттерн все же вылезет на поверхность.

Два типа паттернов A и B я обьясняю как раз разными технологическими нормами.

Например, у Т34-подобных размер кристалла 4513x4251 µm
У Angstrem КР1858ВМ1 - 3601x3409 µm
А у ГДРовского - MME - 4950x4720 µm

А схема везде одинаковая.
И не стоит искать различие в схеме через SCF/CCF. Это слишком примитивная команда. И никаких присутствий/отсутствий регистра Q (которым, наверное, все называют кеш регистра F) нет! Он есть везде. Его невозможно ни убавить, ни добавить в разные ревизии чипов, т.к. он очень важен и очень массивен по своей площади.
Вот если на других командах найдется отличие, вот там уже стоит рассмотреть.

sh686
22.12.2024, 05:50
Вот нашел ссылку, где вроде как были снимки кристалла, с которого реверсили netlist для visual6502:
https://web.archive.org/web/20130909...isual6502/z80/

Но файлы уже не доступны. Может кто знает, что там было или у кого-то остались снимки?

Вот остался покоцанный скриншот, но в очень плохом качестве - ничего не видно (исходное изображение было на 400 МБ):

Вот тут кое что есть:
http://www.visual6502.org/images/z80/


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


Дай прямую ссылку на покоцанный.

есть файл 171 мб примерно оттуда же
http://www.visual6502.org/images/z80/Z80_st2_top_9156.png

ZXMAK
22.12.2024, 12:07
Все версии, кроме 9-й были одинаковыми по сути, но менее полными. Поэтому я их и удалил, чтобы не отвлекали на себя внимание.

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

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


Мои тесты не показывают никакой разницы в принципе работы Zilog и NEC. NEC не противоречит теории, просто другие пороги.

Еще раз повторю, что стабильность в тесте не означает иную схемотехнику.
У меня полно стабильных NMOS'ов других производителей. Причем, как с переходом флага в 1, так и в 0 относительно середины.

Однако с NEC вопрос в том, что у них результат зависит не от перехода в 1 или 0 относительно середины, а напрямую зависит от другого регистра.


1) NEC JAPAN - D780C - протестирован только один экземпляр, поля теста стабильные 0:0 у @zebest

Вот это самый интересный момент. Есть конкретная версия теста которой тестили и сохранился ли результат в виде снимка экрана? Потому, что без теста и результата который можно воспроизвести и проверить - это информация из разряда одна бабка сказала.



Поэтому всякий стабильный процессор является таковым, пока не поставлен в условия, когда паттерн все же вылезет на поверхность.

Нет, так нельзя обобщать - это некорректно. Это ошибка обобщения на основе ограниченной выборки. Она связана с тем, что выводы о целом классе объектов делаются на основании данных, полученных только для одной его части, которая не является доказуемо репрезентативной для всего множества.

Результатов с тестами для NEC довольно много, но чем они примечательны - они абсолютно все дают стабильные, повторяемые и прогнозируемые результаты и показывают, что результат берется из аккумулятора, а не из регистра флагов, чем значительно отличаются от ZILOG и ST, у которых источник флагов пресловутый регистр Q.

Если бы были результаты тестов, которые свидетельствуют, что NEC может давать результат не из регистра A, а из Q, тогда можно было-бы пробовать делать такие обобщения, пока таких результатов нет (и сомнительно, что они вообще возможны) таких обобщений делать нельзя.


И никаких присутствий/отсутствий регистра Q (которым, наверное, все называют кеш регистра F) нет! Он есть везде.

Он есть на твоей схеме? Как его найти?


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


http://www.visual6502.org/images/z80/

отлично, правда открывает еще один вопрос - это ошибка, что полигон в виде буквы T оцифрован как полигон в виде буквы V? Или это снимок с другой ревизии кристалла?

https://i.imgur.com/gJyDhpK.png https://i.imgur.com/4Lmujgh.png

Titus
22.12.2024, 14:56
Вот это самый интересный момент. Есть конкретная версия теста которой тестили и сохранился ли результат в виде снимка экрана? Потому, что без теста и результата который можно воспроизвести и проверить - это информация из разряда одна бабка сказала.
Есть в этой теме, или в теме про SCF. Мне лень искать, поищи, результат выкладывал zebest.

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


Результатов с тестами для NEC довольно много, но чем они примечательны - они абсолютно все дают стабильные, повторяемые и прогнозируемые результаты и показывают, что результат берется из аккумулятора, а не из регистра флагов, чем значительно отличаются от ZILOG и ST, у которых источник флагов пресловутый регистр Q.

Хорошо, не буду спорить по сто раз о том, что не может быть значительного отличия в схемах у разных NMOS) А наличие/отсутствие кэша регистра F - это сверхбольшое отличие)

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


Он есть на твоей схеме? Как его найти?

Конечно он там есть. У меня же полная схема.

Но ты его долго будешь собирать по кускам, т.к. в транзисторном виде он очень большой.
Смотри страницу ALU.
На ней большие блоки, каждый из них относящийся к конкретному биту кеша флагов.
Ищи по /LBUS0, /LBUS1 и т.д.

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


Вот тут кое что есть:
http://www.visual6502.org/images/z80/
Но при этом они не указали маркировку на корпусе, откуда вообще кристалл был взят(

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

В общем, посравнивал я фотку кристалла с теми, что находил в инете, и она один в один совпадает с Zilog Z8400APS.
Поэтому будем считать, что нетлист мы имеем именно с него.

AlexG
22.12.2024, 15:10
Мои пять копеек. ИМХО.
Я не думаю что каждый кто производил z80 делал СВОЮ топологическую реализацию. Хотя бы чисто из экономических соображений. "Просто взяли топологию и натянули на своё производство" - дёшево и сердито (и быстро). Если кто и делал изменение топологии так это только "авторы". Для есть правда исключения - то ли "кролик" толи ещё кто (кто был "однотактовым") (если не сильно склероз). Ну а в современном мире своих топологий как грязи - тот же марвелл использует сей проц в хабах(свитчах ?).

Titus
22.12.2024, 15:48
"Просто взяли топологию и натянули на своё производство" - дёшево и сердито (и быстро).
Согласен. Судя по всему так и есть.
Поэтому можно условно считать все NMOS одинаковыми по топологии, за исключением каких-то специально правленых кристаллов, и то, если это будет не просто выявлено в тестах, но и теоретически обосновано.
Теоретическое обоснование SCF полностью охватывает все текущие разновидности NMOS и обьясняет их единой моделью.

Кстати говоря, долгое время думали, что CMOS стабильны, пока на тестах Test SCF 9 в некоторых экземплярах не выявили такое же распределение шума, как и на NMOS. Что может говорить лишь о том, что CMOS это простая конвертация NMOS на новую технологию без какого-либо изменения принципа работы. Либо же изменения минимальные.

ZXMAK
22.12.2024, 22:22
Я не думаю что каждый кто производил z80 делал СВОЮ топологическую реализацию.

однако снимки кристаллов кардинально отличаются, сравните:

- http://www.visual6502.org/images/z80/z80_10x_top_2000.png
- http://visual6502.org/images/Z84C00/Z84C00_die_shot_20x_1b_1600w.jpg
- https://ic.onidev.fr/map/toshiba/T6A43/60S/T84C00-CORE.html

Как может быть одна топология, если вся разводка полностью другая?

Titus
22.12.2024, 22:44
однако снимки кристаллов кардинально отличаются, сравните:

NMOS только на первой фотке

На остальных CMOS. Их не надо сравнивать между собой. Я говорю пока что только о NMOS, т.к. схема у меня от NMOS.

ZXMAK
23.12.2024, 04:02
Z80 Special Reset (http://www.primrosebank.net/computers/z80/z80_special_reset.htm)

https://i.imgur.com/logbIvW.png

Действительно - сбрасывает только PC, прерывания оставляет разрешенными и IR не трогает :)

Любопытно, что схема блокировки прерываний как после EI - не задействуется (iffe - сигнал разрешения прерываний с учетом этой блокировки).

А вот обычный сброс, после EI для наглядности:

https://i.imgur.com/vxcHhe0.png

Titus
23.12.2024, 13:45
Действительно - сбрасывает только PC, прерывания оставляет разрешенными и IR не трогает
Я так и говорил)

Это что за таблицы? Это ты Z80Exploerer так тестируешь?

ZXMAK
23.12.2024, 14:07
Это что за таблицы? Это ты Z80Exploerer так тестируешь?

нет, немного допилил visual6502 под свои нужды для тестов - исправил ошибки инициализации и дизассемблера, переделал UI, стало в несколько раз быстрее и удобнее дебажить :)

Правда дизассемблер все еще глючит - не понимает, когда процессор делает холостую выборку опкода с префиксом, например во время halt, и начинает трактовать следующие выборки как префиксный опкод. Нужно будет заменить самопальный анализ префиксов на чтение состояния из процессора, чтобы корректно префиксы дизассемблировались:
https://i.imgur.com/KZtVWkI.png

Titus
23.12.2024, 14:13
нет, немного допилил visual6502 под свои нужды для тестов - исправил ошибки инициализации и дизассемблера, переделал UI, стало в несколько раз быстрее и удобнее дебажить

А цель какая? Прошагать все команды, и таким образом узнать, что как работает? )

ZXMAK
23.12.2024, 14:30
А цель какая? Прошагать все команды, и таким образом узнать, что как работает? )

отладка для допиливания эмулятора для более точной потактовой эмуляции. Уже несколько неточностей с таймингами нашел.

Titus
23.12.2024, 15:25
отладка для допиливания эмулятора для более точной потактовой эмуляции. Уже несколько неточностей с таймингами нашел.

До полутактовости допиливать не будешь? )

ZXMAK
23.12.2024, 19:42
До полутактовости допиливать не будешь? )

в этом я не вижу смысла. Интересно, есть аналогичный нетлист для 8080?

Titus
23.12.2024, 22:41
в этом я не вижу смысла. Интересно, есть аналогичный нетлист для 8080?
Реверс в виде транзисторной схемы есть.

ZXMAK
24.12.2024, 15:07
Реверс в виде транзисторной схемы есть.

а в текстовом (или json/xml) виде есть? чтобы можно было сделать выборку соединений транзисторов в текстовом виде?

Titus
24.12.2024, 20:44
Вроде нет)

anasana
24.12.2024, 23:03
а нетлист отсюда ( https://github.com/1801BM1/vm80a/tree/master/sch ) выгрузить?
или надо чистый 8080?

ZXMAK
25.12.2024, 16:13
а нетлист отсюда ( https://github.com/1801BM1/vm80a/tree/master/sch ) выгрузить?
или надо чистый 8080?

там схема в бинарном pcad формате, мне нечем прочитать. Да и из схемы вытянуть связи между транзисторами задача не такая и простая, нужно свой парсер писать. Может чтото готовое есть?

Titus
25.12.2024, 16:55
Да и из схемы вытянуть связи между транзисторами задача не такая и простая, нужно свой парсер писать. Может чтото готовое есть?
Вряд ли) Скорее всего самому придется)

ZXMAK
25.12.2024, 19:24
Titus, пытаюсь разобраться в твоей схеме как процессор префиксные инструкции обрабатывает. Где он хранит информацию о префиксах?

На схеме PLA нашел сигналы /CB_SET, /ED_SET, /IDX_SET, /BASE_SET. Но смысл их непонятен.

Казалось бы первые два должны устанавливаться сразу после обработки соответствующего префикса CB/ED, но нет. /ED_SET устанавливается на последнем такте выборки опкода после префикса, где тогда хранится все это время информация о префиксе?

С /CB_SET всё еще чудесатее - он устанавливается уже после выборки префикса и опкода... и более того - удерживается даже когда идет выборка следующего опкода... :confused:

/IDX_SET устанавливается на последнем такте выборки опкода (как и /ED_SET), при этом непонятно как процессор отличает IX от IY.

Что такое /BASE_SET вообще не понятно - он устанавливается на последнем такте выборки опкода и может вообще не сбрасываться на серии инструкций. :confused:

Нашел еще сигналы DD/FD prefix, CB prefix, ED prefix и их объединение DD/FD/ED/CB prefix на схеме ECO, они ведут себя более адекватно - устанавливаются после префиксов, но странно - сбрасываются как-раз перед последним тактом выборки опкода, т.е. когда идет захват опкода они уже сброшены - странно.

Почему-то для DD/FD,CB такого сигнала нет - после DD/FD устанавливается сигнал DD/FD, а после следующего за ним CB сигнал DD/FD сбрасывается и устанавливается CB, как при обычном префиксе CB. Странно.

Titus
25.12.2024, 21:30
На схеме PLA нашел сигналы /CB_SET, /ED_SET, /IDX_SET, /BASE_SET. Но смысл их непонятен.
Как раз все понятно. Если установлен соответствующий сигнал, то опкод декодируется в соответствии с префиксом.

BASE_SET - это базовый набор инструкций

Триггеры, хранящие состояние префиксов тактируются сигналом PREF_CLK, который в общем случае активен в M1.T3.1

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


/IDX_SET устанавливается на последнем такте выборки опкода (как и /ED_SET), при этом непонятно как процессор отличает IX от IY.

Есть специальный триггер, он содержит информацию, какой сейчас набор IX или IY. Транзисторы T3603/T3611 и т.д.

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


Почему-то для DD/FD,CB такого сигнала нет - после DD/FD устанавливается сигнал DD/FD, а после следующего за ним CB сигнал DD/FD сбрасывается и устанавливается CB, как при обычном префиксе CB. Странно.
Выборка опкода для DD/FD/CB отличается от всех остальных команд. Этот опкод выбирается отдельным способом не в цикле M1. Я об этом писал в этой теме, поищи. Видимо, это было сделано для ускорения таких команд или для еще какой-то оптимизации.

ZXMAK
25.12.2024, 21:59
BASE_SET - это базовый набор инструкций

почему он не сбрасывается на серии префиксных инструкций?



https://i.imgur.com/kukzgHv.png




Есть специальный триггер, он содержит информацию, какой сейчас набор IX или IY. Транзисторы T3603/T3611 и т.д.

да, действительно именно тут хранится, спасибо за инфу :) По умолчанию он 1, для DD опкодов сбрасывается в 0. Получается IY у Z80 как-бы регистр по умолчанию? :)

А почему сигнал никак не назван?

Любопытно, что сигнал и SEL_IX и SEL_IY, в отличие от указанного, включается только на один полу-такт в момент пересылки.

Titus
25.12.2024, 22:13
А почему сигнал никак не назван?
Есть сигналы, которые и так понятны из контекста. Не буду же я все десять тысяч соединений подписывать именами)

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


почему он не сбрасывается на серии префиксных инструкций?
Ты имеешь в виду префиксных DD/FD?
Но ведь набор команд остается тот же, просто меняется HL на IDX, и всякое такое.
Тогда как в ED и CB меняется сам набор команд.

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


Любопытно, что сигнал и SEL_IX и SEL_IY, в отличие от указанного, включается только на один полу-такт в момент пересылки.
Все правильно. Так как SEL_какой-то регистр непосредственно управляет чтением/записи из банка регистров, а активная фаза чтения или записи как раз и длится пол-такта.

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


да, действительно именно тут хранится, спасибо за инфу По умолчанию он 1, для DD опкодов сбрасывается в 0. Получается IY у Z80 как-бы регистр по умолчанию?
Нет регистра по умолчанию)

По умолчанию - это то, что выбирается, когда нет явного указания, что выбрать.
А тут явно 0 или 1, и иного не дано.

ZXMAK
25.12.2024, 22:58
Ты имеешь в виду префиксных DD/FD?
Но ведь набор команд остается тот же, просто меняется HL на IDX, и всякое такое.
Тогда как в ED и CB меняется сам набор команд.

нет, после завершения выполнения инструкции он почему-то не сбрасывается.
Он похоже меняется на последнем такте выборки следующего опкода (M1 T3), поэтому когда идет DD,21,00,00, DD,21,00,00, то он все время в нуле...

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

Как-то очень сложно и непонятно префиксы в Z80 обрабатываются, я думал там все прозрачнее и проще. Пока не понимаю как это работает... :v2_dizzy_tired2:

Вот пример обработки DD,CB,00,46:

https://i.imgur.com/Ai3oWc0.png


А у тебя есть схема с логикой и триггерами вместо транзисторов?

Titus
25.12.2024, 23:05
DD,21,00,00, DD,21,00,00, то он все время в нуле...
Похоже, ты смотришь на инверсный сигнал. Он наоборот все время в единице.

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


Вот пример обработки DD,CB,00,46:
И чего тут непонятного?

ZXMAK
25.12.2024, 23:35
Похоже, ты смотришь на инверсный сигнал. Он наоборот все время в единице.

я вот о чём:

https://i.imgur.com/wo3JCYQ.png



И чего тут непонятного?

непонятно тут то, что на момент выборки опкода понять из состояния приведенных сигналов, что именно должен сделать процессор решительно невозможно. Флаги префиксов именно на такте захвата опкода сбрасываются (ещё до того как опкод будет захлопнут в защелке), для DD,CB вообще идут странные переключения из одного режима в другой.

Titus
25.12.2024, 23:37
я вот о чём:
А в чем проблема-то? Я не могу догадаться, что тебя смущает) Ну да, не очень ровные оранжевые линии вокруг циферок)

ZXMAK
25.12.2024, 23:54
А в чем проблема-то? Я не могу догадаться, что тебя смущает

кажется понял, /BASE_SET активирует дешифратор стандартных опкодов. Т.к. до этого был CB опкод, то сигнал был не активен, а на префиксе переключился в активное состояние, т.к. инструкция обрабатывается стандартным декодером. Ладно, с этим сигналом понятно.

Я сейчас пытаюсь понять, по каким сигналам можно определить что будет делать процессор с опкодом в моменты выборки из памяти. Нужно мне это, чтобы исправить дизассемблер симулятора, чтобы он показывал корректную инструкцию в момент выборки.

Но я пока не вижу как в момент выборки определить что за опкод читается - прямой или с каким префиксом. Ситуация усугубляется тем, что флаги префиксов сбрасываются прямо во время выборки опкода, еще до её завершения, т.е. на последнем такте выборки, когда происходит захват опкода по состоянию сигналов вообще не понятно что читает процессор... :(

Если на первых двух полутактов еще более-менее понятно - можно понять какой сейчас префикс, то вот на последнем полутакте выборки флаги уже сброшены. Новые флаги у процессора включатся на следующем полутакте. Поэтому в самый важный момент, когда процессор захватывает опкод нет информации о текущем состоянии префиксов...

Titus
26.12.2024, 00:42
Опкод недействительный всего пол-такта, между окончанием действия предыдущего опкода и выборкой следующего.
Эти пол-такта M1.T3.1 (если нет торможения памяти). В этом же полутакте идет установка режима выборки опкода.
Таким образом, с M1.T3.2 уже в регистре опкода защелкнут и действителен новый опкод, и уже в регистрах префиксов установлен выбор нужного набора команд или префикса.
Во все остальное время регистр опкода действителен и декодируется в соответствии с текущим режимом.
Если режим BASE_SET то по ПЛМ базового набора
Если режим ED_SET или CB_SET то по ПЛМ их наборов

ZXMAK
26.12.2024, 01:52
Опкод недействительный всего пол-такта, между окончанием действия предыдущего опкода и выборкой следующего.
Эти пол-такта M1.T3.1

это что, получается, что в промежуток от M1.T1.1 до M1.T2.2 процессор продолжает выполнять предыдущую операцию?


Таким образом, с M1.T3.2 уже в регистре опкода защелкнут и действителен новый опкод, и уже в регистрах префиксов установлен выбор нужного набора команд или префикса.

Это конечно хорошо, но как в M1.T3.1 предсказать какие флаги префиксов будут активированы на M1.T3.2?

Я хочу отобразить правильно дизассемблированную инструкцию в момент когда ещё идет её выборка, т.е. в M1.T3.1, а не когда она начинает обрабатываться в M1.T3.2...

По каким сигналам в полу-такте M1.T3.1 можно узнать как процессор будет декодировать текущий опкод?

Проверил еще раз, вот выборка:

https://i.imgur.com/M4o8nig.png


1) С самими префиксами ок, по /BASE_SET==0 можно определить что ED/CB/DD/FD - это префикс.

2) C ED46 ок - по /ED_SET==0 можно определить, что 46 - это опкод с префиксом ED

3) С DD210000 тоже ок - по /IDX_SET==0 и /BASE_SET==0 можно определить что 21 - это базовая операция с префиксом DD

4) А вот с CB40 возникает проблема - все перечисленные флаги в M1.T3.1 не активны, /CB_SET станет активным только на следующем полу-такте M1.T3.2. Как понять что 40 это опкод для префикса CB в M1.T3.1 (когда еще идет выборка)?


Эти пол-такта M1.T3.1 (если нет торможения памяти).

а если будет торможение wait, опкод может быть выбран не в момент перехода из M1.T3.1 в M1.T3.2?

Проверил - выборка похоже всегда идет в M1.T3.1. Если активируется WAIT, то процессор просто откладывает M1.T3.1 на потом:

https://i.imgur.com/pHGoqyq.png

Titus
26.12.2024, 04:45
это что, получается, что в промежуток от M1.T1.1 до M1.T2.2 процессор продолжает выполнять предыдущую операцию?
Приехали. Конечно)
У нас же конвейер. Новая операция начинается с поступлением нового опкода в M1.T3.2.

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


Это конечно хорошо, но как в M1.T3.1 предсказать какие флаги префиксов будут активированы на M1.T3.2?

Я хочу отобразить правильно дизассемблированную инструкцию в момент когда ещё идет её выборка, т.е. в M1.T3.1, а не когда она начинает обрабатываться в M1.T3.2...

Процессору Z80 предсказывать это не нужно. Для него в этот полутакт регистр опкода недействителен и все. Идут переходные процессы.

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


Проверил - выборка похоже всегда идет в M1.T3.1. Если активируется WAIT, то процессор просто откладывает M1.T3.1 на потом:
Да

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

Я понял, ты все вынашиваешь ту свою идею, что процессор можно остановить в любой такт, и надо иметь возможность его состояние сохранять в любой момент, в том числе в середине последовательности префиксов)

Чтобы иметь возможность сохранять состояние процессора в любой такт, и тем более полутакт, надо записывать гораздо больше информации,чем просто состояние префиксов. Но это никому не нужно.

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


4) А вот с CB40 возникает проблема - все перечисленные флаги в M1.T3.1 не активны, /CB_SET станет активным только на следующем полу-такте M1.T3.2. Как понять что 40 это опкод для префикса CB в M1.T3.1 (когда еще идет выборка)?
Если тебе прям очень-очень надо это знать, то это состояние триггера T2956/T2922.

Сигналы выбора наборов ED_SET, IDX_SET, BASE_SET устанавливаются уже к M1.T3.1
Тогда как CB_SET задерживается на пол-такта.
Судя по схеме, это сделано для того, чтобы он за эти пол-такта:
1. Заблокировал сигнал BASE_SET
2. Активизировал сигнал SEL_MASK

SEL_MASK - это сигнал генерации маски битовых операций для АЛУ, которая применяется в BIT/SET/RES.

ZXMAK
26.12.2024, 06:57
Если тебе прям очень-очень надо это знать, то это состояние триггера T2956/T2922.

работает :) Я назвал сигнал на затворе T2922 как /CB_SETE (E от early):

https://i.imgur.com/u3BhSSP.png

теперь задача определить моменты, когда процессор читает опкод :)

Я правильно понимаю, что опкод всегда читается в M1.T3.1 и это состояние всегда соответствует CLK=0? (точнее в момент posedge CLK, что соответствует переходу из M1.T3.1 в M1.T3.2).

Пробовал давать WAIT, если WAIT заканчивается на CLK=1, то процессор продолжает ожидание до CLK=0.
Тоесть можно считать, что выборка опкода происходит всегда при M1=1 && T3==1 && CLK==0?

Titus
26.12.2024, 13:09
Тоесть можно считать, что выборка опкода происходит всегда при M1=1 && T3==1 && CLK==0?
Чтение начинается раньше.
Память может выставлять данные на шину данных уже M1.T2.2.
И начиная с этого времени шина данных уже проброшена и прописывается во внутренний регистр READ_DATA.
И все это происходит в течении цикла ожидания, если он есть, и в M1.T3.1 тоже.
Начиная с M1.T3.1 внутренняя шина /DBUS начинает записываться в регистр опкода. Но при этом эта же шина на этот полу-такт подтягивается к +5, таким образом в этом полутакте в регистр опкода прописывается 0.
Начиная с M1.T3.2 регистр READ_DATA, в котором уже считается устоявшимся ответ от памяти, пробрасывается на шину /DBUS, и соответственно через нее в регистр опкода.
При этом одновременно регистр READ_DATA отключается от внешней шины.
Таким образом, мы можем считать, что по фронту M1.T3.2 внешняя шина данных защелкивается в регистре опкода.
При этом за пол-такта до этого регистр опкода обнуляется.
И, наконец, по M1.T3.3 шина /DBUS отключается от регистра опкода, и он продолжает хранить свое значение дальше.

Но это я описал только момент выборки стандартного опкода.
Выбор опкода в командах DD/FD/CB идет в M3.T3 и вообще в другом полу-такте.

ZXMAK
26.12.2024, 16:02
И все это происходит в течении цикла ожидания, если он есть, и в M1.T3.1 тоже.

да, я это заметил, когда пробовал wait включать во время выборки.


Правильно ли понял, что независимо от цикла M, по T3 всегда идет выборка из памяти, причем опкод и его данные читаются в T3.1, а при выполнении опкода данные читаются в T3.2? И кстати, почему чтение опкода и его данных занимает 3 полу-такта, а чтение данных при выполнении опкода 4 полу-такта?

Если это так, можно ли по какому-то сигналу отличить эти два случая, т.е. когда идет выборка опкода и его данных, а когда идет выборка данных при выполнении инструкции

Titus
26.12.2024, 16:55
Правильно ли понял, что независимо от цикла M, по T3 всегда идет выборка из памяти, причем опкод и его данные читаются в T3.1
Нет, не каждый M-цикл порождает цикл чтения-записи памяти. А только по необходимости.

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


И кстати, почему чтение опкода и его данных занимает 3 полу-такта, а чтение данных при выполнении опкода 4 полу-такта?
Цикл чтения опкода в M1 укорочен, видимо, это связано с тем, что в M1 надо было упихнуть и цикл чтения опкода, и цикл регенерации памяти, иначе они бы не поместились, если бы были длиннее.

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


Если это так, можно ли по какому-то сигналу отличить эти два случая, т.е. когда идет выборка опкода и его данных, а когда идет выборка данных при выполнении инструкции

Если у тебя активен LOAD_IR, значит идет загрузка регистра опкода.

ZXMAK
26.12.2024, 17:09
Нет, не каждый M-цикл порождает цикл чтения-записи памяти. А только по необходимости.

тоесть если T3=1 значит идет чтение/запись памяти?