FPGA内部模块详解之四 算力引擎——数字信号处理单元(DSP Slice)深度解析

FPGA的"算力引擎"------数字信号处理单元(DSP Slice)深度解析

前几章我们分别认识了FPGA的逻辑"心脏"(PFU/CLB)和"记忆细胞"(Block RAM)。从本章开始,我们将目光转向FPGA中负责高速计算的"算力引擎"------数字信号处理单元(DSP Slice)。

在现代FPGA中,DSP Slice已经成为一个不可或缺的硬核资源。它使得FPGA不仅能做逻辑控制,更能高效地完成数字信号处理、图像处理、AI推理等计算密集型任务。如果你曾好奇为什么FPGA可以跑数百兆赫兹的FIR滤波器,为什么能实时处理4K视频,为什么能成为AI加速的利器,那么答案很大程度上就藏在DSP Slice中。

本章将带你深入DSP Slice的内部架构,从乘法器、加法器到流水线,从基本模式到级联应用,并给出实际设计中的使用建议。

一、为什么需要专用的DSP Slice?

在数字信号处理中,最基本的操作就是乘法乘加 。例如,一个FIR滤波器的抽头计算:y = ∑(x[i] * h[i])。如果用普通的PFU来实现乘法:

  • 一个N位乘法器需要大量的LUT和进位链,面积大、速度慢。
  • 即使可以用LUT实现,也会消耗大量逻辑资源,且延迟随位数增加急剧增大。
  • 当需要大量并行乘法时,FPGA的逻辑资源将不堪重负。

因此,FPGA厂商在芯片中集成了硬核乘法器,并逐步发展为完整的DSP Slice,集成了乘法器、加法器、累加器、流水线寄存器等。这种硬核实现具有以下优势:

  • 高性能 :可工作在数百MHz甚至更高频率,延迟固定且很小。
  • 低功耗 :专用硬核的功耗远低于用通用逻辑搭建的等效电路。
  • 高密度 :一个DSP Slice往往可以替代成百上千个LUT。
  • 专用级联 :DSP Slice之间有专用的级联路径,支持构建高阶滤波器而不占用通用布线。

二、DSP Slice的演进与基本架构

不同厂商、不同系列的DSP Slice结构略有差异,但基本思想一致。本章以Xilinx 7系列及UltraScale系列中的DSP48E1/2为例进行讲解,这是目前最广泛使用的架构之一。

2.1 DSP Slice的主要组成

一个典型的DSP48E1 Slice包含以下核心部件:

部件 功能 典型位宽
预加法器(Pre-adder) 实现 (A ± D),常用于对称滤波器优化 25位/27位
乘法器(Multiplier) 执行有符号/无符号乘法 18×18位或25×18位
累加器/加法器(Accumulator/Adder) 执行乘加/乘累加,支持级联 48位
流水线寄存器(Pipeline Registers) 提升频率,可旁路 多级
模式控制逻辑(Mode Control) 配置操作模式 -
级联输入输出(Cascade) 连接相邻DSP Slice 48位累加器数据,进位等
2.2 数据路径

DSP Slice的典型数据路径为:

text

复制代码
A(25) ─┐
       ├─> 预加器 ─┬─> 乘法器 ─> 乘法结果(36位) ─> 加法器/累加器(48位) ─> P(48)
B(18) ─┘            │
C(48) ──────────────┘
                     └── 来自前一级DSP的级联输入(P_CIN)
  • A端口 :通常为25或27位宽,连接预加器。
  • B端口 :通常为18位宽,作为乘法器的一个输入。
  • D端口 :预加器的另一个输入。
  • C端口 :48位宽的输入,可直接注入加法器。
  • P端口 :48位输出结果。

三、DSP Slice的核心功能与工作模式

DSP Slice通过内部控制信号可以配置为多种工作模式,以满足不同的运算需求。

3.1 乘法模式(MULT)

最简单的模式,仅使用乘法器。例如:P = A × B。此时加法器被旁路,直接输出乘法结果(根据位宽自动扩展至48位)。

3.2 乘加/乘减模式(MULT-ADD / MULT-SUB)

这是最常用的模式之一,实现 P = (A × B) ± C。在FIR滤波器中,每个抽头计算后需要累加,这种模式可以直接将上一个抽头的累加结果作为C输入,实现流水线累加。

3.3 累加模式(ACC)

实现 P = P ± (A × B),即乘积与上一次的输出相加。这是实现积分器、累加器的核心模式。在DSP48E1中,通过反馈路径将P寄存器的输出连接到加法器输入,形成累加器。

3.4 预加模式(Pre-adder)

预加器可以执行 (A ± D) 然后乘以B。在对称FIR滤波器中,如果系数对称(h[i] = h[N-1-i]),可以先将两个对称的输入相加,再乘以同一个系数,从而节省一半的乘法器。预加器正是为此设计的。

例如:P = (A + D) × BP = (A - D) × B

3.5 其他高级模式
  • 宽位乘法 :通过级联多个DSP Slice实现更大位宽的乘法(如36×36)。
  • 复数乘法 :利用多个DSP Slice完成复数乘法运算。
  • 模式切换 :可动态改变操作模式,实现时分复用。

四、流水线与寄存器

DSP Slice之所以能高速运行,关键在于其内部的多级流水线寄存器。所有关键路径都可在需要时插入寄存器。

典型的流水线级数(以DSP48E1为例):

阶段 可选寄存器 作用
输入 MREG 寄存A、B、D等输入,可提高输入时序
预加器输出 PREG(部分) 可寄存预加结果
乘法器输出 MREG 寄存乘法结果,大幅提升频率
加法器输入 CARRYINREGOPMODE 控制信号寄存
累加器输出 PREG 寄存最终结果P

通过合理配置,可以将整个数据路径全部流水线化,达到FPGA的最高工作频率。

重要提示 :开启更多的流水线寄存器会增加延迟(即输出相对于输入的时钟周期数),但能提高吞吐率。设计时需要在延迟和频率之间做权衡。

五、DSP Slice的级联

单个DSP Slice的累加器最多48位,但当需要构建高阶滤波器或大数据宽累加时,必须将多个DSP Slice级联起来。

5.1 累加器级联(Pattern Detector)

在FIR滤波器等高阶累加中,需要将多个DSP Slice的乘积结果累加到一个48位累加器中。DSP Slice提供了专用的级联路径:

  • CASCADEIN :来自前一级DSP的48位累加结果。
  • CASCADEOUT :输出到后一级DSP的48位累加结果。

每个DSP Slice可以配置为:

  • 使用本地C输入(来自本Slice的C端口,或来自上一级的CASCADEIN),与乘法结果相加。
  • 将结果传递给下一级。

这样,多个DSP Slice可以串成一个长链,完成所有乘积的累加,而不占用通用布线资源,延迟可控。

5.2 宽位乘法级联

当需要实现大于18×18的乘法时,可以采用平方和分解技术,将大乘法拆分为多个小乘法并累加,利用多个DSP Slice完成。例如,实现一个35×35乘法器,可将操作数拆分为高17位和低18位,用四个DSP Slice完成部分积的乘加。

Xilinx的IP核(如Multiply Adder)会自动利用多个DSP Slice实现大位宽乘法。

六、设计实例:FIR滤波器的DSP实现

下面以一个简单的4抽头FIR滤波器为例,展示如何使用DSP Slice实现乘加流水线。

滤波器公式y[n] = x[n]*h0 + x[n-1]*h1 + x[n-2]*h2 + x[n-3]*h3

6.1 使用DSP Slice的乘加模式

我们可以用一个DSP Slice实现每个抽头的乘加,通过流水线累加。但单个DSP Slice只能一次做一个乘加,我们需要4个周期才能完成一个y[n]的计算。为了并行,通常使用多个DSP Slice级联,每个抽头一个DSP,然后级联累加。

假设系数和输入都是18位有符号数,用4个DSP48E1级联:

  • 每个DSP48E1配置为乘加模式:P = (A × B) + C,其中C来自前一级的CASCADEOUT。
  • 第一级DSP的C输入为0,后续DSP的C输入来自前一级的累加结果。
  • 所有DSP共享相同的时钟,输入数据流在时域上对齐。

这样,每个时钟周期可以得到一个滤波结果,实现了全流水线。

6.2 代码示例(Verilog,使用原语)

verilog

复制代码
// 假设使用4个DSP48E1,参数已配置为乘加模式
// 第一级
DSP48E1 #(
   .USE_DPORT("FALSE"),
   .USE_MULT("MULTIPLY"),
   .USE_SIMD("ONE48"),
   .A_INPUT("DIRECT"),
   .B_INPUT("DIRECT"),
   .CASCADEIN("CASCADEIN"),
   .OPMODE("0000101")   // 乘加模式:P = A*B + C
) dsp0 (
   .CLK(clk),
   .A(x0),      // x[n]
   .B(h0),      // h0
   .C(48'd0),   // 初始累加为0
   .P(P0),
   .CARRYCASCOUT(cascade0)
   // ...
);

// 第二级
DSP48E1 #(...) dsp1 (
   .CLK(clk),
   .A(x1),      // x[n-1]
   .B(h1),
   .C(P0),      // 累加前一级结果
   .P(P1),
   .CARRYCASCOUT(cascade1)
);

// 第三级、第四级类似...
// 最后一级输出P3即为滤波结果y[n]

注意 :实际使用中,需要将数据流对齐(x[n-1]需比x[n]延迟1拍),可以通过移位寄存器实现。

七、DSP Slice的资源与性能考量

7.1 资源消耗

一个DSP Slice通常包含1个乘法器、1个加法器/累加器。在FPGA的资源报告中,DSP Slice的数量是独立统计的。如果设计使用了大量乘法运算,需要确保不超过芯片的DSP数量。

7.2 频率与吞吐率

DSP Slice的流水线设计使其能工作在较高频率(通常与芯片速度等级相关,如500MHz+)。但实际频率还受数据路径、控制路径、外部接口等影响。

  • 开启所有流水线寄存器(如乘法器输出寄存)可以提升频率,但会增加延迟。
  • 对于高吞吐率的应用(如连续数据流),延迟不是问题,流水线是首选。
7.3 功耗

DSP Slice的功耗与工作频率、翻转率有关。当不使用时应尽量关闭时钟或使能,以降低功耗。一些工具支持自动门控。

八、DSP Slice与通用逻辑的对比

场景 使用DSP Slice 使用通用逻辑(LUT+FF)
小位宽乘法(4×4) 可用,但资源浪费 可能更节省LUT资源
中等位宽(9×9, 18×18) 性能好,资源专用 面积大,速度慢
大量并行乘法 理想选择 不可行
乘加/累加 优势明显 难以达到高频率
非标准运算(如特殊函数) 无法直接使用 可通过LUT实现

经验法则 :如果设计中需要乘法、乘加或累加,且位宽超过8位,优先考虑使用DSP Slice。对于小位宽或特殊运算,可以权衡。

九、设计中的注意事项

  1. 数据格式 :DSP Slice支持有符号和无符号乘法,但有符号乘法需要正确设置控制信号(如 AB端口的 IS_ALUMODE_INVERTED等)。混合有符号/无符号时需要扩展符号位。
  2. 溢出处理 :累加器可能溢出。DSP Slice提供溢出标志(如 OVERFLOWPATTERN DETECT)供检测。
  3. 流水线匹配 :当使用多个DSP Slice级联时,需要确保数据流延迟一致。例如,输入数据的延迟要与DSP内部的流水级数匹配,否则会出现数据错位。
  4. 复位 :DSP Slice内部寄存器通常有同步复位,但复位会清零流水线,需要谨慎使用,避免频繁复位影响性能。
  5. IP核使用 :Xilinx、Intel等厂商提供高级IP核(如FIR Compiler、Multiply Adder),它们会自动优化DSP资源使用,并处理流水线、级联等细节。对于复杂设计,强烈推荐使用IP核。

十、本章小结

本章我们深入解析了FPGA的"算力引擎"------DSP Slice。核心要点如下:

方面 内容
为什么需要DSP Slice 高效实现乘法、乘加等运算,节约逻辑资源,提高性能
基本组成 预加器、乘法器、加法器/累加器、流水线寄存器、级联路径
工作模式 乘法、乘加、乘减、累加、预加等
流水线 多级可选寄存器,提升频率但增加延迟
级联 专用级联路径,构建高阶滤波器、宽位乘法
设计建议 优先使用DSP Slice处理乘法类运算,利用IP核简化设计

DSP Slice使得FPGA不仅能做控制和存储,更能成为高性能计算的利器。在后续章节中,我们将看到DSP Slice如何与BRAM、PFU协同,构建完整的数字信号处理系统。

相关推荐
weiyvyy3 小时前
嵌入式硬件接口开发的核心原则
驱动开发·单片机·嵌入式硬件·fpga开发·硬件架构·硬件工程
Kong_19943 小时前
芯片开发学习笔记·二十一——primetime静态时序分析
fpga开发·芯片开发
S&Z34634 小时前
[SZ901] 多路FPGA 网络下载器总览
网络·fpga开发
Shang180989357269 小时前
SSD202D星宸科技SigmaStar一颗高度集成的嵌入式智能触控显示板解决方案SSD202集成了硬件H.264/H.265视频解码器、内置了DDR
科技·嵌入式硬件·fpga开发·ssd202d嵌入式智能显示
青山_FPGA1 天前
AT24CM01芯片的时序是如何进行控制的?
嵌入式硬件·fpga开发·lattice
FPGA小迷弟1 天前
FPGA工程师面试题汇总(二)
学习·fpga开发·verilog·fpga
unicrom_深圳市由你创科技1 天前
如何根据项目需求选型FPGA器件?逻辑单元、BRAM、DSP切片怎么看?
fpga开发
Saniffer_SH1 天前
【高清视频】实验室搭建PCIe 6.0测试环境需要的retimer卡介绍
服务器·驱动开发·测试工具·fpga开发·计算机外设·硬件架构·压力测试
GateWorld1 天前
FPGA内部模块PFU配置: 6输入LUT如何实现32位移位寄存器
fpga开发