FPGA 进阶(03):常用 IP 核——PLL、BRAM、FIFO、DSP48、SerDes、DDR 控制器
更新时间:2026-09-02。本文是
fpga/FPGA 领域第 03 篇,接 Verilog 设计基础。IP 核是 FPGA 厂商预置的硬件模块,比用 LUT 实现更高效、更可靠。用好 IP 核,比纯手写逻辑更重要。
本文要回答的问题
- PLL 怎么生成多路时钟?相位和频率可以调吗?
- BRAM 怎么配置成 FIFO?FIFO 的满空信号怎么用?
- DSP48 做乘加比 LUT 快多少?怎么用?
- SerDes 是什么?高速串行接口怎么工作?
- DDR 控制器为什么复杂?FPGA 怎么接 DDR?
一、PLL(锁相环)——时钟管理
PLL 功能:
输入:一个参考时钟
输出:多个不同频率/相位的时钟
PLL 架构:
Ref Clock → 相位检测 → 环路滤波 → VCO → 分频 → 输出时钟
↑ │
└──────── 反馈 ────────────┘
PLL 能做到:
- 频率合成:倍频、分频
- 相位调整:0°、90°、180°、270°
- 占空比调整
- 时钟整形PLL 使用示例:
verilog
// VHDL 式例化(Xilinx MMCM)
clk_wiz_0 u_clk_wiz (
.clk_in1 (sys_clk_100M), // 输入 100 MHz
.clk_out1 (clk_200M), // 输出 200 MHz
.clk_out2 (clk_100M), // 输出 100 MHz
.clk_out3 (clk_50M), // 输出 50 MHz
.clk_out4 (clk_200M_90), // 输出 200 MHz,相位偏移 90°
.locked (pll_locked) // PLL 锁定指示
);PLL 注意事项:
- 上电后 PLL 需要锁定时间(ms 级)
- 必须等
pll_locked拉高后才用输出时钟 - 输出时钟频率有范围限制(VCO 频率范围)
- 抖动:PLL 输出有抖动,高频场景要注意
二、BRAM——块内存
BRAM 配置模式:
- 单端口 RAM:一个端口读写
- 简单双端口:一个端口写,一个端口读
- 真双端口:两个端口都可以读写
配置参数:
- 位宽:1-36 bit
- 深度:最大 32K(36Kb)
- 时钟模式:同钟/异钟
- 读模式:读优先/写优先
BRAM 初始化:
- 可以加载初始化数据(.coe 文件或 hex)
- 用于 ROM 查找表、系数表BRAM vs LUT RAM:
| 对比 | BRAM | LUT RAM(Distributed RAM) |
|---|---|---|
| 容量 | 36 Kb / 块 | 几十 bit / LUT |
| 速度 | 快,专用布线 | 中等,靠 LUT |
| 面积 | 1 块 BRAM 省很多 LUT | 大量 LUT 做 RAM 浪费资源 |
| 场景 | 大容量缓存 | 小容量寄存器组 |
三、FIFO——跨时钟域缓存
FIFO 是 FPGA 最常用的 IP 核之一
FIFO 功能:
- 数据缓冲(速率匹配)
- 跨时钟域同步
- 数据宽度转换
FIFO 信号:
wr_clk, wr_en, din → 写端口
rd_clk, rd_en, dout → 读端口
full, empty → 满空指示
wr_rst, rd_rst → 复位
wr_used, rd_used → 数据量(可选)
FIFO 深度计算:
写入速率 > 读出速率 → 需要 FIFO 缓冲
深度 = 最大写入量 - 最大读出量FIFO 使用注意事项:
- 读之前先检查
empty,不为空再读 - 写之前先检查
full,不为满再写 - 异步 FIFO 已有格雷码指针处理,一般不需要额外跨时钟域处理
- 复位后要等几个时钟周期再开始读写
四、DSP48——数字信号处理
DSP48 核心操作:
P = A * B + C
A 输入:25 bit(有符号)
B 输入:18 bit(有符号)
C 输入:48 bit(累加结果)
P 输出:48 bit
DSP48 可以配置为:
- 乘法器:P = A * B
- 乘加器:P = P + A * B
- 累加器:P = P + C
- 加法器:P = A + C
- 移位器:P = A << BDSP48 效率对比:
8x8 乘法:
LUT 实现:约 100 LUT,5 ns 延迟
DSP48 实现:1 个 DSP48,2 ns 延迟
16x16 乘法:
LUT 实现:约 300 LUT,8 ns 延迟
DSP48 实现:1 个 DSP48,3 ns 延迟
结论:用 DSP48 省 10 倍 LUT,快 2-3 倍什么时候用 DSP48:
- 数字滤波(FIR、IIR)
- FFT 蝶形运算
- 矩阵乘法
- 图像处理(卷积)
- 任何乘法运算
五、SerDes——高速串行接口
SerDes = Serializer / Deserializer
为什么需要 SerDes:
并行接口:位宽大,速度受限(100-200 MHz 极限)
串行接口:速度高(Gbps),线少
SerDes 架构:
发送:并行数据 → 串行化 → 差分对输出
接收:差分对输入 → 时钟恢复 → 解串行 → 并行数据
FPGA 中 SerDes 通常集成在 GTX/GTH 收发器中:
GTX:12.5 Gbps
GTH:13.1 Gbps
GTY:30 Gbps(Virtex 高端)SerDes 应用:
- PCIe(2.5/5/8/16 Gbps)
- Ethernet(1G/10G/25G/100G)
- SATA(1.5/3/6 Gbps)
- SRIO(1.25/2.5/3.125 Gbps)
- Aurora(自定义协议)
- JESD204B(ADC/DAC 接口)
六、DDR 控制器
DDR 控制器是 FPGA 最复杂的 IP 核之一
DDR 控制器组成:
1. PHY 层:物理接口,DDR 信号电平、时序
2. 控制器层:读/写命令调度
3. 用户接口层:AXI / 其他协议
DDR 带宽计算:
DDR3-1600,64 bit 位宽:
带宽 = 1600 MHz × 64 bit / 8 = 12.8 GB/s
DDR 效率:
理论带宽很高,但实际效率取决于访问模式
顺序访问:效率 80-90%
随机访问:效率 20-40%
行切换频繁 → 效率急剧下降MIG(Xilinx Memory Interface Generator)配置:
- 选择 DDR3/DDR4/LPDDR
- 配置时钟频率、位宽、Bank 数量
- 生成 HDL 代码 + 约束文件
- 接口:AXI4 或 Native
七、IP 核使用原则
1. 能用 IP 核尽量用
比手写高效、可靠、省资源
2. 理解 IP 核的参数
不理解参数含义,配置可能出错
3. 注意 IP 核的时序约束
IP 核生成时会自动生成约束
但外部接口的约束还要自己写
4. 不要重新造轮子
FIFO、PLL、BRAM 这些 IP 核已经很成熟
手写大概率不如 IP 核相关与延伸
下一篇:时序约束与收敛——create_clock、set_input_delay、set_output_delay;FPGA 架构,见 FPGA 架构原理。
一句话总结
FPGA IP 核:PLL 做倍频/分频/相位调整,上电后需等 locked 信号;BRAM 做数据缓存,比 LUT RAM 容量大 1000 倍;FIFO 做跨时钟域缓存,异步 FIFO 自动处理格雷码同步;DSP48 做乘加运算,比 LUT 实现省 10 倍资源、快 2-3 倍;SerDes 做高速串行接口,Gbps 级别;DDR 控制器最复杂,带宽大但随机访问效率低(20-40%);原则:能用 IP 核尽量用,不重新造轮子。