1.引言
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个时钟延迟才能输出数据。
2.3 弹性缓冲机制
弹性缓冲本质上是读写同时受控的异步fifo,常半满(normal half full)fifo,其深度为16,首先要写满8个有效数据,并一直维持在半满的状态。因此在正常情况下,fifo一直处于或接近半满状态,当读写时钟一样快慢的时候,fifo中有8个有效数据。
图 3 常半满读写同等速率
当读时钟快于写时钟,读出的数据多于写入的数据,常半满模式可能导致fifo中的数据数量少于8,甚至有可能被读空。如下图所示,在出现skp窗口的时候,fifo中的有效数据为4,比常态少4。所以此时,弹性缓冲应该添加4个skp,使得fifo维持半满,以此来调节时钟。此时读指针向前跳跃4个间隔,并且当读指针读到跳跃区间时,完成skp添加。
图 4 常半满模式读快于写
当读时钟慢于写时钟,写入的数据多于读出的数据,常半满模式可能导致fifo中的数据数量多于8,甚至有可能被写满。如下图所示,在出现skp窗口的时候, fifo中有效数据为10,比常态多2. 所以此时,弹性缓冲应该删除2个skp,使得fifo维持半满,以此来调节时钟。此时写指针应该暂停2个时钟周期,完成skp删除。
图 5 常半满写快于读
3.弹性缓冲结构
常半满模式下弹性缓冲的结构设计,可以分为接收时钟域控制、系统时钟域控制、阀值检测与同步。接收时钟域控制包括,写控制与写指针控制。系统时钟域控制包括读控制与读指针控制。阀值检测与同步包括skp添加删除阀值与时钟域之间的同步。
图 6 常半满模式弹性缓冲结构
3.1 usb3.0中skp删除
当接收时钟域的symbol lock有效时,写使能才可能有效。一直可以写到fifo处于半满状态,此时fifo处于临界状态,读写速率的差别将导致不同阀值的触发。下图是skp对的删除。
图 7 skp对删除
检测单元用来检测进入fifo的数据是否为skp,起到标注skp窗口的作用,为skp的删除提供了窗口。阀值监测单元一直监测fifo中有效数据的数量。如果数量大于删除阀值(fifo中有10个有效数据),并且skp窗口有效,那么弹性缓冲暂停指针,屏蔽skp对,以此来达到删除skp对的目的。但是usb3.0中的skp都是成对出现的,因此删除skp对的时候要注意奇偶性。
所以采用状态机来设计usb3.0中skp对的删除,如下图。当skp窗口无效的时候,状态处于idle;当skp窗口有效而且删除阀值触发时,状态进入了屏蔽状态;在skp窗口 有效的情况,屏蔽状态持续到删除阀值标志无效;当skp窗口无效,或者删除阀值标志无效而且被屏蔽skp个数是偶数个,则状态返回到idle状态。
指针屏蔽verilog代码如下。
3.2 usb3.0中skp添加
skp添加模块包括断点保存、写指针跳跃与握手、读指针生成与输出控制模块 skp添加发生在读时钟快于写时钟的时候,在正常情况下,弹性缓冲的读操作与普通的fifo没有任何区别。
图 9 skp添加结构
3.2.1 断点保存
在常半满模式下,读写指针相差8个时钟。因此在写指针发生事件,要经过8个左右的 时钟才能传递到读指针。在出现skp窗口的时候,如果添加阀值标志触发,则读指针要经过8个时钟才能添加skp。
对于添加skp对,读指针如何才能知道要添加多少呢?因此读指针需要写指针去引导。在设计中,采用了断点保存和握手来解决。在skp窗口出现和添加阀值标志有效时候,写指针在此时计算fifo中的有效数据个数,根据fifo中有效数据的个数与8的差距来决定wrptr_nxt所指向的下一个指针点,这就是写指针跳跃。并且在写时钟域把当前的写指针和下一个所指向的指针点保存起来。在弹性缓冲设计中,读指针永远落后于写指针。
图 10 写指针保存断点
3.2.2 握手
写指针在出现skp窗口和skp添加阀值触发的时候,发生了跳跃,并保存了断点,但这只是在写时钟域。由于读指针晚于写指针,因此采用握手来通知读时钟域何时添加skp。如下图,当skp窗口出现,并且添加阀值触发时,弹性缓冲保存了断点,并向读时钟域发起了请求(req),请求一直持续到读指针读到了断点的起始地址(start_rptr),此时,读指针读到了断点的起始地址,并向写时钟发送收到(ack)。当写时钟域收到读时钟域的ack信号,撤销req。读时钟域一旦读到了截止地址(end_ptr)自动撤销ack信号。在整个读时钟域的ack过程中,skp对被添加。
图11 握手
3.2.3 输出控制
弹性缓冲fifo读写控制的过程中,写先于读,首先根绝延迟要写到规定的要求,此时写有效读无效(定义为w1r0)。当达到规定的阀值之后,读写同时有效(w1r1)。等到写结束, 即一个包接收完毕,但是读不一定结束(w0r1),直至读到空,即所有数据已经同步到本地了(w0r0)表示此次任务结束。这种流程控制为了保持这个数据的完整性。
图 12 读写流程控制
usb协议中明确规定skp对为2个连续的skp symbol。根据8b10b原则,2个连续的skp对的游程是相反的,并且skp对的添加要符合8b10b3的规则。
中要求,在弹性缓冲下溢的时候,要添加一个edb字符,并且显性的用下溢标志。如下图,在rx-g与rx-h之间,由于读快于写,导致了下溢。因此需要添加一个edb字符,并使能一个时钟的下溢,并且置状态。
图 13 弹性缓冲下溢
pipe3.0中要求,在弹性缓冲上溢的时候,丢掉一个数据,并且置状态。如下图rx-f、rx-g与rx-h,由于溢出,rx-g被丢弃,并且置状态。
图 14 弹性缓冲上溢
5.总结
本设计充分考虑了pipe 3.0标准的要求与实际需要,并且应用于工程中,实现了弹性缓冲补偿时钟的目的。
Matlab的微分、积分和微分方程
吉利在广西成立极电新能源公司
2014年全球通讯芯片产值将超过PC
蒂姆·库克赞成美国政府调查科技巨头 但否认苹果存在垄断
德州仪器推出两款全面集成型LED驱动器微型模块
USB3.0物理层中弹性缓冲设计
汽车电子芯片订单大幅减少 四维图新销售收入减少
联发科智能手机芯片狂吞摩托大单
笔记本主板芯片组
华为侧面验证5G通信技术对车联网发展的重大影响
运放的稳定性评估的基本原理
因需求疲软以及中国大陆制造商产能过剩 晶元光电连续第二个季度实现净亏损
为什么大部分服务器都要用Linux系统?
英创信息技术利用精简ISA总线扩展GPIO概述
华为为什么要投资类脑人工智能、半导体材料初创公司?
使用IIoT的智能水管理
作为“世界工厂”的中国,机器人产业该如何发展
行业协会标准免费下载|T/CSA 070-2021 《多功能杆结构设计规范》
MAX15109电流模式开关稳压器
MS6212是一款双向电平转换器,它的作用都有哪些