4. DDR读写时序:ACT命令、READ/WRITE命令、预充电、刷新操作
好,咱们今天聊聊DDR读写时序里的几个核心命令。说实话,很多初学者一上来就被DDR的复杂状态机吓住了。我当年也一样,看着时序图密密麻麻的,头都大了。但后来我发现,只要抓住几个关键命令,整个DDR的操作逻辑就清晰了。
DDR的操作,说白了就是三个步骤:激活行、读写列、预充电。再加上一个后台的刷新操作。嗯,就这么简单。咱们一个一个来看。
4.1 ACT命令:激活行
DDR的存储结构是行列矩阵。你要读写数据,得先找到哪一行。ACT命令就是干这个的。
ACT命令会带着行地址(Row Address)和Bank地址。执行后,这一行的数据会被搬到一个叫“行缓冲”的地方。行缓冲说白了就是一个高速缓存,读写操作都在这里进行。
关键时序参数:tRCD
从发出ACT命令到可以发出READ/WRITE命令,中间必须等一段时间。这个时间叫tRCD(RAS to CAS Delay)。
我遇到过不少新手,ACT命令刚发出去,紧接着就发READ命令。结果数据读出来全是错的。为什么?因为行缓冲还没准备好呢。
举个例子,假设tRCD=15ns,你的时钟周期是1.25ns(800MHz),那你就得等12个时钟周期。少一个都不行。
4.2 READ/WRITE命令:读写列
行激活之后,你就可以发READ或WRITE命令了。这两个命令带着列地址(Column Address)和Bank地址。
READ命令发出后,数据不会立刻出现在数据总线上。它需要等一段时间,这个时间叫CL(CAS Latency)。CL是DDR颗粒的一个重要参数,一般会在颗粒的标贴上写着。
个人经验:我习惯在初始化DDR时,先读取SPD信息,确认CL值。有一次我手头没有颗粒手册,直接用了默认的CL值,结果系统跑起来总是不稳定。后来一查,颗粒的CL比默认值大了2个周期。改过来之后,问题就解决了。
WRITE命令呢?它也有个参数叫tWL(Write Latency)。不过tWL通常比CL简单,因为它是从命令发出到第一个数据出现在总线上的时间。嗯,这里要注意,WRITE命令的数据是跟着命令一起发的,不像READ那样要等。
| 命令 | 关键时序参数 | 说明 |
|---|---|---|
| ACT | tRCD | 行激活到读写命令的延迟 |
| READ | CL (CAS Latency) | 读命令到第一个数据输出的延迟 |
| WRITE | tWL (Write Latency) | 写命令到第一个数据输入的延迟 |
4.3 预充电:关闭行
读写操作完成后,你得把当前行关掉,才能去激活另一行。这个关掉行的操作就叫预充电(Precharge)。
预充电有两种方式:
- 自动预充电:在READ/WRITE命令里带一个位,告诉DDR读完/写完这一行后自动关闭。
- 显式预充电:单独发一个PRE命令来关闭行。
我个人习惯用自动预充电。为什么?省事啊。你想想看,如果每次读写都要手动发PRE命令,那控制逻辑就复杂多了。尤其是在做连续读写的时候,自动预充电能省掉不少麻烦。
避坑指南:我曾经在一个项目里,为了追求极致性能,用了显式预充电。结果发现,如果预充电命令发晚了,下一行的ACT命令就得等。这一等,带宽就浪费了。后来我改成自动预充电,虽然每次读写多了一个周期,但整体吞吐量反而上去了。
预充电还有一个重要参数:tRP(Precharge to Activate Delay)。从发出PRE命令到可以发出下一个ACT命令,中间必须等tRP时间。
4.4 刷新操作:保持数据
DDR是动态存储器,它的存储单元是靠电容来保存数据的。电容会漏电,所以你得定期给它们“充电”。这个充电操作就叫刷新(Refresh)。
刷新操作其实就是一个特殊的ACT+PRECHARGE组合。DDR控制器会定期发出REF命令,DDR颗粒内部会自动完成所有行的刷新。
刷新频率是多少?DDR颗粒的规格书里会写。一般要求每64ms刷新所有行一次。如果颗粒有8192行,那平均每7.8μs就要发一次REF命令。
关键点:刷新操作会占用总线时间。在这段时间里,你不能发任何ACT、READ、WRITE命令。所以,刷新会影响DDR的带宽利用率。
我做过一个视频处理的项目,DDR带宽利用率要求很高。刷新操作成了瓶颈。后来我用了“刷新掩蔽”技术,把刷新操作安排在DDR空闲的时候。嗯,效果还不错。
4.5 整体时序流程
咱们把整个流程串起来看看:
- 发ACT命令,激活行(等tRCD)
- 发READ/WRITE命令,读写列(等CL或tWL)
- 数据传输
- 发PRE命令(或自动预充电),关闭行(等tRP)
- 回到步骤1,或者发REF命令进行刷新
下面这张图展示了DDR读写的基本时序流程:
说白了,DDR的时序就是一套严格的“交通规则”。你遵守了,数据就能顺畅流动。你不遵守,数据就堵车,甚至出事故。
我在做FPGA的DDR控制器时,最喜欢用的调试方法就是抓波形。把ACT、READ、WRITE、PRE、REF这几个命令的波形抓出来,看看它们之间的间隔对不对。只要这几个命令的时序对了,DDR基本就稳了。
小技巧:如果你用的是Xilinx的MIG或者Intel的UniPHY,它们会自动处理这些时序。但如果你是自己写控制器,那一定要仔细核对每个时序参数。我建议你先把tRCD、CL、tRP、tRFC这几个参数列出来,然后一条一条地检查你的状态机。
好了,DDR的四个核心命令就讲到这里。记住:ACT激活行,READ/WRITE读写列,PRE关闭行,REF保持数据。把这四个命令搞明白了,DDR读写时序你就掌握了八成。
可可精品资料库