RZ、NRZ、NRZI与曼彻斯特编码:数字信号传输的底层逻辑与工程选型
发布时间:2026/10/6 9:40:53 作者:尧图编辑部 阅读量:1,286

1. 先搞清楚一件事比特到底怎么变成看得见的信号1.1 一条网线或者一根PCB走线里1和0的本质是什么做嵌入式、通信或者网络底层开发的工程师迟早会跟RZ、NRZ、NRZI、曼彻斯特编码这些词打交道。第一次看协议文档的时候满屏都是归零码非归零码翻转位中间跳变之类的术语感觉像在看天书。我当时也是硬着头皮啃后来被几回现场问题教育过才明白这些编码方式其实都是在解决同一个问题怎么让一串抽象的01数据在真实的导线、光纤、空气中被可靠地传输过去。先别急着背规则先想想底层一根导线里只有电压和电流没有1和0。所谓数字信号不过是把电压高低约定成逻辑值。高电平代表1低电平代表0这是最朴素的编码思想。可一旦到了实际工程事情就没那么简单。接收端怎么知道一个bit什么时候结束、下一个bit什么时候开始如果发送端连着发出100个0接收端看到的是一整段平静的低电平它怎么判断这是100个0还是50个0再比如发送端如果长时间输出高电平变压器之类的耦合器件会不会被憋死编码方式本质上是怎样用电压波形把比特流里的时间信息和数据信息一起打包好。我当年调试SPI总线时就吃过这个亏。示波器上明明是漂亮的方波主从设备却偶尔错一位查了半天也找不到逻辑漏洞。后来才意识到问题不在波形漂不漂亮而在接收端有没有可靠的采样时钟。SPI有独立的时钟线所以问题不大但很多串行总线没有单独的时钟线接收端只能从信号本身的跳变里去恢复时钟。哪种编码能提供更多有规律的跳变哪种就更容易让接收端跟上节奏。RZ、NRZ、NRZI、曼彻斯特这四种方案本质上就是一套比一套更舍得用跳变同时也在用带宽和复杂度换可靠性。1.2 三个绕不开的核心矛盾时钟、直流、带宽要把编码方式讲透先得建立三个评价维度后面所有对比都围绕这三件事展开。第一是时钟同步能力。数字接收端的采样时刻如果和发送端漂移就会采错电平。解决办法是从信号自身的跳变沿里恢复采样时钟跳变越多、越规律恢复越容易。这就像两个人对话如果说话的人每说几个字就停顿一下听的人很容易跟上节奏如果一口气匀速念一大段听的人稍微走神就不知道说到哪了。RZ、曼彻斯特就属于每几个字都停顿的类型NRZ则是一口气念到底的类型。第二是直流分量。一段信号的长时间平均电压如果明显偏离0V就叫有直流分量。直流分量对很多场景是致命的变压器无法传直流所以网口PHY通过变压器耦合时信号里带直流会让磁芯趋向饱和波形直接被拉坏。光纤通信里直流分量高意味着平均光功率偏高影响激光器寿命和接收机灵敏度。另外某些协议里长时间传输连续0或连续1线路上的平均电平会漂移接收端比较器的判决阈值也会跟着漂最终把有效信号采错。第三是带宽效率。信号的跳变越频繁高频分量越高在同样的物理线路上占用的带宽越大。带宽是硬资源铜线长了会衰减射频有频谱限制总线寄生电容也摆在那里。所以能用一个固定电平持续多久就持续多久的NRZ类方案带宽最省每个bit都要跳变的曼彻斯特最费带宽。工程上没有免费的午餐所谓好的编码方式就是在这三者之间找到适合自己场景的平衡点。2. RZ和NRZ一对勤快与偷懒的兄弟2.1 RZ归零码每个比特都回零时钟藏在跳变里RZ的全称是Return-to-Zero归零码。它的规则很勤快表示逻辑1时先把电平拉高但只保持半个位周期然后必须回到零电平表示逻辑0时整个位周期保持零电平。也就是说只要数据里出现1信号就会有一次清晰的高脉冲这个脉冲自带开始和结束两个边沿接收端看到边沿就能恢复时钟。举个例子发送比特流1011RZ的波形会是这样第一个bit是1前半个周期高电平后半个周期回0第二个bit是0整个周期都是0第三个bit是1高半个周期再回0第四个bit是1又高半个周期再回0。你会发现波形里高电平都是一小段一小段的看起来就像脉冲串。这种脉冲串结构让解码变得很直观只要检测到高电平就算1没有就算0而且跳变事件足够多锁相环很容易锁定。但RZ的代价也很明显。第一带宽消耗大。同一比特率下RZ波形里最高的信号成分频率相当于比特率的2倍因为每个bit内部都多来一次高到低的跳变线路实际需要的带宽比NRZ高出一截。第二平均电压偏低。大量时间是零电平信号的能量主要靠那半拍高电平维持长距离传输时信噪比不如NRZ。第三它对电平判决阈值比较敏感。如果回零阶段和逻辑0都共用零电平那接收端要分辨高脉冲和零两个状态比纯粹的高/低两态判决更容易受噪声影响。有人可能会问RZ是不是就被淘汰了并没有。光通信里的PAM4、PAM8这类多电平调制从脉冲后回到基准电平这个意义上看就是广义的RZ思路一些传感器输出的单总线协议、早期的磁记录设备也用类似归零结构主要图它自带时钟、解码简单。只是在普通铜线上的高速数字传输里RZ确实不是主流因为它太浪费电平状态了。2.2 NRZ非归零码电平保持一个位周期效率最高但最懒NRZ全称Non-Return-to-Zero非归零码。最常见的理解就是1对应高电平0对应低电平整个bit周期内电平保持不变不回到零。这也是大家在逻辑分析仪上最熟悉的波形几乎下意识认为数字信号就该长这样。NRZ的优点非常实在简单、直接、带宽最省。同样的比特率NRZ的信号基波频率最低对高频衰减和串扰不敏感所以在同等物理条件下NRZ往往能把速率推到更高。这也是为什么几乎所有高速SerDes内部的核心数据通路在均衡和预加重之后最终跑在线上仍然是一种NRZ形态的信号——不是说工程师不想用别的编码而是NRZ的带宽效率最高能省一点是一点。但NRZ的毛病是结构性的如果连续出现多个相同bit信号长时间没有任何跳变接收端就无法从信号里恢复时钟。比如发送100个连续的1线上就是一条平坦的高电平接收端只能靠自己的本地时钟硬撑。只要两端晶振稍有偏差或者噪声导致PLL失锁马上就会采错。此外长串相同电平意味着信号平均值严重偏向一侧直流分量很大变压器耦合、交流耦合的直接没法用。为了解决这两个病工程上一般不会让NRZ裸奔。8B/10B编码、64B/66B编码、还有各种扰码器scrambler本质都是先把数据流打散保证线路上的信号有足够多的跳变同时让0和1出现的几率尽量接近。所以你看到的PCIe、SATA、千兆以太网物理层虽然线路上跑的波形可以叫NRZ但其实是经过编码、扰码后的数据绝不是把CPU给的原始数据直接怼上去。这个细节很重要很多人调高速链路时以为NRZ就是简单高/低电平结果忽略了对数据流的预处理最后眼图惨不忍睹。3. NRZI不关心是高是低只关心变没变3.1 从电平到跳变的思路转变NRZI的全称是Non-Return-to-Zero Inverted非归零反向码。它和NRZ的核心区别在于NRZ把电平高低当信息NRZI把电平有没有变化当信息。最常见的USB方案约定是遇到逻辑0电平保持不变遇到逻辑1电平翻转一次。有些资料也会写1不变、0翻转那是另一种约定不同协议里定义不一样看文档时务必先确认是哪家的规矩。为什么会有这种思路因为在很多差分传输的场景里接收端真正关心的是有没有发生翻转这个事件而不是当前电压是高是低。比如USB就用一对差分线D和D-接收端比较两线电压具体哪根线高、哪根线低其实没那么重要重要的是有没有跨越阈值的事件发生。NRZI把1对应为翻转那么数据流里只要1出现得够多信号就不断在翻接收端就能获得持续的时钟参考。NRZI的另一个好处是带宽效率高。它不像RZ那样每个bit回零也不像曼彻斯特那样每个bit都强制跳变电平可以在整个位周期内保持所以同等比特率下线路上的高频率成分跟NRZ基本相当。这在USB那个年代是很宝贵的低速USB才1.5Mbps全速12Mbps但当时的MCU主频和线缆质量都不高用曼彻斯特会让线路波特率翻倍压力会大不少。3.2 位填充bit stuffing是如何救场的NRZI有一个绕不开的弱点连续的0依然没有跳变。如果数据流里出现一长串0NRZI和NRZ一样无能为力接收端时钟照样失锁。所以NRZI几乎从不单独使用必须搭配保跳变机制最典型的就是位填充bit stuffing。USB低速/全速的做法很有代表性发送端在数据流中如果检测到连续6个1就强制插入一个0使线路上的实际bit流变成连续7个1中间必然夹一个0的结构。为什么是6个1因为按USB的NRZI约定1会引发翻转连续6个1意味着信号已经翻了6次如果能保证在这之后不出现太长的无跳变区间接收端的PLL就可以在短时间里维持锁定。插入0是为了打断长时间不跳变的危险区间。位填充的本质是用极小比例的带宽冗余换掉信号长时间静止的风险。代价是接收端必须做解填充收到连续6个1之后要判断第7个bit到底是填充的0还是真实数据。接口控制器里的位填充/解填充电路就是干这个活的。如果实现有误就会出现经典的插0丢0错误抓包时看到USB帧错乱很多时候根子就在这。还有一个容易忽略的细节位填充不能随意延迟它要求硬件在发送路径上实时扫描bit流并插入这会影响发送延迟和吞吐。USB全速模式名义12Mbps经过位填充后实际线路速率会稍微高于名义值所以用协议分析仪观察时实际波形速率和标称速率不完全一样别大惊小怪。我自己写FPGA USB控制器时位填充逻辑的仿真case一定要覆盖最长连续1的边界否则上板后会出现偶发断帧那种问题极难查。3.3 为什么USB偏偏选NRZI很多人会问USB明明可以选曼彻斯特编码连位填充都省了为什么偏要选NRZI原因主要有三点。第一是带宽效率。低速USB只有1.5Mbps全速12Mbps但当时MCU性能有限线缆质量也很一般。NRZI接近NRZ的带宽效率而曼彻斯特会让线路波特率翻倍对廉价USB线缆和普通IO来说压力更大。第二是收发器复杂度。NRZI只需要一个差分驱动器和比较器翻转逻辑非常简单曼彻斯特则需要精确的双沿生成电路对晶振稳定度和时序约束要求更高成本自然上去。第三是历史延续性。USB设计时参考了大量成熟的串行总线经验NRZI加位填充的组合在硬盘接口、网络接口里已经验证过风险和不确定性最小。当然NRZI也不是没有缺点。它没有曼彻斯特那种每位必有跳变的强保证时钟恢复完全依赖位填充兜底同时它对1和0翻转不对称长期来看DC平衡不如曼彻斯特。所以USB后来在高速模式480Mbps转用了更复杂的方案NRZI只在低速和全速的历史舞台上保留。这不是NRZI不行而是在越来越高的速率下需要更先进的编码来兼顾带宽和同步。4. 曼彻斯特编码把变化本身变成信息4.1 编码规则每位中间必须跳变方向定0/1曼彻斯特编码Manchester Encoding的规则所有教材里都差不多每个bit周期正中间必定有一次电平跳变用这次跳变的方向来区分0和1。最常用的IEEE 802.3里10BASE-T的定义是位中间从高到低跳变表示逻辑1从低到高跳变表示逻辑0。但请注意很多RFID标准用的就是相反约定所以看资料时先确认是哪家定义再对波形否则会把0和1全部读反。这里要特别强调位中间必有跳变这句话它不只是说大多数时候有跳变而是每一位都有。这意味着曼彻斯特信号在任何位置都能提供一个边沿事件接收端锁相环锁定的难度极低哪怕数据流是清一色的0或1同步也完全不会丢。这个特性在低速、长距离、时钟精度不高的场合极其珍贵。同时在位与位的交界处电平可能保持不变也可能再次跳变边界处的跳变只是为了衔接相邻bit的电平状态并不承载数据。所以看波形时别搞混只有位中间的跳变才是信息边界跳变是附属品。用示波器观察的时候你数一下每个bit格子里必然至少有一个中间沿多出来的那些是边界沿。这也是曼彻斯特信号和普通NRZ最直观的区别它永远不可能静静地保持一个电平静止一个完整位周期。4.2 为什么说它自带时钟且没有直流分量自带时钟很好理解每位一跳动相当于在数据流里嵌入了时钟信号。接收端可以直接从信号沿恢复采样时钟不需要额外的时钟线。这也是曼彻斯特适合只有两根线信号地、又不方便传时钟的场景的原因。典型例子是RFID标签没有独立电源也没有时钟线读卡器发过来的载波和被调制的曼彻斯特信号对方直接从边沿里恢复工作时钟整个握手才能进行。直流分量方面曼彻斯特的每位中间跳变意味着每个bit内高电平时间和低电平时间基本各占一半长时间平均电压非常接近0信号里几乎没有低频直流成分。这就让它可以轻松通过变压器、电容耦合不会因为连续长时间高电平把隔直电容充到饱和。老式10BASE-T以太网用曼彻斯特信号经过变压器送到双绞线上靠的就是这种DC平衡特性。变压器不传直流如果信号有直流分量磁芯会被单向磁化到饱和波形直接畸变后端的均衡器根本救不回来。但DC平衡不是免费的。前面说了曼彻斯特的基波频率等于比特率的2倍实际需要的信道带宽比NRZ大一倍。10Mbps以太网用曼彻斯特线上等效波特率是20Mbaud这就是为什么10BASE-T只能停留在10Mbps而百兆以太网必须换用4B5B加MLT-3等新方案来节省带宽。编码在自带时钟、DC平衡和带宽翻倍之间没有回头路可走。4.3 差分曼彻斯特编码抗干扰的升级版曼彻斯特还有个变体叫差分曼彻斯特编码Differential Manchester Encoding。它的规则是每个bit中间依然必有一次跳变但0和1不是靠跳变方向区分而是靠位起始处有没有额外跳变来区分。通常约定是位起始处有跳变表示0没有跳变表示1或者反过来各标准不一。差分版本的最大好处是抗极性和抗地电位漂移。如果两根信号线接反了普通曼彻斯特会把0和1全部对调解码结果完全错乱差分曼彻斯特只看跳变有无而不是电平高低极性反了也照样判断。同理它对共模噪声、地电位差异也更钝感。在很多工业总线、RFID系统里差分曼彻斯特至今还在用拼的就是这个鲁棒性。不过它的波形边界跳变更密集硬件判断逻辑稍微复杂一点解码时需要同时跟踪上一个状态和当前bit起始处有没有翻转。新手容易在状态机的状态转换上出错调试时先给固定数据比如0x55一眼就能从示波器波形上验证有没有写反。5. 同一根示波器下看四种波形关键指标横向对比5.1 效率、自同步、直流、抗干扰一览表光讲规则容易晕列个表就清楚了。这里统一按相同的逻辑比特率来比较各种编码在物理链路上的表现编码方式跳变密度线路等效波特率自同步能力直流分量硬件复杂度典型应用RZ每个1有跳变0没有最高约2倍依赖1的密度低中早期磁记录、部分传感器总线NRZ依赖数据长0/长1时无跳变1倍差高易基线漂移极低UART、SPI、SerDes内部NRZI每个1翻转0无跳变1倍依赖1密度需位填充兜底中低USB低速/全速曼彻斯特每位1次100%2倍极好极低DC平衡中高10BASE-T、RFID表格里线路等效波特率指的是物理信号实际翻转速率相对于bit率的倍数。曼彻斯特和RZ都需要更宽的带宽NRZ/NRZI在这一点上最省钱。但这不是说NRZ一定好而是不同应用对同步稳定性和带宽代价的权重不一样。你要传几十公分PCB走线NRZ完全够用你要传几十米隔离链路还想省一根时钟线曼彻斯特的价值立刻体现。5.2 从波形看误码扩散现象四种编码还有一个容易被忽略的差异单个bit错误之后错误会不会传染给后面的bit。NRZI是重灾区因为它用翻转与否来解信息一旦某一位采样错误接收端得到的当前电平状态就是错的之后所有bit再基于这个错误状态去判断变没变结果就是这个错误会一路滚下去直到下一次能够重新对齐的同步事件出现。所以NRZI系统往往在数据头部放同步码序列同时配合CRC校验一旦出错就整帧重传不让错误一路蔓延。曼彻斯特则相反它有比较强的错误自检倾向。传统曼彻斯特编码中每一位都应当满足中间必有跳变和高/低占空比接近一半这两个约束一旦噪声破坏了其中一个接收端可以立刻判断这不符合合法码型从而打出错误标志。这也是为什么一些用曼彻斯特的协议误码检测可以做得相对简单不需要帧尾大量CRC兜底。RZ和NRZ的表现取决于具体实现。RZ因为每个1后面紧跟零电平对毛刺的容忍度稍好NRZ一旦采样点落在错误的判定位上通常是一个整bit错但由于没有状态记忆错误不会扩散到后续bit。归纳成一句话编码里的高频跳变能换来自同步和自检测能力代价是带宽带宽省了就得用填充、校验机制去弥补同步和检测的缺失。6. 项目选型实战这些编码在真实设备里都怎么用6.1 串口为什么不直接用曼彻斯特很多人学完曼彻斯特会觉得它完美然后产生一个经典疑问为什么我天天用的UART还是裸的NRZ关键在异步两个字。UART根本不去信号里恢复时钟它靠通信双方预先约定波特率然后在每个字节前面加起始位来对表。字节内部只有8个bit时间很短只要两端晶振误差在允许范围内接收端用本地时钟采样完全够用不需要每位都携带时钟边沿。所以在短距离、低速率、双方晶振可靠的场景NRZ加起始位/停止位就是最划算的方案。如果硬改成曼彻斯特意味着RS-232线路的波特率要翻倍电平还要严格对称旧式MCU的IO根本跑不动成本完全划不来。反过来如果传输距离很长、接收端无法保证时钟精度、或者线路要过变压器UART那种裸NRZ就力不从心了曼彻斯特的优势才能真正体现。选什么编码从来不是哪个更先进而是哪个刚好够用且最便宜。6.2 CAN、USB、以太网各自的选择逻辑把这些编码放到真实协议里看选型逻辑非常清晰CAN总线用的是NRZ加位填充。CAN的位时间本身就有同步段和相位段节点通过帧起始和填充位保持同步同时差分信号提供共模抗扰。它没用曼彻斯特是因为现场总线在乎波特率效率而且CAN协议自带非常强的错误处理机制已经能兜住NRZ的同步弱点。USB低速/全速用NRZI加位填充核心诉求是省带宽、省硬件前面已经细说了。老式以太网10BASE-T用曼彻斯特为的是变压器隔离下的DC平衡和自时钟百兆以太网改用4B5B加MLT-3是因为100Mbps下曼彻斯特需要200Mbaud带宽双绞线实在扛不住千兆以太网干脆用PAM5多电平调制。每一代升级本质上都是在带宽效率、DC平衡、时钟恢复之间重新找平衡。看多了会发现一个规律低速、低成本、可靠性优先的总线偏爱带自同步的编码高速、带宽紧张的链路偏爱NRZ类加编码表或扰码器对直流敏感、要过变压器的场景一定优先考虑DC平衡方案。6.3 我的踩坑记录与调试建议最后分享几个实际项目中踩过的坑都是常规文档里不会写的。第一个坑DC不平衡导致的变压器饱和。有段时间我想做一个私有协议直接把基于NRZ的串行数据怼进带变压器的以太网PHY前端结果示波器上看到的信号眼图一塌糊涂。后来才意识到NRZ长时间出0或出1会让变压器磁芯进入饱和波形被拉得变形根本不是后端均衡能救的。解决办法要么换DC平衡编码要么做8B/10B或者加扰码让平均电平稳住。第二个坑时钟容差被忽视。设计一条长距离RS-485链路时选了普通NRZ两端晶振都是20ppm理论上完全够用。实际线缆一长、地电位有差异接收端采样点抖动变大偶尔就整包错。后来我在接收端用了边沿触发再配合软件重采样并在数据帧前面加了更长的前导码问题才缓解。NRZ不是不能用但你的系统必须给它足够的同步预处理。第三个坑示波器上判断编码方式时别只盯着高低电平看。NRZI和NRZ的波形长得几乎一模一样区别只在翻转代表什么。如果你不知道USB协议头部有同步序列抓到的波形很容易被当成普通NRZ来读然后得出完全错误的逻辑电平。我的建议是调试任何新总线前先找到协议文档里的同步码型比如USB的SYNC字段用示波器做触发条件一下子就能看清编码规则和边界跳变。我在实际项目里体会最深的一点是编码方式决定的不只是波形好不好看而是整个系统的误码率、成本和设计复杂度。搞懂RZ、NRZ、NRZI、曼彻斯特编码的取舍比背下再多定义都有用。下次画原理图或写FPGA逻辑时多问一句这个信号走的是什么编码它的时钟和直流靠什么保证很多底层问题就能提前规避。