1.引言
弹性缓冲由MaurICe Karnaugh在电话网络中传输PCM信号中提出来的。随后人们在很多不同的应用中采用了弹性缓冲技术来同步数据,很多协议例如USB、PCIE、以太网等。
USB3.0是一个高速,串行,源同步数据传输协议。但是数据经过传输线与原数据发生了很大的偏差。本文从USB3.0的角度分析了弹性缓冲机制,解释了与其他设计的不同,并采用指针控制与握手的设计方法实现。
2.弹性缓冲作用
2.1 USB3.0弹性缓冲作用域
在USB3.0中数据传输采用双单工,因此物理层设计为接收、发送2组差分对传输部分。传输线是承载数据传输的载体。因此如何从传输线正确接收数据,并把它同步到系统内部时钟域,变的十分关键。
USB3.0中规定的物理层接收部分结构图如下,它包括差分接收、时钟数据恢复、串并转换和8B10B译码。
图 1USB3.0物理层接收部分结构
整个数据流向自上而下,差分输入经过差分接收,从差分信号中提取出时钟,并用恢复出来的时钟来恢复出数据(CDR)。恢复出来的数据在接收时钟域进行串并转换为10bit位宽并行数据1,并检测USB3.0包起始标志符(K28.5)。一旦检测到起始标志符K28.5,使能符号有效(symbol LOCk),直至检测到结束符号,才结束符号有效。
弹性缓冲从串并转换接收数据,所有的接收数据与控制都工作在接收时钟域(receive clock)。因此弹性缓冲要把数据与控制同步到系统时钟域(system clock)。把数据向下传递给8B10B译码模块,而后传递给系统内部。
2.2 弹性缓冲容量
USB3.0中,协议规定允许的时钟精度为-5300ppm到300ppm。而符号时钟频率为2ns即2000ps,最坏情况下每178个symbol添加或者删除一个SKP,也就是每356个symbol添加或者删除一个SKP对(SKP Order Sets)。USB3.0中包最长为1052字节,所以最差情况下,最多可以添加或删除8个SKP或者4个SKP对,所以弹性缓冲至少要能缓冲8个SKP。USB3.0协议规定每个SKP order sets为2个连续的SKP symbol。因此在10B8B译码前,SKP order set的游程(running disparity)应该是互补的。
通过计算得知,弹性缓冲的缓冲容量为8。本文设计采用常半满2(normal half full)模式来设计弹性缓冲,所以弹性缓冲容量为16,在正常情况下里面应该有8个数据,剩下的8个为缓冲空间,因此叫常半满。常半满模式首先要向缓冲中写满8个symbol,达到半满,然后读使能才可以有效,因此大约有8个时钟的延迟。常半满模式只有在symbol队列中出现SKP对才能添加或者删除SKP对。下图为常半满输入输出时序图。
图 2 常半满输入输出时序
从上图可以看出,rx_valid_out有效要晚于rx_valid_in约8个时钟沿;而无效却晚于rx_valid_out约0至16个时钟沿(取决于时钟精度差)。因此常半满需要8个时钟延迟才能输出数据。