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

Выхода конечно перевёрнуты по отношению к традиционным, потому что первая линия создавалась на сложение, а вторая уже на перенос, снизу в верх, так и осталось. Уточнять распиновку обычных сумматоров я не стал, так как мне просто было достаточно знать их функцию и габариты, к распиновке приступил уже когда описывал всё на 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, хотя возможно будет достаточно изучить документацию на него подробно). Спасибо за внимание, успехов всем.
