А какой вопрос-то тогда? Если что-то отличается от графиков, которые я нарисовал, то спрашивай конкретнее.
Вид для печати
Пока только моделирую. Пишу тестовые программки и проверяю на диаграммах моделирования работу. А соединил почти все, кроме 065 и 055. Вместо буфера подсоединил сигналы напрямую.
Для @Vslav'а:
Поковырялся в ВМ2. Там огромная туча RS-триггеров, управляемых так, что у них может быть потенциально третье состояние (это сложно проверить сразу, т.к. сложно проследить сходу все зависимости управляющих сигналов).
Как ты их перевел в синхронную схему? Ты уверен, что не потерялась совместимость? Я бы тут весьма был аккуратен)
То, что работа по реверсу ВМ2 грандиозная - это я очень ценю) Одних трам... транзисторов там стотыщпятьсот)
Вот смотри, например, триггер, который управляет противофазной парой IRSTB_SRC, и /IRSTB_SRC, вполне себе может встать в третье состояние (тут, конечно, надо проверять по всем входным сигналам, но одно только RESET наводит на мысли, что он может прийти одновременно с F1 и BRA_REQ). Тогда мощный каскад, управляющий формированием IR_STB и /IR_STB встанет раком, извиняюсь за прямоту.
Если уж совсем не повезет, то будет оба низких на выходах, и состояние IR_STB и CLR_CEND просто нее изменится. Две единицы на выходе не бывает, иначе на T17408/17409 мы увидели бы сквозной ток. Но это ты взял совсем сложный кусочек, таких там немного. Это можно обработать только при помощи моделирования, глядя на диаграмму соотношение сигналов становится понятным.
http://www.1801bm1.com/files/images/...ync_ir_stb.png
И все сигналы привязаны к изменению фаз, то есть, грубо можно выделить четыре события в периоде - фронты и срезы F1 и F2, и все изменения привязать к ним, временем распространения можно пренебречь, понятно, что в реальном процессоре тактовая частота такая, что все успевает. Главная сложность тут в том, что сигнал может распространяться через латч и нужно отловить все латчи на одной фазе в цепочке и откорректировать распространение для флип-флопов, иначе сигнал запоздает на такт(ы). Такие косяки часто вылавливались по общему фейлу теста или по изменению числа тактов на весь тест. Все тесты T40x на асинхронной модели и синхронной выполняются одинаковое количество тактов. Ну и когда применили модель в реальной системе и попытались запустить 055-ую прошивку повылазила пара проблем, связанных с пультовым режимом, который T40x не проверяет основательно. Поэтому буду делать еще проект ДВК и буду гонять ПЗУ и грузить RT-11 для более полного покрытия. И то это не гарантия, а просто верификация.
А хотелось бы узнать, что это за проблемы?
Ну и пользуясь случаем, хотел бы узнать, что делает в 1801ВМ2 в HALT-режиме команда с кодом 030. По описанию, она должна исполняться также, как и команда с кодом 020, т.е. читать безадресный регистр. Но в 1801ВМ2 судя по всему допустили ошибку в микрокоде. В 1806ВМ2 эту ошибку убрали, и 030 исполняется также, как и 020.
Внезапно там ничего не бывает, даже входной DCLO "внезапно" синхронизирован с тактовой частотой.
Конденсатор, вторая обкладка - изолированный затвор.
Ускоряющий конденсатор, обычно для генерации вольт-добавки - помогает импульсно увеличить напряжение на затворе следующего транзистора для ускорения переключения. Емкость-то затвора мощного транзистора большая, пока там через обычный depletion load натечет.
CLR_CEND не изменится, т.к. там стоит обычный RS-триггер.
А вот с IR_STB гораздо интереснее. Это не RS-триггер.
Если IRSTB_SRC и /IRSTB_SRC в нуле, то выходные каскады некоторое время удержат информацию на затворах 17426, 17442, 17473 (для верхнего плеча), пока не разрядятся, а потом на IR_STB появится единица, и на /IR_STB тоже будет единица.
Другой вопрос, что конечно, за несколько тактов они не разрядятся, но все равно как-то не айс)
Не могу совлалать с записью в раритетные регистры. Выход H61.2 имеет пички и диаграмма RARE REG AUTOMAT не соответствует рисунку.
Для лучшего видения пичка сделал задержку на триггерах в 5 нс для моделирования.
https://pic.maxiol.com/thumbs2/15991...iterarereg.png
- - - Добавлено - - -
Диаграмма совпала с рисунком, если вход 1 у элемента Н65.1 сделать инверсным, ну и задержать RPLY на PPU.
- - - Добавлено - - -
https://pic.maxiol.com/thumbs2/15991...terarereg2.png
Хм... на первый взгляд оптимизированная схема не отличается от оригинального реверса. Придется сравнивать с фоткой кристалла, но это не раньше следующей недели я смогу только сделать, так как на даче, огород и все такое. Так что пока оставь так, как есть, тем более, что раритетные регистры не используются вообще. Для совместимости они должны быть, но пока можно и без них все остальное тестировать.
Еще обнаружил несовпадение диаграммы WRITE PLANE ADDRESS. Сигнал LATCH_DATA в 136й у меня совпадает с сигналом CAS как по положению, так и по длительности. Хотя тесты записи/чтения в/из планы/ов проходят.
https://pic.maxiol.com/thumbs2/15992...aneaddress.png
@Vslav, обратил внимание, что схема ветвлений тоже не должна работать в статике. Правда, подробно еще не разбирался, но похоже, PLM ветвлений чисто динамическая.
Рассматривал счетчик таймаута в ВМ2, получилось, что TOUT срабатывает на 53-м тике /F1, а TINIT на 511-тике. Интересно, так ли это в реальности.
У меня в описании 1801ВМ2 тоже было указано, что RPLY ждёт 54 такта. Информация бралась здесь, раздел [Отличия от 1806ВМ2]. Так как этот счётчик используется и для ожидания RPLY, и для формирования INIT, то в ТО на 1801ВМ2 сказано, что активная фаза сигнала INIT равна 105 периодам CLCI, делим на два, где-то 53 и есть. Но в том же ТО сказано, что RPLY процессор ждёт 64 такта. Ну а 511, так и должно быть, счётчик 9-разрядный.
Если перевести монстроидальную потранзисторную схему счетчика таймаута в логическую, то получится такое компактное и изящное (и, самое главное, сразу всем понятное) представление.
Скрытый текст
@Titus, моделирую ЦП. В начале работы при чтении адресов о160000 и о160002 вырабатывается сигнал WE. Если для формировании сигнала WE с триггера С43 беру прямой выход, то сигнал WE не формируется. Зашивка ХМ2-003 rev 27.
"Если перевести монстроидальную логическую схему счетчика таймаута в HDL-описание, то получится такое компактное и изящное (и, самое главное, сразу всем понятное) представление."
Но ты торопишься, а "какие Ваши доказательства" что схема эквивалентна? Там не приличный параллельный счетчик, а с последовательным переносом (ripple counter), поэтому у меня сначала было честное представление на латчах в асинхронной модели:Код://______________________________________________________________________________
//
// Q-bus timer, also involved in INIT command pulse timing
//
assign tout = qtim[0] & qtim[2] & qtim[4] & qtim[5];
always @(posedge vm_clk_n)
begin
if (!tena)
qtim <= 9'o000;
else
qtim <= qtim + 9'o001;
end
Промоделировано и только потом переведено в синхронную схему с сравнением выходных времянок. Нельзя "просто так взять и" перескочить этап, потому что "легко накосячить".Код://______________________________________________________________________________
//
// Q-bus timer, also involved in INIT command pulse timing
//
assign qct_ck[0] = tena & ~f1;
assign qct_ck[1] = tena & qct_ta[0];
assign qct_ck[2] = qct_ck[1] & qct_tb[1];
assign qct_ck[3] = qct_ck[2] & qct_tb[2];
assign qct_ck[4] = qct_ck[3] & qct_tb[3];
assign qct_ck[5] = qct_ck[4] & qct_tb[4];
assign qct_ck[6] = qct_ck[5] & qct_tb[5];
assign qct_ck[7] = qct_ck[6] & qct_tb[6];
assign qct_ck[8] = qct_ck[7] & qct_tb[7];
assign tout = qct_ta[0] & qct_tb[2] & qct_tb[4] & qct_tb[5];
assign tinit = qct_tb[8] & qct_ck[8];
always @(*)
begin
if (!tena)
begin
qct_ta <= 9'o000;
qct_tb <= 9'o000;
end
else
begin
if (qct_ck[0]) qct_ta[0] <= ~qct_tb[0];
if (qct_ck[1]) qct_ta[1] <= ~qct_tb[1];
if (qct_ck[2]) qct_ta[2] <= ~qct_tb[2];
if (qct_ck[3]) qct_ta[3] <= ~qct_tb[3];
if (qct_ck[4]) qct_ta[4] <= ~qct_tb[4];
if (qct_ck[5]) qct_ta[5] <= ~qct_tb[5];
if (qct_ck[6]) qct_ta[6] <= ~qct_tb[6];
if (qct_ck[7]) qct_ta[7] <= ~qct_tb[7];
if (qct_ck[8]) qct_ta[8] <= ~qct_tb[8];
if (~qct_ck[0]) qct_tb[0] <= qct_ta[0];
if (~qct_ck[1]) qct_tb[1] <= qct_ta[1];
if (~qct_ck[2]) qct_tb[2] <= qct_ta[2];
if (~qct_ck[3]) qct_tb[3] <= qct_ta[3];
if (~qct_ck[4]) qct_tb[4] <= qct_ta[4];
if (~qct_ck[5]) qct_tb[5] <= qct_ta[5];
if (~qct_ck[6]) qct_tb[6] <= qct_ta[6];
if (~qct_ck[7]) qct_tb[7] <= qct_ta[7];
if (~qct_ck[8]) qct_tb[8] <= qct_ta[8];
end
end
Нет, не тороплюсь. Я сначала перевел в честные RS-триггеры, потом в D-триггеры, потом в счетчик.
- - - Добавлено - - -
Не совсем понял, что ты берешь. Но если смотреть rev 27, то, похоже, надо исправить вход C40-1 должен быть инверсный. Т.е. инверсный выход триггера C43 идет на инверсный вход C40.
Но из твоей схемы этого не видно. Будешь рисовать и предоставлять несколько схем для каждого этапа? :)
Ладно, это неважно, просто надо быть очень осторожным с wishful thinking, мне тоже хотелось сразу синхронный счетчик в начальной модели нарисовать и не возиться - "оно ж тут все сразу понятно". Но так нельзя - при этом сразу теряется куча деталей, ни из твоей схемы, ни из моего синхронного описания непонятно что счетчик последовательный, а вот в оригинальной заводской схеме (этот блок там нарисован на латчах) и асинхронной модели - это видно.
Поверь, я очень дотошный в вопросах точности логики) Если я говорю, что сперва нарисовал так, потом так, потом так, значит так оно и было)
Скрытый текст