LINUX.ORG.RU

Алгоритм умножения на логических схемах

 , ,


4

3

Каким образом в вычислительных устройствах (АЛУ процессора) аппаратно реализован алгоритм умножения? В частности судя по http://www.sm.bmstu.ru/sm5/n4/oba/proz2.html для умножения используются сумматоры и двоичный сдвиг. Я придумал другой метод. Я через дешифраторы преобразовываю двоичную систему счисления в одноединичный код, потом ищу пересечения этих единичек для двух чисел, потом преобразовываю через дешифратор это в двоичную систему счисления. И т.к. умножение это коммутативная операция, схема несколько(почти в два раза) упрощается. Вот нарисовал в logisim http://dump.bitcheese.net/files/umucuby/upd_2.circ и в виде картинки http://dump.bitcheese.net/images/aditoso/sc.png
Имеет ли смысл использовать подобное решение вместо привычного подхода с сумматорами(лучше или хуже оно)? Используется ли подобный подход в процессорах? Если у кого есть опыт с программированием FPGA через verilog/VHDL, имеет ли смысл подобное реализовывать в софт-микропроцессорах? И да, есть ли в Verilog или VHDL cредства для кодогенерации того, что я тут изобразил, для произвольной разрядности чисел? Или надо для таких случаев свой кодогенератор писать? Кастану пожалуй yax123, он вроде что-то на спартанах там делает

★★★★★

Последнее исправление: SZT (всего исправлений: 1)

Ответ на: комментарий от yax123

Правда дешифратор не полный (должно быть 8 выходов, а не 7, ну это не самая главная проблема).

Ну так восьмой вывод же должен под нуль выводиться. Но нули мне не нужны т.к. 0 умножить на что угодно это 0. Проблему я вижу только в том, что схема эта будет черезмерно разрастаться при увеличении разрядности. Я сначала хотел это нарисовать для перемножения 8-битных чисел, но оценив примерный объем работ, решил сократить до 4, а потом и до 3-битных

SZT ★★★★★
() автор топика
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от Zubok

Я глянул исходную схему чуть-чуть повнимательнее. А ты проверил - она работает? А то я на глаз что-то не могу определить.

Да, работает. В logisim тестировал на разных числах - результат был всегда правильным.

Теперь мнение по практичности. Непрактично совершенно. Если ты будешь множить 8-битные числа, то сам прикинь, сколько у тебя ресурсов сожрет твое решение.

А и не надо. Можно использовать трехбитные умножатели для реализации 8-битных, примерно как при умножении в столбик мы умножаем отдельные цифры числа с переносом

SZT ★★★★★
() автор топика
Ответ на: комментарий от SZT

Можно использовать трехбитные умножатели для реализации 8-битных, примерно как при умножении в столбик мы умножаем отдельные цифры числа с переносом

Вот бы глянуть на такую схему.

yax123 ★★★★★
()
Ответ на: комментарий от SZT

А и не надо. Можно использовать трехбитные умножатели для реализации 8-битных, примерно как при умножении в столбик мы умножаем отдельные цифры числа с переносом

Еще глянь на LUT-based multipliers как вариант реализации. Их можно объединить по алгоритму Бута в умножители большей разрядности.

Zubok ★★★★★
()
Ответ на: комментарий от yax123

Посмотри алгоритм Карацубы. Для множителей размера n он использует 3 перемножения размера n/2. Причём перемножения размера n/2 можно вычислять дальнейшим разбиением до n/4 и так далее пока мы не дойдём до однобитного перемножения.

prischeyadro ★★★☆☆
()
Ответ на: комментарий от asaw

Верилог тут притом, что я это хочу на верилоге переписать

SZT ★★★★★
() автор топика
Ответ на: комментарий от prischeyadro

Посмотри алгоритм Карацубы.

Понятно что у математиков все просто и понятно. Нарисовал пару формул и хорошо. Я про то как это будет в логических элементах выглядеть.
Изначально то я спрашивал про то как исходную модель ТС-а каскадировать.
Самая содомия именно в железе.
Из производственного. К virtex6 подключены 8 SPF+. Нужно через них осуществлять коммуникацию с внешним миром. Транссиверы подключены каждый к своему GTX. И у каждого по 32+32 линии данных (на чтение и на запись). Вот вам уже 512 линии которые должны быть строго синхронные. Попробуйте протащить их через весь кристалл.

yax123 ★★★★★
()

Простите за оффтоп, но даже самые младшие FPGA типа cyclone II или spartan 3 уже содержат в себе выделенные блоки умножения. А так иногда лучше несколько коротких тактов, чем один но с большой задержкой.

Rupricht ★★
()
Ответ на: комментарий от Rupricht

хе, ну может я хочу это в кристалле сделать (мечты)

SZT ★★★★★
() автор топика
Ответ на: комментарий от Rupricht

А самые интересные FPGA, для которых есть open source toolchain (ice40) никаких dsp slices не имеют.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.