«Железный» OnKeyUp и антидребезг в асинронном счётчике
Здравствуйте. Со времени той, не очень удачной публикации прошло много времени, за которое у меня многое изменилось, поэтому переработка материала немного подзадержалась. Скажу сразу, что это пока выполнено только в симуляторе Logisim Evolution, и проект полностью готов в Gowin 1.9.11, но пока я не знаю как отключать оптимизацию модулей, поэтому битстрима пока нет, но код выложу. Почему я решился на публикацию - потому что к "железному" OnKeyUp прибавился такой-же антидребезг. В симуляторе работает, но в битстрим пока не реализовано. Как только выяснится что у разработчика уровень демократичности (свобода действий пользователя и документация) достаточен - битстрим будет здесь с немного переработанной публикацией. А пока - только в симуляторе, для полного ознакомления с схемой он необходим, но можно и через код под спойлером в конце.
Наверное сразу выложу схему модуля, который обеспечивает «железный» OnKeyUp и антидребезг.
Тут всё просто: задача модуля подать короткий сигнал единицы как только будет отпущена нажатая кнопка-клавиша. Предполагается, что кнопка будет отпущена после того, как уже запишется в регистр единица. Сразу как только будет отпущена кнопка, элемент NOT выдаст сигнал единицы и сработает на подачу единицы элемент AND, а сменится уровень сигнала с единицы на ноль достаточно быстро, так как этот же сигнал сбросит значение регистра в ноль. Увеличить длительность периода можно примерно так, если надо
, в модуле GenTact , убрав некоторое число буферов создающих задержку сигнала.
По антидребезгу ещё проще - последовательная цепь управляемых буферов, предположительно, будет обрывать прохождение всех коротких сигналов, которые короче по времени чем время задержки срабатывания этой цепи, таким образом пройдёт только устойчивый сигнал единицы. Схема в работе симулятора в режиме моделирования выглядит так , если есть симулятор - кнопка для счёта слева на схеме
.
Количество регистров в схеме можно убавить, мной они не убраны потому, что ускоряют процесс запуска схемы - в каждый запишется ноль, а следовательно на каждый разряд сумматора быстрее прийдёт ноль. Но если это не критично - лишнее можно убрать.
файл можно скачать тут.
Код под спойлером, отладочая часть закомментирована.
Скрытый текст
module STrs
(input S, R,
output Q);
not n1(R1,R);
and a1(G,S,R1);
DLC D1(Q,G,G,R);
endmodule
module registrT
(input data_in, direct,reset2,
output outputw);
wire n=0;
bufif1 bf1(D1,data_in,direct);
buf b1(outputw, D1);
nor n1(interrupt,direct, reset2);
bufif1 bf2(outputw,outputw,interrupt);
buf b2(reset21, reset2);
bufif1 bf3(outputw,n,reset21);
endmodule
//module registrT
//(input data_in, direct,reset2,
// output outputw);
//wire n=0;
//buf b1(D1, direct);
//bufif1 bf1(outputw,data_in,D1);
//nor n1(interrupt,direct, reset2);
//bufif1 bf2(outputw,outputw,interrupt);
//buf b2(reset21, reset2);
//bufif1 bf3(outputw,n,reset21);
//endmodule
module FourLine_adder (input intransfer, term2, term1, output outtransfer, mresult);//My summator 2
not n1(NOTout2, intransfer);
xor x1(XORout1,term2,term1);
not n2(NOTout3, XORout1);
buf buf1(XORout11, XORout1);
bufif1 bf1(outtransfer, intransfer, XORout11);
bufif1 bf2(outtransfer, term2, NOTout3);
bufif1 bf3(mresult, XORout1, NOTout2);
buf buf2 (intransfer1, intransfer);
bufif1 bf4(mresult, NOTout3, intransfer1);
endmodule
module STarterR
(output reset1);
wire Mnull = 0;
STrs St1(rs,Mnull,onNot);
not n1(reset1,onNot);
buf(SF1,reset1);
buf(SF2,SF1);
buf(SF3,SF2);
buf(SF4,SF3);
buf(SF5,SF4);
buf(SF6,SF5);
buf(SF7,SF6);
buf(SF8,SF7);
buf(SF9,SF8);
buf(SF10,SF9);
buf(SF11,SF10);
buf(SF12,SF11);
buf(rs,SF12);
endmodule
module MGenTct
(input mbutton, mstarter,output gt);
or o1(oor1,mbutton,mstarter);
buf o2(oor2,oor1);
buf o3(oor3,oor2);
buf o4(oor4,oor3);
buf o5(oor5,oor4);
buf o6(oor6,oor5);
buf o7(gt,oor6);
endmodule
module mbuttom (input in, output out);
not nt1(outAnd2,in);
bufif1 b1(in1,in,in);
bufif1 b2(in2,in1,in);
bufif1 b3(in3,in2,in);
bufif1 b4(in4,in3,in);
bufif1 b5(in5,in4,in);
bufif1 b6(in6,in5,in);
STrs (in6,out,outAnd1);
and a1(out,outAnd1,outAnd2);
endmodule
module test (input wire button1, output led0, led1, led2, led3, led4, led5, myoscout);
genvar i;
wire outact;
wire Mnull = 0;
wire Munit = 1;
wire [5:0] resultM;
wire [5:0] transferM;
wire [5:0] RGresultM;
wire [5:0] RGtransferM;
STarterR strt(reset1);
not mbutton(mbutton2,button1);
mbuttom mb1(mbutton2,bout);
MGenTct mgt (bout, reset1,outact);
bufif1 bf1 (reset2,reset1,reset1);
not n1(directTact,reset1);
bufif1 bf2 (directTact1,outact,directTact);
registrT trR1(bout,bout,outact,OnCLC);
registrT trR(resultM[0],directTact1,reset2,RGresultM[0]);
STrs TestTRS(RGresultM[0],Mnull,TestTRSwire);
//STrs TestTRS1(RGresultM[0],Mnull,TestTRSwire);
FourLine_adder M0(Mnull, OnCLC, RGresultM[0], transferM[0], resultM[0]);
registrT trT(transferM[0],directTact,reset2,RGtransferM[0]);
generate
for (i=1; i<6; i=i+1 ) begin
FourLine_adder Mg(RGtransferM[i-1], Mnull, RGresultM[i], transferM[i], resultM[i]);
registrT trRg(resultM[i],directTact,reset2,RGresultM[i]);
registrT trT(transferM[i],directTact,reset2,RGtransferM[i]);
end
endgenerate
not (led0,RGresultM[0]);//(led0,TestTRSwire);
not (led1,RGresultM[1]);
not (led2,RGresultM[2]);
not (led3,RGresultM[3]);
not (led4,RGresultM[4]);
not (led5,RGresultM[5]);
//Gowin_OSC (oscout);
endmodule
В общем-то пока на этом всё - не стану отнимать своё и ваше время лишними текстами, остаётся надеется на демократичность разработчика по отношению к пользователям. В случае использования версии EDA мне не удалось отключить оптимизацию, возможно сейчас, мне или подскажут или я по новой перечитаю документацию (версия у меня теперь не та, что была раньше). Если удастся отключить оптимизацию, то наверное новой публикации делать не буду, а доработаю эту.
На этом пока всё, всем добра.