微波EDA网,见证研发工程师的成长!
首页 > 射频和无线通信 > 射频无线通信文库 > 实现USB3.0物理层中弹性缓冲的设计方案

实现USB3.0物理层中弹性缓冲的设计方案

时间:07-29 来源:互联网 点击:

值监测单元一直监测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.总结

  本文通过分析弹性缓冲的作用与机制,采用异步时钟FIFO来设计弹性缓冲。并且根据USB3.0协议要求,提出了断点保存、指针跳跃与握手、指针屏蔽等方法来设计弹性缓冲。本设计充分考虑了PIPE 3.0标准的要求与实际需要,并且应用于工程中,实现了弹性缓冲补偿时钟的目的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top