第四节:信号编码与时钟恢复

好,咱们今天聊聊SpaceWire总线里一个特别关键的话题——信号编码与时钟恢复。说白了,就是数据怎么在线上跑,以及接收端怎么把时钟从数据里“拽”出来。

我个人觉得,这部分内容是整个SpaceWire通信的基石。你想想看,如果信号编码搞不好,时钟恢复做不干净,那后面的数据解析全是错的。我在项目中就吃过这个亏,后面会跟大家细说。

4.1 DS编码原理

SpaceWire用的是DS编码,全称是Data-Strobe编码。这名字听着挺唬人,其实原理很简单。

DS编码的核心思想:用两根线来传输数据。一根是数据线(Data),另一根是选通线(Strobe)。数据线传输原始数据,选通线则根据数据线的变化来翻转。

具体规则是这样的:

  • 当数据线为逻辑“0”时,选通线保持不变
  • 当数据线为逻辑“1”时,选通线翻转

嗯,这里要注意:选通线的翻转只跟数据线的值有关,跟数据线的跳变没关系。我刚开始学的时候,总把这两个搞混。

举个例子:

数据:  0 0 1 1 0 1 0 0 1
选通:  0 0 0 1 1 1 0 0 0  (假设初始为0)

你看,数据是“0”的时候,选通不变;数据变成“1”了,选通就翻转一次。就这么简单。

DS编码的优点

  • 时钟信息隐含在数据和选通的异或结果中
  • 接收端可以通过异或运算恢复出时钟
  • 抗干扰能力强,适合高速传输

我记得有一次调试星载计算机的SpaceWire接口,示波器一看,数据和选通的波形特别干净。这就是DS编码的好处——信号跳变少,EMI辐射也小。

4.2 时钟与数据分离技术

接收端拿到数据和选通信号后,怎么把时钟恢复出来?

方法很简单:把数据和选通做异或运算。

恢复时钟 = Data XOR Strobe

为什么这样就能得到时钟?你想想看:

  • 数据不变时,选通也不变,异或结果不变
  • 数据变化时,选通也跟着变,异或结果翻转

实际上,每次数据或选通发生变化,异或结果都会翻转一次。这就相当于在每个数据位边界都产生了一个时钟沿。

我建议你在FPGA里实现这个逻辑时,要注意一点:

工程实践小技巧

恢复出来的时钟可能会有毛刺。我习惯在异或输出后面加一个D触发器做同步,滤掉窄脉冲。这个做法在Xilinx和Microchip的FPGA上都验证过,效果不错。

时钟恢复的完整流程是这样的:

  1. 接收数据和选通信号
  2. 异或运算得到恢复时钟
  3. 用恢复时钟采样数据
  4. 串并转换得到并行数据

这里有个坑:恢复时钟的频率是数据速率的两倍。因为每个数据位都会产生一个时钟沿。所以你的FPGA逻辑要能跑在这个两倍频率上。

4.3 抖动容限

抖动,说白了就是信号边沿的位置不稳定。在SpaceWire总线里,抖动主要来自三个方面:

抖动来源 产生原因 典型值
发射端抖动 时钟源不稳定、驱动电路噪声 < 0.1 UI
传输线抖动 线缆阻抗不匹配、串扰 < 0.2 UI
接收端抖动 采样时钟抖动、阈值漂移 < 0.15 UI

UI是单位间隔,就是一个数据位的时长。比如200Mbps速率下,1 UI = 5ns。

抖动容限指的是接收端能容忍的最大抖动。SpaceWire标准规定,接收端至少要能容忍0.5 UI的抖动。

我曾经在一个项目里遇到过抖动超标的问题。现象是:常温下通信正常,温度一高就丢包。查了三天,最后发现是PCB走线太长,导致信号反射产生了抖动。

避坑指南

我曾经在调试时发现,DS编码的抖动容限其实比想象中要好。因为数据和选通是同时传输的,它们的抖动是相关的。接收端做异或时,共模抖动会被抵消掉。这个特性在实际工程中很有用。

提高抖动容限的几个方法:

  • 使用差分信号传输,抑制共模噪声
  • PCB走线做阻抗匹配,减少反射
  • 接收端加PLL做时钟净化
  • 适当增加采样窗口的余量

我个人习惯在接收端加一个数字PLL,把恢复时钟再净化一遍。虽然会增加几个时钟周期的延迟,但抖动容限能提升到0.7 UI以上。

小结

DS编码是SpaceWire的核心技术。它用两根线就实现了数据和时钟的同步传输,而且抗抖动能力不错。时钟恢复说白了就是异或运算,但工程实现时要注意毛刺和时序。抖动容限这块,标准要求0.5 UI,实际设计时最好留点余量。

下一节我们会讲SpaceWire的链路层协议,包括流控制、错误检测这些内容。到时候再跟大家分享一些实战经验。

课后思考

如果数据线连续传输多个相同的值(比如全是0),选通线会保持不变。这时候接收端怎么知道数据位边界在哪里?这个问题留给大家思考,下一节我们揭晓答案。