Перейти к содержанию
    

Многовходовой сумматор

Дело под вечер... Не могу сообразить, как сделать красиво многовходовой синтезируемый сумматор (на минимальное число строк на HDL). Кол-во входов 128 (на каждом входе новые данные), разрядность 16 бит. Нужно просумировать все входы. Конвеерность не важна, хоть все 128 тактов. Критично лишь минимизация логики.

Есть идеи ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дело под вечер... Не могу сообразить, как сделать красиво многовходовой синтезируемый сумматор (на минимальное число строк на HDL). Кол-во входов 128 (на каждом входе новые данные), разрядность 16 бит. Нужно просумировать все входы. Конвеерность не важна, хоть все 128 тактов. Критично лишь минимизация логики.

Есть идеи ?

в том в чём будет работать есть dsp блоки?

если да то....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в том в чём будет работать есть dsp блоки?

если да то....

Да пожалуйста...сколько угодно. Но речь про краткость кода.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Это решение можно разбить на 2 блока по 64 входа и т.д.

 

а краткость кода.. это какое-то запредельное требование..

 

комбинаторный always @( * ), в котором в цикле все значения суммируете. Синтезатор найдет способ, как реализовать это хозяйство. потом пишите временные ограничения для этого комбинаторного оковалка, и ура-ура.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да пожалуйста...сколько угодно. Но речь про краткость кода.

ну полный исходник писать мне лень и к тому же то что написал это для DSP48 xilinx

 input[63:0][15:0]  inputA,
input[63:0][15:0]  inputB,
input clock,
input reset,
.....
always@(posedge clk)
begin
if (start)
begin
   a<= inputa[counter];
  b<= inputb[counter];
dsp_clr<=0;
end
else if(done)
  out<=P;// выход с dsp48
dsp_clr<=0;
else 
dsp_clr<=1;

end

assign sel_oper=oper_sum_AB_P;

dsp_operation A+B+P

ну или в генерате подключить все входа ко входам dsp48(с операцией A+B+PCIN), pcout к pcin, итог будет - 64 dsp блока

(либо A+B+C+PCIN не уверен что dsp48 такое умеет)

масштабираемо :)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дело под вечер... Не могу сообразить, как сделать красиво многовходовой синтезируемый сумматор (на минимальное число строк на HDL). Кол-во входов 128 (на каждом входе новые данные), разрядность 16 бит. Нужно просумировать все входы. Конвеерность не важна, хоть все 128 тактов. Критично лишь минимизация логики.

Есть идеи ?

 

http://forum.ixbt.com/topic.cgi?id=48:1629:2575#2575

Собственный код лень разбирать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дело под вечер... Не могу сообразить, как сделать красиво многовходовой синтезируемый сумматор (на минимальное число строк на HDL). Кол-во входов 128 (на каждом входе новые данные), разрядность 16 бит. Нужно просумировать все входы. Конвеерность не важна, хоть все 128 тактов. Критично лишь минимизация логики.

Есть идеи ?

Имхо нет ничего сложного - два цикла, один суммирует попарно в каждой ступени, другой увеличивает количество ступеней до двоичного логарифма от количества слагаемых первой ступени. Это - решение "в лоб". DSP блоки тут нафиг не нужны, имхо "из пушки по воробьям". Если хотите оптимизации по ресурсу - покурите доки на тему трёхвходовых сумматоров по ключевому слову "ternary adder". Во всех вышеперечисленных рассуждениях подразумевается, что работаем на предельной частоте, т.е. финты с аккумуляторами невозможны. Если это не так (условия позволяют немного пооверклочить), то ещё туча вариантов для оптимизации.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

http://forum.ixbt.com/topic.cgi?id=48:1629:2575#2575

Собственный код лень разбирать...

Отменяется, там другая задачка решается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конвеерность не важна, хоть все 128 тактов. Критично лишь минимизация логики.

Я бы поставил двухпортовку. По одному входу данные записывались бы, а по другому - считывались бы в сумматор... Собственно и нужно: один сумматор, счетчик адресов на чтение и формирователь стробов...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имхо нет ничего сложного - два цикла, один суммирует попарно в каждой ступени, другой увеличивает количество ступеней до двоичного логарифма от количества слагаемых первой ступени. Это - решение "в лоб". DSP блоки тут нафиг не нужны, имхо "из пушки по воробьям". Если хотите оптимизации по ресурсу - покурите доки на тему трёхвходовых сумматоров по ключевому слову "ternary adder". Во всех вышеперечисленных рассуждениях подразумевается, что работаем на предельной частоте, т.е. финты с аккумуляторами невозможны. Если это не так (условия позволяют немного пооверклочить), то ещё туча вариантов для оптимизации.

если есть дсп блоки то не использовать их крайне странное решение

тем более что такое решение будет занимать меньше всего логики и работать будет на высокой частоте, чем в той же логике

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во всех вышеперечисленных рассуждениях подразумевается, что работаем на предельной частоте

Кстати, совсем забыл про такой важный факт, что необходима предельно возможная частота синтеза и один тактовый сигнал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если есть дсп блоки то не использовать их крайне странное решение

тем более что такое решение будет занимать меньше всего логики и работать будет на высокой частоте, чем в той же логике

Тут ключевое слово "если есть". Просто обычный сумматор можно сделать легко и на логике, а вот умножитель (при условии что множитель

и множимое - не константы) достаточно проблематично.

В случае 16-битных данных, кстати, не факт, что DSPшный сумматор будет быстрее.

 

P.S. В качестве пруфа последнего утверждения собрал проект с двумя 16-битными сумматорами, один - на логике, другой - на DSP блоке.

У DSP блока задействованы все регистры для повышения быстродействия. Так вот, у DSP сумматора времянка валится уже на 550 МГц, в то время как

обычный сумматор бодр и весел аж на 625МГц - при дальнейшем повышении частоты начинают уже валиться ограничения на период клока в BUFG, хотя

сам сумматор может молотить и быстрее. ПЛИС XC7K325TFFG676-1. Синтезатор - синплифай (хотя это в данном случае непринципиально). Разводил в ISE 14.5.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут ключевое слово "если есть". Просто обычный сумматор можно сделать легко и на логике, а вот умножитель (при условии что множитель

и множимое - не константы) достаточно проблематично.

В случае 16-битных данных, кстати, не факт, что DSPшный сумматор будет быстрее.

 

P.S. В качестве пруфа последнего утверждения собрал проект с двумя 16-битными сумматорами, один - на логике, другой - на DSP блоке.

У DSP блока задействованы все регистры для повышения быстродействия. Так вот, у DSP сумматора времянка валится уже на 550 МГц, в то время как

обычный сумматор бодр и весел аж на 625МГц - при дальнейшем повышении частоты начинают уже валиться ограничения на период клока в BUFG, хотя

сам сумматор может молотить и быстрее. ПЛИС XC7K325TFFG676-1. Синтезатор - синплифай (хотя это в данном случае непринципиально). Разводил в ISE 14.5.

 

1)на мой ключевой вопрос был дан ключевой ответ - да полно

2)ТС хотел не 2-а 16 битных сумматора а это многовходовой синтезируемый сумматор...Кол-во входов 128

как вы такое смогли развести я не очень понимаю ->16х128. можно взглянуть на собраный вами проект?

3) если же суммировать все 128 16 битных чисел то Вам не кажется что 16 битного сумматора не хватит?

4) проект в исе я не собирал конечно. ибо... проверял в синплифае вот его оценку и привожу ниже(камень XC7K410TFFG900-2)

4.1) тот исходник что тут приводил немного подправленный с 1 dsp48 - 802LUT 500MHz(около того).

4.2) та же функциональность(теже такты на подсчёт) что и 4.2 но на логике 858LUT 325MHz .

5)умножитель не может быть проблематичным если вы слышали про алгоритма Бута(Booth)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1)на мой ключевой вопрос был дан ключевой ответ - да полно

2)ТС хотел не 2-а 16 битных сумматора а это многовходовой синтезируемый сумматор...Кол-во входов 128

как вы такое смогли развести я не очень понимаю ->16х128. можно взглянуть на собраный вами проект?

3) если же суммировать все 128 16 битных чисел то Вам не кажется что 16 битного сумматора не хватит?

4) проект в исе я не собирал конечно. ибо... проверял в синплифае вот его оценку и привожу ниже(камень XC7K410TFFG900-2)

4.1) тот исходник что тут приводил немного подправленный с 1 dsp48 - 802LUT 500MHz(около того).

4.2) та же функциональность(теже такты на подсчёт) что и 4.2 но на логике 858LUT 325MHz .

5)умножитель не может быть проблематичным если вы слышали про алгоритма Бута(Booth)

1. В данном конкретном случае DSP блоки никак проблему не решают, более того, могут ещё и ухудшить тайминги.

2. В чём проблема перейти от двухвходового сумматора к структуре типа 64 сумматора в первой ступени - 32 сумматора во второй ступени - и т д ?

Вы полагаете такое будет трудно развести? Естественно каждая ступень сумматоров защёлкивается в регистры, схема работает по принципу конвеера.

3. Вполне хватит 23-битного сумматора. Но это увеличение разрядности будет в очень небольшом числе сумматоров. Грубо говоря на выходе 1 ступени - 17 бит (64 сумматра),

на выходе 2 ступени - 18 бит (32 сумматора) и т д.

4. Не стОит доверять отчётам синплифая по времянке, некоторые вещи там не учитываются.

И всё-таки я так и не понял, как вы умудряетесь ОДНИМ сумматором на DSP48 складывать 128 чисел КАЖДЫЙ такт? Видимо сипользуете какие-то скрытые способности DSP блока?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, совсем забыл про такой важный факт, что необходима предельно возможная частота синтеза и один тактовый сигнал.

Вот держите - простецкое дерево сумматоров. Быстродействие определяется быстродействием самого последнего сумматора в цепи (в вашем случае получается 23-битный сумматор). Конвеерная задержка равна двоичному логарифму от количества входных операндов. Это в вашем случае 7. Операндов может быть произвольное число (не обязательно степень двойки). Ширина входных данных и количество слагаемых настраивается входными параметрами. Можно также порулить и выходной шириной, но лучше этого не делать - она внутри считается оптимально. Сюда ещё можно добавить строб для входа и выхода, а также работу по clock enable дабы сэкономить немного потребляемой мощности в случаях когда данные на входе меняются редко.

adder_tree.v

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...