Двухлинейный сумматор. Объективного измерения быстродействия в сравненнии произвести не удалось, но тем не менее…

от автора

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

Скрытый текст

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

В первый вечер, когда выпало время и уже было готово описание на Verilog, мне удалось произвести тестбенчи, и они вполне были впечатляющие. Ссылка на пост

Скрытый текст

Тест бенч моего сумматора был такой

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

Скрытый текст

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

Код под спойлером

Скрытый текст
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 тактов осцилятора.

Далее надо вникать, потому что это уже решение проблемы с повтором результата, и если вы не нестроены вникать — лучше просто закрыть страницу, позднее я так или иначе проведу объективные тестбенчи.

Когда‑же повторить не получилось — решил адаптировать модуль активатора из этой публикации, первая анимация цепи из двух активаторов, но теперь они работали так, чтобы осуществить пропуск тактов замкнутой цепи.

Тут анимация с элементом НЕ, который в коде модуля с названием module TestSummators.

Анимация адаптированного варианта

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

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

Код:

Скрытый текст
module Trs (input S, R,   output Q); not n1(R1,R); and a1(G,S,R1); DLC dlc1 (Q,G,G,R); endmodule  module activate (input out, further, output out1, onActivate,OutFurther); wire wi0=0; wire wi1,onout2,onTrsReset,outTrsReset; bufif1 bf1(on,out,wi1); Trs Tout(on,mreset,onout1); bufif1 bf2(onFurth,onout1,further); Trs TFurth(onFurth,mreset,onWi1); xor xs1(onout2,onout1,onWi1); bufif1 bf3(out1,out,onout2); not n1(wi1, onWi1); bufif1 bf4(OutFurther,out,onWi1); Trs TrsReset(onout2,onTrsReset,outTrsReset); and An1(wA1,outTrsReset,onWi1); not n2(notfurther,further); bufif1 bf5(onActivate,wA1,notfurther); bufif1 bf6(onTrsReset,out,wA1);  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 TestSummators (output out,outTime); 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]; activate a1(w[100],w[0],oncount,,autfurt1); activate a2(autfurt1,w[0],,offcount,); Trs onc(oncount,offcount,outTime); Gowin_OSC GOwOsc(oscout); endmodule

Ну вот пока так. Как позволит время — обнаружу или ошибку, или то, что с платой что‑то не так. Думаю, что на это много вечеров не уйдёт, иногда на это зхватает минут. И далее — попробую создать триггер на базе части этого сумматора, в принципе возможно, но большой «головняк» с сигналом Z, надеюсь что решаемо.

И чтобы вы не думали что это совсем уже плохо — приведу вам изображение с схемой другого сумматора, который «красуется» в википедии, например,

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


ссылка на оригинал статьи https://habr.com/ru/articles/862214/