DRAM子系统
所谓的DRAM子系统,它由三个部分组成:
• DRAM存储器本身,包括上述的所有内容
• DDR PHY物理层
• DDR控制器

上面的图片中发生了很多事件,所以让我们把它分解一下:
• DRAM 被焊接在板上。 PHY 和控制器以及用户逻辑通常是同一 FPGA 或 ASIC 的一部分。
• 用户逻辑和控制器之间的接口可以是用户定义的,不需要是标准的。
• 当用户逻辑向控制器发出读或写请求时,它会发出一个逻辑地址
• 然后控制器将此逻辑地址转换为物理地址并向 PHY 发出命令。
• 控制器和 PHY 通过称为 DFI 接口的标准接口相互通信。你可以从这里下载DFI的规范。
• 然后,PHY完成所有低级别的信令,并将物理接口驱动到 DRAM。
• JEDEC标准中规定了PHY和存储器之间的这种接口。JESD79-49B specification
将控制器视为大脑,将 PHY 视为肌肉。
• 当你激活一个行时,整个页面会被加载到Sense Amps中,所以对一个已经打开的页面进行多次读取,成本较低,因为你可以跳过激活行的第一步。控制器通常有能力对用户发出的请求重新排序,以利用这一优势。为了进行重新排序,它使用了一个小的缓存或TCAM,并总是返回最新的数据,所以你不必担心陈旧的数据或由于控制器的重新排序而发生的碰撞
• PHY包含模拟驱动器,并提供调整寄存器的能力,以增加驱动强度或变更终止,以改善信号完整性。
概括地说
我们来总结一下:
• DRAM包含Bank Groups, Bank, Row & Columns。
• 用户发出的地址被称为逻辑地址,并由DRAM控制器将其转换为物理地址,然后提交给DRAM。
• 根据DQ数据总线的宽度,DDR4 DRAM被分为x4、x8或x16。
• 可以通过深度级联或宽度级联 DRAM 以达到所需的大小。
• 读取和写入操作是一个两步过程。第一步激活一行,第二步读取或写入内存
• DRAM子系统由存储器、PHY层和控制器组成。
C语言访问数据的完整过程
CPU要访问“64”这个数据在DRAM里的所存放的物理地址,详细步骤是什么
int i = 64; //0x00000040 (32)
假设以下场景:
数据”64”(32位整数0x00000040)存储在物理地址0x80001234
系统使用DDR4内存,单通道,无ECC
CPU是ARM Cortex-A系列
流程:
CPU执行指令 → 虚拟地址转换 → 缓存查找 → 内存控制器 → DRAM命令 → Bank激活 → 数据读取 → 返回CPU
阶段1:CPU执行指令
;假设程序执行以下指令
LDR R0, [R1] ; R1 = 0x80001234 (虚拟地址)
; 指令含义:从内存地址R1处加载32位数据到R0
; 在CPU流水线中的阶段:
1. 取指(Fetch):获取LDR指令
2. 译码(Decode):识别是加载指令
3. 执行(Execute):计算地址 0x80001234
4. 内存访问(Memory):访问该地址
5. 写回(Writeback):结果写入R0
此时:CPU知道要访问虚拟地址0x80001234。
阶段2:虚拟地址到物理地址转换
此时:虚拟地址0x80001234 → 物理地址0x80000234
阶段3:缓存查找(L1/L2/L3)
假设场景:所有缓存都未命中(最坏情况),必须访问DRAM。
阶段4:内存控制器处理
物理地址0x80000234映射到:
- Bank组0, Bank 0
- 行地址 0x0000
- 列地址 0x46 (列地址0x23,但考虑突发长度后需要调整)
- 数据总线的字节通道4(因为是地址0x234,字节偏移4)
阶段5:DRAM芯片内部操作
发送DRAM命令序列
1.PRECHARGE命令
- 位线(BL)充电到VREF (0.6V)
- 所有字线(WL)关闭
- Bank 0准备接受新行
2.ACTIVATE命令
- 解码行地址0x0000
- 打开字线WL0(第0行)
- 整行1024个存储单元连接到位线
- 发生电荷共享:30fF电容 ↔ 300fF位线
- 位线电压微小变化:±50mV
- 读出放大器检测差异,放大到全摆幅
- 整行8192位(1024字节)复制到行缓冲器
3.READ命令
- 解码列地址0x46
- 选择列选择线CSL46
- 从行缓冲器读取列46-53共8列数据
- 通过8个DQ引脚输出(因为x8配置)
- 突发传输8个时钟周期
阶段6:数据返回路径
步骤6.1:从DQ引脚到内存控制器
物理信号路径:
DRAM芯片DQ引脚 → PCB走线 → SoC封装引脚 →
SoC内部走线 → DDR PHY接收器 →
数据采样(根据DQS选通信号) →
去偏移(Deskew)处理 → 串并转换 →
64位数据总线 → 内存控制器数据缓冲区
步骤6.2:内存控制器数据处理
1. ECC校验(如果启用)
2. 提取所需字节
3. 32位组装(如果读取的是32位整数)
4. 返回给CPU
阶段7:CPU接收数据
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 351134995@qq.com