FPGA 如何实现高速数字信号处理
一、CPU 与 FPGA 的计算模型差异
同样是执行 y = a * x + b 这个表达式,CPU 和 FPGA 存在本质区别。
- CPU:取指令 → 取操作数 → 执行乘法 → 存中间结果 → 加法 → 写回内存。这一串动作需要多个时钟周期。
- FPGA:直接构建电路通路——输入 a 和 x 进来,经过物理乘法器,立刻加上 b,输出 y。整个过程在一个时钟周期完成。
FPGA 不是在'运行程序',而是在'构建电路'。它是可编程的硬件。在高速 DSP 场景下,FPGA 的优势在于从根本上改变了计算模型:空间换时间 + 并行流水线 = 实时吞吐的终极武器。
例如做一个 8 阶 FIR 滤波器: $$ y[n] = h_0x[n] + h_1x[n-1] + \cdots + h_7x[n-7] $$
- CPU 要循环 8 次,串行算;
- FPGA 可以实例化 8 个乘法器 + 一棵加法树,所有乘法并行完成,求和也在几级逻辑内搞定。
这就是所谓的'算法即电路'。每一个系数对应一块真实的硬件单元,每一级延迟都是一段实实在在的寄存器链。没有调度开销,没有缓存命中问题,路径完全可控。
二、核心算力:DSP Slice
如果说 LUT 是 FPGA 里的'乐高积木',那么 DSP Slice 就是出厂自带的专用引擎。
现代高端 FPGA(如 Xilinx Kintex/UltraScale、Intel Stratix)都会集成成百上千个 DSP Slice,专为乘加运算优化。它们不是用逻辑单元拼出来的软核,而是固化在硅片上的硬核模块。
| 特性 | 普通 LUT 实现 | DSP Slice |
|---|---|---|
| 乘法速度 | ~100 MHz | >600 MHz |
| 资源消耗 | 数百 LUT+FF | 1 个 Slice |
| 功耗 | 高 | 约 5mW |
| 支持模式 | 基本运算 | MAC、预加、级联、模式检测等 |
举个例子:你想做个复数乘法 $(a+jb)(c+jd)$,需要 4 次实数乘法和一些加减法。如果全靠 LUT 搭建,资源占用大不说,频率还上不去。但很多 DSP Slice 内置了'预加器',可以直接支持复数运算结构,效率翻倍。
Verilog 实战代码
module mac_unit (
input clk,
input rst,
input [24:0] a_data, // 25 位输入
input [17:0] b_data, // 18 位系数
input [47:0] c_data, // 累加输入
output reg [47:0] result
);
wire [47:0] p;
DSP48E1 #( .A_INPUT("DIRECT"), .B_INPUT("DIRECT"), .USE_DPORT("FALSE"), .OPMODE(6'b0001101) ) // A*B + C
dsp_mac (
.CLK(clk),
.A(a_data),
.B(b_data),
.C(c_data),
.P(p),
.RST(rst),
.CEA1(1'b1), .CEA2(1'b1),
.CEB1(1'b1), .CEB2(1'b1),
.CEC(1'b1), .CEP(1'b1)
);
always @(posedge clk) begin
if (rst) result <= 0;
else result <= p;
end
endmodule
重点解读:
OPMODE设置为6'b0001101表示工作在'A × B + C'模式,也就是经典的 MAC 操作;- 所有使能信号拉高,确保连续运行;
- 输出锁存在寄存器中,保证时序收敛。

