AMD(XILINX)FPGA 乘加运算DSP有哪些坑?

文章来源:FPGA入门到精通

FPGA 中的 DSP,全称 Digital Signal Processing Block(数字信号处理块),是 FPGA 芯片内部专用的硬件运算硬核,专为乘法 (Multiplication) 和乘累加 (MAC, Multiply-Accumulate) 优化,替代通用逻辑单元(LUT)执行密集数学运算,速度更快、占用资源更少、功耗更低。

7系列FPGA中的乘加器是DSP48E1,是25×18的有符号数乘法器。

UltraScale/UltraScale+FPGA中的乘加器是DSP48E2,是27×18的有符号数乘法器。

这里分享几个使用要点:

1、仅支持同步复位。

DSP48E1内部的寄存器(AREG/BREG/MREG/PREG)仅支持同步复位。

异步复位会使综合工具不得不使用Slice中的寄存器外加LUT来模拟复位功能,显著增加资源消耗。

2、三级流水线,可改善时序。

三级流水代码示例。


module dsp_mult (

     input clk,

     input rst,  // 同步复位

     input signed [24:0] a,

     input signed [17:0] b,

     output reg signed [42:0] p

);

   // 输入寄存

   reg signed [24:0] a_reg;

   reg signed [17:0] b_reg;

   // 乘法结果寄存(MREG)

   reg signed [42:0] mult_reg;



   always @(posedge clk) begin

     if (rst) begin 

           a_reg   <= '0;

           b_reg   <= '0;

           mult_reg <= '0;

           p       <= '0;

     end else begin

          a_reg   <= a;

          b_reg   <= b;

         mult_reg <= a_reg * b_reg;  // MREG级

          p       <= mult_reg;        // PREG级

      end

   end

endmodule