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%。
咱们画个图,把存储阵列的结构看清楚:
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 小结:记住这三件事
这一节内容不少,但核心就三件事:
- SDRAM vs DDR:双边沿传输,带宽翻倍
- Bank结构:多个Bank并行工作,用Bank交错提升效率
- 突发传输+预取:一次读一串,内部多读慢吐,外部快收
嗯,这些概念后面写代码的时候会反复用到。你现在理解了,后面看代码就不会懵。
可可精品资料库