
Сообщение от
Titus
Если перевести монстроидальную потранзисторную схему счетчика таймаута в логическую, то получится такое компактное и изящное (и, самое главное, сразу всем понятное) представление.
"Если перевести монстроидальную логическую схему счетчика таймаута в HDL-описание, то получится такое компактное и изящное (и, самое главное, сразу всем понятное) представление."
Код:
//______________________________________________________________________________
//
// 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
Но ты торопишься, а "какие Ваши доказательства" что схема эквивалентна? Там не приличный параллельный счетчик, а с последовательным переносом (ripple counter), поэтому у меня сначала было честное представление на латчах в асинхронной модели:
Код:
//______________________________________________________________________________
//
// 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
Промоделировано и только потом переведено в синхронную схему с сравнением выходных времянок. Нельзя "просто так взять и" перескочить этап, потому что "легко накосячить".