PS DRAM接口的函数式编程模型(一)

针对PS DRAM接口的操作启动,确实需要遵循一系列精心设计的步骤来确保DRAM控制器(DDRC)和DRAM模块能够正确初始化和配置。以下步骤详细说明了这些操作,并指出了Vivado Design Suite通常如何提供这些编程支持。

  1. DDR时钟初始化:涉及配置和稳定DDR时钟信号。时钟的稳定性和准确性对于DRAM操作的时序至关重要。Vivado Design Suite会提供工具来配置时钟源,包括时钟频率、相位和占空比等参数。
  2. DDR I/O缓冲区(DDR IOB)初始化和校准:DDR I/O缓冲区负责在DDR控制器和DRAM模块之间传输数据。初始化这些缓冲区并对其进行校准可以确保信号完整性和性能。Vivado Design Suite通常包含用于配置和校准I/O缓冲区的工具和算法。
  3. DDR控制器(DDRC)寄存器编程:DDRC寄存器编程是配置DDR控制器以匹配DRAM模块特性和系统需求的关键步骤。这包括设置时序参数、配置突发长度、启用或禁用特定功能等。Vivado Design Suite提供了图形用户界面(GUI)或命令行工具来配置这些寄存器。
  4. DRAM重置和初始化:在DRAM模块开始正常操作之前,需要对其进行重置和初始化。这通常包括将DRAM置于已知状态,并设置必要的初始化序列。Vivado Design Suite可以生成这些初始化序列,并通过DDRC将其发送到DRAM模块。
  5. DRAM输入阻抗(ODT)校准:ODT校准是优化DRAM信号质量的重要步骤。通过调整ODT电阻值,可以减少信号反射和过冲,从而提高信号完整性。Vivado Design Suite可能包含用于自动校准ODT的工具或提供指导如何手动进行校准。
  6. DRAM输出阻抗(Ron)校准:类似于ODT校准,Ron校准也是优化DRAM信号质量的一部分。它关注于调整DRAM模块的输出驱动强度,以确保信号在传输过程中保持足够的幅度和清晰度。Vivado Design Suite可能支持Ron校准的自动化或提供相关的配置选项。
  7. DRAM训练:DRAM训练是确保DRAM模块与DDR控制器之间正确同步和数据传输的关键步骤。它包括多个子步骤,如写电平调整、读DQS门控训练和读数据眼图训练。
  • 读数据眼图训练:通过调整读操作的时序参数来优化数据眼图,从而提高数据传输的可靠性和性能。
  • 读DQS门控训练:优化DQS(数据选通信号)的接收时序,以确保读数据窗口的正确对齐。
  • 写电平调整:调整写操作的时序,以确保数据在DRAM内部正确采样。

Vivado Design Suite通常包含自动化工具来执行这些训练步骤,并验证DRAM模块的性能和稳定性。

时钟工作频率

在DDR初始化之前,DDR时钟必须处于活动状态。DDR_2x和DDR_3x时钟都必须正确配置。DDR_3x时钟是DRAM使用的时钟,应设置为所需的工作频率(请注意,每比特的数据速率是工作频率的两倍)。DDR_2x时钟由互连使用,通常设置为工作频率的2/3。DDR PLL频率应设置为工作频率的偶数倍。

表10-5提供了假设50 MHz参考时钟的频率配置示例

对DDR时钟进行编程涉及SLCR中的DDR_PLL_CTRL和DDR_CLK_CTRL寄存器。

除了主DDR时钟外,DDR IOB内置的数字控制阻抗(DCI)功能还使用10 MHz时钟。该时钟通过SLCR DCI_CLK_CTRL寄存器配置。

DDR IOB阻抗校准

DDR IOB使用IOB的DCI数控阻抗模式支持校准的驱动强度和端接强度。在DDR2/DDR3/DDR3L模式下,这用于校准端接强度。在LPDDR2模式下,这用于校准驱动器强度。
DCI状态机需要两个外部引脚VRN和VRP,它们分别连接到VCCO_DDR和地的外部电阻器。DCI设置如表10-6所示。

启用后,DCI状态机将自动将驱动和端接阻抗与外部电阻器匹配。此背景校准需要1-2ms才能锁定,然后连续运行。

校准

1.配置时钟模块,在dci_clk上配置10 MHz时钟

2.使用SLCR寄存器DDRIOB_DCI_CTRL和DDRIOB_DCL_STATUS启用DDR DCI校准系统

   a.将DDRIOB_DCI_CTRL.RESET_B切换为0并设置为1   

   b.根据表10-7设置DDRIOB_DCI_CTRL.PREF_OPT和NREF_OPT字段

  c.将DDRIOB_DCI_CTRL.UPDATE_CONTROL设置为0

  d.将DDRIOB_DCI_CTRL.ENABLE设置为1

  e.对DDRIOB_DCI_STATUS进行轮询。一点一点地做,直到它是1

DDR IOB配置

DDR IOB必须配置为用作I/O。每种类型的DDR IOB由两个不同的SLCR配置寄存器控制。配置寄存器配置IOB的输入模式、输出模式、DCI模式和其他功能。

配置

DDR系统支持16位和32位模式以及断电模式下的DDR3L/DDR3/DDR2/LPDDR2。

按如下方式设置IOB配置:

1.将所有LPDDR2 I/O的DCI_TYPE设置为DCI驱动器。

2.将DCI_TYPE设置为DDR2/DDR3/DDR3L双向I/O的DCI终止。

3.设置OUTPUT_EN=obuf以启用输出。

4.设置TERM_DISABLE_MODE和IBUF_DESABLE_MODE以启用省电输入模式。在DDR训练完成之前,不应设置TERM_DISABLE_MODE和IBUF_DESABLE_MODE字段。

5.将SSTL的INP_TYPE设置为基于VREF的差分接收器,将HSTL设置为单端输入。

6.将INP_TYPE设置为差分输入接收器,用于差分输入。

7.将TERM_EN设置为启用DDR3/DDR32L和DDR2双向I/O(输出和LPRDDR2 IO未终止)。

8.如果只使用16位DQ DDR(包括ECC位),则将DDRIOB_DATA1和DDRIOB_DIFF1寄存器设置为断电。

9.对于DDR2和DDR3/DDR3L,DCI只影响端接强度,因此地址和时钟输出不使用DCI。

10.对于LPDDR2,DCI会影响驱动器强度,因此所有I/O都使用DCI。

VREF配置DDR I/O使用差分输入接收器。该接收器的一个输入端连接到数据输入端,另一个连接到称为VREF的电压基准。对于DDR2/3和LPDDR2 DRAM接口,VREF电压设置为I/O VCCO电压的一半。VREF可以通过专用VREF焊盘从外部提供,也可以从内部电压源提供。建议所有设计都使用外部VREF,以提供额外的时序裕度,但需要外部板组件。要配置VREF参考电源,请按如下方式设置DDRIOB_DDR_CTRL寄存器:

  1. 启用内部VREF
  • 将DDRIOB_DDR_CTRL.VREF_EXT_EN设置为00(断开I/O与外部信号的连接)
  • 根据DDR标准将DDRIOB_DDR_CTRL.VREF_SEL设置为适当的电压设置(VREF=VCCO_DDR/2)
  • 将DDRIOB_DDR_CTRL.VREF_INT_EN设置为1,以启用内部VREF发生器

     2. 启用外部VREF

  • 将DDRIOB_DDR_CTRL.VREF_INT_EN设置为0,以禁用内部VREF发生器
  • 将DDRIOB_DDR_CTRL.VREF_SEL设置为0000
  • 将DDRIOB_DDR_CTRL.VREF_EXT_EN设置为11,以将IOB VREF输入连接到32位接口的外部焊盘
  • 将DDRIOB_DDR_CTRL.VREF_EXT_EN设置为01,将IOB VREF输入连接到16位接口的外部焊盘

DDR控制器寄存器编程

在启用DDRC之前,所有DDRC寄存器都必须初始化为系统特定的值。

大约80个具有350多个参数的寄存器可能会被设置或保持其开机默认值。然后通过写入DDRC_ctrl寄存器来启用DDRC。一旦启用,DDRC会自动执行初始化步骤4-7(功能编程模型)。

DDRC操作是自主的,除非需要更改功能(例如更改AXI端口优先级),否则不需要进一步编程。

DRAM重置和初始化

DDRC根据JEDEC规范执行DRAM重置和初始化,包括重置、刷新和模式寄存器初始化。

DDR初始化顺序
LPDDR2初始化序列

当与LPDDR2 DRAM一起使用时,初始化状态机执行以下初始化序列:

  1. 同时给VDD和VDDQ加电。坚持并抓住CKE。
  2. 使用稳定的时钟
  3. 在reg_ddrc_pre_cke_x1024指定的持续时间内发布NOP/取消选择(规范要求至少200 us,电源和时钟稳定)。
  4. 发布刷新
  5. 加载模式寄存器
  6. 加载扩展模式寄存器
  7. 发出ACTIVE命令
  8. 取消选择reg_ddrc_final_wait_x32周期(无规范要求)。
  9. 开始正常运行
DDR2初始化顺序

对于DDR2,初始化状态机执行以下初始化序列:

  1. 加电
  2. 在reg_ddrc_pre_cke_x1024指定的持续时间内发布NOP/取消选择(规范要求至少200 us,电源和时钟稳定)
  3. 断言CKE并为reg_ddrc_post_CKE_x1024发出NOP/Deselect(规范要求至少400 ns)
  4. 在reg_ddrc_t_rp循环中,先发出“全部预充”,然后再发出“NOP/取消选择”
  5. 将EMR2编程为reg_ddrc_EMR2值,然后对reg_ddrc.t_mrd循环进行NOP/取消选择
  6. 将EMR3编程为reg_ddrc_EMR3值,然后对reg_ddrc.t_mrd循环进行NOP/取消选择
  7. 通过将EMR编程为reg_ddrc_EMR值,然后对reg_ddrc.t_mrd周期进行NOP/取消选择,启用DLL
  8. 通过将MR编程为reg_ddrc_MR值,然后在reg_ddrc.t_mrd循环中执行NOP/Deselect,来重置DLL
  9. 在(reg_ddrc_t_rp+1)个周期内发布预充全部,然后进行NOP/取消选择
  10. 在reg_ddrc_t_rfc_min循环中发出刷新,然后发出NOP/取消选择。重复9次。
  11. 通过将MR设置为reg_ddrc_MR值,将位8设置为1,在不重置DLL的情况下对MR进行编程。
  12. .在reg_ddrc_pre_ocd_x32指定的持续时间内发布NOP/取消选择(无规范要求)
  13. 发出“OCD完成”命令,表示不会执行片上驱动器校准
  14. 为reg_ddrc_final_wait_x32周期发布NOP/取消选择(无规范要求)
  15. 开始正常运行
DDR3初始化顺序

对于DDR3,初始化状态机将执行以下初始化序列:

  1. 加电
  2. 在reg_ddrc_pre_cke_x1024指定的持续时间内发布NOP/取消选择(规范要求至少200 us,电源和时钟稳定)
  3. 断言CKE并为reg_ddrc_post_CKE_x1024发出NOP/Deselect(规范要求至少500 us)
  4. 发出MRS命令,加载具有reg_ddrc_emr2值的MR2,然后在reg_ddrc.t_mrd的持续时间内执行NOP/Deselect
  5. 发出MRS命令,使用reg_ddrc_emr3加载MR3,然后在reg_ddrc.t_mrd的持续时间内执行NOP/Deselect
  6. 发出MRS命令,使用reg_ddrc_emr加载MR1,然后在reg_ddrc.t_mrd的持续时间内执行OP/Deselect
  7. 发出MRS命令,使用reg_ddrc_mr加载MR0,然后在reg_ddrc.t_mod的持续时间内执行NOP/Deselect
  8. 开始计数reg_ddrc_t_zq_long_nop,并发出ZQCL命令开始zq校准
  9. 等待reg_ddrc_t_zq_long_nop计数完成。确保步骤7的等待时间大于tDLLK
  10. 开始正常运行

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值