Счетчика на 64 я пока там не встретил.
Вид для печати
Если перевести монстроидальную потранзисторную схему счетчика таймаута в логическую, то получится такое компактное и изящное (и, самое главное, сразу всем понятное) представление.
Скрытый текст
@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, мне тоже хотелось сразу синхронный счетчик в начальной модели нарисовать и не возиться - "оно ж тут все сразу понятно". Но так нельзя - при этом сразу теряется куча деталей, ни из твоей схемы, ни из моего синхронного описания непонятно что счетчик последовательный, а вот в оригинальной заводской схеме (этот блок там нарисован на латчах) и асинхронной модели - это видно.
Поверь, я очень дотошный в вопросах точности логики) Если я говорю, что сперва нарисовал так, потом так, потом так, значит так оно и было)
Скрытый текст