FPGA 入门 28:DSP48 初认识——专用乘法乘加硬块
更新时间:2026-09-12。本文是
fpga/入门层第 30 篇。LUT 搭算术见 LUT 与 FF 深入,算术深讲见进阶 DSP48 与算术(乘加/FIR/推断/级联),定点/FIR 后续见规划篇。
本文要回答的问题
- 一个二进制乘法器用通用逻辑搭为什么代价是平方级增长,DSP48 硬块内部结构如何把这件事变成一拍操作?
- 25×18 乘法器、48 位累加器、三级内部寄存器、专用级联线各自解决什么问题?
- 写成什么样的 Verilog 才会被综合器「推断」成 DSP48?signed、打拍、位宽、复位这四个条件为什么关键?
- 累加器位宽为什么不能直接用乘积位宽,连续累加多少次会溢出,位宽怎么算?
- FIR 滤波器、矩阵乘、卷积这些算法如何一一映射到多块 DSP48 的级联阵列?
- 常数乘法、无符号乘法、乘除法、宽位宽乘法分别会落到什么资源,什么时候用 LUT 反而更省?
- 怎样从资源利用率报告和综合日志确认乘法真的进了 DSP,而不是悄悄被 LUT 实现?
一、DSP48 是什么
一块 DSP48E1/E2(7 系/UltraScale)内含:
A(25) ┐
×── 25×18 有符号乘法器 ── 48位加/累加器 ── P(48)
B(18) ┘ ↑
级联输入(上一块 P) / 可累加 acc- 单块一拍完成一次乘加 MAC:
P = A*B + C或acc += A*B; - 有专用级联线把多块串起来(FIR/宽加法不绕布线);
- 内部有输入/流水/输出寄存器,打拍后跑高频;
- 一片 FPGA 几十~几千块;不占 LUT/FF。
二、推断 DSP48 的写法
module mac #(parameter W=16)(
input wire clk, rst,
input wire signed [W-1:0] a, b,
output reg signed [2*W:0] acc // 累加, 位宽留够
);
always @(posedge clk) // 同步、打拍
if (rst) acc <= 0;
else acc <= acc + a*b; // a*b 有符号乘 + 累加 -> MAC
endmodule要点:signed 有符号、位宽 ≤25×18(超了自动级联)、输入输出打拍、数据通路别用异步复位;需要可加 (* use_dsp48="yes" *)。
三、用不用 DSP 的对照
| 情形 | 结果 |
|---|---|
| signed 乘 + 打拍 + 乘加 | 推断 DSP48(省、快) |
| 常数乘(×10)/很窄乘法 | 工具可能用移位加→LUT |
| 乘除/取模/复杂混算 | 被拆散用 LUT |
| 关键寄存器异步复位 | 阻碍映射进 DSP |
| 位宽超单块且写法绕 | 可能不级联、用逻辑 |
验证:Utilization 报告看 DSP48E1/E2 计数;综合日志看 'inferring DSP'。
四、为什么乘法需要专用硬块
先从硬件代价理解 DSP48 存在的理由。二进制乘法在结构上是「部分积生成 + 压缩树 + 最终加法」:两个 N 位操作数相乘,要产生约 N² 量级的部分积与全加器单元。用 LUT 和进位链拼一个 16×16 乘法器,通常要吃掉几百个 LUT,25×18 规模可能逼近上千个 LUT,而且进位链拉长后延迟很大,能跑到的最高频率往往只有几十兆赫。一个稍复杂的滤波器或小型神经网络一层就有几十个并行乘法,全用 LUT 实现,逻辑资源会在算逻辑之前先被算术吃光。
DSP48 是把这套结构做成了硅片上的专用硬电路:以 7 系列的 DSP48E1 为例,核心是一个 25×18 位的有符号二进制乘法器,乘积(43 位左右)送入一个带模式设置的 48 位加法/减法/累加器,还可通过可选的输入寄存器、乘法器后寄存器、输出(累加)寄存器构成最多三级流水;整个硬块外围配有模式控制、进位、三态加法等逻辑,使其不止能乘加,还能做乘法累加、乘加后加常数、宽加法、计数器、累加器、多路选择等。专用硅电路的布线短、延迟确定,打满流水后主频常能到几百兆赫,且一个乘法加累加只占一块 DSP、零 LUT。
更关键的是级联结构:相邻 DSP48 在芯片纵向排成列,列与列之间有专门的级联总线(PCIN/PCOUT、ACIN/ACOUT 等),一块的 48 位累加结果可以不经通用布线直接送进下一块的加法端。FIR 滤波器的求和链、多个部分积拼接的宽乘法,都沿着这条「DSP 列」流动,既省布线资源又几乎不增加延迟。可以把它想象成一条专门做乘加的装配线:BRAM 负责把数据和系数源源不断送到线边,DSP 列负责每拍完成大量乘法与求和,这正是 FPGA 做数字信号处理和 AI 推理能效高的物理基础(应用背景见 神经网络与 FPGA)。
五、推断 DSP48 的四条写法要点
和 RAM 推断一样,不必手工例化原语,综合器能识别「乘法乘加模式」,但要写得让它认得出来。四个要点务必同时满足:
第一,有符号语义。DSP48 乘法器原生按补码有符号数工作,操作数声明为 signed,或确保符号扩展方式与硬件一致。无符号乘法虽然现代工具也能映射(DSP 可配成无符号输入),但混合有符号/无符号、或在乘法外手工拼符号位,容易让工具放弃硬块改用逻辑。统一用 signed 是最省心的规范(补码与位宽见 数据类型、定点数基础见 定点数)。
第二,位宽在单块能力内。两个输入分别不超过 25 位和 18 位时,一块 DSP 装下;超过后,综合器可以自动用多块级联拼出宽乘法,但前提是代码结构规整(直接相乘、不要把乘法拆成奇怪的部分积手工相加)。例如 32×32 乘法会用约 4 块 DSP,复杂混算则可能让工具判断「不如用 LUT」。
第三,在时序路径上打拍。DSP 内部的输入/流水/输出寄存器是它跑高频的关键。若乘法器输入直接来自管脚或长组合逻辑、输出立刻进复杂组合判断,工具无法把寄存器映射进 DSP 边界,只能用 LUT 搭组合乘法。典型推荐结构是输入寄存器(a_reg、b_reg)、乘法寄存器(p_reg)、累加寄存器(acc_reg)三级,与 DSP 内部三级寄存器一一对应,时序报告上路径都在硬块内部闭合。
第四,避免异步复位和非支持操作。DSP 内部寄存器的复位能力有限(多数只支持同步复位/使能),给乘法相关寄存器加异步复位可能把寄存器推出 DSP 边界,乘法随之用逻辑实现;除法、取模、与乘法混合的可变移位等不是 DSP 一条指令能完成的运算,会被拆散成 LUT。常数乘法(尤其常数为 2 的幂或很小)工具可能认为「移位加」更省而主动不用 DSP,这是合理优化而非推断失败。
显式控制可用综合属性(如 (* use_dsp48 = "yes" *) 加到模块或信号,或在综合设置里选 DSP 策略),但属性同样不是强制魔法——写法不支持时会产生「无法按属性实现」的警告,必须改 RTL。
六、位宽、溢出与累加器设计
MAC 设计中最隐蔽的错误是累加器位宽不够导致高位被悄悄截断。两个 W 位有符号数相乘,乘积需要 2W 位才能无溢出表示(考虑双负数相乘还要多一位时取 2W 即可,两个负的最小值同乘是极端情形,按 2W+1 最稳妥)。乘积只有 2W 位,但累加器要连续加 N 次:N 个等宽数相加,和的最大值比单项最多多 log2(N) 位。因此累加器位宽应取「乘积位宽 + 表示累加次数所需的额外位」。举例 16 位输入相乘得 32 位乘积,累加 1024 次约需再加 10 位,累加器至少 42~43 位——这恰好与 DSP48 的 48 位累加器宽度呼应,工程上直接用 48 位或按真实次数推导。
位宽不足的症状在仿真里表现为累加值到某个值后突然变负或回卷(补码溢出环绕),上板后表现为结果周期性错误,且频率、资源都正常,极具迷惑性。防护措施:设计时在注释里写明「输入位宽、乘积位宽、累加次数、累加器位宽及推导过程」;Testbench 用随机大数和连续最大值做溢出压力测试;定点算法还要统一规划整数位和小数位,避免每级运算都重新截断引入误差累积(定点误差分析见进阶 定点 DSP 设计)。
另一类常见问题是「想省资源把乘法位宽截得太短」,系数只保留几位后滤波器频响变形、量化噪声上升。位宽裁剪要在算法精度预算内做,而不是凭感觉,先用浮点/高精度模型确定每层允许的误差,再逐级定标。乘法器的输入、乘积、累加、输出各有各的合理位宽,把它们显式画在数据通路图上,比在代码里临时决定要可靠得多。
七、从 MAC 到 FIR、矩阵和卷积:级联阵列
单块 DSP 完成一个 MAC,真实算法靠多块阵列协同,理解几种经典映射就能看懂绝大多数算力型 FPGA 设计。
FIR 滤波器:输出 y(n) 等于各抽头系数 h(i) 乘以延迟样本 x(n-i) 后求和。硬件上用一条样本延迟线(SRL 或 BRAM 组织的移位寄存器)提供并行的各阶样本,系数存 ROM;每个抽头占一块 DSP 完成「乘系数」,各 DSP 的部分积通过 PCOUT/PCIN 级联链逐级相加,链末端输出求和结果。全流水结构下,每个时钟都能吞进一个新样本、吐出一个滤波结果,吞吐等于时钟频率。系数固定时还能利用 DSP 的模式把部分控制固化,进一步省资源(完整实现见进阶 FIR/FFT 实现)。
矩阵乘与卷积:神经网络全连接层是「输入向量 × 权重矩阵」,卷积是滑动窗口内的乘加树,二者底层都是大量并行 MAC。工程上把若干 DSP 组织成脉动阵列或并行乘加阵:权重从 BRAM 排成宽字一次广播给多块 DSP,输入样本沿一个方向流动,部分和沿另一方向级联,每个时钟完成多个 MAC;算力上限大致是「DSP 数量 × 每块每拍 MAC 数 × 时钟频率」,数据供给能力(BRAM 带宽、外部存储)则决定实际利用率。入门小规模实验可以先做 8~16 个 MAC 组成的点积单元,再扩展成阵列(入门项目参考 神经网络加速器)。
复数运算与 FFT:复数乘法 (a+bi)(c+di) 表面要 4 个乘法、2 个加减,借助恒等变形可压到 3 个乘法加更多加法,按 DSP/逻辑资源比价选择;FFT 蝶形单元是一组复数乘加,同样映射到 DSP 阵列,旋转因子存 BRAM。可以看到,信号处理算法的「计算结构」几乎都能翻译成「DSP 阵列 + BRAM 供数 + 流水线寄存器」这一种物理形态,这就是算法与 FPGA 资源之间最核心的对应关系。
八、资源对账:确认乘法真的进了 DSP
写完乘法密集代码,必须像审计 BRAM 一样审计 DSP 落点,否则可能出现「设计以为有几十个硬件乘法器,实际全是 LUT 拼的组合云」。核对流程如下:
- 看综合日志:Vivado 综合过程会打印「Inferring DSP48E1/E2」或具体乘法器推断信息;若看到大量纯加法器/乘法器被综合成 generic multiplier 而无 DSP 推断行,要警觉。
- 看利用率报告:DSPs(DSP48E1/DSP48E2)计数应随乘法器数量合理增加;同时观察 LUT 是否异常暴涨。例如一个含 32 个 16×16 MAC 的设计,期望 DSP 约 32 块(若流水结构共享乘法器则更少),若 DSP 为 0 而 LUT 多了上万,落点完全错误。
- 看时序报告的关键路径:若关键路径穿过由乘法产生的长组合链(起点终点都是普通 FF、中间几十级 LUT),说明乘法没进 DSP 或没打拍;进 DSP 后关键路径应主要是硬块内部路径或输入供给路径。
- 看原理图/层级:综合后的 RTL 原理图里能直接看到 DSP48E1 原语实例,是最直观的确认。
当落点不对时,用「最小乘法器」二分定位:只保留一个 signed 寄存器乘法,确认能进 DSP;逐步加回累加、复位、附加逻辑,找出破坏推断的那一处,比通读代码快得多。资源平衡也很重要:DSP 数量有限且固定成列,有时一个很小的乘法占用一块 DSP 不划算(比如 ×3、×10 这类常数乘),工具用移位加只需几个 LUT,让它自动选择即可;而当 LUT 紧张、DSP 富余时,可以用属性把部分加法/累加也压进 DSP。不要教条地「凡乘法必 DSP」,以全局利用率和频率目标为准(面积权衡见 资源利用率)。
九、流水线与吞吐:让 DSP 阵列跑满
DSP48 的价值要在流水化后才能完全兑现。单级乘法器若输入和输出都不寄存,频率受限于乘法器全部组合延迟(可能只有几十兆赫);按「输入寄存、乘积寄存、累加/输出寄存」切成三级后,每级路径短,可以跑到器件标称高频。代价是结果延迟(latency)增加两三拍,但对于逐样本流处理(滤波、卷积、调制解调),延迟固定且不影响吞吐——每拍仍能吃一个新数据,这正是流处理的标准权衡(流水线原理见 时序优化)。
阵列级流水要保证各抽头、各数据路的延迟对齐:FIR 中级联求和链每加一块 DSP 都多一拍,样本延迟线和系数供给就要插入对应数量的寄存器使参与同一求和的数据属于同一时刻;矩阵阵列中数据、权重、部分和三路流水也要等长。valid/ready 或 tvalid 这类有效信号要和数据一起打相同拍数(「valid 随数据走」),否则会出现数据对了但有效标志错位。这类「延迟平衡」是 DSP 数据通路工程的主要手工活,建议在设计文档里画一张表格,逐行列出每路信号在每一级的位置。
复位策略上,数据寄存器尽量不复位(见 时钟与复位),把复位留给状态机和累加清零;需要周期清空累加器时用 DSP 的同步清除/使能功能,而不是异步复位。系数存储配合 BRAM:深系数表用 BRAM、短表用分布式 ROM,系数位宽按精度分析确定,避免无谓占满 DSP 的 25×18 输入。
十、自查清单与练习
- 所有乘法操作数为 signed 或明确无符号配置,位宽与乘积扩展在设计文档中可追溯;
- 乘法器输入、乘积、累加三级寄存器齐备,累加器位宽按「乘积 + log2(累加次数)」计算;
- 数据通路不使用异步复位,清零走同步使能;
- 综合日志明确报出 DSP 推断,利用率报告中 DSP 数量符合预期,LUT 无异常增长;
- 多块 DSP 的级联结构规整(累加链/部分和链),系数和样本供给延迟对齐;
- 常数乘、窄乘是否用 LUT 是经过资源比价的决定,而非意外;
- Testbench 覆盖最大输入、负负相乘、连续累加溢出边界、流水线排空与填充;
- 关键路径不落在乘法组合云上,目标频率下 WNS 为正。
练习路径:先写一个带三级流水的 16×16 有符号乘法,综合后在原理图里找到 DSP48 原语,记录资源和最高频率;再改成 MAC 累加器,用 Testbench 验证 1024 次累加并故意缩窄累加位宽观察溢出;接着做一个 8 抽头 FIR:样本移位寄存器、系数 ROM、8 块 DSP 级联求和,对比算法模型给出的输出;最后把乘法改成无符号、加异步复位、去掉打拍,逐项观察综合结果如何从 DSP 退化成 LUT。走完这条线,你会真正理解「资源推断」不是玄学,而是代码模式与硅片硬块之间的精确对话——FPGA 的信号处理和 AI 算力,就是在这场对话中一块块 DSP 被有效利用起来的。
十一、DSP48 还能做什么:不只是乘法
理解一个 DSP48 的通用表达式有助于写出更聪明的结构:它的输出大致是「加/减法器(乘法结果或 A 输入)±(C 常数或级联输入)」,并可配合模式位做逻辑运算、位宽拼接、宽加法。因此除了乘法和 MAC,它还常被用于:
- 宽加法/累加计数器:48 位加法器配合进位,可以做高频大位宽计数器、地址发生器、相位累加器(DDS 直接数字频率合成的核心);
- 乘法后加减常数:缩放加偏置,例如神经网络激活前的 affine 运算 y = scale·x + bias,可在一块 DSP 内完成;
- 三输入求和、求和树:利用加法端把多个部分积组织到一起,配合级联链搭加法树,减少 LUT 进位链压力;
- 移位、掩码、模式检测:模式检测单元可比较结果是否等于某常数(常用来做模回卷、计数器到标志),省一个外部比较器;
- 多路选择与预加:部分系列内置预加器,适合 FIR 中对称系数「先加后乘」的优化,一块 DSP 可处理两个抽头,乘法器数量减半。
写这些结构时,仍然遵循「signed/打拍/不异步复位/结构规整」的规则,工具会把它们识别进 DSP;过于花哨、用一条语句混合乘除取模移位的写法反而会让推断失败。做架构设计时先问一句「这块 DSP 的加法端和级联端口还能不能顺便用上」,往往能显著节省 LUT 并提高频率。
十二、除法、开方与超越函数:DSP 之外
需要清醒认识 DSP48 的边界:它不包含除法器。代码里出现 / 或 % 且除数是变量时,综合器会用长序列比较减法、LUT 进位链搭出一个慢而大的迭代除法器,时序和资源都很差;常数除法会被优化成乘倒数加移位,通常较省。工程中处理除法的策略有:
- 尽量转化为常数乘法:定点设计里除以已知数等于乘以预先定点化的倒数,一次乘法进 DSP 解决(这也是 定点数方法 的核心收益);
- 用 IP 核:厂商除法器 IP 可配置成多周期(省资源、慢)或流水式(快、占资源),按吞吐需求选;
- 自己做多周期除法 FSM:每位若干拍做移位减法,资源极少、延迟长,适合偶尔算一次的配置类运算;
- 牛顿迭代、查表加插值:开方、倒数、sin/cos 等超越函数用「小表 + 几次乘加」实现,乘加全部交给 DSP,是高性能信号处理的常见做法。
因此系统设计阶段要尽量让数据通路「乘加密集、少用真除法」,把不可避免的复杂运算隔离到少数模块并明确其多周期时序。判断一段算法是否适合 FPGA,很大程度就是看它能不能被重写成以乘法、加法、查表、延迟线为主的结构——能,就正好落在 DSP + BRAM + 流水寄存器的舒适区;不能,就要在算法层面做变换或考虑软件配合。把这一判断和前面的存储选型、时钟复位纪律结合起来,你已经具备了把一个信号处理或推理算法搬进 FPGA 的基础架构眼光。
十三、乘法器位宽、时序与流水级的工程权衡
用 DSP 做乘法看似一句 a*b 就够了,但要让它跑得又快又省,必须理解位宽、寄存器(流水级)和时序之间的三角关系。第一是位宽决定占用几个 DSP。一个 DSP 单元的乘法器有原生位宽上限(如 25×18),当乘法位数不超过它时,一句乘法映射成一个 DSP;超过后,综合器要把大乘法拆成多个部分积、用多个 DSP 加加法树拼起来。例如 32×32 可能要消耗 4 个左右 DSP,而且拼接出的加法逻辑会拉长组合路径。有符号与无符号、输入端的符号扩展也会影响最终位宽。因此设计数据通路时应"按需定位宽":在满足精度和动态范围的前提下用最小的位宽,这直接关系 DSP 数量,而不是一律用 32 位图省事。乘积位宽则是两输入位宽之和(无符号),累加还要再加 log2(累加次数) 位来容纳增长,截高位还是截低位、在哪里舍入,都要在定点预算里定好。
第二是流水级决定能跑多快。DSP 内部提供了可选的输入寄存器、乘法器后寄存器和累加/输出寄存器,把它们用上,等价于在长组合路径中间插入触发器,能显著提升可达到的最高频率,代价是结果晚几个周期出来(latency 增加)。一个"裸乘"(输入直接进乘法器、乘积直接出)逻辑级数长、fmax 低;打满流水寄存器后,每一级只承担一小段延迟,可以跑到数百 MHz。综合属性(如 DSP48 的 pipeline 风格、mult_style)和你在 RTL 里手动写的流水线寄存器共同决定最终级数。工程上的权衡是:控制环、反馈很强的算法(IIR、锁相环)对延迟敏感,流水级不能太多,否则相位/稳定度受影响,可能只能降频;而 FIR、FFT、矩阵乘这类前馈、数据持续流入的结构,几乎可以放心打满流水,用延迟换吞吐和频率。第三是确认推断结果:综合后看资源报告里 DSP48 列的数字是否与你的手算一致,再看时序报告里穿过乘法器的路径是不是关键路径;若乘法没用 DSP 而用 LUT 拼(通常因为位宽不匹配、写了复位、或属性设成了逻辑实现),几百个 LUT 会被一个乘法吃掉且时序很差。养成"位宽→DSP 个数、流水级→fmax/latency、报告→是否真上 DSP"这三步联查的习惯,就把 DSP 从"能算出数"提升到了"算得快、算得省、时序过得了"的工程水平。
十四、DSP、BRAM 与数据通路:以 FIR 为例串起来
单独的乘法器只是原料,真实算法加速器是把大量 DSP、BRAM 和控制逻辑组织成一条数据通路,用一个贯穿性的例子——FIR 滤波器——最能看清这些资源如何协同。FIR 的每一步输出,是当前和过去若干个输入采样分别乘以各自系数、再全部相加:y = Σ c[i]·x[n-i]。这一句里同时出现三类资源:首先要"记住过去的输入",这是一条移位寄存器(抽头延迟线),规模大时用 BRAM 或分布式 RAM 实现;系数 c[i] 通常不变,放进 ROM(BRAM 初始化)或分布式常量表;最核心的乘累加由一串 DSP 完成。结构选择直接决定资源与性能。直接型把每个抽头的乘法结果送进一条加法链,结构简单但加法链长、高速时要在中间插流水寄存器,延迟随阶数增长;转置型让输入广播给所有乘法器、乘积在寄存器之间逐级累加,天然适合流水、跑高频更容易,是 FPGA 上高速 FIR 的常见选择。
这个例子把前面散落的知识点一次性串了起来。其一是吞吐与复用的权衡:若采样率远低于时钟频率,可以用一个 DSP 时分复用、按节拍依次算多个抽头再累加(省 DSP、需要更高内部时钟和调度 FSM);若要线速处理高采样率,则每个抽头配一个或多个 DSP 全并行(费 DSP、延迟低)。同一个数学表达式,资源方案可以相差十倍,这正是 FPGA 架构设计的核心决策。其二是存储与计算的配合:抽头延迟线用 BRAM 还是分布式 RAM、系数表放哪、部分和用多少级寄存器缓存,决定了 DSP 能不能每个周期都吃到数据——若数据供不上,再多乘法器也空转,这与神经网络加速器"搬运与计算平衡"的道理完全一致。其三是位宽与精度链:输入、系数、乘积、累加器逐级增长,要在定点设计阶段就规划好每级位宽和截位/舍入策略,否则要么溢出、要么浪费 DSP。其四是控制与数据分离:采样输入、系数加载、复位、valid/ready 握手由小 FSM 控制,重的运算全部留在由 DSP 和寄存器组成的数据通路里。学会用"需要多少乘法、多少存储、什么频率、数据怎么流进来又怎么流出去"四个问题去拆解一个算法,你就掌握了从数学公式到 FPGA 实现的通用路径——FIR 如此,FFT 的蝶形运算、矩阵乘法、数字下变频、电机控制里的 Clarke/Park 变换同理,都是 DSP 阵列、片上存储、流水与状态机的有序组合。
常见坑对照
| 坑 | 后果 | 正确做法 |
|---|---|---|
| 大量乘法用 LUT | LUT 爆、频率低 | 让工具推断 DSP48 |
| 无符号/不打拍 | 可能不进 DSP | signed + 寄存器打拍 |
| 数据通路加异步复位 | 映射受阻 | 同步复位/不复位 |
| 累加位宽不够 | 溢出 | acc 位宽放宽 |
| 不看资源报告 | DSP 闲置不自知 | 查 DSP48 使用率 |
| 系数用变量乱跳 | 难级联 | FIR 系数放 ROM、用 cascade |
相关与延伸
入门:LUT 与 FF 深入(进位链)、BRAM vs 分布式 RAM(系数/数据存储)、神经网络与 FPGA。 深入:进阶 DSP48 与算术(乘加/FIR/推断/级联)、定点 DSP 设计、FIR/FFT 实现。
一句话总结
DSP48 是 FPGA 里的专用算术硬块:一块内含 25×18 有符号乘法器 + 48 位加/累加器 + 专用级联线,一个时钟周期完成一次乘加 MAC,还不占 LUT/FF——FIR、FFT、矩阵乘、CNN 卷积全靠它。用 LUT 搭乘法器规模 O(N²)、几百上千 LUT 还慢,所以算术密集逻辑务必让综合器推断 DSP48:用 signed 有符号乘法、位宽在 25×18 内(超了自动级联)、输入输出打拍、写成 acc<=acc+a*b 乘加结构、数据通路别加异步复位;写好后看 Utilization 报告的 DSP48E1/E2 计数对账。推不出 DSP 的常见原因是常数/很窄乘法被优化成移位加、乘除混算被拆散、异步复位挡路——这时 DSP 闲置而 LUT 暴涨、时序变差。FPGA 的信号处理/AI 算力基本由 DSP48 数量×频率决定,BRAM 负责喂数据。
上一篇:30 BRAM vs 分布式 RAM(ram_style/推断) | 下一篇:32 IP 核怎么调(IP Catalog/例化/OOC) | FPGA 系列目录