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