操作模式
在内存控制器中,操作模式寄存器位(mode_sts_reg.ddrc_reg_operating_mode
)用于指示当前控制器的操作模式。通过检查这些位,我们可以了解控制器和DRAM的当前状态。以下是不同操作模式的解释:
- 000 - 未初始化:控制器可能处于软复位状态,或者已退出软复位但DRAM初始化序列尚未完成。这意味着控制器尚未准备好进行任何数据访问操作。
- 001 - 正常操作模式:控制器已准备好接受读写请求,并能向DRAM发出读写操作。在此模式下,系统可以正常地进行数据的读写操作。
- 010 - DRAM电源关闭模式:DRAM进入低功耗状态,以减少功耗。在此模式下,DRAM不会响应任何读写请求,直到从电源关闭模式中唤醒。
- 011 - DRAM自刷新模式:DRAM在自刷新模式下能够自动刷新其存储单元以保持数据不丢失,而无需外部时钟信号。这通常用于系统进入低功耗睡眠状态时保持DRAM中的数据。
- 100 - 111(仅限LPDDR2设计):这些模式指示DRAM处于深度电源关闭状态。在LPDDR2(低功耗双倍数据率2)设计中,这种深度电源关闭模式提供了比常规电源关闭模式更低的功耗。不过,需要注意的是,具体的深度电源关闭模式(如100到111)可能在不同的设计或实现中有不同的具体含义,这取决于制造商的规格和控制器的实现细节。
更改时钟频率
更改时钟频率的过程如下:
1.通过断言ctrl_reg1.reg_drc_selfref_en,请求控制器将DRAM置于自刷新模式。
2.等待mode_sts_reg.ddrc_reg_operating_mode[1:0]==11,表示控制器处于自刷新模式。如果是LPDDR2,请检查ddrc_reg_operating_mode[2:0]==011。
3.更改控制器的时钟频率。
4.更新可能需要更改以适应新频率的任何寄存器。这包括静态和动态寄存器。如果更新的寄存器涉及reg_ddrc_mr、reg_ddrc.emr、reg-ddrc.emr2或reg_ddrc-emr3中的任何一个,则转到步骤5。否则,转到步骤6。
5.断言reg_ddrc_soft_rstb以重置控制器。当控制器退出重置时,它会重新初始化DRAM。在初始化过程中,步骤4中更新的模式寄存器值会被写入DRAM。在解除重置后的任何时候,都可以转到步骤6。
6.通过取消断言reg_ddrc_selfref_en使控制器退出自刷新。
注意:除了时钟频率外,通常还可以按照此顺序更改DDRC设置。当控制器重置时,DRAM必须处于自刷新模式(见步骤1)以保存DRAM内容。
电源关闭模式
在内存控制器(DDRC)中,通过主控制寄存器可以启用电源关闭模式。一旦启用此模式,DDRC会在经过设定的空闲周期数(由DDRC_param_reg1.reg_ddrc_powerdown_to_x32
寄存器编程确定)后,自动将DRAM置于预充电所有电源关闭状态。
电源关闭模式的工作流程如下:
- 启用电源关闭模式:通过设置
ddrc_ctrl
寄存器中的相应位来启用电源关闭模式。 - 进入预充电所有电源关闭状态:一旦启用,并且DRAM处于空闲状态(即没有读写操作)达到设定的周期数后,DDRC会自动将DRAM置于预充电所有电源关闭状态。这个状态有助于减少DRAM的功耗。
- 退出电源关闭模式:
- 刷新请求:任何刷新请求都会使DRAM退出电源关闭模式,以执行必要的刷新操作来保持数据完整性。
- 空闲期后重新进入:刷新或任何交易完成后,如果DRAM再次进入空闲状态并持续设定的周期数,它将再次自动进入电源关闭模式。
- 任何事务:任何读写事务都会自动使DRAM退出电源关闭模式,以处理这些事务。
- 清除电源关闭使能位:通过清除
ddrc_ctrl
寄存器中的电源关闭使能位,也可以立即将DRAM从电源关闭模式中唤醒。
深度电源关闭(Deep Power Down) 模式
仅适用于LPDDR2内存。在这种模式下,DRAM的功耗被进一步降低,以满足低功耗应用的需求。
设置深度电源关闭模式
- 启用深度电源关闭:通过将
deep_pwrdwn_reg.deeppowerdown_en
寄存器设置为1,来启用深度电源关闭模式。一旦事务缓冲区为空,DDRC会立即将DRAM置于深度电源关闭状态。 - 事务处理:如果事务(读写请求)持续到达,DDRC将不会将DRAM置于深度电源关闭模式。只有在DRAM处于空闲状态且事务缓冲区为空时,深度电源关闭模式才会被激活。
退出深度电源关闭模式
- 重置使能位:要将DRAM从深度电源关闭模式中唤醒,必须将
deep_pwrdwn_reg.deeppowerdown_en
寄存器重置为0。在重置使能位后,控制器会执行自动的DRAM初始化过程,以确保DRAM能够正确响应后续的事务。 - 等待周期:在LPDDR2中,从重置使能位到DRAM完全退出深度电源关闭模式之间,存在一个等待周期。这个等待周期由
reg_ddrc_deeppowerdown_to_x1024
寄存器确定,通常这个值设置为500微秒(μs),根据具体规格可能会有所不同。
深度电源关闭期间的命令处理
- 在DRAM处于深度电源关闭模式期间,任何到达的命令都会被存储在内容可寻址存储器(CAM)中。
- 当DRAM退出深度电源关闭模式并完成重新初始化后,这些命令将被处理。
自刷新(Self Refresh) 模式
是DRAM的一种低功耗状态,其中DRAM能够自动刷新其存储单元以保持数据完整性,而无需外部时钟信号。在自刷新模式下,DRAM的功耗显著降低,适用于系统进入低功耗睡眠状态或空闲周期较长的场景。
设置自刷新模式
- 请求自刷新:通过在主控制寄存器(
ddrc_ctrl
)中设置自刷新请求位来请求DRAM进入自刷新模式。一旦设置了该位,并且事务缓冲区为空(即没有待处理的读写请求),DDRC会立即将DRAM置于自刷新状态。 - 确保无事务到达:软件必须确保在请求自刷新之后,没有新的读写事务到达。如果事务持续到达,DDRC将不会将DRAM置于自刷新模式。这通常涉及到在系统进入低功耗模式之前暂停或挂起所有外部设备和应用程序的操作。
退出自刷新模式
一旦有第一个有效的事务到达(即读写请求),DRAM会自动退出自刷新模式,并准备处理该事务。需要注意的是,在退出自刷新模式后,可能需要一定的时间来恢复DRAM的正常操作状态。
DDR Power Reduction(DDR功耗降低)
可以通过多种技术来实现,以下是一些主要的方法和技术细节:
1. Clock Stop(时钟停止)
- 功能描述:当该功能启用时,DDR PHY(物理层)被允许停止向DRAM发送时钟信号。这可以显著降低功耗,因为DRAM的许多操作都是基于时钟信号的。
- 适用场景:
- 对于DDR2和DDR3/DDR3L,这一功能在自刷新模式下最为有效。
- 对于LPDDR2,这一功能在空闲期、掉电模式、自刷新模式和深度掉电模式下均有效。
2. Precharge Power Down(预充电功耗降低)
- 功能描述:当启用时,DDR内存控制器会在空闲期间动态地使用预充电功耗降低模式来减少功耗。当DDRC接收到新请求时,正常操作会继续进行。
- 优势:通过减少在空闲期间不必要的功耗,可以显著提高系统的能效。
3. Self Refresh(自刷新)
- 功能描述:当启用时,DDRC会在空闲期间动态地将DRAM置于自刷新模式。在这种模式下,DRAM的内容得以保持,即使DDRC的核心逻辑完全断电,也能允许停止DDR2X和DDR3X/DDR3LX时钟。此外,控制DDR终止的DCI时钟也可以被关闭。
- 优势:自刷新模式允许系统在不丢失DRAM内容的情况下,显著降低功耗。这对于需要长时间待机或低功耗运行的系统尤为重要。
- 进一步降低功耗:通过禁用DDR I/O(输入输出),可以进一步降低功耗。这可以通过将DDRIOB_*.OUTPUT_EN设置为00来实现。
4. Self Refresh Sequence(自刷新序列)
将DDR内存置于自刷新模式通常需要执行以下序列:
- 确保无新请求:在执行这些步骤时,应确保没有其他主设备向DDR内存发出新请求。
- 执行自刷新命令:通过发送自刷新命令,使DRAM进入自刷新状态。
- 停止时钟:在DRAM进入自刷新状态后,可以停止DDR时钟。
ddrc.ctrl_reg1[reg_ddrc_selfref_en] = 1
ddrc.DRAM_param_reg3 [reg_ddrc_en_dfi_dram_clk_disable] = 1
while (ddrc.mode_sts_reg[ddrc_reg_operating_mode] != 3)
while (ddrc.mode_sts_reg[ddrc_reg_dbg_hpr_q_depth] ||
ddrc.mode_sts_reg[ddrc_reg_dbg_lpr_q_depth] ||
ddrc.mode_sts_reg[ddrc_reg_dbg_wr_q_depth)
delay(40 * Tddr)
slcr.DDR_CLK_CTRL[DDR_2XCLKACT] = 0
slcr.DDR_CLK_CTRL[DDR_3XCLKACT] = 0
slcr.DCI_CLK_CTRL[CLKACT] = 0
要恢复正常的DDR操作,如果DDR I/O被禁用,则必须首先重新启用DDR I/O。然后必须重新启用时钟,使DRAM再次可访问,并且可以禁用时钟停止和自刷新功能。
重要提示:预充电断电和自刷新模式是互斥的,不得同时激活。