F
FPGA 做 DSP 算法时,新手常用 LUT 搭乘法器,既浪费资源又难以跑高频。FPGA 内部的 DSP 硬核(Xilinx DSP48E1/DSP48E2/DSP58、Intel 可变精度 DSP 块)才是乘加运算的正确载体。
一、DSP48 结构
以 7 系列 DSP48E1 为例:25 位预加器 + 25×18 有符号乘法器 + 48 位累加器/ALU,内部带 A/B/M/P 多级流水寄存器,满流水时在 -2 速度等级器件上可运行到约 600MHz 以上。UltraScale 的 DSP48E2 将乘法器扩展到 27×18,Versal 的 DSP58 为 27×24 并支持浮点。
二、实践要点
1. 推断与例化:简单乘加用规范写法即可被综合工具推断;复杂结构(预加、级联、模式动态切换)建议例化原语或使用 IP;
2. 位宽匹配:数据控制在 25×18(或 27×18)以内可用单个 DSP,超出会拆成多个;
3. 流水线:至少使用 MREG 和 PREG,否则频率难以超过 300MHz;
4. 级联:FIR 滤波器使用 PCIN/PCOUT 级联通路做脉动结构,可省掉逻辑加法器;
5. 对称系数 FIR 用预加器先相加再乘,乘法器数量减半。
三、常见坑
1. 复位接入 DSP 内部寄存器时使用异步复位,会导致寄存器无法吸收进 DSP,频率下降;
2. 有符号与无符号混用导致结果错误;
3. 累加器位宽不足,长时间累加溢出;
4. 跨时钟域数据直接送入 DSP 链。
讨论:
1. 你们做高速采集时,7 系列与 UltraScale 的 DSP 资源和时序差异体会明显吗?
2. FIR 滤波器你们更倾向手写还是使用 FIR Compiler IP?
一、DSP48 结构
以 7 系列 DSP48E1 为例:25 位预加器 + 25×18 有符号乘法器 + 48 位累加器/ALU,内部带 A/B/M/P 多级流水寄存器,满流水时在 -2 速度等级器件上可运行到约 600MHz 以上。UltraScale 的 DSP48E2 将乘法器扩展到 27×18,Versal 的 DSP58 为 27×24 并支持浮点。
二、实践要点
1. 推断与例化:简单乘加用规范写法即可被综合工具推断;复杂结构(预加、级联、模式动态切换)建议例化原语或使用 IP;
2. 位宽匹配:数据控制在 25×18(或 27×18)以内可用单个 DSP,超出会拆成多个;
3. 流水线:至少使用 MREG 和 PREG,否则频率难以超过 300MHz;
4. 级联:FIR 滤波器使用 PCIN/PCOUT 级联通路做脉动结构,可省掉逻辑加法器;
5. 对称系数 FIR 用预加器先相加再乘,乘法器数量减半。
三、常见坑
1. 复位接入 DSP 内部寄存器时使用异步复位,会导致寄存器无法吸收进 DSP,频率下降;
2. 有符号与无符号混用导致结果错误;
3. 累加器位宽不足,长时间累加溢出;
4. 跨时钟域数据直接送入 DSP 链。
讨论:
1. 你们做高速采集时,7 系列与 UltraScale 的 DSP 资源和时序差异体会明显吗?
2. FIR 滤波器你们更倾向手写还是使用 FIR Compiler IP?

