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的时序参数多得像天书,但真正关键的其实就那么几个。我个人习惯把它们分成三类:

  1. 激活相关:tRCD(行到列延迟)、tRP(预充电时间)、tRAS(行激活时间)
  2. 读写相关:tCL(CAS延迟)、tWR(写恢复时间)、tWTR(写到读延迟)
  3. 刷新相关: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存储器知识体系 DDR颗粒特性 DDR3/4/5区别 Bank结构 时序参数 突发传输 FPGA DDR控制器设计 初始化序列 命令调度 数据通路 时序校准 系统集成与验证 带宽分析 信号完整性 调试技巧

这张图把DDR知识分成了三层:颗粒特性是基础,FPGA控制器是核心,系统集成是实战。我个人建议你按照这个顺序来学习,先搞懂DDR本身,再研究控制器怎么设计,最后才是系统级的调试和优化。

一个小技巧:刚开始学DDR的时候,别急着看那些几百页的JEDEC标准文档。先找一颗具体的DDR颗粒,比如MT41K256M16(DDR3),把它的数据手册通读一遍。我当年就是这么干的,读完之后再看标准文档,感觉豁然开朗。

好了,这一章的内容就到这里。DDR的基础知识其实不难,难的是把理论跟FPGA的实际设计结合起来。下一章我们会深入DDR控制器的RTL设计,到时候我会分享一些具体的代码和仿真波形。

可可精品资料库