您的位置:首页 > 其它

USB 之传输编码格式 NRZI 介绍

2017-08-16 19:30 253 查看

记录NRZI (Non-Return-to-Zero Inerted code) 非归零翻转编码,之前,我先稍微记录一下他的前身。

RZ 编码(Return- to - zero coding)

RZ 编码,简单的来说,就是在每一位普通的编码后面加了一个零电平。所以叫做归零编码,正电平代表1,后面再接一个0电平,告诉接收器该同步了,负电平代表0,然后又接一个0电平。
如下图所示




可以看到,每一位后面都接了一位0电平,所以接收器在接收到 0 以后采样即可,这样就不用单独的时钟信号,实际上,RZ编码就相当于把时钟信号用 0 编码在数据之内,这样的信号也叫自同步(self-clocking)信号。
这样的做法虽然在物理上少了一根时钟线,但是在带宽上确有一大部分都用在 归零 上面了。


第二种演变,去掉归零 NRZ (Non - Return - to - Zero - code)编码,就是讲 RZ 编码的归零去掉



这样做虽然我们带宽不浪费了,但是我们的时钟线的同步信号又要另外给。


第三种演变,NRZI(Non - Return - to - Zero - Inverted - code) 非归零翻转编码

和NRZ 编码不同的是,NRZI 编码利用的电平的翻转来代表一个逻辑,当前电平相对于前一个电平不变代表1,当前电平相对于前一个电平相反代表0
USB 的传输就是用的 NRZI 编码格式,再USB 中,电平翻转代表逻辑0,电平不变代表逻辑1

如下图所示:




数据同步问题

再回到同步的问题。
NRZ 和 NRZI 都没有同步的特性,但是,可以用一些比较特殊的技巧来解决,比如,先发送一个同步头,内容是0101010, 让接受着通过这个同步头来计算发出的频率,然后再用这个频率去接受之后的数据信号。

再USB 中,每一个USB的数据包,最开始的时候都有一个同步域,这个域定义为 0000 0001,这个域通过 NRZI 编码后,就是一个正负正负的方波,接收者可以通过这个方波计算频率,然后同步后面的数据

此外,因为在USB的NRZI编码下,逻辑0会造成电平翻转,所以接受者在接收数据时,根据接收的翻转信号调整频率,保证数据传输正确。

但是,这样还会有一个问题,然后接收者可以主动和发送者之间频率匹配,但是两者之间总会有误差,假如数据时1000个逻辑1,经过 NRZI 编码后,很长时间都是同一个电平,这种情况下,即使接收者和发送者之间的频率相差千分之一,就是造成采样 999 个1或者是1001 个1.

USB 对这种问题的解决方法就是强制插一个0, 也就是传说中的 bit-stuffing,如果输出的数据中有7个连续的1,发送前就会在第6个1后面强制插入一个0,就让发送的信号强制出现翻转,从而强制接受者调整频率,接受者只要删除6个1之后的那个0,就可以恢复原有的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: