Есть N М-битных входов. Числа N и М это параметры в диапазоне N=[2..64], M=[6..16]. Как правильно написать параллельный сумматор, считающий сумму всех входов за один такт? Насколько эффективна такая конструкция в реальном железе? А то такой параллелизм мне очень упрощает задачу. Я конечно знаю что такое loop, но краем уха слышал что для большого количества входов лучше строить дерево из сумматоров вручную.
Есть N М-битных входов. Числа N и М это параметры в диапазоне N=[2..64], M=[6..16]. Как правильно написать параллельный сумматор, считающий сумму всех входов за один такт? Насколько эффективна такая конструкция в реальном железе? А то такой параллелизм мне очень упрощает задачу. Я конечно знаю что такое loop, но краем уха слышал что для большого количества входов лучше строить дерево из сумматоров вручную.
Очень странно! Loop - это только форма записи. И приведет они к точно такому же сумматору, как и "вручную"... А вот Ваш сумматор "за 1 такт" сделает весь проект медленным. И возможно настолько медленным, что окажется быстрее суммировать за 2 или более такта, но на более высокой частоте...
iosifk, но ведь вручную можно по разному сгруппировать сумматоры: бинарным деревом, односторонним деревом, или вообще вперемешку . Рискнул синтезировать 64 штуки 8-битных для спартана 6: Maximum combinational path delay: 16.855ns. Для 4 сумматоров было 10 нс. Вроде не смертельно, но в RTL увидел цепочку последовательных суматоров. Т.е. ((A+B )+C)+D). Нехорошо. Можно ли как-то заставить чтобы процедурно генерировалось бинарное дерево ((A+B )+(C+D))? Тогда длина цепочки будет не N, а Log2(N).
generate for (stage = 0; stage < cADDER_STAGE_NUM; stage++) begin : adder_stage_gen
always_ff @(posedge iclk) begin ena[stage] <= (stage == 0) ? iena : ena[stage-1]; end
for (i = 0; i < (cADDER_NUM_PER_STAGE >> stage); i++) begin : adder_in_stage_gen
always_ff @(posedge iclk) begin if (stage == 0) begin if (iena) acc[stage][i] <= idat[2*i] + idat[2*i+1]; end else begin if (ena[stage-1]) acc[stage][i] <= acc[stage-1][2*i] + acc[stage-1][2*i+1]; end end
end // adder_in_stage_gen end // adder_stage_gen endgenerate
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539
Цитата(des00 @ Jun 6 2014, 09:59)
Опять не универсально получается, что со значениями (8 < pNUM < 16), (16 < pNUM < 32) и .т.д. Наверное, придётся схему на два куска бить, часть схемы до максимально возможного 2^n строить по Вашему алгоритму, второй кусок (то, что остаётся) просто сгенерить generate-ом и на выходе сложить. Получится универсальное решение. Можно как-то применить floor() или что-то подобное для SystemVerilog?
Опять не универсально получается, что со значениями (8 < pNUM < 16), (16 < pNUM < 32) и .т.д. Наверное, придётся схему на два куска бить, часть схемы до максимально возможного 2^n строить по Вашему алгоритму, второй кусок (то, что остаётся) просто сгенерить generate-ом и на выходе сложить. Получится универсальное решение.
Ну вот вы это для всех и сделайте зачем мне всю мою либу компонентов выкладывать
Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515
Цитата(doom13 @ Jun 6 2014, 11:45)
Опять не универсально получается, что со значениями (8 < pNUM < 16), (16 < pNUM < 32) и .т.д. Наверное, придётся схему на два куска бить, часть схемы до максимально возможного 2^n строить по Вашему алгоритму, второй кусок (то, что остаётся) просто сгенерить generate-ом и на выходе сложить. Получится универсальное решение. Можно как-то применить floor() или что-то подобное для SystemVerilog?
Гораздо проще - если число слагаемых в текущей ступени нечётное, последнее "лишнее" слагаемое переносится на следующую ступень без сложения.
Можно как-то применить floor() или что-то подобное для SystemVerilog?
и чем это поможет ? описать сигналы в количестве 2**$logb2(ANY_NUM) и занулить ненужные. Для двухвходового сумматора лучше не придумано. Для трехвходового нужно будет действовать по другому.
Цитата(Timmy @ Jun 6 2014, 20:47)
Гораздо проще - если число слагаемых в текущей ступени нечётное, последнее "лишнее" слагаемое переносится на следующую ступень без сложения.
Группа: Свой
Сообщений: 642
Регистрация: 15-11-07
Пользователь №: 32 353
Использовать параметризируемый конвейер! Но результат не за один такт естественно.
--------------------
Правильно сформулированый вопрос содержит в себе половину ответа. P.S.: Некоторые модераторы в качестве ответа так навязчиво предлагают посетить свой сайт, что иначе как саморекламу такие действия интерпретировать сложно.