3、DDR存储器基础:DDR3/DDR4/DDR5的区别、SDRAM内部Bank结构、读写时序与突发传输
做FPGA和DDR的协同设计,说白了就是跟时间赛跑。你想想看,FPGA处理数据的速度越来越快,但DDR的协议却越来越复杂。我刚开始接触DDR3的时候,总觉得不就是个存储器嘛,能有多难?结果第一次调时序,板子死活跑不起来,折腾了整整三天才发现是Bank冲突没处理好。从那以后,我就养成了一个习惯——先吃透DDR的底层结构,再动手写代码。
3.1 DDR3/DDR4/DDR5:三代同堂,差异在哪?
先说说这三代DDR的区别。我个人习惯把它们比作三代交通工具:DDR3是绿皮火车,稳定但慢;DDR4是高铁,速度快了不少;DDR5就是磁悬浮,快得离谱但规矩也多。
| 参数 | DDR3 | DDR4 | DDR5 |
|---|---|---|---|
| 数据速率 | 800~2133 MT/s | 1600~3200 MT/s | 4800~8400 MT/s |
| 工作电压 | 1.5V | 1.2V | 1.1V |
| 预取宽度 | 8n | 8n | 16n |
| Bank数量 | 8 | 16 | 32 |
| 突发长度 | 8 | 8 | 16 |
| 片内终结(ODT) | 支持 | 更精细 | 动态ODT |
关键点:DDR5的预取宽度翻倍到16n,这意味着内部核心频率可以更低,但数据吞吐量却翻倍了。嗯,这里要注意——DDR5的突发长度也变成了16,跟DDR3/4的8不一样,这对FPGA的控制器设计影响很大。
我在项目中遇到过一个问题:用DDR4的控制器IP去接DDR5颗粒,结果死活初始化不成功。后来查手册才发现,DDR5的MRS(模式寄存器)命令格式跟DDR4完全不同,连地址映射都变了。所以,千万别想着兼容设计,老老实实按规格来。
3.2 SDRAM内部Bank结构:为什么要有Bank?
DDR内部其实是个二维矩阵——行和列。但光有行和列还不够,因为每次读写都要先激活行(ACTIVATE),然后才能读写列。如果只有一个矩阵,那连续访问不同行的时候,就得先预充电(PRECHARGE)再激活,效率极低。
所以,设计者把内部划分成了多个Bank。每个Bank都有自己的行缓冲(Row Buffer)。你想想看,如果Bank0正在读某一行,Bank1可以同时激活另一行,这样就能流水线操作了。
我的经验:在FPGA里做DDR控制器时,Bank管理是性能优化的关键。我曾经用过一个简单的轮询调度算法,结果因为Bank冲突太多,实际带宽只有理论值的40%。后来改成了Bank感知调度,把同一Bank的请求尽量合并,带宽直接翻倍。
DDR3有8个Bank,DDR4翻倍到16个,DDR5更是到了32个。Bank越多,并行度越高,但控制逻辑也越复杂。说白了,这就是用复杂度换性能。
3.3 读写时序:那些你必须记住的参数
DDR的时序参数多得像天书,但真正关键的其实就那么几个。我个人习惯把它们分成三类:
- 激活相关:tRCD(行到列延迟)、tRP(预充电时间)、tRAS(行激活时间)
- 读写相关:tCL(CAS延迟)、tWR(写恢复时间)、tWTR(写到读延迟)
- 刷新相关:tRFC(刷新周期)、tREFI(刷新间隔)
举个例子,DDR3-1600的典型时序是CL=11,tRCD=11,tRP=11。而DDR4-3200通常是CL=22,tRCD=22,tRP=22。你可能会问:为什么DDR4的延迟数字反而大了?其实是因为时钟周期变短了,换算成时间,DDR4反而更快。
避坑指南:我曾经在调试时发现,DDR的读写数据总是错位。查了半天,原来是tCL设置错了。FPGA的DDR控制器里,tCL通常要转换成FPGA时钟域的周期数,这个转换很容易出错。我的建议是:先用仿真把时序参数换算好,再写寄存器配置。
3.4 突发传输:为什么一次读8个数据?
突发传输是DDR的核心机制。说白了,就是一次命令,连续传输多个数据。DDR3/4的突发长度固定为8,DDR5变成了16。
为什么会这样?因为DDR内部的核心频率比I/O频率低得多。DDR3的核心频率只有I/O频率的1/8,所以一次突发正好把预取的数据全部送出去。DDR5的核心频率更低,只有I/O的1/16,所以突发长度也翻倍了。
在FPGA里,突发传输意味着你不需要为每个数据都发送命令。比如你要读64字节的数据,DDR3只需要发一次读命令,然后连续接收8个64位数据(假设数据位宽64位)。这比一次读一个字节效率高太多了。
实战要点:FPGA的DDR控制器通常支持可编程的突发长度。但要注意,有些控制器要求突发长度必须跟DDR颗粒的配置一致。我见过有人把控制器设成突发长度4,但DDR颗粒是8,结果数据顺序全乱了。
3.5 知识体系总览
下面这张图是我自己总结的DDR知识体系,涵盖了从颗粒特性到FPGA控制的完整链路。你可以把它当作学习路线图。
这张图把DDR知识分成了三层:颗粒特性是基础,FPGA控制器是核心,系统集成是实战。我个人建议你按照这个顺序来学习,先搞懂DDR本身,再研究控制器怎么设计,最后才是系统级的调试和优化。
一个小技巧:刚开始学DDR的时候,别急着看那些几百页的JEDEC标准文档。先找一颗具体的DDR颗粒,比如MT41K256M16(DDR3),把它的数据手册通读一遍。我当年就是这么干的,读完之后再看标准文档,感觉豁然开朗。
好了,这一章的内容就到这里。DDR的基础知识其实不难,难的是把理论跟FPGA的实际设计结合起来。下一章我们会深入DDR控制器的RTL设计,到时候我会分享一些具体的代码和仿真波形。