第四节:信号编码与时钟恢复
好,咱们今天聊聊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上都验证过,效果不错。
时钟恢复的完整流程是这样的:
- 接收数据和选通信号
- 异或运算得到恢复时钟
- 用恢复时钟采样数据
- 串并转换得到并行数据
这里有个坑:恢复时钟的频率是数据速率的两倍。因为每个数据位都会产生一个时钟沿。所以你的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),选通线会保持不变。这时候接收端怎么知道数据位边界在哪里?这个问题留给大家思考,下一节我们揭晓答案。