
В этот раз результатом стал двухлинейный сумматор. Намучался с ним достаточно - не одну неделю разрабатывал, в процессе какие только монстры не получались, но итогом вполне удовлетворён. Внушает надежды, что на его базе можно создать асинхронный триггер, который вообще будет в корне отличаться от предшественников. Объективных тестбенчей в сравнениях произвести не удалось по непонятным причинам — сначала они получились, но вечером следующего дня картина тестбенчей в корне изменилась, попробовал обойти трудности надстройкой над тестовой схемой — но увы, сигнал почему‑то не отслеживается. Буду искать ошибки пару вечеров, а пока просто расскажу о том как собственно всё обстоит. Приступил сразу после предшествующих публикаций, разумеется всё в свободное время, пару недель вечеров было потрачено на попытки сократить цепь звеньев, потому как было ясно, что последовательная цепь лучше чем имеется на настоящий момент не получится. И вот однажды начиркал на клочке бумаги основу, а потом доработал в симуляторе. Получилось это, постил тут
Скрытый текст

Выхода конечно перевёрнуты по отношению к традиционным, потому что первая линия создавалась на сложение, а вторая уже на перенос, снизу в верх, так и осталось. Уточнять распиновку обычных сумматоров я не стал, так как мне просто было достаточно знать их функцию и габариты, к распиновке приступил уже когда описывал всё на Verilog в структурном стиле описания (люди бывает думают что компилятор откомпилирует не так, но всё так — если стиль описания схемы структурный, провод в провод).
В первый вечер, когда выпало время и уже было готово описание на Verilog, мне удалось произвести тестбенчи, и они вполне были впечатляющие. Ссылка на пост
Скрытый текст
Тест бенч моего сумматора был такой (плата Tang Nano 9K).

Сравнивал с другим сумматором, вот этим
Скрытый текст

Тестбенч его выглядел так

Код под спойлером
Скрытый текст
module Trs
(input S, R,
output Q);
not n1(R1,R);
and a1(G,S,R1);
DLC dlc1 (Q,G,G,R);
endmodule
module summator (input intransfer, term2, term1, output outtransfer, mresult);//My summator
wire wi1;
xor x1(XORout,intransfer,term2);
not n1(NOTout, XORout);
bufif1 bf1(outtransfer, term2, NOTout);
bufif1 bf2(outtransfer, term1, XORout);
xor x2(XORout1,term2,term1);
not n2(NOTout2, intransfer);
bufif1 bf3(mresult, XORout1, NOTout2);
not n3(NOTout3, XORout1);
bufif1 bf4(mresult, NOTout3, intransfer);
endmodule
//module summator (input intransfer, term2, term1, output outtransfer, mresult);//locomotive
//and a1(outA1,intransfer,term2 );
//not n1(not1,outA1);
//and a2(outA2,intransfer,not1);
//and a3(outA3,intransfer,term2);
//or o1(outO1,outA2,outA3);
//and a4(outA4,outO1,term1);
//not n2(not2,outA4);
//and a5(outA5,outO1,not2);
//and a6(outA6,not2,term1);
//or o2(mresult,outA5,outA6);
//and a7(outA7,not2,not1);
//not n3(outtransfer,outA7);
//endmodule
//module summator (input intransfer, term2, term1, output outtransfer, mresult);//fashionable
//xor x1(outX1,intransfer, term2);
//xor x2(mresult,outX1, term1);
//and a1(outA1,outX1,term1);
//and a2(outA2,intransfer,term2);
//or o1(outtransfer,outA1,outA2);
//endmodule
module summatorChane (input in, output out);
Trs (,,nil0);
summator s1(nil0,nil0,in,,out1);
summator s2(nil0,out1,nil0,,out2);
summator s3(out2,nil0,nil0,,out3);
summator s4(nil0,out3,out3,out4,);
summator s5(out4,out4,out4,,out5);
summator s6(out5,out5,nil0,out6,);
summator s7(out6,nil0,out6,out,);
endmodule
module TestSummators (input sys_clk,output out);
wire mIn;
genvar i;
wire [100:0] w;
generate
for (i=0; i<100; i=i+1 ) begin:pprobe1_generation
summatorChane sC1(w[i],w[i+1]);
end
endgenerate
not (w[0],w[100]);
assign out = w[100];
Gowin_OSC GOwOsc(oscout);
endmodule
Тут цепь из сумматоров

Глушил сигнал Z выходом с триггера. Таких модулей было 100 штук, подключенных последовательно и закольцованных через элемент НЕ, то — есть цикл повторялся бесконечно, но отслеживался только захват от первых 126 тактов осцилятора.
Далее предпринятое по факту невозможности повторить тестбенч, но это уже решение проблемы с повтором результата, то, что было сделано и что получилось в результате.
Асинхронный делитель частоты смены уровня сигнала
По будущим тестбенчам - у меня всё это слишком быстро работает, чтобы захватывать даже на частоте встроенного осцилятора 2.7 ГГц (хотя не факт, ведь первый тестбенч вполне работал, но теперь увы), поэтому, после того как повторить тестбенч не получилось (а скорость работы асинхронных схем чувствительна даже к комнатной температуре, как показала мне ранее моя практика, поэтому я даже не могу предположить почему в точности не получается произведённого ранее), то я решил объединить такты смены уровня сигнала генерируемые схемой с сумматорами. Для этого сделал такой вариант (потому что ничего в поисковике не нашёл, хотя раньше вроде и попадалось), и завтра эта публикация будет содержать ещё тестбенчи, но уже с объеденёнными тактами получаемыми от цепи сумматоров.

Согласно данной симуляции синтез звена делителя получается таким

Код звена делителя в структурном стиле описания
module Trs
(input S, R,
output Q);
not n1(R1,R);
and a1(G,S,R1);
DLC dlc1 (Q,G,G,R);
endmodule
module Devided (input OnUnit, OnZero, OnFurther, OnReset, output OutFurth);
and a1 (outa1, OnUnit, OnFurther);
Trs tr1 (outa1, OnReset,OutTrs1);
and a2 (outa2, OnZero, OutTrs1);
Trs tr2 (outa2, OnReset,OutFurth);
endmodule
В "гонке на выживание" на плате tangnano 9k "выжил" только один сумматор
, тот самый который некоторые старательно критикуют. Я не знаю, они конечно наверное специалисты, но вот только то, что они называют лучшим (как минимум в критике моего) - перестаёт работать первым.
Самым первым перестал работать сумматор из википедии - то есть я его расскомментировал в коде для тестов, свой комментировал, и всё - Gowin Analyzer Oscilloscope просто зависал, в смысле, что на него не поступал сигнал. Это было ещё при первых тестах, результат которых в выложен в начале публикации. Второй работал, но согласно тестбенчам - медленнее. Потом на следующий день, прийдя с работы я обнаружил что поведение платы стало иным, и уже не смог повторить той чистоты тестбенчей, и тогда приготовил код.
Весь код под спойлером
Скрытый текст
module Trs
(input S, R,
output Q);
not n1(R1,R);
and a1(G,S,R1);
DLC dlc1 (Q,G,G,R);
endmodule
module summator (input intransfer, term2, term1, output outtransfer, mresult);//My summator
wire wi1;
xor x1(XORout,intransfer,term2);
not n1(NOTout, XORout);
bufif1 bf1(outtransfer, term2, NOTout);
bufif1 bf2(outtransfer, term1, XORout);
xor x2(XORout1,term2,term1);
not n2(NOTout2, intransfer);
bufif1 bf3(mresult, XORout1, NOTout2);
not n3(NOTout3, XORout1);
bufif1 bf4(mresult, NOTout3, intransfer);
endmodule
//module summator (input intransfer, term2, term1, output outtransfer, mresult);//locomotive
//and a1(outA1,intransfer,term2 );
//not n1(not1,outA1);
//and a2(outA2,intransfer,not1);
//and a3(outA3,not1,term2);
//or o1(outO1,outA2,outA3);
//and a4(outA4,outO1,term1);
//not n2(not2,outA4);
//and a5(outA5,outO1,not2);
//and a6(outA6,not2,term1);
//or o2(mresult,outA5,outA6);
//and a7(outA7,not2,not1);
//not n3(outtransfer,outA7);
//endmodule
//module summator (input intransfer, term2, term1, output outtransfer, mresult);//fashionable
//xor x1(outX1,intransfer, term2);
//xor x2(mresult,outX1, term1);
//and a1(outA1,outX1,term1);
//and a2(outA2,intransfer,term2);
//or o1(outtransfer,outA1,outA2);
//endmodule
module summatorChane (input in, output out);
Trs (,,nil0);
summator s1(nil0,nil0,in,,out1);
summator s2(nil0,out1,nil0,,out2);
summator s3(out2,nil0,nil0,,out3);
summator s4(nil0,out3,out3,out4,);
summator s5(out4,out4,out4,,out5);
summator s6(out5,out5,nil0,out6,);
summator s7(out6,nil0,out6,out,);
endmodule
module Divided (input OnUnit, OnZero, OnFurther, OnReset, output OutFurth);
and a1 (outa1, OnUnit, OnFurther);
Trs tr1 (outa1, OnReset,OutTrs1);
and a2 (outa2, OnZero, OutTrs1);
Trs tr2 (outa2, OnReset,OutFurth);
endmodule
module TestSummators (output out,outTime, outOsc);
genvar d;
wire [5:0] dw;
genvar i;
wire [200:0] w;
generate
for (i=0; i<200; i=i+1 ) begin:pprobe1_generation
summatorChane sC1(w[i],w[i+1]);
end
endgenerate
not n1(w[0],w[200]);
not n2(ndiv,w[0]);
Divided d1(w[0], ndiv, w[0], dw[5],dw[0]);
generate
for (d=0; d<4; d=d+1 ) begin
Divided (w[0], ndiv, dw[d], dw[5],dw[d+1]);
end
endgenerate
Divided d2(w[0], ndiv, dw[4], dw[5],dw[5]);
assign out = w[200];
assign outTime = dw[5];
Trs oscT(w[0], dw[2],outOsc);
Gowin_OSC (oscout);
endmodule
Сигналом захвата был сигнал oscout, а отслеживался outOsc .
В общем в этот раз мой сумматор оттестился с следующей диаграммой, при параметре defparam osc_inst.FREQ_DIV=128;

, вот тот, что со слов других лучше моего (из-за наличия у моего элемента НЕ), по примеру первого сошёл с дистанции, я просто закомментировал свой, раскомментировал его, пересобрал проект с сохранением файла GAO (там просто нужно нажимать не забывать все кнопочки, среда разработки минималистична и многое приходится делать вручную), залил битстрим, нажал кнопку воспроизвдения захвата сигнала - и всё

.как и с паравозоподобным сумматором в самом начале тестбенчей (здесь он в самом конце публикации). Поймите меня правильно - мне хотелось завершить тестбенчи, чтобы узнать какой-же именно лучше, не со слов других участников, а на практике. Ну вот я знаю теперь, что в "гонке на выживание", раз уж что-то с платой стало не так (она работает, работаю другие проекты, но вот повторить первый тестбенч сумматоров - никак не удавалось), "выжил" единственный, тот самый про который публикация. Всё это я повторил несколько раз, чтобы убедиться что никакого случая тут нет - так и есть, к финишу в усложнённых тестах приходит единственный

(вообще он и раньше приходил к "финишу" единственным, но было-бы не правильным отталкиваться от банальной перегрузки платы , поэтому нужен был делитель асинхронных тактов смены уровня сигнала, но, как только я сделал тест с ним - второй другой сумматор тоже сошёл с "дистанции"). Может мой и не самый лучший, как утверждают на словах другие, но проявил себя при тестах как самый надёжный. Код попыток повторить самый первый тест я убираю, потому как в начале присутствует оригинал самого первого кода.
Вместо неудавшейся попытки протестировать проблематичные сумматоры, разверну пошире тему своего сумматора, заодно поясню что пользуюсь не аниматором, а именно симулятором. Напрмиер в моём сумматоре нет MUX, потому что MUX достаточно весомый по затраченным ресурсам примитив. Проверить на сложность схему можно и в симуляторе, тем, как скоро она начнёт давать ошибки. Вот например при создании своего триггера мной было понято зачем компилятор так усложняет схему элементом НЕ и И, если она и так работает (сохраняет значение, как триггер, при нужном расключении проводов), но компилятор делал правильно, как я понял позднее, и потом использовал этот же способ и сам тут https://habr.com/ru/articles/854562/, так как без него при состоянии входящего сигнала Z триггер на базе защёлки сбрасывал значение. Потому и были добавлены компилятором лишние элементы, которые на самом деле никак на логику не влияли, а просто не противоречили ей. Так и тут, я специально взял MUX, чтобы немного пояснить свою позицию вот этому участнику https://habr.com/ru/articles/862214/#comment_27618754 и сделал симуляцию, заанимировав её в отдельной программе аниматоре Peek

Как видно из анимированной симуляции, у сумматора достаточно убрать любой сигнал - и будет на выходе не просто отсутствие сигнала, а ошибка, в то время как на базе MUX совсем не сложно создать триггер, с гораздо меньшими хлопотами, но как свидетельствет данная публикация - более надёжные (не дают сбоев на плату), и вроде как даже более быстрые (по тестбенчам), схемы, получаются если над ними основательно поработать, а не брать и лепить готовое. Поэтому и есть желание создать на базе сумматора триггер, не смотря на то, что один свой рабочий у меня уже есть, но скажу сразу - брался уже не раз, и пока что безрезультатно, но с сумматором тоже было всё сложно, и голову поломать пришлось изрядно.
А вот выдавать за действительность то, чего в действительности нет, как тут
https://habr.com/ru/articles/862214/#comment_27625854
1) В ответах нельзя прикреплять картинки.
мне кажется уже против правил использования сервиса и участия на портале, уровень доверия к этому участнику стремится к нулю, так как и я, и другие участники, например как тут https://habr.com/ru/articles/857444/#comment_27572372, могут прикреплять изображения в ответы. Мне совсем не лень самому делать схемы, просто я не считаю себя обязанным делать это за других, тем более с учётом того, что они откровенно лгут и времени у меня свободного от основной работы - всего пару часов после работы остается и бытовых повседневных дел, из них я считаю имею право хотя-бы на часовой отдых. То-есть заявляемое этим участником уже не работает, как минимум ограничения о которых он говорит, что касается лени - то он ещё даже функционал этого портала, за который уже отвечает, не изучал никак. В любом случае - должна быть схема, слова не работают, они компилируются, а вот структура - переносится.
Кстати о буферах третьего состояния, под спойлером
Скрытый текст
Что такое маленькие треугольнички?Буферы с выходом в третье состояние? Нет.Их нельзя соединять по выходу. Это ключи.
мной изначально давно как раз предполагалось, что маленькие треугольники и примитив bufif1 - обычный электроннный ключ, потому что на FPGA работает как электронный ключ. Может это и не так, но точно и проверено - подключать можно хоть сколько на один выход как тут
https://habr.com/ru/articles/854562/
в схеме после слов
SetChain сигнал повтороный активации, после чего цикл повторяется
. Что касается последовательного подключения, то тоже можно, но уже после создания заглушки возможных ошибок, по аналогии , что в публикации тут https://habr.com/ru/articles/805883/ и уже переделанные, как в анимации тут https://www.cyberforum.ru/blogs/223907/blog8679.html
А от старого материала, оставлю только, в качестве памяти (всё-таки его образ вдохновил меня на создание своего сумматора), тот, который сошёл с "дистанции" самый первый, для памяти и чтобы вы не думали что у меня совсем уже плохо (просто многие стараются именно так описать мой сумматор - всё совсем плохо) — приведу вам изображение с схемой другого сумматора, который «красуется» в википедии, например,

Как видите, не всё так уж и плохо у меня. Скорость удалось только раз измерить, второй раз уже не получалось, но тем не менее линии цепей у меня получились намного короче, к этому я прилагал не малые усилия. Надеюсь, что следующая публикация уже будет и с новым триггером, на базе части двухлинейного сумматора, и с вполне нормальными тестбенчами (видимо прийдётся приобрести ещё одну плату - эта работает, но вот странности имеются при работе с Gowin Analyzer Oscilloscope, хотя возможно будет достаточно изучить документацию на него подробно). Спасибо за внимание, успехов всем.