Вот этот кусочек:
Если предыдущая догадка верна и внизу здесь IR, а над ним дешифрация, то можно предположить, что каждая секция дешифратора это отдельный машинный цикл?
Вот этот кусочек:
Если предыдущая догадка верна и внизу здесь IR, а над ним дешифрация, то можно предположить, что каждая секция дешифратора это отдельный машинный цикл?
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
В Z80 каждый выход декодера (здесь это горизонтальные линии металлизации) это какая-то инструкция или группа по маске, например, 00xxx101 - декремент регистра, или 00xx1001 - add HL,RR. Они дополнительно группируются, а потом уже около сотни многовходовых элементов, на которые заведены в том числе циклы и такты. Их выходы это уже и есть (почти) управляющие сигналы АЛУ, регистров и прочего. "Секции" в нём тоже есть, но это, видимо, просто питание так заведено на дешифратор.
---------- Post added at 17:07 ---------- Previous post was at 16:38 ----------
Согласен. Схема наглядней Verilog'а, но всё-таки в тексте таскать туда-сюда куски схемы мне показалось проще. Поэтому в конце я (или может кто-то другой) всё равно переведу в схему, но она не будет один в один как на кристалле, там есть много мест, в которых можно повысить наглядность и читаемость. Например, тот же счётчик циклов. У него очень закрученные условия инкремента/сброса, но в результате упростил до (условно) "(цикл1 И такт3 И выход_декодера) ИЛИ (цикл2 И такт4 И выход_декодера) ИЛИ ...". То есть изначально оно наверное так и было, но её "сжали" чтобы было меньше транзисторов.
---------- Post added at 17:14 ---------- Previous post was at 17:07 ----------
Z80 в основном построен на "прозрачных защёлках", описываю их так:
iverilog (симулятор такой) понимает правильно, Quartus вроде тоже.Код:always @(*) if (clk) begin ... end
Это потому, что латч требует всего 2 транзистора, а D триггер гораздо больше. Вот пример из дендечипа:
Когда левый транзистор закроется на одном из полупериодов /PCLK, заряд, оставшийся на затворе правого транзистора, поддержит его открытым. Естественно, эта схема не статична и требует минимальной тактовой частоты. У многих старых чипов и процессоров есть минимальная разрешенная частота.
Я больше боюсь зависимости работы схемы от скорости переключения элементов. Пока попалось только две "линии задержки" на соединённых последовательно инверторах, но они особой роли не играют.
Поясню на примере, что можно упростить в Z80 для повышения наглядности.
Есть провод, указывающий, какие биты опкода брать для получения номера регистра
куча инверсий упрощается до вполне понятной логики "A or B or C"Код:assign w185 = ~(~(w[40] | w[45]) & (w210 | ~w[47]));
Потом мультиплексор, но его выходы также инвертированыКод:assign w185 = w[40] | w[45] | (w[47] & ~T2);
Дальше бардакКод:assign w3[351] = w185 ? ~cmd[0] : ~cmd[3]; assign w3[357] = w185 ? ~cmd[1] : ~cmd[4]; assign w3[361] = w185 ? ~cmd[2] : ~cmd[5];
который с учётом инверсии выходов мультиплексора приводится кКод:assign w3[355] = ~(w3[357] | w3[361]); ... (w3[351] | w3[355]) ... // это обращение к каким регистрам? ... ~(w3[351] | w3[355]) ...или дажеКод:assign w3[355] = (cmdmux1 & cmdmux2); // =1 при обращении к регистру 6 или 7 (SP/[HL]/A) ... (~cmdmux0 | (cmdmux1 & cmdmux2)) ... // =1 - обращение к регистру 0 2 4 6 7 (B D H [HL] A) ... ~(~cmdmux0 | (cmdmux1 & cmdmux2)) ... // =1 - обращение к регистру 1 3 5 (C E L)причём w3[355] больше нигде не используется, его можно убрать.Код:(cmdmux[0]==0) | (cmdmux==7) // любой старший регистр или аккумулятор
Мне кажется в 580ВМ80 логику И-НЕ / ИЛИ-НЕ так же можно будет сильно упростить при переводе на HDL, а инкремент/декремент со всеми ускоренными переносами вообще привести к одной строчке
Или оставлять как есть?
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)