DQS 信号:差分对、相位与数据采集原理

DQS,全称 Data Strobe,也就是数据选通信号。这玩意儿是 DDR 里面最核心的信号之一,甚至比时钟 CK 还关键。你想想看,CPU 读写内存,数据能不能正确采到,靠的就是 DQS。

说白了,DQ 数据信号是跟着 DQS 跑的,不是跟着时钟跑的。这个观念很重要。

3.1 为什么 DQS 要做成差分对?

DDR 里面的 DQS 通常是一对信号:DQS_t 和 DQS_c。正端和负端,互补关系。

为什么不用单端?我一开始也觉得单端简单,多根线还占地方。但第一次在高速示波器上看波形时,我就明白了——信号在传输过程中,共模噪声的干扰远比你想象的大。单端信号容易受地弹、电源波动影响,而差分对能天然抑制共模噪声。

差分对的好处:

  • 抗干扰强:外部噪声同时耦合到正负端,差分后相互抵消
  • 参考点稳定:不用依赖板上的地平面,信号质量更干净
  • 时序精度高:交叉点位置由正负端交叉决定,不受阈值漂移影响

我做过一个项目,前期为了省一根线,把 DQS 差分改成了单端参考地平面。跑低频没问题,一跑到 1600MT/s 以上就各种误码。后来换回差分,问题全部消失。嗯,这个教训很深刻。

⚠️ 避坑指南:设计 PCB 时,DQS 差分对必须等长,且要尽量短。我见过一个板子把 DQS 绕了很长去匹配 DQ 的延迟,结果信号质量完全没法看。

3.2 DQS 与时钟 CK 的相位关系

很多人搞不清楚 DQS 和 CK 到底什么关系。我简单说一下:

CK 是系统时钟,全局同步用的。而 DQS 是数据时钟,只在读写操作时存在。读数据时,DQS 由 DRAM 驱动;写数据时,DQS 由控制器驱动。

最关键的一点是:DQS 和 CK 之间是异步关系。也就是说,它们之间没有固定的相位关系。那 CPU 怎么对齐?这就是 CA 训练要做的事,但那是后面章节的内容。

对于 DQS 本身,我们需要关注的是 DQS 与 DQ 之间的相位。读操作时,DQS 的边沿正好与 DQ 数据眼的中心对齐。这个相位差是 90 度。

为什么会是 90 度?因为 DDR 采用源同步设计,DRAM 发送数据时,会把 DQS 信号延迟 90 度,让 DQS 的边沿落在 DQ 的稳定区间。接收端直接用 DQS 边沿去锁存 DQ,就能采到正确的数据。

操作类型 DQS 驱动端 DQS 与 DQ 相位关系 采样方式
读操作 DRAM DQS 边沿对齐 DQ 数据眼中心 上升沿+下降沿都采样
写操作 控制器 DQS 边沿对齐 DQ 数据眼中心 上升沿+下降沿都采样
💡 记住:DQS 是一个边沿对齐信号,不是电平对齐信号。它在每个边沿(上升和下降)都采样数据。

3.3 数据采集的原理

DQS 怎么用?简单讲就是:控制器用 DQS 的边沿去采样 DQ 总线上的数据。

具体流程如下:

  1. 读操作开始时:DRAM 先拉低 DQS,进入前导码(preamble)状态
  2. 前导码结束后:DQS 开始翻转,每个边沿对应一次数据传输
  3. 控制器内部:用 DQS 的上升沿和下降沿分别采样 DQ 总线
  4. 每个时钟周期:传输两个数据位,这就是 DDR 的名字由来

控制器内部实现时,通常会先把 DQS 延迟 90 度(或者把 DQ 延迟 90 度),让采样点落在数据眼中心。这步就是 DQS 训练的核心。

我遇到过一个 bug,读数据时老是随机错位。查了好久,发现是 DQS 的延迟寄存器没配置对,导致采样点落在了数据翻转区域。你看,时序上差一点点,结果就是天壤之别。

// DQS 延迟调整的典型配置寄存器
// 不同厂商的 DDR PHY 实现不同,但思路一致

// 设置 DQS 读延迟:0~63 个延迟单元
DQS_RD_DELAY = 0x20;    // 32 个延迟单元,约 90 度相移

// 设置 DQ 采样延迟:与 DQS 联动
DQ_SAMPLE_DELAY = DQS_RD_DELAY + ADJUSTMENT;
📌 小技巧:调试时可以先固定延迟值,逐步扫描所有可能的延迟,然后选择数据眼最宽的那个点。这叫眼图扫描,后面会详细讲。

3.4 DQS 的完整结构

下面这张图可以帮你理解 DQS 在整个数据采集路径中的位置和作用:

DQS 数据采集原理结构图 DQS 数据采集原理结构图 DRAM 端 数据发送/接收 控制器端 数据采样/处理 DQ 数据总线 DQS 差分对 (DQS_t / DQS_c) 90° 相移 DQS 边沿对齐数据眼中心 采样原理 DQS 上升沿 → 采样第 1 个数据位 DQS 下降沿 → 采样第 2 个数据位 每个时钟周期 → 传输 2 个数据位 DDR 命名由来:Double Data Rate 接收端内部处理 DQS 路径延迟链 → DQ 采样窗口 → 数据恢复 注:DQS 是源同步信号,与 CK 异步,只与 DQ 同步

3.5 DQS 的前导码(Preamble)

前导码是 DQS 开始翻转前的一段固定电平状态。读操作前,DRAM 会把 DQS 拉低一段时间,告诉控制器:数据要来了,准备采样。

我遇到过的情况:有个板子读数据时经常丢第一个数据。查波形发现,前导码长度不够,控制器还没准备好,数据就来了。后来延长了前导码,问题解决。

前导码的关键参数:

  • tRPRE:读前导码时间,DDR4 通常要求至少 1 个时钟周期
  • tWPRE:写前导码时间,DDR4 通常要求至少 1 个时钟周期
  • 前导码过长会影响效率,过短会导致采样不稳
🔍 排查思路:如果你发现读数据时第一个数据经常错,先检查前导码设置。我自己的经验是,前导码长度不要用理论最小值,留点余量更稳妥。

3.6 DQS 训练的核心目标

讲了这么多,DQS 训练到底在练什么?说白了就是两件事:

  1. 找到正确的采样相位:让 DQS 边沿对准数据眼中心
  2. 补偿走线延迟:消除 PCB 布线长度不同带来的时序偏差

DQS 训练的最终结果,就是控制器的接收路径能够稳定地采集到 DRAM 发来的数据,不管 PVT(工艺、电压、温度)怎么变化。

这部分内容在后续章节会详细展开,包括训练算法、调试工具和常见问题。但核心基础就是今天讲的这些——差分对结构、90 度相位关系、边沿采样原理。

记住这三个点,后面的内容就好理解多了。