Просмотр полной версии : Реверс-инжиниринг Z80
Не очень понял как можно сломать схему, если перепутать название (полярность) сигнала, ну да ладно :)
В смысле как? Если я вместо, допустим, 2ИЛИ-НЕ впилю 2ИЛИ, то схема сломается.
В смысле как? Если я вместо, допустим, 2ИЛИ-НЕ впилю 2ИЛИ, то схема сломается.
А почему должен впиливаться какой-то другой вентиль? Если переименовать провод он по другому работать не будет. Тут судя по всему не в полярности проводов дело, а в том что трансы перегоняются в вентили неправильно. Полярность сигнала тут причём?
И наконец, особенности установки 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 биты флагового регистра.
- - - Добавлено - - -
А почему должен впиливаться какой-то другой вентиль? Если переименовать провод он по другому работать не будет. Тут судя по всему не в полярности проводов дело, а в том что трансы перегоняются в вентили неправильно. Полярность сигнала тут причём?
При чем тут название провода. От имени ничего не меняется. Когда я перегоняю трансы в вентили, либо же когда оптимизирую схему, соединяя несколько вентилей в триггер, или меняя полярность какой-то линии, т.к. в оригинале она инверсная, а для лучшего понимания схемы следует линию сделать прямой. Вот тут и может закрасться ошибка. Повторюсь еще раз, я не делаю схему для клонирования ее в ФПГА. Прежде всего я делаю схему, чтобы она была наглядной и понятной, поэтому вследствие этих оптимизаций и может закрасться ошибка перепутанной полярности.
При чем тут название провода. От имени ничего не меняется. Когда я перегоняю трансы в вентили, либо же когда оптимизирую схему, соединяя несколько вентилей в триггер, или меняя полярность какой-то линии, т.к. в оригинале она инверсная, а для лучшего понимания схемы следует линию сделать прямой. Вот тут и может закрасться ошибка. Повторюсь еще раз, я не делаю схему для клонирования ее в ФПГА. Прежде всего я делаю схему, чтобы она была наглядной и понятной, поэтому вследствие этих оптимизаций и может закрасться ошибка перепутанной полярности.
Понял. Мы этот процесс называем "деморганизация". За годы убедились что оно подвержено ОЧЕНЬ большому количеству ошибок и поэтому лично я де-Моргана не проворачиваю. Оставляю как есть.
За годы убедились что оно подвержено ОЧЕНЬ большому количеству ошибок и поэтому лично я де-Моргана не проворачиваю. Оставляю как есть.
Ну ведь они же выявятся, когда схема не заработает? И исправятся)
- - - Добавлено - - -
Да, через 'деморганизацию' у меня прошла вся схема вдоль и поперек.
Ну ведь они же выявятся, когда схема не заработает? И исправятся)
- - - Добавлено - - -
Да, через 'деморганизацию' у меня прошла вся схема вдоль и поперек.
Нет деморгана - нет дополнительных ошибок. Исправятся, да, но зачем вносить лишние ошибки
Нет деморгана - нет дополнительных ошибок. Исправятся, да, но зачем вносить лишние ошибки
У меня нет другого варианта преобразовать схему в самый дружественный и понятный вид, кроме как таким образом.
У меня нет другого варианта преобразовать схему в самый дружественный и понятный вид, кроме как таким образом.
Ну опять же возвращаясь к теме "понимания". Комбинаторно-последовательностная логика, в которой ты копаешься - понимается путём изучения временных диаграмм.
Это brainchild разработчиков чипа.
Даже если ты красиво восстановишь схему - тот кто будет искать практическое применение не будет изучать вентили - "ммм а тут у нас AND, тот OR агась потом это идёт на этот FF". Ему интересней будет понимать какие диаграммы порождает данный кусок логики. Схему никто "читать" не будет, только в крайнем случае, если возникнут вопросы, на которые нельзя ответить просматривая вейвы.
Это тоже самое что восстанавливать дизассемблированный код умножения двух матриц написанный на SSE. Не нужно понимать почему одна SSE следует за другой. Нужно понимать просто как работает каждая инструкция ("вентили") и что в итоге делает весь кусок кода ("логики").
И к другим новостям. Я начал восстанавливать топо верхнего левого угла тошибовского з80. Там находится клоковый гена, буферы для DB интерфейса и АЛУ.
Ну опять же возвращаясь к теме "понимания". Комбинаторно-последовательностная логика, в которой ты копаешься - понимается путём изучения временных диаграмм.
Изучение диаграмм - это смотреть только на последствия, но не на причину.
Для простого повторения чипа в ФПГА и контроля идентичности - вполне подходяще. Экономит время и деньги.
Однако, для моих целей - детального изучения особенностей работы Z80 смотреть только на последствия - не информативно.
Попробуй найти, почему шумит команда SCF/CCF по диаграммам? Диаграммы даже не покажут этот шум.
Почему OUT (c),0 выдает ноль? Почему BIT n,(HL) выставляет так флаги, и как?
Видя схему, это понимается достаточно легко и быстро.
Диаграммы модели в проекте Z80 Explorer существуют уже 10 лет. Но как-то это не особо продвинуло в понимании некоторых загадок Z80, которые без видения причин, а не последствий отгадать можно только умозрительно и предположительно.
Твой подход хорош для твоих целей. А мой для моих. Каждому своё)
- - - Добавлено - - -
И к другим новостям. Я начал восстанавливать топо верхнего левого угла тошибовского з80. Там находится клоковый гена, буферы для DB интерфейса и АЛУ.
Лучше картинки не прикреплять средствами форума, они несмотрибельные.
Лучше на сторонний хостинг. Мы использовали pic.maxiol.com, хотя по стечению обстоятельств, он сегодня первый день, как не работает)
Упрощенное описание команд 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.
Мои пять копеек. Нарисовать "транзисторную схему" - значит понять ВСЕ нюансы поведения схемы. Особенно если применить аналоговое моделирование (что то типа Verilog-AMS). Если рисовать сходу "логическую схему" - то потеряется ВСЯ информация об UB (неопределённое поведение). Посему можно добиться "правильного поведения" при "правильных входных воздействиях", но если создать "не штатную ситуацию" - "логическая схема" даст сбой в поведение (она не будет на все 100% совпадать с оригиналом.).
Задача сего топика - это полноценное вскрытие "чОрного ящика" для полноценного раскрытия оного UB.
ПС: а для целей создания сеги/несов итд это излишнее знание...
Мои пять копеек. Нарисовать "транзисторную схему" - значит понять ВСЕ нюансы поведения схемы. Особенно если применить аналоговое моделирование (что то типа Verilog-AMS). Если рисовать сходу "логическую схему" - то потеряется ВСЯ информация об UB (неопределённое поведение). Посему можно добиться "правильного поведения" при "правильных входных воздействиях", но если создать "не штатную ситуацию" - "логическая схема" даст сбой в поведение (она не будет на все 100% совпадать с оригиналом.).
Задача сего топика - это полноценное вскрытие "чОрного ящика" для полноценного раскрытия оного UB.
ПС: а для целей создания сеги/несов итд это излишнее знание...
Никто не запрещает модули где есть UB разметить специальным образом, в том числе тупо трансами.
Оба правы. Давайте жить дружно. У каждого свои цели и способы (адекватные к задачам). Лично мне нравится способ ТС.
Лично мне нравится способ ТС.
Товарищ Vslav, который и заварил всю эту кашу с реверсами на форуме, делал вообще только транзисторную схему, а уже с нее Verilog-модель. И если что, сверялся только с транзисторной. Я так не могу, мне нужна транзисторная, как базис, и логическая, как удобная для быстрого анализа и оптимизации.
Заполнены разделы по клоковому гене и по интерфейсу с внешней шд.
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, что мне очень подозрительно.
- сигнал clk в Visual Z80 на самом деле _clk (active-low), т.к. из того что я вижу у себя в регблоке - на время clk=0 производится подзарядка бит лайнов ячеек SRAM и регистры в этом время использовать нельзя ("команды" reg_load_xxx).
А в чем несостыковка? Внешний вход /CLK инверсный, затем внутри он инвертируется. Т.е. при внешнем CLK = 0 заряжаются лайны.
- - - Добавлено - - -
- чип в Visual Z80 лежит вверх ногами
В смысле вверх ногами? Чип крутят так, как удобно, у него нет ни верха, ни низа) А то, что надписи на кристалле ориентированны в какую-то сторону, это еще ничего не значит.
А в чем несостыковка? Внешний вход /CLK инверсный, затем внутри он инвертируется. Т.е. при внешнем CLK = 0 заряжаются лайны.
Несостыковка в том, что по даташитам - он Active High. И как раз с учётом всех инверсий в CMOS Z80 - внутренний clk такой же полярности, что и внешний.
https://github.com/emu-russia/SEGAChips/raw/main/T84C/logisim/clkgen.png
Несостыковка в том, что по даташитам - он Active High.
В даташите от Zilog'а он инверсный:
https://pic.maxiol.com/images2/1728768537.1595414782..png
В даташите от Zilog'а он инверсный:
https://pic.maxiol.com/images2/1728768537.1595414782..png
Я вот сижу и думаю - что это значит если CLK - Active Low.
Также сижу втыкаю в z80 remix и в упор не вижу, чтобы входной пад назывался _clk:
https://i.imgur.com/CESj5sL.png
Также сижу втыкаю в z80 remix и в упор не вижу, чтобы входной пад назывался _clk:
Видимо, назвали пин, как в старых даташитах без инверсии.
- - - Добавлено - - -
Я вот сижу и думаю - что это значит если CLK - Active Low.
Это загадка, но ее надо просто принять)
Где то когда то что то слышал что: клок можно оставлять в неизменном состоянии только в одном логическом состоянии. Примерно так: клок==0 то все состояния в проце в зафиксированном состоянии, а при ==1 состояние изменяется и не может находится в устойчивом состоянии. Как то вот так - малость мутно мысль моя...
Где то когда то что то слышал что: клок можно оставлять в неизменном состоянии только в одном логическом состоянии. Примерно так: клок==0 то все состояния в проце в зафиксированном состоянии, а при ==1 состояние изменяется и не может находится в устойчивом состоянии.
Да, оставлять можно только в '1', т.е. внешний инверсный уровень - это '0'.
Иначе внутренние динамические латчи, сделанные за счет удержания заряда на емкостях затворов, разрядятся и все.
В смысле вверх ногами? Чип крутят так, как удобно, у него нет ни верха, ни низа) А то, что надписи на кристалле ориентированны в какую-то сторону, это еще ничего не значит.
Сорь не ответил.
Таки у чипа есть "верх" и "низ" - это то, как он сориентирован по отношению к лид фрейму и выводам пекеджа:
https://i.imgur.com/92T6IyO.png
В случае з80 - слева вверху находится CLK (который между прочим в старых даташитах Active High), затем по часовой идут пады A15, A14, и т.д.
Такой же layout сохраняется и для CMOS версий сабжа.
Решил все же ознакомиться немного с Verilog'ом.
Попробовал найти этот бесплатный популярный ModelSim. Оказывается, его нет в свободном доступе.
Нашел на торрентах какой-то из последних (хотя это 2018 год) modelsim-win64-10.6d-se, посмотрю, что это. Если это вообще то.
Попробуй Icarus Verilog.
https://bleyer.org/icarus/
Попробуй Icarus Verilog.
https://bleyer.org/icarus/
Я уже начал ModelSim пробовать. Тем более, как я понял, он самый популярный.
Оказалось, сходу так не войдешь в мир 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
оффтоп же.
По верилогу рекомендую книгу Соловьёва.
"Основы языка проектирования цифровой аппаратуры Verilog | Соловьев Валерий Васильевич"
Я уже начал ModelSim пробовать. Тем более, как я понял, он самый популярный.
для икаруса кроме блокнота для набора верилога больше ничего не нужно. В состав входит GTKWave, для просмотра .vcd дампов.
ModelSim и подобные (Quartus, PlanAhead/Vivado) - это монструозные комбайны на несколько гигабайт.
ModelSim и подобные (Quartus, PlanAhead/Vivado) - это монструозные комбайны на несколько гигабайт.
Это я уже понял) Но раз уж он пользуется такой популярностью, решил начинать с него.
ModelSim к сожалению ничего не подскажу. лет 10 назад пробовал использовать. С тех пор у вивады свой симулятор - не скажу что прелесть - но на мои нужды хватает. Другими то же не пользовался. (я не фанатичный фанат "свободного софта"). В программах симуляции надо быть внимательным с точки зрения "где код, для которого можно выполнить синтез, а где код только для симуляции". Иначе можно создать "сферического коня".
- - - Добавлено - - -
В догонку.
1 - возможно есть "кнопка" сохранить wavewindow.cfg
2 - хз
3 горячие кноки кажется были - надо хелп смотреть или настройки
4 'Run 100' кажется время выполнения моделирования в единицах us (гдето в настройках было).
пс
давно это было
пспс: конечно можно ограничиться только моделированием, но (моё имхо) лучше совмещать реализацию и симуляцию
лучше совмещать реализацию и симуляцию
Что это означает?
собственно сообщение 527.
в module counter должен быть ТОЛЬКО синтезируемый код.
а в module testbench всё что относится к тестированию.
Собственно там так и сделано - норм.
По module counter (в вивадо или алтера) можно посмотреть "схему" во что превращается описание. Какие есть возможности у других программ - я без понятия.
Да, оставлять можно только в '1', т.е. внешний инверсный уровень - это '0'.
Иначе внутренние динамические латчи, сделанные за счет удержания заряда на емкостях затворов, разрядятся и все.
Затворные емкости в любом случае разрядятся со временем, ибо существует ток утечки затворной емкости в нашем неидеальном мире :smile: И для чипов использующих динамические латчи в доках обычно прописывается минимально возможная частота клока, при которой динамические латчи работают без амнезии :biggrin:. Также возможны варианты построения ДФФ на паре SLATCH + DLATCH, в этом случае статический латч обычно идет первым в цепочке и сохраняет свое состояние при отсуствии клока очень продолжительное время, а следующий динамический латч повторяет входные данные с первого слатча.
Пока никто не прояснил мои вопросы (https://zx-pk.ru/threads/34173-revers-inzhiniring-z80.html?p=1205039&viewfull=1#post1205039) по ModelSim, спрошу еще по Verilog'у:
Как обычно реализуют модули с двунаправленными шинами? Например, как шина данных на Z80?
Пока никто не прояснил мои вопросы (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; Также, драйвить шину могут несколько источников, необходимо разрулить доступ к шине без конфликтов в таком случае.
Также, драйвить шину могут несколько источников, необходимо разрулить доступ к шине без конфликтов в таком случае.
Как именно обычно это делают?
- - - Добавлено - - -
Если это внешняя двунаправленная шина то через примитив TRI.
В виде чего DATA обозначается в параметрах модуля? У него же только Input или Output параметры.
- - - Добавлено - - -
Можно привести маленький пример модуля с двунаправленной шиной?
В виде чего DATA обозначается в параметрах модуля? У него же только Input или Output параметры.
Ещё есть Inout
DATA объявляется так :
inout[7:0] DATA;
Вот наш с Оргом общий проект старого верилога 6502 https://github.com/andkorzh/OLD-Verilog-MOS6502/blob/main/Verilog/Core6502.v
Топ модуль содержит двунаправленную шину DATA[7:0].
От конфликтов избавится можно путем разделения доступа с помощью комбинаторики, чтобы исключалась возможность одновременного присуствия двух и более драйверов на шине. Обычно процессоры в своей внутренней логике уже содержат подобные блокировки, и оно будет работать "из коробки" если точно повторять внутреннюю структуру чипа. Например декодер портов чтения, который имеет только одно значение на выходе и управляет загрузкой данных на шину из разных источников, это избавляет от этой проблемы полностью.
Обычно процессоры в своей внутренней логике уже содержат подобные блокировки, и оно будет работать "из коробки" если точно повторять внутреннюю структуру чипа.
Как это делается в настоящих процессорах, я прекрасно знаю)
Меня интересует именно Verilog описание версии, которая годится для FPGA. Т.е. без настоящих Z-состояний.
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 - это для ВНЕШНИХ буферов (физический вывод).
ПС: примеры не самые изящные - айэмсорри (с)
Можно - но НЕ нужно использовать значение 1'bz внутри схемы.
1'bz - это для ВНЕШНИХ буферов (физический вывод).
Ну да, понятно, что если процессор находится в составе какого-то компьютера, и все это на одном FPGA, то ему реальные Z-состояния не нужны.
ModelSim это всегда был кровавый энтерпрайз и проприетарщина от Mentor Graphics, а потом вроде как от Сименса.
На старой работе его покупали вместе с Квартусом, в лохматых нулевых, за какие-то сумасшедшие деньги.
- - - Добавлено - - -
ИМХО, с наскока, без книжек, в нём никак. Монструозный комбайн.
Сейчас посмотрел несколько скриншотов новых версий - отдалённо напоминает, что было. Но переиначили всё сильно.
ИМХО, с наскока, без книжек, в нём никак. Монструозный комбайн.
Значит не я такой тупой, что сходу не могу вьехать в нормальную работу с ним)
- - - Добавлено - - -
Может действительно лучше Икарус ставить или Вивадо сразу?
1) ну как бы да. Mentor Graphics - это всегда Монстр. Ужасный инсталятор, куча каталогов в корне диска итд итп.
2) За икаруса не скажу (не фанат фрихалявы , или что там с лицензией). Если разобраться то возможно норм.
3) квартус - работает быстрее вивады, но тоже монстр. разные версии умеют разные плисы, гдето есть симулятор , гдето возможно и нет (запутано там всё) - лекарства простого нет (это если приспичит)
4) вивадо если брать современную версию - то качать 100гб (но это абсолютно всё - все виды плис, все компиляторы, и до кучи инсталятор для виндов и для линуха). Лекарство простенькое, но по жизни в 99% не требуется. другими словами "халява сэр".
пс есть нюанс - вивада (современная) только 64бит. квартус аналогично.
пс есть нюанс - вивада (современная) только 64бит. квартус аналогично.
Мне все равно, сколько весит, и 64 бита мне подходит.
Главное, чтобы удобно и понятно работать в среде.
А работа моя на минималках - погонять простой проект на графиках, посмотреть в виде схемы.
ну как вариант
"азбука как устанавливать в картинках"
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 (типо так удобнее). Я беру (качаю только с сайта оригинал - посему всегда уверен в качестве товара)
ПС: для скачки оригинала требуется почта буржуйская и впн (для регистрации на сайте)
ПС: как всегда есть нюансы. на торенте перепакованный из tar.gz (оригинальный формат распространения) архива (100гб) в образ сд-диска iso (типо так удобнее). Я беру (качаю только с сайта оригинал - посему всегда уверен в качестве товара)
Так откуда брать, с торрента, или оттуда не надо?
- - - Добавлено - - -
ну как вариант
"азбука как устанавливать в картинках"
Хорошо бы в картинках, как собрать и посмотреть графики самого простого проекта.
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 версии (на половину устарело по актуальности).
но там есть излишняя инфа для первых шагов.
проще спросить
Поставил виваду, гораздо все дружественней, чем в ModelSim. Добавил два своих тестовых файла - счетчик и тесбенч, и он сразу понял, кто из них какого уровня, как компилить. Нажимаешь симуляцию, и все просимулировал сам. Красота. С ModelSim не сравнится по удобству. Во всяком случае пока что.
Правда, пришлось поставить хотя бы одну девборду, без нее не хотел создавать проект.
И еще при запуске Run Syntesis (видимо под эту борду) он когда происинтезировал и открыл, то завис и закрылся. Видимо, потому что борды нет и кабеля нет.
Вопрос такой - какие функции мне нужно использовать в виваде для моих начальных целей? Как симулировать вроде в общих чертах понятно. Как посмотреть логическую схему?
Что еще нужно основного знать или какие клавиши?
- - - Добавлено - - -
Хм, может я рано порадовался?
Запустил Schematic, он просинтезировал схему, открыл и тут же закрылся. Как и с синтезированием на борду.
Едва успел поймать скриншот экрана перед зависанием (закрытием):
https://pic.maxiol.com/images2/1729083310.1595414782.clipboard101620240.png
В общем, нашел проблему. Видимо, надо было установить пакет для какой-то реальной борды. Установил на спартан-7, выбрал борду наобум и все заработало стабильно.
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
По началу этого за глаза и уши хватит.
ПС если не устанавливать файл с лицензиями - то вивадо умеет работать токмо с младшими семействами плис Спарта/Артикс/Кинтекс (это если кратенько) . Но опять же этого выше крыши для бытовых целей.
1) какая операционка на хосте (на компе)? вин или линух ? номер версии ?
Windows 10
2) демо плату совсем не обязательно устанавливать/использовать. Можно просто указать тип плисы: пример xc7s50csga324-1 (там в окошке выбирается)
Так и сделал
3) Сколько памяти ? своп в наличии ?
Памяти 32Гиг
- - - Добавлено - - -
В общем, мое впечатление от вивады пока что прекрасное по сравнению с модельсимом. Дружественно человеку.
На счет двунаправленных шин я так решил - не надо делать то, что не реализуемо в железе (ПЛИС). Надо сделать отдельно шину DataIn, отдельно DataOut. Ну и всякие дополнительные сигналы типа DataZ. А уж внешние модули сами будут решать, как обьединить процессор, память и т.д. Либо же, если порты проброшены на реальные порты ПЛИС, то там уже будет реальная двунаправленная шина с Z-состоянием.
Еще несколько вопросов по Verilog:
1. Какова область видимости модулей? Сколько может быть модулей верхнего уровня в одном проекте, и как IDE определяет, какой модуль является верхним?
2. Зачем при определении регистров в примерах иногда есть присвоения, например: reg [7:0] reg1 = 8'h0? В какой момент исполнения идет это присвоение? Если один раз при старте проекта, то чем оно отличается от присвоения в блоке initial? Эти начальные присвоения нужны только для тестирования в симуляторе, или же они работают так же в реальной FPGA? Если в реальной тоже, то в какой момент времени и как эти начальные значения загружаются в регистры?э
3. Какие правила 'хорошего тона' в именовании цепей и именовании модулей? Каков стандарт табуляции, сколько пробелов? Ну и другие правила хорошего тона в написании.
Сколько может быть модулей верхнего уровня в одном проекте
я далеко не профи (тоже учусь в этой области, правда VHDL) но, как говорится , в правильно поставленном вопросе есть ПОЛОВИНА ответа)))
Так вот - на то он и верхний уровень - он сверху над всеми и значит ОН - ОДИН)))
как IDE определяет, какой модуль является верхним
юзер САМ ОБЯЗАН его указать IDE.
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
ИДЕ (если включено автоматическое обновление иерархии - обычно по умолчанию включено) сам выбирает ТОП. если есть варианты - то предлагает выбрать. Можно ручками указать
будем знать)
Про видимость я не понял вопроса.
1) в любом модуле можно использовать любой другой.
2) в ниже стоящем нельзя использовать ТОП
3) Рекурсия запрещена.
4) если одно описание модуля используется несколько раз в других - значит создаётся столько же реальных экземпляров этого модуля.
- - - Добавлено - - -
В догонку. ТОП - это модуль, порты которого можно цеплять в выводам самой плисы.
Для проектов, которые предназначены только для отладки отдельных частей цеплять порты на выводы совсем не обязательно. да и имплемент тоже совсем не обязательно делать.
И да. аналогично назначается ТОП и для симуляции.
Про симулятор:
Глобально у симулятора три "режима"
- поведенчиский
- после синтеза (кажется с учётом задержек по элементам)
- после имплемента с учётом всех временных задержек (логики+дорожки).
первый самый быстрый
последний самый тормоз по симуляции
- - - Добавлено - - -
про видимость
по крайней мере в модуле для tb (точно работает в sv, в верилоге не в курсе) можно "вытаскивать наружу" любой сигнал из любого модуля из любого уровня вложенности
Как реализовать ОЗУ, в котором изначально в некоторые ячейки записаны какие-то значения?
Просто тупо в блоке initial присвоить?
Один из вариантов (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 можно смотреть примеры кода.
А дата изготовления?
у чипов DC год неделя, только британцы по своему выеживаются
у чипов 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. Как настроить, чтобы при запуске симуляции она запускалась сразу на какое-то количество временных отрезков заданное мною, чтобы я сразу видел результат в окне. Да и как сделать, чтобы окно симулятора запомнило, какие сигналы я хочу смотреть, какие надо скрыть?
Написал счетчик 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 для конкретного модуля?
Алгоритм (очень усреднённо)
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 (для его "поиска" нажать на дискетку в окне с диаграмами, рядом с лУпой). его рекомендуется сохранить в каталоге рядом с исходниками. И добавить его в проект как "файл исходников"
тогда при открытии окна диаграмм - все требуемые сигналы (их можно добавлять и убирать, менять кодировку итд) будут на месте.
Меня здесь смущает "генератор на инверторе" - вот это жесть.
always
#10 clk = ~clk; // Каждые 10 тиков меняем полярность clk
Да это так, для теста просто.
- - - Добавлено - - -
но что значит "вход которого соединен с выходом" ?
Ну когда инверсный выход триггера соединен с его входом.
ну или выложи свои исходники, гляну - подправлю.
Во первых кусок кода не полноцнен.
а во вторых. Если какой либо сигнал не выходит из ТОПа наружу - то он и все его "родители" анулируются после синтеза. и в "идеале" можно получить схему вообще пустую.
Ну у меня из топа вообще наружу ничего не выходит, а схема рисуется из тех фрагментов, которые заведены сигналами в топ. А те, что к топу не подключены не рисуются.
- - - Добавлено - - -
Дык это самое оная строчка должна быть в другом файле (отличном от файла, где описан модуль). и это файл должен распологаться в "категории" simulation source и быть "там" в топе.
Эта строчка находится в топе. Зачем ее куда-то выносить, если топ - это тестбенч.
HardWareMan
18.10.2024, 21:29
Меня здесь смущает "генератор на инверторе" - вот это жесть.
Не особая жесть. Маршрут закольцовывания LAB/LE таков, что создаётся необходимый сдвиг фазы и генерация стабильна. Я на Arria2GX получал ~1ГГц на коротком инверторе. Эту частоту использовать нельзя - сложная схема не работала, но поделив 1 раз на 2 и получив ~500МГц уже моя достаточно сложная IP завелась и работала стабильно. Понятно, что генерация не стабильна: она зависит от грейда чипа, от его архитектуры, от температуры и прочих параметров, которые приведут к дрейфу частоты, но генерация при этом не сорвётся. Но можно пойти дальше и вывести пару таких "инвертора" на ноги и навесить на них стандартные RC да кварцевый резонатор и вот вы уже сэкономили на генераторе. Результат подаём на CLK вход (а иногда можно прямо внутри чипа даже конфигурацией) и вот оно уже закварцованное и стабильное.
Эта строчка находится в топе. Зачем ее куда-то выносить, если топ - это тестбенч.
Отделяем мух от котлет.
должны быть файлы для синтеза (топ модуль с "реальным списком портов" для реальной плисы)
и
должны быть файлы для моделирования (тут свой топ с "пустым списком портов") и в этом ТОПе внутри подключен ТОП для синтеза.
Иначе ломается "логика" работы утилит САПРа
- - - Добавлено - - -
Не особая жесть.
Ну да при цене плисы в несколько сотен уе делать такой генератор это "Не особая жесть".
Параметры такого генератора даже на кварце будут так себе... да на таких частотах - ну его нафик
Вот так с помощью не хитрых приспособлений буханка хлеба превращается в троллейбус (с)
А оно стоит того чтоб экономить на нормальном генераторе частоты ??
------------------
вроде на всё ответил ??? ничего не пропустил ??
должны быть файлы для синтеза (топ модуль с "реальным списком портов" для реальной плисы)
У меня нет реальной плис, поэтому наверху топ для теста вообще без портов. Это работает для симуляции, и это для меня пока главное.
- - - Добавлено - - -
вроде на всё ответил ??? ничего не пропустил ??
Вроде все! )
У меня нет реальной плис, поэтому наверху топ для теста вообще без портов. Это работает для симуляции, и это для меня пока главное.
нукактотаконотожеможетчто тоделать.
Но всё же повторю
"Иначе ломается "логика" работы утилит САПРа"
и ряд тулзов вряд ли будут работать адекватно.
нукактотаконотожеможетчто тоделать.
Пока мне нужно просто вьехать в тему. Такая структура не мешает мне потихоньку писать Z80. И смотреть, чего получается.
Ну раз топик превратился в "помоги Титусу освоить верилог" добавлю от себя:
для простейшей симуляции можно вообще всё делать без 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 и приуныть немного, хотя тоже полезно.
ля простейшей симуляции можно вообще всё делать без always блоков, тупо соединяя вентили нетлистом.
Хоть я и начинающий вериложник, но у меня задача сразу делать красиво и правильно. Я имею в виду Z80. Только синхронная схема, все оптимально и красиво чтобы было.
- - - Добавлено - - -
OpenCores и приуныть немного
Приуныть от чего?
- - - Добавлено - - -
рекомендую изучить гига-лики от Nintendo
Лучше не выражаться сленгом, а давать конкретные ссылки с уточнениями.
Может так получиться что когда начнешь делать красиво и правильно, то что-то получится, но уже не z80.
Ссылки которые можно давать я даю, которые нельзя я не даю, leak - сам понимаешь, гугли.
На OpenCores много ядер и другого железа на верилоге, есть кстати и z80 сделанный по мотивам чипа, так что как минимум можно приуныть что уже всё сделано до нас.
https://opencores.org/projects/a-z80
HardWareMan
19.10.2024, 08:01
Ну да при цене плисы в несколько сотен уе делать такой генератор это "Не особая жесть".
Параметры такого генератора даже на кварце будут так себе... да на таких частотах - ну его нафик
Вот так с помощью не хитрых приспособлений буханка хлеба превращается в троллейбус (с)
А оно стоит того чтоб экономить на нормальном генераторе частоты ??
Эх... То, что я игрался на Arria2GX это было баловство "а что если". А вот генератор на инверторах ПЛИС я активно использовал (и видел как использовали другие) на FLEX и, особенно, на CPLD типа MAX7000/MAX3000. Можно было заводить схему на разных нестандартных частотах нативно.
Может так получиться что когда начнешь делать красиво и правильно, то что-то получится, но уже не 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 перейдет в неопределенное состояние вообще. Думаю, что с большей вероятностью пересилит правое плечо, т.к. там больше емкость затворов подключенных к нему транзисторов. Но все же.
Я так понял, что чтобы в режиме Schematic все не перепутывалось друг с другом, надо помельче дробить модули?
Еще обратил внимание, что в цикле чтения данных, который длится на один полутакт дольше, чем цикл чтения кода операции, реально данные все равно защелкиваются через тот же промежуток времени, что при чтении кода операции.
Т.е. этот лишний продленный полутакт чтения непонятно зачем. Возможно, для совместимости с 8080?
https://pic.maxiol.com/images2/1729351929.1595414782.clipboard101920240.png
HardWareMan
19.10.2024, 19:03
Еще обратил внимание, что в цикле чтения данных, который длится на один полутакт дольше, чем цикл чтения кода операции, реально данные все равно защелкиваются через тот же промежуток времени, что при чтении кода операции.
Зависит от типа регистра: прозрачная защёлка или защёлка или тактируемый D-триггер.
Зависит от типа регистра: прозрачная защёлка или защёлка или тактируемый D-триггер.
Тут нет разницы, в чем защелкиваются данные.
Я говорю о том, что не смотря на то, что длительность циклов обращения к внешней памяти для чтения опкода (1 такт) и данных (1.5 такта) - разная, внутренний цикл (внутри Z80) все равно остается одинаковым, и равен 1 такту. Поэтому увеличенный на 0.5 такта внешний цикл не играет никакой роли, все равно внутри процессора данные защелкиваются на 0.5 такта раньше, чем окончится внешний цикл.
Меня интересует, зачем это сделано? Я думаю, что до совместимости с предыдущей линейкой (i8080). Иного обьяснения у меня нет.
Я так понял, что чтобы в режиме Schematic все не перепутывалось друг с другом, надо помельче дробить модули?
Как бы да...
На самом низу - собственно реализация - получаем набор модулей, которые между собой соединяются между собой - получаем ТОП.
Там, где цыпляем между собой модули - логики лучше не рисовать.
ПС: раннее я предлагал поделить всю схему на блоки - обозвать их. и потом собирать из этих кубиков ТОП
ПС: раннее я предлагал поделить всю схему на блоки - обозвать их. и потом собирать из этих кубиков ТОП
Ну просто Z80 не такой большой процессор, чтобы бить его на модули.
Я смотрел, некоторые реализации так и сделаны, одним файлом.
Некоторые разбиты на АЛУ и прочее.
по мне блочный дизайн проще исправлять, редактировать (да и моделировать сперва по частям). не требуется бегать по паре тыщ строк в поисках нужной части кода/схемы
Переделал блок управления памятью в полностью синхронный вариант.
Пришлось пол-дня повозиться, крепкий орешек.
Все дело в том, что это самый кривосинхронный блок в процессоре. Одни циклы длятся 2, другие 3, третьи 4 ПОЛУ-такта, не такта. Да и еще в зависимости от разных условий. Самым оптимальным оказалось добавить на выходные линии простые обрезалки сигналов в нужные фазы. Тут пол-такта отрезаем, сям пол-такта. Тут режем, тут не режем, а тут рыбу заворачивали. Зато вынеся нестандартности за скобки, внутри схемы остался качественный синхронный дизайн.
Изначально попробовал - как Vivado отнесется к RS-триггерам, у которых что-то устанавливается по спаду CLK, что-то по фронту? Оказалось, что никак вообще. И это к лучшему.
https://pic.maxiol.com/images2/1729379793.1595414782.clipboard102020240.png
- - - Добавлено - - -
Да, кроме того, в оригинальной схеме каждый из трех триггеров мог встать 'р@ком', если в неподходящие T-циклы приходил ресет. Особенно короткий ресет. Но повторять это нет смысла, потому что все равно плавающее кратковременное состояние не повторишь, а при ресете длинной >1 такта и так все нормализуется. Даже в оптимизированной текущей схеме еще не убран кофликт R и S при неподходящем времени ресета.
- - - Добавлено - - -
Интересно, как себя ведет Xilinx, если на R и S поданы 1?
Интересно, как себя ведет Xilinx, если на R и S поданы 1?
Если посмотреть технологическую карту после синтеза, то можно заметить, что любой из триггеров T, JK, SR, - получается из D триггера. В данном случае будет кольцо из DFF + OR + AND. И тут главное при описании на верилоге правильно расставить приоритеты для R и S. И в таком случае один из входов будет проигнорирован, ибо у него меньший приоритет (т.е. он дальше от ДФФ). А вот при использовании прозрачной D защелки, она собирается без участия ресурса DFF на одной комбинаторике и по сути своей асинхронна, на что получим сразу предупреждение от TimeQuest-a. По крайней мере в Квартусе так, подозреваю, что для Xilinx-a все аналогично.
И тут главное при описании на верилоге правильно расставить приоритеты для R и S.
Как проставить приоритет?
Прозрачные защелки я не использую.
- - - Добавлено - - -
В данном случае будет кольцо из DFF + OR + AND.
Как выглядит это кольцо?
Как проставить приоритет?
Прозрачные защелки я не использую.
- - - Добавлено - - -
Как выглядит это кольцо?
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
https://pic.maxiol.com/thumbs2/1729419445.1389483554.sr.png (https://pic.maxiol.com/?v=1729419445.1389483554.sr.png&dp=2)
При таком построении, R имеет высший приоритет.
- - - Добавлено - - -
Касаемо триггеров и приоритетов HardWareMan достаточно хорошо описал это здесь:
Правда, я так и не понял, что будет в ПЛИС, если R и S подать одновременно)
Да, можно тусовать 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)
При одновременной подаче единиц на входы S и R, будет запомнено состояние более приоритетного входа.
Какой будет более приоритетный вход, если на Verilog'е я напишу так:
begin
always @ (posedge clk)
if (set)
Q = 1;
else if (reset)
Q = 0;
end
Какой будет более приоритетный вход, если на 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). Внезапно, да?
Тут даже без компиляции понятно, что первое условие (Set) приоритетнее, потому что (Reset) стоит в блоке ELSE у (Set). Внезапно, да?
На всякий случай надо уточнить. Я же очень начинающий вериложник)
Забыл, я там хотел неблокирующее присваивание написать, <= вмест =.
- - - Добавлено - - -
Проанализировал по схем блок запроса шины. Если сравнивать с оригинальной документацией, то тайминги все навраны.
1. /BUSREQ защелкивается в другом полутакте, чем описано в документации.
2. Шины переводятся в Z-состояние тоже не в том полутакте.
3. Ну и возвращается все обратно тоже в другом полутакте.
https://pic.maxiol.com/images2/1729431704.1595414782.realbusreqackcycle.png
Ну от этого внешняя логика не пострадает.
Описание версталось параллельно, и, видимо, не все изменения попали в него. А потом посмотрели - и забили, как на не особо критичные.
Ну от этого внешняя логика не пострадает.
В основном-то да.
Интересно, есть спектрумы, где процессор тормозится через BUSREQ?
Интересно, есть спектрумы, где процессор тормозится через BUSREQ?
Надеюсь, что нет. Это был бы какой-то лютый костылинг... Это ж для DMA-контроллеров.
Написал небольшой кусочек управления шинами и чтения кода команды в полностью синхронном дизайне.
Все тайминги совпадают с теоретически предсказанными, что не может не радовать)
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)); // Внешний сигнал чтения памяти формируется с учетом удлиненной врезки окончания цикла чтения кода операции
Если есть концептуальные косяки, можно сделать замечание)
Замечаний нет, есть немного обмена опытом.
После 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. Немного читнул ранее про "ПОЛУ-такты". Да, это так. Большая часть ядер ретро-чипов (да что там.. скорее даже все) реализует оба полупериода (полуцикла), ещё их называют "фазами". Это абсолютная нормальность на таком уровне, если есть какой-то психологический "запор" в восприятии, то его необходимо как можно быстрее "пробить" :)
Все манипуляции с " #1 CLK = ~CLK; `timescale 1ns/1ps " абсолютно не важно до тех пор пока "мы" не начнём учитывать реальные времянки логических элементов. Вот тут две дороги:
1) мы моделируем абстрактные времянки абстрактной ЛА3 - и это будет абсолютно не синтезируемая модель поведения.
или
2) мы не мудрим с этими абстракциями, а задаём рельную частоту клока и реальны тип плисы.
При этом #1 и еже с ними используется для моделирования поведения внешнего окружения (как то sdarm память - реальная микросхема, аль ещё чего...) - но ни разу не используется в синтезируемой части кода.
ПС:
Это типовое значение и именно nS и pS
`timescale 1ns/1ps
ПС:ПС:
#1 CLK = ~CLK
здесь по первости можно указывать #5 чтоб получить "красивую" частоту в 100 МГц. и чтоб проще "отсчитывать" какой щаз период времени (хотя это можно сделать в автоматическом режиме отображение номера периода со счётчик оного клока).
Ребята, я вовсе не собираюсь на верилоге моделировать работу реальных транзисторов. Наоборот, весь мой код и реализация заточены под реальные возможности ПЛИС, синхронную архитектуру. Поэтому вопрос по коду на верилоге был задан именно исходя из этого. Правильно ли я пишу, пока не написал много, чтобы потом не пришломсь все переделывать.
В общих чертах все более-менее правильно описано было в этой (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 такт.
КО. там упомянут один из двух патентов
https://patentimages.storage.googleapis.com/a2/09/1a/8a9fea5f2255fd/US4486827.pdf
про что второй - склероз...
https://patentimages.storage.googlea.../US4486827.pdf
Я все читать не стал, но по картинке там только схема ресета в этом документе.
Интересную вещь рассказал nukeykt с эмураши.
Он сохраняет в верилоге оригинальный дизайн, а асинхронные латчи эмулирует так:
always @(posedge MCLK)
begin
if (CLK)
x <= a;
end
Т.е. MCLK (мастерклок) превышает CLK в разы.
HardWareMan
25.10.2024, 14:18
Titus, я про это изначально всегда говорил. Ньюк эту идею подхватил когда я там был пару лет назад, когда он сначала дербанил декап YM2612 а затем Сегу-Денди.
Потихонечку пишу модули на верилоге.
Пример модуля (пока набросок):
//----------------------------------------------------------------------
//
// Модуль управления внешней шиной
//
//----------------------------------------------------------------------
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
я правильно понимаю ситуацию после запуска процессора (PC=0, прерывания IM1 разрешены ?, во всех регистрах нули)
я правильно понимаю ситуацию после запуска процессора (PC=0, прерывания IM1 разрешены ?, во всех регистрах нули)
Ты имеешь в виду посл ресета, а не запуска?
В регистрах конечно не нули. Ни после запуска, ни после ресета.
А после ресета PC равен нулю.
Кстати, 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 регистр А физически в АЛУ, а флаги вообще просто набор отдельных триггеров, раскиданных вокруг АЛУ), а значит задействуют несколько другие сигналы управления.
Осмелюсь предположить, как и в случае с ВМ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
Плюс этого подхода, что схема фактически оставалась оригинальной, без вмешательств. Меньше поле для косяков, когда ручками переделываешь на синхронный дизайн.
Минус - завышенная тактовая, что приводит к дополнительной трате ресурсов.
Кроме того, такой подход не требует детального понимания работы схемы. Фактически это клонирование и симуляция.
Вот так понял я из общения с ними.
- - - Добавлено - - -
Я люблю максимально все оптимизировать, поэтому без глобального разбирательства в принципах работы схемы и переделывания на синхронный дизайн исходя из этого не обойтись.
Но это да, значительно затратнее по времени и всему остальному.
Плюс этого подхода, что схема фактически оставалась оригинальной, без вмешательств. Меньше поле для косяков, когда ручками переделываешь на синхронный дизайн.
Минус - завышенная тактовая, что приводит к дополнительной трате ресурсов.
Кроме того, такой подход не требует детального понимания работы схемы. Фактически это клонирование и симуляция.
Вот так понял я из общения с ними.
- - - Добавлено - - -
Я люблю максимально все оптимизировать, поэтому без глобального разбирательства в принципах работы схемы и переделывания на синхронный дизайн исходя из этого не обойтись.
Но это да, значительно затратнее по времени и всему остальному.
Мои все проекты на аналогичном принципе работают, по поводу ресурсов особо не парюсь, т.к. даже камни с 150к ячеек вполне себе доступны на Али, не говоря уже о 6-ти или 10-ти тысячных Циклонах IV .
Так например те же ядра процессоров Денди (PPU + APU) можно вполне себе вместить в Циклон II с 5к ячеек. Но при оптимизации дебаг будет заметно веселее, так как мест, где можно косякнуть будет заметно больше. :smile:
Единственное, что я оптимизировал, так это инверсную логику.
Мои все проекты на аналогичном принципе работают, по поводу ресурсов особо не парюсь, т.к. даже камни с 150к ячеек вполне себе доступны
Вопрос не только в количестве ячеек, но и в максимальной рабочей скорости симулируемого устройства.
- - - Добавлено - - -
Но при оптимизации дебаг будет заметно веселее, так как мест, где можно косякнуть будет заметно больше.
Да, тут безусловно все так)
- - - Добавлено - - -
Мои все проекты на аналогичном принципе работают
Какие у тебя проекты?
Вопрос не только в количестве ячеек, но и в максимальной рабочей скорости симулируемого устройства.
- - - Добавлено - - -
Да, тут безусловно все так)
- - - Добавлено - - -
Какие у тебя проекты?
ядро 6502 и чипы APU и PPU NES
Пока скорости хватает, ибо старым железякам оно не сильно чтобы нужно. А более новые чипы уже все и так оптимизированы еще на стадии проектирования и изготовления.
Пока скорости хватает, ибо старым железякам оно не сильно чтобы нужно. А более новые чипы уже все и так оптимизированы еще на стадии проектирования и изготовления.
Я согласен, что это ускоряет процесс разработки и уменьшает число багов.
Но мой характер оптимизатора или перфекциониста, не знаю, что тут играет роль, заставляет всегда стремиться к оптимизации, если я вижу ее возможной.
Хочется из любой вещи слепить конфетку. Чтобы смотреть и любоваться)
Хотя это человекоресурсоемко, и далеко не на все хватает усидчивости)
Поэтому и получаются эмуляторы без интерфейсов типа EmuStudio. Типа, хотел, чтобы еще на тех старых PC (2005 года) все летало синхронно с разверткой, чтобы поиграться в любимые игры детства. Сделал, поигрался, удовлетворил потребность, и все.
- - - Добавлено - - -
Кстати, наверное это вопрос к Alex_G, можно ли в Vivado сделать так, чтобы участок памяти ПЛИС отображался в виде какой-то графики в окне? Т.е. визуальное наблюдение за битовым массивом в виде картинки хочу.
Реализовал синхронный модуль специального ресета.
Некоторая проблема в перевода в синхронный дизайн была в том, что в основе модуля асинхронный 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
"можно ли в 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
Вопрос задавал на емураше, но чего-то однозначного ответа не получил:
У меня такая дилемма, как реализовать банк регистров.
Или же генерить адрес регистра, с которым я работаю (0..13), и тогда удобнее использовать массив регистров reg [7..0] reg_block [16].
Либо же генерить 14 линий, и каждая линия выбирает свой регистр reg_AF, или reg_HL и т.д. Но тогда им на выходе нужно много логики, чтобы все выходы 14 8-битных регистров обьеденить в одну шину. Если бы реализовал на базе массива регистров, то это бы не понадобилось, т.к. там выбирается по адресу.
Поэтому и спрашиваю, что будет быстрее работать?
- - - Добавлено - - -
И еще, я спрашивал, как сделать так, чтобы компилятор не превращал многовходовый элемент типа 10-ИЛИ в кучу каскадно включенных элементов 2-ИЛИ. А чтобы группировал их параллельно. Мне предложили ключ KEEP="TRUE', но это никак не отразилось в Schematic)
максимально компактно память реализуется на примитиве BRAM - по сути это ОЗУ N*M
А вот во что реализуется память на рассыпухе - это "секрет".
По факту проще реализовать оба варианта и посмотреть что после синтеза получилось (не после елаборатион, а именно после синтеза).
То что выглядит "страшно" в коде - может быть "изящным в примитивах" и на оборот.
С другой стороны "этот кусок схемы" "живёт" в окружении других схем. По сему и выбирать "конкретный" вариант схемы.
Про атрибуты (* KEEP="TRUE' *) и еже с ними - их достаточно много для разных применений.
см UG901 глава 3. и да, есть атрибуты и для имплемента.
Про: KEEP "предложение" несколько не применимое к 10-ИЛИ.
"10-ИЛИ в кучу каскадно включенных элементов 2-ИЛИ." По факту превратится в два слоя примитивов (мне так видится на вскидку) два примитива 5 входовых и второй слой из 2 входной логики.
и сиё не зависит от этого аттрибута тк в плисе не существует единого примитива. Можно попробовать применить BRAM (это изврат)
ПС: 1) любое применение атрибутов приводит к потери "переносимости" кода verilog между разными производителями плис.
2) некоторы аттрибуты устарели
3) и временами важно где именно размещается атрибут (у имени цепи или у места определения модуля) - короче есть нюансы.
ПСПС% ну и на последок: вполне возможно (очевидно) что результат синтеза на этапе уже учитывает времянки и синтезатор может по разному синтезировать схему (и не забываем что и от имплементация ещё зависит конечный результат), Конечно если цель получить прошивку для конкретной плис и конкретной тактовой. а Если "забить на времянки" то зачем волноваться за "красоту" которую никто не увидит (да и излишне она будет для симуляции)
Чем больше я разбираюсь в Z80, тем больше понимаю, что фактически большая часть процессора (кроме работы с портами/памятью и кое-чего еще) спроектирована под нормальный синхронный дизайн без всякой ощутимой активности во время полутактов. Но, в силу специфичности элементной базы и невозможности синхронно переключать латчи, были добавлены промежуточные латчи для смещения сигналов на пол-такта, чтобы к моменту прихода /CLK не было гонки сигналов. А после того, как схема авторами была оптимизирована, эти латчи еще и размазались, делая понимание логики работы более сложным.
Что же касается управления памятью/портами, то там да, много активности и в полутактах. Возможно, где-то из-за того, что пытались уместить в 4 классических такта и чтение опкода, и регенерацию памяти. Поэтому чтение 1.5 такта, регенерация 1 такт. А может по каким-то еще причинам.
Но вообще, авторы - монстры. Не даром процессор столько лет живее всех живых)
HardWareMan
31.10.2024, 21:08
Titus, ну они смогли переключиться с двухфазовой модели на однофазную и это реально прорыв.
Titus, ну они смогли переключиться с двухфазовой модели на однофазную и это реально прорыв.
Двухфазная - это ты про 8080?
HardWareMan
01.11.2024, 09:50
Двухфазная - это ты про 8080?
Именно.
Именно.
Кстати, зачем нужно было двухфазное тактирование?
HardWareMan
01.11.2024, 18:07
Кстати, зачем нужно было двухфазное тактирование?
Прозрачные латчи nMOS. На них трудно построить синхронный D триггер. Он просто не экономный выходит.
Очередной шедевр, когда сразу две единицы подаются на RS-триггер.
В случае активного ресета (RES = 1), на RES_TCLK тоже подается 1.
Сама подача RES в этом случае теряет смысл, т.к. она не просто загоняет триггер в ненужное состояние, да еще и не сбрасывает его.
Триггер находится в цепи управления остановки инкремента PCR в режиме обработки прерываний или HALT.
https://pic.maxiol.com/images2/1731009211.1595414782.clipboard110720240.png
тут наверно надо смотреть времянки между RES и RES_TCLK кто из них раньше (позже) относительно клока.
тут наверно надо смотреть времянки между RES и RES_TCLK кто из них раньше (позже) относительно клока.
Это не важно, т.к. триггер синхронный, и гонка сигналов на него не влияет.
Еще одна интересная особенность Z80, которая выяснилась при моделировании. Вернее, она видна и по схеме, но не приходило в голову об этом подумать.
Во время сброса процессора, сбрасывается не только счетчик PC, но еще и IR.
Это происходит из-за того, что во время ресета принудительно выбраны PC и IR одновременно. Поэтому при любой записи в PC (в такте T2) или IR (в такте T4), запись идет в оба этих регистра. А так как при сбросе обнуляется регистр инкремента PCR, то каждый цикл записи идет запись 0 в PC и IR, пока не сняли ресет.
Дошел до модели АЛУ, и тут наткнулся на подозрение, что такая конструкция переводится в схему не так, как казалось бы должно:
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
Все, отбой, разобрался.
Это из-за использования неблокирующего присваивания в первом триггере. Странно, что на графике выход триггера выглядит абсолютно правильно, а симулируется неправильно.
Одна из самых нестандартных команд для 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 устанавливается для любой АЛУ-операции
Не смотря на не очень высокий интерес массовой публики к подробным (а уже не подробные, лаконичные) разборам особенностей выполнения команд, все же буду выкладывать интересное)
А именно егодня начал распутываться загадочный клубок с побочной записью/чтением регистра 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, ну и фиг с ними)
Да уж, тема заглохла)
Можно закрывать лавочку за отсутствием интересующихся)
Lethargeek
18.11.2024, 16:30
Можно закрывать лавочку за отсутствием интересующихся)
или за отсутствием у них времени на достаточное погружение в тему
ведь чтоб задать правильный вопрос, надо знать б0льшую часть ответа
да еще отрывочно излагаешь, надо бы оформить в статью нормальную
да еще отрывочно излагаешь, надо бы оформить в статью нормальную
Излагаю по мере исследования.
И так уже пишу самым простым языком, и группируя по командам.
Вот такая команда, вот такая особенность.
yashcher
18.11.2024, 18:37
Да уж, тема заглохла)
Можно закрывать лавочку за отсутствием интересующихся)
Мне интересно, просто я слишком далёк от таких инженерных тонкостей. Другим было бы не интересно, не было бы столько просмотров (сейчас уже 92469). Понятно, что ТС хотелось бы обратной связи (т.е. диалога и вопросов), но иногда может это и к лучшему: не отвлекает от проекта.
хотелось бы обратной связи (т.е. диалога и вопросов), но иногда может это и к лучшему: не отвлекает от проекта.
У меня так, если нет обратной связи, то это никому не нужно, и я сам теряю интерес)
почему-же интересно, просто я отладкой TZX формата занимался. До доработки внутренностей Z80 пока руки не дошли, нужно вначале графический интерфейс для linux доработать.
Мне интересно. У меня "шкурный интерес" - verilog model. Чем могу - посодействую. Сейчас в "две смены пашу" на работе и дома... так что времени вообще нету :v2_dizzy_tired2:
Мне интересно. У меня "шкурный интерес" - verilog model. Чем могу - посодействую. Сейчас в "две смены пашу" на работе и дома... так что времени вообще нету :v2_dizzy_tired2:
Для какого проекта тебе нужна Veriolog-модель?
Почему не попробуешь Z80 из проекта Nuked-MD? Там точно списана модель с NMOS, как они говорят, и проходит тесты ZXALL.
Я уже писал , что у неё "два клока" (как здесь написали - для эмуляции латчей) - а оное "дурно" влияет на фактическую частоту проекта. и не факт что она пройдёт "другие" тесты (которые здесь тестят)
Я уже писал , что у неё "два клока" (как здесь написали - для эмуляции латчей) - а оное "дурно" влияет на фактическую частоту проекта. и не факт что она пройдёт "другие" тесты (которые здесь тестят)
Ну все зависит от того, в каком проекте ты хочешь использовать. Тебе нужны частоты 100МГц?
ОФФТОП: я жадный, я ОЧЕНЬ ЖАДНЫЙ.
при 100 эффективная будет не более 25. (я не помню соотношение частот в том проекте). А на 100 "разводить" несколько сложновато ("дороже по ресурсам").
ОФФТОП: я жадный, я ОЧЕНЬ ЖАДНЫЙ.
при 100 эффективная будет не более 25. (я не помню соотношение частот в том проекте). А на 100 "разводить" несколько сложновато ("дороже по ресурсам").
Тогда еще интереснее стало, что у тебя за проект) Колись)
Честно ? Пока никакого. а первоначально "Хоббит"
Честно ? Пока никакого. а первоначально "Хоббит"
Для хоббита не нужно 25Мгц)
Зато процессор от Нюка полностью соответствует схеме, в отличие от моей версии. Т.к. нельзя сохранить оригинал переходя на синхронный плисовский дизайн.
Товарищи с емураши правильно заметили, что чем больше преобразований относительно транзисторной схемы, тем больше шансов накосячить.
Поэтому если хочется сохранить прям эталонную модель, то это тут надо брать верилог с Nuked-MD, а еще лучше Z80 Explorer)
Каждая ступень оптимизации может дать свои косяки просто из-за банальной ошибки.
А уж преобразование в синхронную модель и отказ от двунаправленных шин, да и иных полу-аналоговых элементов схемы, требует не просто оптимизации а переделывания частей схемы.
Например, никак нельзя оставить двухпортовый регистровый файл со всеми его фичами, такими как произвольное обьединение LBUS и HBUS, возможность слияния шин основного набора регистров и набора регистров-указателей.
Его приходится полностью переписать на функциональный аналог, но не копию, т.к. она невозможна на этом уровне.
А уж всякие остаточные заряды на шинах, из-за которых получаются 3 и 5 флаги и всякие другие фичи - никак не сохранить в первозданном виде.
Их приходится написать заново, где условные 'заряды' будут хранится в триггерах.
В общем, чем дальше переводишь схему на современные и оптимальные рельсы, тем больше привносишь своего, что хоть и должно являться функциональным аналогом, но может нести ошибку.
- - - Добавлено - - -
Кстати, все эти особенности шин регистрового файла позволяют делать такие вещи, как, например.
1. Одновременно читать регистр A, записывать регистр F, и снова его читать в одном и то же такте.
2. Записывать по шине HBUS регистр WZL (младший байт внутреннего регистра-указателя, его еще называют MEMPTR) в главную часть регистрового файла, и при этом одновременно читать WZ целиком (и младшую и старшую часть) из другой части регистрового файла, которые на это такт специально обьединяются мостом.
Чур меня на это:
"а еще лучше Z80 Explorer"
бредовая реализация...
Вот это не понял:
"Например, никак нельзя оставить двухпортовый регистровый файл со всеми его фичами"
двух портовость в плисе "аппаратная"
А это ни одна из выше упомянутых реализаций тоже не имеет:
"А уж всякие остаточные заряды на шинах, из-за которых получаются 3 и 5 флаги и всякие другие фичи - никак не сохранить в первозданном виде."
А в случае КМОП - так это (я так понял) вообще статическая вещь - без всяких плавающих флагов.
Да и следующие (мне так кажется) тоже реализуемо
Кстати, все эти особенности шин регистрового файла позволяют делать такие вещи, как, например.
1. Одновременно читать регистр A, записывать регистр F, и снова его читать в одном и то же такте.
2. Записывать по шине HBUS регистр WZL (младший байт внутреннего регистра-указателя, его еще называют MEMPTR) в главную часть регистрового файла, и при этом одновременно читать WZ целиком (и младшую и старшую часть) из другой части регистрового файла, которые на это такт специально обьединяются мостом.
двух портовость в плисе "аппаратная"
Это не та двухпортовость.
Тут функционал гораздо шире. Начиная с того, что можно одновременно писать в любое количество регистров. И при этом читать другие.
- - - Добавлено - - -
"А уж всякие остаточные заряды на шинах, из-за которых получаются 3 и 5 флаги и всякие другие фичи - никак не сохранить в первозданном виде."
А в случае КМОП - так это (я так понял) вообще статическая вещь - без всяких плавающих флагов.
На CMOS прекрасно обнаружены те же самые плавающие 3 и 5 биты в командах SCF/CCF.
Статика никак не влияет на причину плавающих флагов.
- - - Добавлено - - -
Да и следующие (мне так кажется) тоже реализуемо
Кстати, все эти особенности шин регистрового файла позволяют делать такие вещи, как, например.
Конечно все эти прекрасно реализуемо.
Но это как бы уже не копия оригинала, а функциональный аналог.
Ну значит "двухпортовость" собирается на отдельных триггерах - и "делай с ними что хошъ"(с)
Копия - это на транзисторах спаянное (как 6502).
Копия - это на транзисторах спаянное (как 6502).
Все это относительно)
Каждый подьем на более высокий слой абстракции может породить какую-то новую несовместимость)
Обратил внимание, что в некоторых описаниях работа команды DAA описана уж очень сложным языком.
Тогда как в железной реализации она очень проста:
DAA:
Цикл M1:
T1-T2 - выборка кода команды и завершение предыдущей ALU-операции
T3 - стандартная загрузка A в ALUA и ALUB
T4 - если ALUA[3..0] > 9 или флаг H = 1, то ALUB[3..0] = 0x6
если ALUA > 99 или флаг C = 1, то ALUB[7..4] = 0x6, и флаг C результата равен 1
далле выполняем сложение ALUA и ALUB, если N = 0, и вычитание, если N = 1
Все остальные флаги устанавливаются как при обычном сложении/вычитании, за исключением того, что флаг P/V показывает признак четности
- - - Добавлено - - -
А вообше, скажу оффтопно - Vivado хоть и классная студия для моделирования, но после первого запуска симуляции начинает весь комп подтормаживать, хотя симуляция стоит на паузе.
Причем, закрываешь симуляцию или нет, уже не влияет. Приходится выйти из студии и снова войти.
Вот почему я люблю программирование и VisualStudio, а не симуляторы)
T4 - если ALUA[3..0] > 9 или флаг H = 1, то ALUB[3..0] = 0x6
иначе ALUB[3..0] = 0 (а не загруженный из А в предыдущем цикле, как кто-то может подумать) ?
иначе ALUB[3..0] = 0 (а не загруженный из А в предыдущем цикле, как кто-то может подумать) ?
Да, если не 0x6, то 0x0.
Что уж совсем логично)
случайно наткнулся на большую подборку тестов z80
https://github.com/redcode/Z80/wiki/Tests
случайно наткнулся на большую подборку тестов z80
https://github.com/redcode/Z80/wiki/Tests
На них уже ссылался Злой Киллер. Там даже мой тест есть)
Интересно, а какое начальное состояние у регистров Z80 и какие регистры прописываются сбросом?
Почему visual6502 при сбросе прописывает регистры значением 0x55 (кроме pc и ir, которые прописываются 0x00)?
Интересно, а какое начальное состояние у регистров Z80 и какие регистры прописываются сбросом?
Почему visual6502 при сбросе прописывает регистры значением 0x55 (кроме pc и ir, которые прописываются 0x00)?
Про 6502 ничего не могу сказать.
А Z80 при сбросе обнуляет PC и IR (неожиданно).
Все остальные регистры остаются без изменений.
Про 6502 ничего не могу сказать.
я про Z80: http://www.visual6502.org/JSSim/expert-z80.html
Видимо кнопка сброса не совсем сброс делает, а просто инициализирует начальное состояние.
Разобрался.
А какие варианты сброса у Z80 есть? Помню читал есть короткий сброс и длинный. Сколько минимум тактов нужно держать активным _reset для первого и второго варианта?
А какие варианты сброса у 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 такт.
Читай выше.
лавное, чтобы во время фиксации ресета (в 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 полуцикла, но в какой момент происходит фиксация данных?
можно поподробнее, что значит 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
2 - это означает, что это второй полутакт такта T2
тогда что значит M1.T2.4? Четвертый полутакт? Их-же два, дальше идет T3, разве не так?
тогда что значит M1.T2.4? Четвертый полутакт? Их-же два, дальше идет T3, разве не так?
Я выше в теме писал, что если какой-то процесс инициируется циклом, например, M2, то все последующие действия отсчитываются от него.
На практике M1.T2.4 скорее всего совпадет с M1.T3.2, однако, если поступит сигнал WAIT, то между T2 и T3 будет пауза, и M1.T2.4 уже не совпадет с M1.T3.2.
Импульс специального ресета задействует механизм запрета декодирования кода команды, который также используется в IM1,2, NMI, HALT. В этом режиме любая команда воспринимается декодером команд, как 00 (NOP).
А можно вот про это поподробнее? Что за механизм запрета?
И кстати насчет режима IM, вы разбирали как работает установка режима? Если я правильно нашел сигналы, то получается такая картина:
IM0: 0 0
IM1: 1 0
IM2: 1 1
Как-то странно, я ожидал увидеть для IM2 0 1, почему оба сигнала одинаковые? Как это работает?
А можно вот про это поподробнее? Что за механизм запрета?
Механизм очень прост. Блок выбора кода команды выдает 0, вместо кода команды.
Это сделано, чтобы, например, во время обработки прерываний, в регистре опкода была нейтральная команда типа NOP, которая не активирует никаких линий, и не помешает декодерам прерываний.
- - - Добавлено - - -
Как-то странно, я ожидал увидеть для IM2 0 1, почему оба сигнала одинаковые? Как это работает?
Не совсем понял, в чем именно вопрос)
Вот причесанная схема декодера IM:
https://pic.maxiol.com/images2/1734547328.1595414782.clipboard121820240.png
- - - Добавлено - - -
вы разбирали
Ко мне можно и нужно на ты)
Вот причесанная схема декодера IM:
IA3 и IA4 - это что за сигналы?
Не вижу SEL_IM0. И не понятно, зачем NMI_ACK с IM1 объединяется по ИЛИ на U44 - для чего это?
Не вижу SEL_IM0.
Его и нет.
Так как IM0 фактически это просто выполнение команды с шины данных.
Но вообще, сами блоки выполнения прерываний я пока не разбирал. Нарисовал, но не разбирал подробности работы.
- - - Добавлено - - -
IA3 и IA4 - это что за сигналы?
Это биты 3 и 4 регистра опкода.
- - - Добавлено - - -
зачем NMI_ACK с IM1 объединяется по ИЛИ на U44 - для чего это?
REQ_DIS_BASE_SET - это запрос запрета декодера команд. О чем я писал уже выше.
Это биты 3 и 4 регистра опкода.
проверил - да, действительно, опкоды ed46 (im0), ed4e (*im0), ed56 (im1) и ed5e (im2), сохраняют разное состояние режима.
Т.е. внутри процессора есть разница между ed46 (im0) и ed4e (*im0). :)
REQ_DIS_BASE_SET - это запрос запрета декодера команд. О чем я писал уже выше.
с нижней частью схемы понятно, а для чего в верхней NMI_ACK с IM1 объединяется - что это за сигнал уходит направо за границу схемы с выхода U44?
Еще такой вопрос - есть ли в схеме физически регистр IFF2 или он как-то виртуально получается?
Т.е. внутри процессора есть разница между 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
Нет, разницы-то как раз нет) im0 и im0* воспринимаются процессором абсолютно одинаково.
однако режим хранится по разному :)
Может и в обработке есть разница, судя по схеме один бит используется в блокировке декодера, второй нет. Получается можно как-то заметить эту разницу?
Разумеется есть:
где примерно эта цепь IFF2 на кристалле находится? может ктото подскажет номер цепи в visual6502 z80 симуляторе?
Как насчет регистра Q, который для недок флагов в SCF/CCF используется? Он есть физически?
однако режим хранится по разному :)
Может и в обработке есть разница, судя по схеме один бит используется в блокировке декодера, второй нет. Получается можно как-то заметить эту разницу?
Никакой разницы нет.
Схема была спроектирована для того, чтобы различать 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 в этой ветке у меня оооочень хорошо описаны, как и почему такое происходит. Просто надо все прочитать)
Номера транзисторов могу подсказать:
не нахожу, а можно такую-же схему с номерами транзисторов для IFF1?
не нахожу, а можно такую-же схему с номерами транзисторов для IFF1?
https://pic.maxiol.com/images2/1734565596.1595414782.clipboard121920240.png
хм, не нахожу. Пробовал методом перебора путём выбора нодов которые соответствуют значению нода IFF1 на последовательности EI, NOP, DI, NOP, EI, NOP, DI, NOP. В результате осталась только одна нода IFF1. Толи в симуляторе нет этой цепи, толи IFF2 при выполнении EI/DI устанавливается и сбрасывается не одновременно с IFF1. Странно это.
нашел только инверсную ноду IFF1:
iff1 = 231
_iff1 = 1166
Однако при выполнении NMI/RETI флаг IFF1 восстанавливается. Значит где-то сохраняется, получается, что IFF1 и IFF2 устанавливаются на разных циклах.
в коде симулятора есть такой комент:
// * 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? Где его взять?
хм, не нахожу.
Ты не написал, где ты и в каком проекте ищешь.
На каком сайте.
Что запускаешь.
Я когда-то просто скачал Z80 Explorer, и в нем есть список всех транзисторов и координаты каждого транзистора на схеме.
- - - Добавлено - - -
Но вообще, на моей схеме видно же, когда и чего устаналивается.
- - - Добавлено - - -
Разберем схему:
Триггер IFF1 сбрасывается по:
1. Reset
2. Прием NMI
3. Прием INT
Триггер IFF2 сбрасывается по:
1. Reset
2. Прием NMI
Оба триггера устанавливаются/сбрасываются по EI/DI
Триггер IFF2 копируется в IFF1 RETN/RETI, если не активен прием NMI
Всё!
Ты не написал, где ты и в каком проекте ищешь.
На каком сайте.
Что запускаешь.
Проект visual6502: https://github.com/trebonian/visual6502
Вот сама страница с симулятором: http://www.visual6502.org/JSSim/expert-z80.html
там есть мелкие ошибки в дизассемблере, но они легко исправляются.
- - - Добавлено - - -
Оба триггера устанавливаются/сбрасываются по EI/DI
проблема в том, что я пробовал перебором искать node, которая в каждом цикле соответствует IFF1 (node 231) для цепочки инструкций EI,NOP,DI,NOP, однако ничего не нашел, находится только инверсный сигнал _IFF1 (node 1166). Если оба триггера устанавливаются/сбрасываются по EI/DI одновременно, то такой подход должен был найти node для IFF2, ведь IFF1 и IFF2 на такой цепочке инструкций должны дублироваться в каждом цикле. Но ничего не находит. Как такое может быть?
При этом проверил обработку NMI логика сохранения IFF1 в этом симуляторе работает.
проблема в том, что я пробовал перебором искать node
Зачем ее искать?
Я нарисовал схему прямо по списку транзисторов, который использует этот симулятор.
На схеме все четко видно. И все правильно.
- - - Добавлено - - -
Проект visual6502: https://github.com/trebonian/visual6502
Я использовал вот это:
https://github.com/gdevic/Z80Explorer
Зачем ее искать?
Я нарисовал схему прямо по списку транзисторов, который использует этот симулятор.
На схеме все четко видно. И все правильно.
я хочу видеть в симуляторе сигнал 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?
Что это за Z80Simulator?
Не знаю)
Я скачивал Z80 Explorer ради списка транзисторов.
В качестве симулятора никогда его не использовал, мне это не нужно, по схеме и так все понятно)
- - - Добавлено - - -
Проблема в том, что я не знаю как генерируются эти списки цепей и как они связаны с номерами транзисторов
Мои номера транзисторов взяты из Z80Explorer, и только некоторые номера я поменял (подтягивающие транзисторы поменял, т.к. добавлял их позже).
Не знаю)
Я скачивал 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. Что это?
открыть куски схем, как на скриншотах.
Куски схем, как на моих скриншотах?
Их нельзя открыть, я их сам нарисовал в P-CAD'е)
- - - Добавлено - - -
Т4246 - это выход U485:
https://pic.maxiol.com/images2/1734552815.1595414782.clipboard121820240.png
А именно запрет сигнала с IFF1, если текущая команда DI или EI.
Как раз из-за этого цепочка EI блокирует прерывание.
Куски схем, как на моих скриншотах?
Их нельзя открыть, я их сам нарисовал в P-CAD'е)
я про скриншоты на сайте Z80Explorer, там открыты окна со схемами. Но как их открыть, скажем для заданного транзистора - не понятно.
А у тебя есть транзисторная схема триггеров где IM режим хранится (со схемы выше)? Интересуют номера транзисторов на выходах триггеров. Ты где-то выкладывал эти схемы?
Кстати интересный момент заметил, после выполнения DI, IFF1/IFF2 все-еще активен до M1.T2 следующего опкода. Может ли прерывание в этот момент сработать? (между DI и следующим опкодом)
https://i.imgur.com/OfQeipW.png
Update: похоже, что не может, из-за вышеозначенного сигнала блокировки (последняя колонка на следующем скрине), который сбрасывает разрешение прерываний прямо сразу после чтения опкода DI:
https://i.imgur.com/2CFjrGo.png
А у тебя есть транзисторная схема триггеров где IM режим хранится (со схемы выше)? Интересуют номера транзисторов на выходах триггеров. Ты где-то выкладывал эти схемы?
Выкладывал не последнюю версию в этой теме, но ссылка за неделю потухает.
NMOS Z80 - Transistor sketch rev 2.25.pdf (https://dropmefiles.com/6tGse)
Выкладывал не последнюю версию в этой теме, но ссылка за неделю потухает.
NMOS Z80 - Transistor sketch rev 2.25.pdf
не загружается - кликаешь, страница перезагружается и ничего не происходит.
А в kicad можно сконвертить? На моём компе pdf с крупной схемой врядли получится открыть - процессор слабый и памяти мало. По крайней мере файлы pdf со схемой реверса ВГ93 не открывает - долго думает и зависает.
Любопытно видеть как этот сигнал блокировки (последняя колонка) срабатывает на серии опкодов EI :)
https://i.imgur.com/k8ShAc8.png
не загружается - кликаешь, страница перезагружается и ничего не происходит.
Только что проверил, все загружается.
- - - Добавлено - - -
А в kicad можно сконвертить?
Нет, в это конвертера не имею.
Только что проверил, все загружается.
у меня при клике на DOWNLOAD пишет в статусе transferring, потом через секунду странца просто перезагружается заново и всё. :(
у меня при клике на DOWNLOAD пишет в статусе transferring, потом через секунду странца просто перезагружается заново и всё. :(
https://transfiles.ru/f19jo
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)
А возможность сохранить в одном из следующих форматов есть? У меня такие варианты импорта в KiCad доступны:
На сколько я вижу, у PCAD-2006 нет способа сохранить ни в каком формате, кроме его собственного .sch.
На сколько я вижу, у 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
а в формате pcad можешь выложить?
https://transfiles.ru/cg2v0
Текущая ревизия.
Думаю, что ошибок в ней нет, просто это еще не финальная по подписыванию, группированию и вылизыванию.
https://transfiles.ru/cg2v0
Текущая ревизия.
Думаю, что ошибок в ней нет, просто это еще не финальная по подписыванию, группированию и вылизыванию.
спасибо. конвертер к сожалению не берет - падает прямо вначале файла получает токен II, далее ожидает увидеть строку начинаюуюся с ", а там 0x02.. Похоже проблема в том что это бинарный формат, а конвертер ожидает PCAD ASCII. В PCAD нет возможности сохранить в PCAD ASCII?
нет возможности сохранить в PCAD ASCII?
https://transfiles.ru/9ngnu
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
Также вылезла еще одна проблема - номера транзисторов почему-то не сконвертились, они точно в файле сохранились?
Во всяком случае в текстовом файле есть названия транзисторов, значит сохранились)
Мне кажется, вместо заката солнца вручную проще поставить PCAD2006 и не мучиться)
Мне кажется, вместо заката солнца вручную проще поставить PCAD2006 и не мучиться)
помоему для моей платформы на ARM Cortex A72 его просто не существует в природе... :)
Вобщем пришлось основательно продебажить и допилить конвертер, добавил генерацию uuid-ов для символов и проекта, чтобы заработали имена (Reference) компонентов. Теперь транзисторы и имена остальных компонентов сохраняются... :)
Правда на некоторых схемах встречаются странные длинные проводники вдоль всей схемы, висящие в воздухе - что это?
https://i.imgur.com/EidM0KR.png
это так в оригинале было?
https://i.imgur.com/we8J79X.png
- - - Добавлено - - -
Кстати, вопрос - для какого варианта Z80 netlist в симуляторе Z80Explorer/visual6502? И есть ли netlist для других процессоров?
Правда на некоторых схемах встречаются странные длинные проводники вдоль всей схемы, висящие в воздухе - что это?
Я думаю, эти вертикальные проводники - глюк конвертера.
- - - Добавлено - - -
помоему для моей платформы на ARM Cortex A72 его просто не существует в природе...
Переходи на платформу КПСС PC :-)
- - - Добавлено - - -
Кстати, вопрос - для какого варианта Z80 netlist в симуляторе Z80Explorer/visual6502? И есть ли netlist для других процессоров?
В каком смысле для какого варианта? NMOS или CMOS? Конечно NMOS.
Другие процессоры ты имеешь в виду Z80?
Я думаю, эти вертикальные проводники - глюк конвертера.
попробую продебажить откуда он берется. Можешь проверить нет ли в 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?
В visual6502 похоже NMOS, т.к. OUT (C),0 выводит 0 в порт.
Не похоже, а точно.
- - - Добавлено - - -
Можешь проверить нет ли в PCAD версии на этом месте какого-то висящего провода или чего-то подозрительно похожего?
Да нет ничего там такого.
- - - Добавлено - - -
Есть ли netlist файлы для других вариантов Z80? И какие варианты Z80 удалось идентифицировать?
Товарищ Nuked с эмураши делал в сентябре нетлист от CMOS версии t84c00. Вроде бы от Тошибы. Но он сразу это все писал на Си, и не в виде транзисторов а в виде логических примитивов. Не знаю, можно ли это вытащить в виде нетлиста.
- - - Добавлено - - -
Также непонятно - из какого источника брались эти netlist? Например в netlist от visual6502 максимальный номер транзистора T8880
У меня больше номеров транзисторов, т.к. в нетлисте Z80Explorer'а нет подтягивающих транзистотров. Они находятся в отдельном списке и без номеров. Поэтому я их потом добавлял вручную, и с них набежало еще немало.
Товарищ 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.
Непонятно откуда все берут эти 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 - Си версия
Не думаю, что есть смысл особо идентифицировать 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, т.к. это по сути единственный рабочий симулятор который у нас есть.
Насколько я понимаю, 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.
И не надейся на точность этого симулятора, плавающие флаги он тебе, я думаю, он не покажет, т.к. на этом уровне он не симулирует.
- - - Добавлено - - -
Чтобы просимулировать плавающие флаги, нужно симулировать физические процессы наводок одних проводников на другие, температуру процессора и т.д.
Но этого всего делать не надо. Т.к. все уже давно с ними понятно и протестировано.
Я не думаю, что основные производители NMOS чипов схематехнически отличаются. Отличаются нормы, по которым сделан кристалл, а так же немного трассировка.
Естественно, что из-за этого плавающие флаги (5 и 3) плавают по разному. Это показывает мой Test SCF.
в том-то и дело, что поведение флагов разное у разных производителей - у одних (с Q-регистром) оно зависит от состояния флагов предыдущих операций и еще от каких-то плавающих состояний, у других никак не зависит. И оба NMOS, но разных производителей. Ясно, что схемы АЛУ отличаются. Это разные схемы, поэтому не стоит их смешивать и рассматривать как один и тот-же кристалл только потому что оба NMOS.
в том-то и дело, что поведение флагов разное у разных производителей - у одних (с Q-регистром)
В какой команде-то?
Увеличь, там посередине написано 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 :)
я тоже знаю - автор теста просто в следующей альфа-ревизии теста поменял неправильный результат на правильный.
В смысле поменял? Я автор теста 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% вопросов отпадет)
В смысле поменял? Я автор теста 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: По поводу схем, подчистил немного код конвертера, в нем неправильно вычислялись размеры листа, плавающий провод после этого вроде исчез.
Я про вот этот тест писал: 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) нет! Он есть везде. Его невозможно ни убавить, ни добавить в разные ревизии чипов, т.к. он очень важен и очень массивен по своей площади.
Вот если на других командах найдется отличие, вот там уже стоит рассмотреть.
Вот нашел ссылку, где вроде как были снимки кристалла, с которого реверсили 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
Все версии, кроме 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
Вот это самый интересный момент. Есть конкретная версия теста которой тестили и сохранился ли результат в виде снимка экрана? Потому, что без теста и результата который можно воспроизвести и проверить - это информация из разряда одна бабка сказала.
Есть в этой теме, или в теме про SCF. Мне лень искать, поищи, результат выкладывал zebest.
- - - Добавлено - - -
Результатов с тестами для NEC довольно много, но чем они примечательны - они абсолютно все дают стабильные, повторяемые и прогнозируемые результаты и показывают, что результат берется из аккумулятора, а не из регистра флагов, чем значительно отличаются от ZILOG и ST, у которых источник флагов пресловутый регистр Q.
Хорошо, не буду спорить по сто раз о том, что не может быть значительного отличия в схемах у разных NMOS) А наличие/отсутствие кэша регистра F - это сверхбольшое отличие)
- - - Добавлено - - -
Он есть на твоей схеме? Как его найти?
Конечно он там есть. У меня же полная схема.
Но ты его долго будешь собирать по кускам, т.к. в транзисторном виде он очень большой.
Смотри страницу ALU.
На ней большие блоки, каждый из них относящийся к конкретному биту кеша флагов.
Ищи по /LBUS0, /LBUS1 и т.д.
- - - Добавлено - - -
Вот тут кое что есть:
http://www.visual6502.org/images/z80/
Но при этом они не указали маркировку на корпусе, откуда вообще кристалл был взят(
- - - Добавлено - - -
В общем, посравнивал я фотку кристалла с теми, что находил в инете, и она один в один совпадает с Zilog Z8400APS.
Поэтому будем считать, что нетлист мы имеем именно с него.
Мои пять копеек. ИМХО.
Я не думаю что каждый кто производил z80 делал СВОЮ топологическую реализацию. Хотя бы чисто из экономических соображений. "Просто взяли топологию и натянули на своё производство" - дёшево и сердито (и быстро). Если кто и делал изменение топологии так это только "авторы". Для есть правда исключения - то ли "кролик" толи ещё кто (кто был "однотактовым") (если не сильно склероз). Ну а в современном мире своих топологий как грязи - тот же марвелл использует сей проц в хабах(свитчах ?).
"Просто взяли топологию и натянули на своё производство" - дёшево и сердито (и быстро).
Согласен. Судя по всему так и есть.
Поэтому можно условно считать все NMOS одинаковыми по топологии, за исключением каких-то специально правленых кристаллов, и то, если это будет не просто выявлено в тестах, но и теоретически обосновано.
Теоретическое обоснование SCF полностью охватывает все текущие разновидности NMOS и обьясняет их единой моделью.
Кстати говоря, долгое время думали, что CMOS стабильны, пока на тестах Test SCF 9 в некоторых экземплярах не выявили такое же распределение шума, как и на NMOS. Что может говорить лишь о том, что CMOS это простая конвертация NMOS на новую технологию без какого-либо изменения принципа работы. Либо же изменения минимальные.
Я не думаю что каждый кто производил 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
Как может быть одна топология, если вся разводка полностью другая?
однако снимки кристаллов кардинально отличаются, сравните:
NMOS только на первой фотке
На остальных CMOS. Их не надо сравнивать между собой. Я говорю пока что только о NMOS, т.к. схема у меня от NMOS.
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
Действительно - сбрасывает только PC, прерывания оставляет разрешенными и IR не трогает
Я так и говорил)
Это что за таблицы? Это ты Z80Exploerer так тестируешь?
Это что за таблицы? Это ты Z80Exploerer так тестируешь?
нет, немного допилил visual6502 под свои нужды для тестов - исправил ошибки инициализации и дизассемблера, переделал UI, стало в несколько раз быстрее и удобнее дебажить :)
Правда дизассемблер все еще глючит - не понимает, когда процессор делает холостую выборку опкода с префиксом, например во время halt, и начинает трактовать следующие выборки как префиксный опкод. Нужно будет заменить самопальный анализ префиксов на чтение состояния из процессора, чтобы корректно префиксы дизассемблировались:
https://i.imgur.com/KZtVWkI.png
нет, немного допилил visual6502 под свои нужды для тестов - исправил ошибки инициализации и дизассемблера, переделал UI, стало в несколько раз быстрее и удобнее дебажить
А цель какая? Прошагать все команды, и таким образом узнать, что как работает? )
А цель какая? Прошагать все команды, и таким образом узнать, что как работает? )
отладка для допиливания эмулятора для более точной потактовой эмуляции. Уже несколько неточностей с таймингами нашел.
отладка для допиливания эмулятора для более точной потактовой эмуляции. Уже несколько неточностей с таймингами нашел.
До полутактовости допиливать не будешь? )
До полутактовости допиливать не будешь? )
в этом я не вижу смысла. Интересно, есть аналогичный нетлист для 8080?
в этом я не вижу смысла. Интересно, есть аналогичный нетлист для 8080?
Реверс в виде транзисторной схемы есть.
Реверс в виде транзисторной схемы есть.
а в текстовом (или json/xml) виде есть? чтобы можно было сделать выборку соединений транзисторов в текстовом виде?
а нетлист отсюда ( https://github.com/1801BM1/vm80a/tree/master/sch ) выгрузить?
или надо чистый 8080?
а нетлист отсюда ( https://github.com/1801BM1/vm80a/tree/master/sch ) выгрузить?
или надо чистый 8080?
там схема в бинарном pcad формате, мне нечем прочитать. Да и из схемы вытянуть связи между транзисторами задача не такая и простая, нужно свой парсер писать. Может чтото готовое есть?
Да и из схемы вытянуть связи между транзисторами задача не такая и простая, нужно свой парсер писать. Может чтото готовое есть?
Вряд ли) Скорее всего самому придется)
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. Странно.
На схеме 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. Я об этом писал в этой теме, поищи. Видимо, это было сделано для ускорения таких команд или для еще какой-то оптимизации.
BASE_SET - это базовый набор инструкций
почему он не сбрасывается на серии префиксных инструкций?
https://i.imgur.com/kukzgHv.png
Есть специальный триггер, он содержит информацию, какой сейчас набор IX или IY. Транзисторы T3603/T3611 и т.д.
да, действительно именно тут хранится, спасибо за инфу :) По умолчанию он 1, для DD опкодов сбрасывается в 0. Получается IY у Z80 как-бы регистр по умолчанию? :)
А почему сигнал никак не назван?
Любопытно, что сигнал и SEL_IX и SEL_IY, в отличие от указанного, включается только на один полу-такт в момент пересылки.
А почему сигнал никак не назван?
Есть сигналы, которые и так понятны из контекста. Не буду же я все десять тысяч соединений подписывать именами)
- - - Добавлено - - -
почему он не сбрасывается на серии префиксных инструкций?
Ты имеешь в виду префиксных DD/FD?
Но ведь набор команд остается тот же, просто меняется HL на IDX, и всякое такое.
Тогда как в ED и CB меняется сам набор команд.
- - - Добавлено - - -
Любопытно, что сигнал и SEL_IX и SEL_IY, в отличие от указанного, включается только на один полу-такт в момент пересылки.
Все правильно. Так как SEL_какой-то регистр непосредственно управляет чтением/записи из банка регистров, а активная фаза чтения или записи как раз и длится пол-такта.
- - - Добавлено - - -
да, действительно именно тут хранится, спасибо за инфу По умолчанию он 1, для DD опкодов сбрасывается в 0. Получается IY у Z80 как-бы регистр по умолчанию?
Нет регистра по умолчанию)
По умолчанию - это то, что выбирается, когда нет явного указания, что выбрать.
А тут явно 0 или 1, и иного не дано.
Ты имеешь в виду префиксных 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
А у тебя есть схема с логикой и триггерами вместо транзисторов?
DD,21,00,00, DD,21,00,00, то он все время в нуле...
Похоже, ты смотришь на инверсный сигнал. Он наоборот все время в единице.
- - - Добавлено - - -
Вот пример обработки DD,CB,00,46:
И чего тут непонятного?
Похоже, ты смотришь на инверсный сигнал. Он наоборот все время в единице.
я вот о чём:
https://i.imgur.com/wo3JCYQ.png
И чего тут непонятного?
непонятно тут то, что на момент выборки опкода понять из состояния приведенных сигналов, что именно должен сделать процессор решительно невозможно. Флаги префиксов именно на такте захвата опкода сбрасываются (ещё до того как опкод будет захлопнут в защелке), для DD,CB вообще идут странные переключения из одного режима в другой.
я вот о чём:
А в чем проблема-то? Я не могу догадаться, что тебя смущает) Ну да, не очень ровные оранжевые линии вокруг циферок)
А в чем проблема-то? Я не могу догадаться, что тебя смущает
кажется понял, /BASE_SET активирует дешифратор стандартных опкодов. Т.к. до этого был CB опкод, то сигнал был не активен, а на префиксе переключился в активное состояние, т.к. инструкция обрабатывается стандартным декодером. Ладно, с этим сигналом понятно.
Я сейчас пытаюсь понять, по каким сигналам можно определить что будет делать процессор с опкодом в моменты выборки из памяти. Нужно мне это, чтобы исправить дизассемблер симулятора, чтобы он показывал корректную инструкцию в момент выборки.
Но я пока не вижу как в момент выборки определить что за опкод читается - прямой или с каким префиксом. Ситуация усугубляется тем, что флаги префиксов сбрасываются прямо во время выборки опкода, еще до её завершения, т.е. на последнем такте выборки, когда происходит захват опкода по состоянию сигналов вообще не понятно что читает процессор... :(
Если на первых двух полутактов еще более-менее понятно - можно понять какой сейчас префикс, то вот на последнем полутакте выборки флаги уже сброшены. Новые флаги у процессора включатся на следующем полутакте. Поэтому в самый важный момент, когда процессор захватывает опкод нет информации о текущем состоянии префиксов...
Опкод недействительный всего пол-такта, между окончанием действия предыдущего опкода и выборкой следующего.
Эти пол-такта M1.T3.1 (если нет торможения памяти). В этом же полутакте идет установка режима выборки опкода.
Таким образом, с M1.T3.2 уже в регистре опкода защелкнут и действителен новый опкод, и уже в регистрах префиксов установлен выбор нужного набора команд или префикса.
Во все остальное время регистр опкода действителен и декодируется в соответствии с текущим режимом.
Если режим BASE_SET то по ПЛМ базового набора
Если режим ED_SET или CB_SET то по ПЛМ их наборов
Опкод недействительный всего пол-такта, между окончанием действия предыдущего опкода и выборкой следующего.
Эти пол-такта 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
это что, получается, что в промежуток от 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.
Если тебе прям очень-очень надо это знать, то это состояние триггера 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?
Тоесть можно считать, что выборка опкода происходит всегда при 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 и вообще в другом полу-такте.
И все это происходит в течении цикла ожидания, если он есть, и в M1.T3.1 тоже.
да, я это заметил, когда пробовал wait включать во время выборки.
Правильно ли понял, что независимо от цикла M, по T3 всегда идет выборка из памяти, причем опкод и его данные читаются в T3.1, а при выполнении опкода данные читаются в T3.2? И кстати, почему чтение опкода и его данных занимает 3 полу-такта, а чтение данных при выполнении опкода 4 полу-такта?
Если это так, можно ли по какому-то сигналу отличить эти два случая, т.е. когда идет выборка опкода и его данных, а когда идет выборка данных при выполнении инструкции
Правильно ли понял, что независимо от цикла M, по T3 всегда идет выборка из памяти, причем опкод и его данные читаются в T3.1
Нет, не каждый M-цикл порождает цикл чтения-записи памяти. А только по необходимости.
- - - Добавлено - - -
И кстати, почему чтение опкода и его данных занимает 3 полу-такта, а чтение данных при выполнении опкода 4 полу-такта?
Цикл чтения опкода в M1 укорочен, видимо, это связано с тем, что в M1 надо было упихнуть и цикл чтения опкода, и цикл регенерации памяти, иначе они бы не поместились, если бы были длиннее.
- - - Добавлено - - -
Если это так, можно ли по какому-то сигналу отличить эти два случая, т.е. когда идет выборка опкода и его данных, а когда идет выборка данных при выполнении инструкции
Если у тебя активен LOAD_IR, значит идет загрузка регистра опкода.
Нет, не каждый M-цикл порождает цикл чтения-записи памяти. А только по необходимости.
тоесть если T3=1 значит идет чтение/запись памяти?
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot