[USB协议]USB线路编码(Line code)反向不归零编码 NRZI的原理

Note:

很早以前研究过一段时间USB协议,也保存整理过一些文章,现在拿出来看看并整理到blog上。有些文章找不到出处,有些是多篇拼凑的,无奈,如有侵权问题请谅解并告知。


NRZI (No Return Zero-Inverse) 反向不归零编码 或者 非归零反向编码

解释:NRZ-I编码中,编码后电平只有正负电平之分,没有零电平,是不归零编码。

根据这一编码原则,假设发送端传送8位数据流0000 0001B,前面的7个0位经过NRZ-I编码后,将得到7次翻转信号,如图二的同步域部分。在接收端根据脉宽很容易得到同步接收时钟。此后根据这个频率的倍频来采样后面的数据。在传输过程中,每一次编码的跳变都可以用来同步。这种同步机制在USB低速和中速传输中得到应用。即发送数据前,首先发送同步头 SYNC,内容为01H。这样就可以同步传输数据了,且字节开头和结尾不需要起始位和停止位。

过程

NRZ-I电平的一次翻转来表示Data电平的逻辑0,与前一个NRZ-I电平相同的电平表示Data电平的逻辑1( 翻转代表0,不变代表1)。仔细观察,我们发现,NRZ-I编码信号经过反向后,还原的内容不变。典型应用如USB传输。



原理
NRZ-I No Return Zero-Inverse 非归零反相编码
在传输中,同步头SYNC为00 01H,15个翻转信号。
但是当传输连续的逻辑1位时,NRZ-I编码后,将保持上一次翻转后的状态。这使得接收端无法从中得到同步信号。为此,USB协议规定:如果要发送的数据中出现有连续的6个1,则在进行NRZI编码前,在这6个连续的1后面会插入1个0,然后再进行NRZI编码。接收端收到连续6个1,将自动去掉后面的1个0。从而恢复原数据。这样就使得USB通信的接收同步更加可靠。


下面是几个类似编码的介绍。

NRZ can refer to any of the following serializer line codes:

Code nameAlternate NameComplete NameDescription
NRZ(L)NRZLNon-Return-to-Zero LevelAppears as raw binary bits without any coding. Typically binary 1 maps to logic-level high, and binary 0 maps to logic-level low. Inverse logic mapping is also a type of NRZ(L) code.
NRZ(I)NRZINon-Return-to-Zero Invertedrefers to either an NRZ(M) or NRZ(S) code.
NRZ(M)NRZMNon-Return-to-Zero Markserializer mapping {0:constant, 1:toggle}
NRZ(S)NRZSNon-Return-to-Zero Spaceserializer mapping {0:toggle, 1:constant}
The NRZ code also can be classified as a polar or non-polar, where polar refers to a mapping to voltages of +V and -V, and non-polar


下面是就RZ与NRZI编码的对比介绍。并结合usb的协议做解释。


RZ 编码(Return-to-zero Code),即归零编码。

在 RZ 编码中,正电平代表逻辑 1,负电平代表逻辑 0,并且,每传输完一位数据,信号返回到零电平,也就是说,信号线上会出现 3种电平:正电平、负电平、零电平:



从图上就可以看出来,因为每位传输之后都要归零,所以接受者只要在信号归零后采样即可,这样就不在需要单独的时钟信号。实际上, RZ编码就是相当于把时钟信号用归零编码在了数据之内。这样的信号也叫做自同步(self-clocking)信号。

这样虽然省了时钟数据线,但是还是有缺点的,因为在 RZ 编码中,大部分的数据带宽,都用来传输“归零”而浪费掉了。

那么,我们去掉这个归零步骤,NRZ 编码(Non-return-to-zero Code)就出现了,和 RZ的区别就是 NRZ是不需要归零的:


这样,浪费的带宽又回来了,不过又丧失宝贵的自同步特性了,貌似我们又回到了原点,其实这个问题也是可以解决的,不过待会儿再讲,先看看什么是 NRZI:

NRZI 编码(Non-Return-to-Zero Inverted Code)和 NRZ的区别就是 NRZI用信号的翻转代表一个逻辑,信号保持不变代表另外一个逻辑。

USB 传输的编码就是 NRZI 格式,在 USB中,电平翻转代表逻辑 0,电平不变代表逻辑1:


翻转的信号本身可以作为一种通知机制,而且可以看到,即使把 NRZI 的波形完全翻转,所代表的数据序列还是一样的,对于像 USB这种通过差分线来传输的信号尤其方便~

现在再回到那个同步问题:

的确,NRZ 和 NRZI 都没有自同步特性,但是可以用一些特殊的技巧解决。比如,先发送一个同步头,内容是 0101010的方波,让接受者通过这个同步头计算出发送者的频率,然后再用这个频率来采样之后的数据信号,就可以了。

在 USB 中,每个 USB数据包,最开始都有个同步域(SYNC),这个域固定为 0000 0001,这个域通过 NRZI编码之后,就是一串方波(复习下前面:NRZI遇 0 翻转遇 1 不变),接受者可以用这个 SYNC域来同步之后的数据信号。

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

但是,这样还是会有一个问题,就是虽然接受者可以主动和发送者的频率匹配,但是两者之间总会有误差。假如数据信号是 1000个逻辑 1,经过 USB的 NRZI 编码之后,就是很长一段没有变化的电平,在这种情况下,即使接受者的频率和发送者相差千分之一,就会造成把数据采样成 1001个或者 999个 1了。

USB 对这个问题的解决办法,就是强制插 0,也就是传说中的 bit-stuffing,如果要传输的数据中有 7个连续的 1,发送前就会在第 6个 1 后面强制插入一个 0,让发送的信号强制出现翻转,从而强制接受者进行频率调整。接受者只要删除 6个连续 1之后的 0,就可以恢复原始的数据了。

 

既然说编码,那就顺便把另一种极常用的编码也说一下把:曼彻斯特编码

曼彻斯特( Manchester )码是一种双相码。用高电平到低电平的转换边表示 0,而用低电平到高高电平的转换边表示 1。

注:以上关于电平的表示,具体环境或者不同教材给出的规定可能不同,但是原理相同!




参考文章:

https://en.wikipedia.org/wiki/Line_code

https://en.wikipedia.org/wiki/Non-return-to-zero

http://www.cnblogs.com/jiegekaoyan/archive/2010/09/08/1821779.html

http://baike.baidu.com/link?url=wX4e2qsw9U5xDlCU970mH1rduPm72wQgG_KOiToGKkv7Dpjwp-QS6Z11JSAgwCZEIQI1kxJb2ByMxeE33CAkjK


  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值