2. DDR基础概念:SDRAM vs DDR、DDR的存储阵列与Bank结构、突发传输与预取机制

好,咱们正式开始聊DDR。这一节是地基,地基不牢,后面写代码会各种踩坑。我个人习惯是把DDR当成一个「有脾气」的存储仓库来理解。你摸清了它的脾气,它就能给你高效干活。

2.1 SDRAM vs DDR:从单车道到双车道

先说说SDRAM和DDR的区别。说白了,SDRAM是「单边沿」干活,DDR是「双边沿」干活。

SDRAM,全称Synchronous Dynamic Random Access Memory。它只在时钟的上升沿传输数据。你想想看,一个时钟周期里,上升沿干活,下降沿闲着。这不浪费吗?

DDR就不一样了。DDR全称Double Data Rate SDRAM。它能在时钟的上升沿和下降沿都传输数据。同样的时钟频率,DDR的带宽直接翻倍。

核心区别一句话:

  • SDRAM:一个时钟周期传1笔数据
  • DDR:一个时钟周期传2笔数据

我在项目中遇到过有人把DDR当SDRAM用,只用了上升沿。结果带宽少了一半,图像数据根本刷不过来。嗯,后来查了半天才发现是控制器配置错了。

咱们用个表格对比一下:

特性 SDRAM DDR
数据传输边沿 仅上升沿 上升沿+下降沿
等效频率 等于时钟频率 2倍时钟频率
预取位数 1n(1倍) 2n(2倍)
典型应用 老式嵌入式系统 图像缓存、高速数据采集

你可能会问:「那DDR2、DDR3、DDR4呢?」它们本质还是DDR,只是预取位数和频率越来越高。DDR2是4n预取,DDR3是8n预取。但核心思想没变——双边沿传输。

2.2 存储阵列与Bank结构:仓库里的货架

DDR内部是怎么存数据的?我习惯把它想象成一个大型仓库。

仓库里有很多排货架,每排货架叫一个Bank。每个Bank里有很多行(Row)和列(Column)。你要取一个数据,得先告诉仓库管理员:去第几排(Bank),第几行(Row),第几列(Column)。

为什么要有多个Bank?

因为DDR有个特点:当你访问完一行后,要切换到另一行,需要先「预充电」(Precharge),再「激活」(Activate)。这个过程很耗时。如果有多个Bank,你可以在一个Bank预充电的时候,去访问另一个Bank。这叫Bank交错。

我的经验:在图像缓存场景中,尽量把不同帧的数据放在不同Bank里。这样切换帧的时候,Bank交错能帮你省下不少等待时间。我曾经在1080p60的项目里,靠这个技巧把带宽利用率从60%提到了85%。

咱们画个图,把存储阵列的结构看清楚:

DDR存储阵列结构示意图 Bank 0 Row 0 Row 1 Row 2 ... Row N Bank 1 Row 0 Row 1 Row 2 ... Row N Bank 2 Row 0 Row 1 Row 2 ... Row N Bank 3 Row 0 Row 1 Row 2 ... Row N 每个Bank内部:行(Row) × 列(Column) 构成存储矩阵 数据通路 Bank 0~3 → 行缓冲(Row Buffer) → 列选择 → 数据输出 Bank交错:访问Bank0时,可预充电Bank1,减少等待时间

2.3 突发传输:一次取一串,别一个一个拿

DDR有个特性叫突发传输(Burst Transfer)。什么意思呢?

你给DDR一个起始地址,告诉它「我要连续读8个数据」。DDR就会一口气把这8个数据吐出来,中间不需要你反复发地址。这比一个一个读快多了。

为什么DDR要这么设计?

因为DDR每次访问都有固定的开销——激活行、预充电、列选通。这些开销是固定的。如果你只读一个数据,这些开销就摊在1个数据上,效率很低。如果你一次读8个,开销摊在8个数据上,效率就高了。

突发长度(Burst Length, BL):DDR3/DDR4通常支持BL=8。也就是说,一次突发传输,连续读8个数据。

在图像缓存中,这个特性特别有用。你想,一行图像数据在内存里是连续存放的。你读一行图像,正好可以用一次突发传输搞定。我做过一个项目,有人把每个像素单独读,结果DDR带宽利用率不到20%。改成突发传输后,直接飙到90%。

2.4 预取机制:内部偷偷多干活

预取(Prefetch)是DDR能跑得快的关键。说白了,就是DDR内部一次读多个数据,然后慢慢往外吐。

举个例子:DDR3的预取是8n。意思是,DDR3内部存储阵列一次读8个数据,然后通过双边沿传输,分4个时钟周期吐出去。

你想想看,内部存储阵列的工作频率其实不高,但通过预取+双边沿,等效输出频率就上去了。这就是DDR的「内功心法」。

DDR类型 预取位数 内部频率 : 外部频率 典型应用
DDR 2n 1:2 老系统、低带宽需求
DDR2 4n 1:4 中端嵌入式
DDR3 8n 1:8 图像处理、视频缓存
DDR4 8n 1:8 高性能计算、4K/8K视频

避坑指南:我曾经在DDR3控制器里配错了预取模式,把BL=8配成了BL=4。结果图像数据读出来全是错位的。查了两天才发现,预取和突发长度必须匹配。DDR3的8n预取,必须配BL=8。你配BL=4,内部读8个数据,外面只取4个,剩下的就丢了。

2.5 小结:记住这三件事

这一节内容不少,但核心就三件事:

  1. SDRAM vs DDR:双边沿传输,带宽翻倍
  2. Bank结构:多个Bank并行工作,用Bank交错提升效率
  3. 突发传输+预取:一次读一串,内部多读慢吐,外部快收

嗯,这些概念后面写代码的时候会反复用到。你现在理解了,后面看代码就不会懵。

可可精品资料库