关 闭

新闻中心

EEPW首页 > 工控自动化 > 设计应用 > 位填充导致USB数据传输紊乱的一种解决方案

位填充导致USB数据传输紊乱的一种解决方案

作者:时间:2012-11-06来源:网络收藏

摘要:(USB)中要对数据进行非归零翻转(NRZI)编解码、添加/去除和串并/并串转换。添加/去除使每字节所需的时间发生变化,再加上收发器与协议层的时钟频率不同,从而可能导致。以USB 2.0设备控制器中的收发器为例,在收发器与协议层间添加(FIFO)作为缓存区可以解决这一问题。EDA软件仿真验证了该方法的可行性。
关键词:

在USB数据传输中,为了保证数据的可靠性,需要对所传输的数据进行NRZI编解码、添加/去除位填充和串并/并串转换。NRZI编码可以保证有足够的跳变沿在接收端进行时钟恢复;位填充是为了保证信号具有足够的变化量;串并转换可以降低后端数据处理模块的工作频率。
以USB 2.0设备控制器为例。在向主机发送数据时,其收发器模块先要将协议层传来的8位(或16位)并行数据转换成串行数据,然后添加位填充(每6个连续的1后要加入一个0),最后进行NRZI编码。反之,在接收主机发来的数据时,收发器模块要先对数据进行NRZI解码,再去除位填充,最后转换成8位(或16位)并行数据传给协议层。
USB 2.0设备控制器的收发器和后端协议层的工作时钟频率不同。对于具有高速(480 Mb/s)和全速(12 Mb/s)两种传输速度的USB 2.0设备控制器来说,收发器在高速、全速模式下的工作时钟频率分别为480 MHz和12 MHz;而协议层在高速、全速模式下的工作时钟频率统一为60 MHz(8位并行数据时,对于16位并行数据为30 MHz)。
由于添加/去除位填充导致了每字节数据传输所需的时间的增加或减少,再加上收发器和协议层工作时钟频率的差别,可能会导致数据的紊乱。

1 的原因分析
假设USB 2.0设备控制器的收发器工作时钟为clk,协议层使用8位并行数据,工作时钟为60 MHz的phy_clk,分析数据紊乱产生的原因。
1.1 高速接收模式
USB2.0协议中定义了信号RxValid表示接收数据有效,在phy_clk上升沿,若RxValid=1,协议层可以从收发器提取8位并行数据使用。Rx Valid信号变化后至少需要保持1个phy_clk周期,才能保证其被协议层的phy_clk时钟采样。
图1中Data_nrzi为已经过NRZI解码的串行输入数据;drop_bit为去位填充提示,当drop_bit=1时说明出现了连续6个数据1,其后的数据0为位填充位应该除去,不放入hold_reg中;Data_nrzi经过去位填充后放入hold_reg中,hold_reg收集了8个Data_nrzi数据后,将这8个数据以并行数据DataIn的形式传给协议层。

本文引用地址:http://www.eepw.com.cn/article/159707.htm

a.JPG


从图1中可以看出,在处理第二组8位数据时,由于其中有一个位填充需要去除,故处理这组数据用了9个clk周期,导致第一组8位并行数据在DataIn中的持续时间为9个clk周期,比正常多了1个clk周期。这样有两个缺点:
1)1个phy_clk周期为8个cIk周期,第1组8位数据持续9个clk周期有可能会被协议层采样两次。如图1中所示,第1组数跨越了两个phy_clk的上升沿,被采样两次。虽然出现这种情况的概率较小,但并不是不存在,且随着位填充数最的增多,这种多次采样的可能性会增大。
2)每当位填充的个数达到8个,输出的DataIn被协议层采样到的并行数据总量会比正确的情况多1个,从而导致数据接收错误。
为了避免上述错误,通常的做法是每当去除了8个位填充数据时,就令RxValid=0并持续1个phy_clk周期,使协议层暂停采样一次,从而避免第2)类错误的发生。但这种做法不能完全避免第1)类错误的发生。
1.2 高速发送模式
USB 2.0协议中同样定义了信号TxReady表示收发器准备好发送数据,在phy_clk上升沿,若TxReady=1,协议层便传输过来1个8位并行数据让收发器发送出去。同理TxReady信号变化后也至少要保持1个phy_clk周期。
图2中,TxReady由0变为1代表收发器已将包的同步域发送完毕,开始发送早已从协议层传来的第1组8位并行数据:DataOut为协议层传来的8位并行数据;在clk上升沿,将DataOut数据读取到暂存器hold_reg中;sd_raw为并串转换后的串行数据;stuff为添加位填充信号,当连续出现6个1时,stuff=1在串行数据中添加1位位填充数据0;sd_bs为添加位填充后的数据,对sd_bs进行NRZI编码后即可发送给主机。

b.JPG


从图2中可以看出,高速发送模式出现了两类错误:
1)TxReady由0变为1后开始发送第1组8位并行数据,而当phy_clk上升沿来临后DataOut和hold_reg先后变为了第2组8位并行数据,此时第1组数据并不一定恰好刚刚发完,于是会造成数据缺失或重复发送,同时使后面的数据发送混乱。图2中Txready变为1后sd_raw发送的第1个数据1为同步域的最后一位,接着发送的数据00为第1组数据中的2位,其余6位还未发送hold_reg中的数据已变成了第2组并行数据。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭