1. DDR2/mDDR内存控制器架构解析
在现代嵌入式系统中,内存控制器扮演着处理器与外部存储设备之间的桥梁角色。以TI的DDR2/mDDR控制器为例,其核心功能是将32位逻辑地址转换为物理存储单元的行(row)、列(column)和bank地址。这种转换过程直接影响着内存访问的效率和系统性能。
内存控制器通过数据总线(DDR_DQ[15:0])与16位内存设备通信,采用双倍数据速率技术实现高速数据传输。控制器内部包含命令FIFO、写FIFO和读FIFO,分别用于存储来自片上请求者的命令、写入数据和读取数据。这种架构设计使得控制器能够高效地管理数据流,同时隐藏DDR2/mDDR SDRAM行打开和关闭的开销。
关键提示:DDR2与mDDR的主要区别在于工作电压和功耗特性。mDDR专为移动设备优化,支持部分阵列自刷新等低功耗特性,而DDR2则更注重高性能计算场景。
2. 地址映射机制深度剖析
2.1 常规地址映射模式(IBANKPOS=0)
当SDRAM配置寄存器(SDCR)中的IBANKPOS位清零时,控制器采用常规地址映射模式。这种模式下,行地址位数由内存设备的有效地址引脚数决定,而列地址和bank地址位数则由SDCR寄存器的IBANK和PAGESIZE字段控制。
IBANK字段定义内存设备的内部bank数量:
- 0h: 1个bank
- 1h: 2个bank
- 2h: 4个bank
- 3h: 8个bank
PAGESIZE字段定义每个page的大小:
- 0h: 256字(需要8位列地址)
- 1h: 512字(需要9位列地址)
- 2h: 1024字(需要10位列地址)
- 3h: 2048字(需要11位列地址)
在这种映射模式下,控制器在线性访问时会先递增列地址,当到达page/row边界时,会移动到下一个bank的相同page/row。这种跨bank的访问策略可以最大化激活的bank数量,提高内存访问效率。
2.2 特殊地址映射模式(IBANKPOS=1)
当IBANKPOS位置1时,控制器采用特殊地址映射模式。这种模式下,列、行和bank地址位数完全由PAGESIZE、ROWSIZE和IBANK字段决定。ROWSIZE字段位于SDRAM配置2寄存器(SDCR2)中,定义每个row的大小:
- 0h: 512(需要9位行地址)
- 1h: 1024(需要10位行地址)
- 2h: 2048(需要11位行地址)
- 3h: 4096(需要12位行地址)
- 4h: 8192(需要13位行地址)
- 5h: 16384(需要14位行地址)
特殊映射模式的特点是当源地址跨越SDRAM页边界时,控制器会访问同一bank中的下一页,直到访问完该bank的所有页后才移动到下一个bank。这种模式虽然性能较低,但更适合mDDR设备使用部分阵列自刷新(PASR)功能实现节能。
3. 内存控制器初始化详解
3.1 初始化触发条件
DDR2/mDDR内存控制器在以下情况下会执行初始化序列:
- 复位后(VRST或VCTL_RST信号上升沿)
- 写入SDCR寄存器的DDRDRIVE、CL、IBANK或PAGESIZE位字段
初始化过程中,控制器会通过MRS(Mode Register Set)和EMRS(Extended Mode Register Set)命令配置SDRAM的模式寄存器。对于DDR2设备,初始化序列符合JESDEC79-2A规范;对于mDDR设备,则符合移动DDR规范。
3.2 DDR2模式寄存器配置
DDR2设备的MRS命令配置包括以下关键参数:
- 突发长度(Burst Length): 固定为8
- CAS延迟(CAS Latency): 由SDCR寄存器的CL位决定(2、3、4或5个周期)
- 写入恢复时间(Write Recovery): 由SDTIMR寄存器的T_WR位决定(2-6个周期)
- 突发类型(Burst Type): 固定为顺序(Sequential)
EMRS命令则配置:
- 输出驱动阻抗(Output Driver Impedance): 由SDCR寄存器的DDRDRIVE0位决定
- DLL使能(DLL Enable): 固定为使能状态
- OCD校准(OCD Calibration): 退出校准模式
3.3 mDDR模式寄存器配置
mDDR设备的MRS命令配置相对简单:
- 突发长度: 固定为8
- CAS延迟: 由SDCR寄存器的CL位决定(2或3个周期)
- 突发类型: 固定为顺序
4. 刷新机制与低功耗模式
4.1 刷新调度算法
DDR2/mDDR控制器通过SDRAM刷新控制寄存器(SDRCR)中的RR位字段定义刷新率。控制器维护两个计数器:
- 刷新间隔计数器: 从RR值开始递减,到零时重新加载
- 刷新积压计数器: 记录未执行的刷新命令数量
控制器根据积压数量决定刷新紧急程度:
- Refresh May(积压>0): 空闲时执行刷新
- Refresh Need(积压>7): 提高刷新优先级
- Refresh Must(积压>11): 必须立即执行刷新
4.2 自刷新模式
通过设置SDRCR寄存器的LPMODEN位和清除SR_PD位,可以进入自刷新模式。在此模式下:
- 控制器完成所有未完成的内存访问
- 清除刷新积压
- 关闭所有打开的SDRAM页
- 发出自刷新命令(SLFRFR)
退出自刷新模式的条件包括:
- 收到内存访问请求
- LPMODEN位被清零
- SR_PD位被修改
4.3 部分阵列自刷新(PASR)
mDDR特有的PASR功能通过SDCR2寄存器的PASR位字段配置,可选择刷新:
- 0h: 所有bank(0-3)
- 1h: bank 0和1
- 2h: 仅bank 0
使用PASR时建议设置IBANKPOS=1以避免bank交错,因为只有部分bank会被刷新。
5. 命令调度与性能优化
5.1 命令重排序规则
控制器采用智能调度算法最大化总线利用率:
- 优先选择队列中最旧的命令
- 在以下条件下优先读取而非写入:
- 读取地址与写入地址不在同一块(2048字节)
- 读取优先级不低于写入
- 优先处理已打开行的访问
- 当多个命令优先级相同时,选择最旧的命令
5.2 命令饥饿问题解决方案
为避免某些命令长期得不到执行,控制器提供防饥饿机制:
- 在PR_OLD_COUNT(PBBPR寄存器)定义的传输次数后,临时提高最旧命令的优先级
- 防止高优先级读命令阻塞低优先级写命令
- 防止对已打开行的连续访问阻塞对关闭行的访问
5.3 竞态条件处理
在多主设备系统中,为确保写入数据在读取前已完成,推荐以下流程:
- 执行所需写入
- 对SDRAM状态寄存器执行虚拟写入
- 对SDRAM状态寄存器执行虚拟读取
- 读取完成后再通知其他主设备数据就绪
6. 输出阻抗校准与复位考虑
6.1 VTP IO缓冲校准
DDR2/mDDR控制器支持输出阻抗校准以匹配PCB板特性:
- 通过VTP IO控制寄存器(VTPIOCR)启动校准
- 使用DDR_ZN引脚连接的参考电阻(推荐50Ω ±0.5%)
- 校准结果用于控制IO输出阻抗
重要提示:设备上电或复位后必须执行VTP校准。如果通过PSC复位控制器且VTP输入时钟被禁用,必须先启用时钟再执行校准。
6.2 复位处理
控制器支持两种复位信号:
- VRST: 模块级复位,重置状态机和寄存器
- VCTL_RST: 仅重置状态机,保留寄存器配置
复位源包括:
- 硬件/设备复位(VRST)
- 电源和睡眠控制器(PSC)(VCTL_RST)
复位后控制器立即开始初始化序列,FIFO中的命令和数据将丢失。
7. 工程实践建议
7.1 地址映射模式选择
- 性能优先场景:使用常规映射(IBANKPOS=0),最大化bank并行性
- 低功耗场景:使用特殊映射(IBANKPOS=1),配合mDDR的PASR功能
- 线性访问密集型应用:常规映射可提供更好的性能
7.2 初始化参数配置
典型DDR2配置示例:
c复制
SDCR = 0x0000A832;
SDTIMR = 0x0000000A;
SDRCR = 0x00000400;
7.3 性能调优技巧
- 根据内存设备特性优化CAS延迟和写入恢复时间
- 合理设置刷新率,平衡数据保持和性能
- 对于频繁访问的区域,尽量使其分布在不同的bank
- 使用命令优先级区分关键和非关键访问
7.4 常见问题排查
-
内存访问失败:
- 检查VTP校准是否完成
- 验证初始化序列是否正确执行
- 确认时钟和电源稳定
-
性能低于预期:
- 检查地址映射模式是否适合访问模式
- 分析bank冲突情况
- 调整刷新率参数
-
功耗过高:
- 考虑使用mDDR代替DDR2
- 启用部分阵列自刷新
- 优化不活跃时进入低功耗模式