Titus(05.09.2020)
Titus(05.09.2020)
Если перевести монстроидальную потранзисторную схему счетчика таймаута в логическую, то получится такое компактное и изящное (и, самое главное, сразу всем понятное) представление.
Скрытый текст
[свернуть]
@Titus, моделирую ЦП. В начале работы при чтении адресов о160000 и о160002 вырабатывается сигнал WE. Если для формировании сигнала WE с триггера С43 беру прямой выход, то сигнал WE не формируется. Зашивка ХМ2-003 rev 27.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
"Если перевести монстроидальную логическую схему счетчика таймаута в 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, мне тоже хотелось сразу синхронный счетчик в начальной модели нарисовать и не возиться - "оно ж тут все сразу понятно". Но так нельзя - при этом сразу теряется куча деталей, ни из твоей схемы, ни из моего синхронного описания непонятно что счетчик последовательный, а вот в оригинальной заводской схеме (этот блок там нарисован на латчах) и асинхронной модели - это видно.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)