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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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

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

https://www.cyberforum.ru/blogs/223907/blog8718.html

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

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

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

Постил тут https://www.cyberforum.ru/blogs/223907/blog8723.html

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

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

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

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

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

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

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

Когда-же повторить не получилось - решил адаптировать модуль активатора из этой публикации https://habr.com/ru/articles/854562/ , первая анимация цепи из двух активаторов, но теперь они работали так, чтобы осуществить пропуск тактов замкнутой цепи.

Тут анимация с элементом НЕ, который в коде модуля с названием 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/


Интересные статьи

Интересные статьи

Представьте: горячий металл, мощные машины, сотни работников — наше производство постоянно подвержено различным рискам. И как мы превратили эти вызовы в возможности? Этот рассказ будет о том, как мы в...
В сфере электронной коммерции предприниматели стоят перед важным выбором: использовать готовые SaaS-решения или разворачивать собственную инфраструктуру. Это решение может значительно повлиять на бюдж...
Сегодня я расскажу о процессе, который я придумал для преобразования SVG-контура в векторный рисунок верёвки.Вы узнаете, как превратить показанный слева контур в верёвку справа:Эта задача возникла в п...
Дисклеймер: Нет, это не дайджест авторства Романа Пронского. К сожалению, у меня нет достоверной информации - будет ли выходить его дайджест далее.Однако я взял на себя смелость временно продолжи...
Часто при разговорах с клиентами мы спрашиваем, как они ведут учет различных данных и используют ли они CRM-систему? Популярный ответ — мы работаем с Excel-файлами, а пот...