32bit_me (32bit_me) wrote,
32bit_me
32bit_me

Categories:

Need for Speed

"Я просто ставил опыты о том, какая
рыба быстрее всех.
"
БГ

С какой частотой простая FPGA, типа Cyclone 10, может умножать и складывать числа? Никогда не думали? Давайте проверим.



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

module multiplier(
   input wire rst_n,
 input wire clk,
 input wire[31: 0] in1,
 input wire[31: 0] in2,
   output reg[63: 0] res
);

 reg[31: 0] in1_reg;
 reg[31: 0] in2_reg;
 
 always@(posedge clk, negedge rst_n)
 begin
     if(!rst_n)
   begin
       res <= 0;
     in1_reg <= 0;
     in2_reg <= 0;
   end
   else
   begin
       in1_reg <= in1;
     in2_reg <= in2;
       res <= in1_reg * in2_reg;
   end;
 end
endmodule



Не будем сильно останавливаться на стиле кода, в реальном проекте он совсем не такой, конечно.

Посмотрим на результат синтеза в Quartus II:
Total virtual pins 0
Total memory bits 0
Embedded Multiplier 9-bit elements 8
Total PLLs 0



Картинку из RTL Viewer вы можете видеть вверху. Итак, умножитель занял 8 блоков умножителя 9х9. Но как? Задание для любопытных: попробуйте нарисовать схему умножителя 32x32->64 из 8 блоков 9x9->18. Не получилось?

На самом деле секрет прост: Cyclone 10 имеют блоки умножения 18x18->36, но каждый из них может быть сконфигурирован как два независимых умножителя 9x9->18, и в отчёте Quartus II показывает каждый физический блок умножения как 2 блока. То есть 4 блока 18x18->36 он показывает как 8 блоков 9x9->18. А умножитель 32x32->64 естественным образом состоит из 4 блоков 18x18->36.

Теперь посмотрим частоту (здесь и далее приводятся частоты по отчёту Time Quest для Slow Mode 85 град. для кристалла с speed grade 6)
Итак, умножитель 32x32->64: 113,96 МГц, 8 блоков умножения

Как-то не очень.

Пробуем другие комбинации разрядности операндов и результата:
Умножитель 32x32->32: 153,75 МГц, 6 блоков умножения
Умножитель 16x16->32: 288,68 МГц (restricted freq: 250 МГц), 2 блока умножения
Умножитель 16x16->16: 288,68 МГц (restricted freq: 250 МГц), 2 блока умножения

То есть частота зависит от разрядности, и сильно. Маленькие умножители работают на частоте, которая превышает фактически максимально допустимую для этого чипа (250 МГц), но большой умножитель 32x32->64 уже заметно тормозит (113,96 МГц).

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

Теперь попробуем сумматор 32+32->33 (то есть 32 + бит переноса):
Сумматор 32+32->33: 300,21 МГц (restricted freq: 250 МГц), 97 LE

Хотя бы сумматор быстрый. Когда-то на старых FPGA не получалось запустить такой сумматор даже на 25 МГц. Прогресс, однако.
Tags: fpga, verilog
Subscribe

  • RIP

  • Поздравляю

    Поздравляю всех, кто понимает, о чём я.

  • Дивный новый мир

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

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 5 comments