комбинаторное аппаратное умножение в verilog - PullRequest
4 голосов
/ 17 ноября 2011

Предположим, у меня есть такой код множителя,

      module multiply(
        output [63:0] result,
        input [31:0] a,
        input [31:0] b
      );

        assign result = a * b;

      endmodule

Это производит много ворот.

Какой предпочтительный метод следует использовать для реализации комбинаторного множителя?

Ответы [ 3 ]

5 голосов
/ 17 ноября 2011

Аппаратные множители велики, вам просто нужно с этим жить!

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

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

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

3 голосов
/ 17 ноября 2011

Если вы можете отказаться от комбинаторного требования, вы можете выполнить умножение, используя сумматор и аккумулятор , если скорость не является большой проблемой и вы можете обрабатывать операнды за несколько тактов. Некоторые процессоры с низким энергопотреблением / низкой стоимостью / малой площадью не имеют выделенных команд умножения в своих ISA , или инструкция умножения asm преобразуется в операции сложения декодером внешних команд в микрокод сложения операций.

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

1 голос
/ 17 ноября 2011

Генерируемый множителем verilog может быть неоптимальным.В области эввективных множителей и сумматоров проводится множество исследований.А вот один из довольно универсальных и хороших генераторов add / mul: http://www.aoki.ecei.tohoku.ac.jp/arith/mg/algorithm.html

Эта страница содержит описания многих реализаций add / mul low-lewel

...