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

Начну с отступления - почему...

Сначала приведу сведения из литературы про электронные ключевые элементы.

Электронный ключевой элемент - это электронное устройство, предназначенное для замыкания или размыкания электрической цепи при воздействии на него управляющего сигнала

Шустов М.А "Цифровая схемотехника основы построения".

Основу любого электронного ключа составляет активный элемент (обычно транзистор), работающий в ключевом режиме. Ключевой режим характеризуется двумя состояниями ключа: "Включено"; "Выключено".

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

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

Простейшие логические элементы

Инверторы

Самый простой логический элемент — это инвертор (логический элемент НЕ, "inverter"), уже упоминавшийся в первой лекции. Инвертор выполняет простейшую логическую функцию — инвертирование, то есть изменение уровня входного сигнала на противоположный. Он имеет всего один вход и один выход. Выход инвертора может быть типа 2С или типа ОК. Ниже представлены условные обозначения инвертора принятые у нас и за рубежом и таблица истинности.


Условные обозначения инверторов: зарубежные (слева) и отечественные (справа)


Таблица истинности инвертора

Повторители и буферы

Повторители и буферы отличаются от инверторов прежде всего тем, что они не инвертируют сигнал (правда, существуют и инвертирующие буферы). Они выполняют функцию увеличения нагрузочной способности сигнала, то есть позволяют подавать один сигнал на много входов. Для этого имеются буферы с повышенным выходным током и выходом 2С, например, ЛП16 (шесть буферных повторителей). Большинство буферов имеют выход ОК или 3С, что позволяет использовать их для получения двунаправленных линий или для мультиплексирования сигналов.


Применение буфера с 3С в качестве буфера с ОК


Таблица истинности буфера без инверсии

Элементы И, И-НЕ, ИЛИ, ИЛИ-НЕ

Следующий шаг на пути усложнения компонентов цифровой электроники — это элементы, выполняющие простейшие логические функции. 

.

Именно такие сведения, и просто некоторый опыт и знания, мотивировали меня к поиску нового решения для задачи сумматора, которая мне просто показалась интересной.

Улучшенный двулинейный сумматор

с небольшим пояснением его работы:

Примитив (буфер, который в идеале мог-бы быть и обыкновенным электронным ключевым элементом) lineT1 пропустит сигнал логической единицы на провод outTransfer (выход переноса), если на выходе элемента XOR сигнал логической единицы (то-есть на одном их его входов есть сигнал единицы), в остальных случаях, разумеется, им никакие сигналы не пропускаются. Примитив lineT2 пропустит на тот-же выход (линию переноса) сигнал единицы, если на выходе XOR сигнал нуля и на один из его двух входов поступает сигнал единицы. Примитив lineR1 пропустит на выход result сигнал единицы выходящий с XOR, если на входе intransfer нет сигнала единицы. Примитив lineR2 пропустит на выход result сигнал единицы, если на выходе XOR сигнал нуля, что не противоречит условию как наличия сигналов единиц на входах того, так и наличия на них сигналов нуля. Кроме того, забыл так как заканчивал публикацию ночью, все буферные элементы, управление котороых от выхода с NOT - исключают сигналы Z на выходах- это была та ещё задача, которая собственно и привела к этому решению, исключить сигнал Z и встроить это в непротиворечащие функционированию условия было не просто. Все полученные условия работы соответствуют решению задачи полного сумматора, анимация симуляции которого приложена ниже

.

Итак, почему же сумматор, условно, врос в плату

Дело в том, что мной был немного улучшен счётчик, который отсчитывал генерируемые испытательной системой такты, и делал из нескольких тактов один. Улучшение заключалось в том, что на триггер подавалась установка и сброс с одного провода, но сигнал установки подавался после элемента НЕ, вот так

Просто в схеме звеньев десять.

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

Тест бенч единственного "выжившего"

module summator (input intransfer, term2, term1, output  outtransfer, mresult);//My summator 2
not n2(NOTout2, intransfer);
xor x2(XORout1,term2,term1);
not n3(NOTout3, XORout1);
bufif1 bf1(outtransfer, intransfer, XORout1);
bufif1 bf2(outtransfer, term2, NOTout3);
bufif1 bf3(mresult, XORout1, NOTout2);
bufif1 bf4(mresult, NOTout3, intransfer);
endmodule

на испытательном "стенде"

При установке у осциллятора делителя тактов на 110 из допускаемых от 2 до 128.

То-есть полный цикл необъединённого такта происходит после срабатывания 2800 сумматоров, и соответственно 10 таких тактов соответствуют на диаграмме одному, то-есть это поочерёдное срабатывание 28000 полных сумматоров за один объединённый такт (если я не ошибаюсь с правильностью расчёта). И если ошибки нет, то за весь тест бенч 28000 сумматоров сработают последовательно 63 раза, что соответствует 1764000 срабатываний одного полного сумматора, если я случайно не преувеличил вдвое.

Код всего проекта под спойлером

Скрытый текст
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 2
not n2(NOTout2, intransfer);
xor x2(XORout1,term2,term1);
not n3(NOTout3, XORout1);
bufif1 bf1(outtransfer, intransfer, XORout1);
bufif1 bf2(outtransfer, term2, NOTout3);
bufif1 bf3(mresult, XORout1, NOTout2);
bufif1 bf4(mresult, NOTout3, intransfer);
endmodule

//module andM (input wan, two, free, output  out);
//and and1(Oand1, wan, two);
//and and2(out,  free, Oand1);
//endmodule

//module summator (input intransfer, term2, term1, output  outtransfer, mresult);
//not not1(n1, term1);
//not not2(n2, term2);
//not not3(n3, intransfer);
//andM andM0(intransfer, term2, term1, w0);
//andM andM1(intransfer, term2, n1, w1);
//andM andM2(intransfer, n2, term1, w2);
//andM andM3(intransfer, n2, n1, w3);
//andM andM4(n3, term2, term1, w4);
//andM andM5(term2, n3, n1, w5);
//andM andM6(term1, n3, n2, w6);
//andM andM7(n1, n2, n3, w7);
//bufif1 bf1(outtransfer, w0, w0);
//bufif1 bf2(mresult, w0, w0);
//bufif1 bf3(outtransfer, w1, w1);
//bufif1 bf4(mresult, w0, w1);
//bufif1 bf5(outtransfer, w2, w2);
//bufif1 bf6(mresult, w1, w2);
//bufif1 bf7(outtransfer, w2, w3);
//bufif1 bf8(mresult, w3, w3);
//bufif1 bf9(outtransfer, w4, w4);
//bufif1 bf10(mresult, w3, w4);
//bufif1 bf11(outtransfer, w4, w5);
//bufif1 bf12(mresult, w5, w5);
//bufif1 bf13(outtransfer, w5, w6);
//bufif1 bf14(mresult, w5, w6);
//bufif1 bf15(outtransfer, w6, w7);
//bufif1 bf16(mresult, w6, w7);
//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 [9: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[9],dw[0]);
generate
for (d=0; d<8; d=d+1 ) begin
Divided (w[0], ndiv, dw[d], dw[9],dw[d+1]);
end
endgenerate
Divided d2(w[0], ndiv, dw[8], dw[9],dw[9]);
assign out = w[200];
assign outTime = dw[9];
not (oncount,dw[4]);
Trs oscT(oncount, dw[4],outOsc);
Gowin_OSC (oscout);
endmodule

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

Изменил изображение превью и в публикации, людям не нравятся сгенерированные изображения плат, ну значит надо изменить.

И оставил теоретикам пишущим в комментариях- под спойлером

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

именно мои решения почему-то работают на плате, а не традиционные, которые при увеличении нагрузки на плату - дают сбои. Так что за низким техническим уровнем вы точно не по адресу пожаловали. Вот тут https://habr.com/ru/articles/866816/#comment_27678542

Просто то, что вы пытаетесь сделать врядли может быть сделано вообще. И оно фактически работает совсем не так как вы думаете. Вы думаете, что что-то там оптимизируете используя логические элементы типа not, xor,bufif1, а фактически компилятор всё равно всё это упаковывает в LUTы как сможет.

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

Что касается меня - это не хобби, это не хобби, это противостояние решениям тех людей, которые пытаются выдать их за идеалы для всего общества, и противостояние той части общества, которые как и согласны с данной политикой так и просто извлекающей выгоды из нарушений чужих прав. С той разницею, что я не перехожу на личности и их описание, а делаю всё через результаты своих работ и сравнение их эффективности с другими. Вы ведь своими оценками тоже противостоите успеху автора и его праву? Противостоите, только при этом нарушая как правила, так и права. Думаю, что ваш уровень образования и технический , прекрасно даёт вам понимать как и что такое авторское право и оценивать причины и последствия ваших действий, ведь даже не трудившись толком прочитать что именно мое все как раз и работает на плате и не сбоит - вы как то быстро причислили себя к более успешной части общества, чем автор. Думаю, что вы абсолютно понимаете свои действия, как и я, и понимаете то, что пишите, под спойлером ещё раз сообщение ваше для вас, и тех кто поставил ему плюс, я ничего абсолютно не приписал от себя - весь текст ваш и ваших коллег, кстати как-то небрежно ещё в прошлой публикации пытавшихся вводить меня в заблуждение тут https://habr.com/ru/articles/862214/#comment_27630546

Далее

а фактически компилятор всё равно всё это упаковывает в LUTы как сможет.

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

. Продолжайте сколько угодно, я занимаюсь своим делом, просто теперь оно уже стало и противостоянием (и это абсолютно не по моей воле). Я так понимаю, что вам просто нечем заняться, кроме как показать какие все глупые а вы умные.

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

Далее

У меня следующее предложение.

1) Вы в своем проекте выключаете Gowin Analizer Oscilloscope если он у Вас включен.

2) Компилируете проект

3) Смотрите Resource Usage Report на вкладке Process -> Synthesize -> Synthesis Report и делаете скриншот. Выкладываете его сюда. И вместе посмотрим на него. Я почему-то абсолютно уверен, что компилятор выбросил почти всё из Вашего проекта и оставил с десяток LUTов которые никак не описывают задуманное Вами.. Если я прав, то Ваш проект не делает то, что Вы хотите. Вам только кажется, что он это делает.

Я это всё делал и так, чтобы сравнить ресурсы затрачиваемые разными сумматорами. Да, проект полностью компилируется, показывает триггеры, луты, и прочее, просто я не счёл нужным выкладывать скрины, так как все другие сумматоры дали сбой. Завтра после работы сделаю то, о чём вы просите.

Комментарии (7)


  1. kkuznetzov
    15.12.2024 23:12

    Запретить бы картинки печатных плат от нейросетей. Я пытался понять, что это за плата.


    1. accurate_random Автор
      15.12.2024 23:12

      tangnano 9k


    1. Thealik
      15.12.2024 23:12

      Запретить - это цензура. Так нельзя, а то пострадает свобода. А как можно? Можно поставить реостат, который ограничивает доступ нейросети к энергии. Человек пишет параграф текста. Если в этом параграфе есть смысл - это увеличивает сопротивление реостата на 10%. Думаю, что я уже подвинул ползунок реостата на середину. Или у кого-то сомнения, в том, что про "сумматор" пишет не нейросеть?


  1. Thealik
    15.12.2024 23:12

    Ваше упрямство достойно лучшего применения. Вы хотите использовать ключи, а по сути отдельные транзисторы? Пожалуйста. Вот относительно хорошая схема сумматора на транзисторах
    https://patents.s3.yandex.net/RU2164036C2_20010310.pdf
    Переделайте её так, чтобы вместо pMOS и nMOS транзисторов был ключи. Перед этим найдите в схеме два элемента 2ИЛИ-НЕ и инвертор. Потом уже можете почитать описание патента и найти там формулу XOR3 для суммы. Интереснее посмотреть на формулу для переноса, которая после минимизации должна дать MAJ3. В качестве упражнения, можете задать эту схему на уровне транзисторов в Verilog, ведь этот уровень самый низкий. И здесь приходит разочарование. Все эти действия нужны только для того, чтобы научиться их выполнять, в FPGA нет доступа ни к отдельным транзисторам, ни к отдельным ключам. Есть набор примитивов - LUT, MUX, XOR, FF, конкретные названия приведены в файлах производителя. Эти названия используются для программирования "в примитивах" под названием instantiation. После того, как Вы это поймете, попробуйте соединить два LUT одного блока крест-накрест. Получилось? А могло и не получиться. Всё зависит от возможностей коммутатора (switchbox, PIP). Verilog не позволяет управлять коммутатором вручную, нужно что-то специальное. Этим специальным для Xilinx FPGA является язык XDL. Другие производители такой роскоши не предоставляют.


  1. nckma
    15.12.2024 23:12

    Вообще складывается впечатление, что данная плата живёт какой-то своей жизнью

    Просто то, что вы пытаетесь сделать врядли может быть сделано вообще. И оно фактически работает совсем не так как вы думаете. Вы думаете, что что-то там оптимизируете используя логические элементы типа not, xor,bufif1, а фактически компилятор всё равно всё это упаковывает в LUTы как сможет.


    1. accurate_random Автор
      15.12.2024 23:12

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


      1. nckma
        15.12.2024 23:12

        У меня следующее предложение.

        1) Вы в своем проекте выключаете Gowin Analizer Oscilloscope если он у Вас включен.

        2) Компилируете проект

        3) Смотрите Resource Usage Report на вкладке Process -> Synthesize -> Synthesis Report и делаете скриншот. Выкладываете его сюда. И вместе посмотрим на него. Я почему-то абсолютно уверен, что компилятор выбросил почти всё из Вашего проекта и оставил с десяток LUTов которые никак не описывают задуманное Вами.. Если я прав, то Ваш проект не делает то, что Вы хотите. Вам только кажется, что он это делает.