ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

深挖RZ、NRZ、NRZI与曼彻斯特编码:数字通信自同步与带宽权衡

深挖RZ、NRZ、NRZI与曼彻斯特编码:数字通信自同步与带宽权衡 做硬件和嵌入式这么多年我越来越觉得“编码方式”这四个字是数字通信里最容易被低估的核心知识点。很多人写代码的时候天天跟UART、SPI、USB打交道但真要问一句线上跑的波形到底是什么样为什么USB要用NRZI而10M以太网偏偏选曼彻斯特编码能答上来的人其实不多。RZ、NRZ、NRZI、曼彻斯特编码这几种看起来差不多的方案背后是带宽、时钟恢复、抗干扰、直流分量之间的一连串权衡。这篇文章就是想把这几编码方式的来龙去脉、选型逻辑和调试经验一次讲透。不管你是刚接触通信原理的学生还是正在调接口协议的工程师只要能理解“发送端和接收端怎么对时钟”这件事剩下的都能顺着推出来。1. 先搞清楚为什么不能直接把0和1发出去1.1 数字信号的本质电平不是全部时间才是很多初学者会有一个天然直觉“1就是高电平0就是低电平直接发出去不就行了”这个直觉没有错但忽略了接收端最关键的处境它不知道每个bit什么时候开始、什么时候结束。举个最直白的例子串口空闲时是高电平发送一个字节时先拉低一个bit作为起始位然后依次发8个数据位最后再拉高。接收端能正确解读的前提是双方约定好了波特率并且起始位能精准对齐采样时刻。一旦两边时钟有偏差或者线路上噪声让边沿偏移数据就会像唱歌不看节拍一样越唱越乱。所以数字传输的真正问题不是“用多高的电平表示1”而是“接收端如何从信号本身恢复出bit边界”。编码方式的设计目标表面上是把二进制数据变成电压波形实际上是在电平和时间两个维度同时做文章。哪个方案能让接收端更容易提取时钟哪个方案就能在长距离、高速度、强干扰的环境下活下来。1.2 时钟失步编码要解决的头号敌人数字通信系统里发送端和接收端的时钟不可能完全一致。就算用了同一个晶振型号温度变化、电压波动、器件差异都会让两个时钟产生漂移。如果一次传输持续很长时间漂移会累积最终导致接收端在第几百个bit的时候采样到错误的位置。解决时钟同步有两条路线。一条是“外同步”比如SPI总线专门拉一根时钟线SCLK接收端跟着这根线采样简单粗暴但代价是多一根线而且高速时线间延迟会成为新的瓶颈。另一条就是“自同步”让数据信号本身携带时钟信息接收端从跳变沿里提取出时钟。RZ、曼彻斯特编码走的就是这条路。理解了这个背景再看各种编码方式会清楚很多NRZ本身不具备自同步能力所以实际系统要么像UART那样用起始位对时要么像SATA那样另外做扰码和8b/10b编码NRZI虽然也不直接携带时钟但它规定“1必须跳变”再加上位填充机制就能间接保证信号里始终有足够的边沿供时钟恢复曼彻斯特编码则每个bit中间都制造一次跳变跳变本身就充当了时钟信号。1.3 编码的真正取舍带宽、直流、复杂度三者不可兼得既然自同步这么重要是不是所有系统都该用曼彻斯特编码当然不是。曼彻斯特编码每个bit至少跳变一次信号频率会翻倍也就是说10Mbps的数据率需要至少20Mbaud的线路速率带宽开销直接翻倍。到了百兆以太网时代如果继续用曼彻斯特编码对传输介质、变压器、PCB走线、EMI的要求都会高到不划算。所以工程上永远是在三个维度间做权衡带宽效率、自同步能力、实现复杂度。RZ和曼彻斯特用带宽换时钟恢复能力NRZ保留了全部带宽但把同步问题甩给了协议层NRZI在两者之间踩了个中间点它不增加跳变频率只改变跳变的语义代价是必须配合位填充或者同步码才能可靠工作。没有哪一种方案是“最好的”只有“最合适的”。2. 逐一拆解四种编码方式2.1 RZ编码每个bit中间都要回到零RZ全称Return Zero归零码。它的特点很直白发送“1”时输出高电平但在bit周期的中间位置必须回到零电平发送“0”时整个周期都是零电平。也就是说每个bit的波形都是一个脉冲脉宽大约只占半个bit周期所以也叫占空比50%的信号。这种编码最大的优点是自带节拍。接收端只要检测到脉冲的下降沿就知道一个bit的中点到了可以据此校准采样时刻天然解决了时钟同步问题。早期的磁记录设备、部分传感器接口和光通信链路用过类似思路因为简单而且可靠。但它的问题也很明显脉冲宽度窄意味着信号的高频分量多同码率下需要的信道带宽大约是NRZ的两倍而且长时间发0时线路上完全没活动接收端失去参考沿仍然会漂移。另外每个bit只有一半时间在传输能量信号平均功率低信噪比也会受影响。实际工程里纯RZ编码现在已经很少作为高速接口的物理层方案了更多是作为一种思路出现在测量仪器和低速控制链路中。如果你在示波器上看到一个bit周期内电平从高跳回零的波形基本就可以判定这是RZ类信号。2.2 NRZ编码最简单也最“裸”NRZ全称Non-Return-to-Zero不归零码。这就是大家直觉里的“1高0低”一个bit周期内电平保持恒定要么高要么低不需要回到零。UART、SPI、I2C甚至早期的RS232本质上都是NRZ的变体。它的优势是简单、带宽利用率高同码率下信号基波频率最低。两个连续的1或0之间电平不变化这对降低EMI和减小高频衰减都有利。但NRZ的自同步能力为零。如果一个NRZ信号连续传输几十个相同的bit接收端看到的是一段平坦的电平没有任何边沿可以用来对齐采样时刻时间一长就会不知道当前读到第几位。所以NRZ系统必须借助外部机制来同步UART靠起始位的下降沿重新对齐然后靠约定波特率硬数高速差分接口如SATA则用8b/10b编码保证电平翻转足够频繁。也可以说NRZ把“好处理”的麻烦从物理层推给了协议层。实际调试NRZ信号时有一个常见的错觉看到波形高低电平都正常以为数据没问题却忽略了电平持续了多久、边沿有没有抖动。NRZ能不能解码不仅取决于电平对不对还取决于采样点选得准不准。这也是为什么uart通信波特率稍微偏一点就会出乱码的原因——误码率不是瞬间爆掉的而是随着bit数增加逐渐恶化的。2.3 NRZI编码跳变才是信息NRZI全称Non-Return-to-Zero Inverted不归零反转码。它和NRZ最大的区别是NRZI编码下电平的绝对值不再代表bit值取而代之的是“相对变化”。最常见的定义是遇到“1”时电平必须翻转遇到“0”时电平保持不变。注意这里没有绝对的高或低只看有没有跳变。这样设计有两个直接好处。第一个是抗极性反转。如果两根差分线在连接器处接反了NRZ直接解码出来全是反的但NRZI只看跳变线序反了照样能解出正确数据。USB的低速和全速模式就采用了NRZI这也是为什么USB线即使两数据线接反很多时候设备依然能正常枚举。第二个好处是改善连续1时的时钟恢复——因为每个“1”都强制制造边沿接收端锁相环有足够的事件可追踪。但NRZI并没有完全解决连续0的问题。连续0意味着电平一直不变线路上长时间没有边沿时钟恢复还是会面临挑战。所以在USB物理层里除了用NRZI编码还得配上位填充机制当检测到连续6个1之后发送端强制插入一个0这样线上最多连续6个bit不翻转锁相环不至于彻底失锁。这个细节很多人学的时候会忽略实际上它是NRZI能在USB上稳定工作的关键拼图。2.4 曼彻斯特编码自带时钟的经典曼彻斯特编码可以说是所有自同步编码里最优雅的一种。它的规则是每个bit的周期中间必然发生一次电平跳变。这个中间跳变同时承担两件事——既产生时钟边沿又表达数据。在IEEE 802.3定义的以太网标准里从高电平跳变到低电平代表1从低电平跳变到高电平代表0。也有的文献采用相反的定义但核心思想都一样bit中间的那一刀既是节拍器也是信息本身。因为每个bit至少有一次跳变接收端无论收到什么样的数据序列都能从信号里稳定提取时钟不需要额外插同步码或位填充。而且曼彻斯特编码的平均电平是恒定的直流分量几乎为零这对变压器耦合的以太网接口特别友好——变压器天然隔直流如果信号本身带直流分量经过变压器后波形会畸变无法正确解码。10BASE-T就是看中了这两点才放心地把曼彻斯特编码作为物理层方案。曼彻斯特编码的代价也清楚效率对半。编码后线路波特率等于数据率的两倍10Mbps的以太网实际线上跑的是20Mbaud的信号。这个特性在某些场景是优点比如RFID和NFC卡通信数据率很低用曼彻斯特编码既能可靠供电又能稳定通信完全不在乎带宽翻倍。但在百兆以太网里翻倍后的频率就成了不可承受之重。另外还有差分曼彻斯特编码Differential Manchester它保留了“bit中间必跳变”的时钟特性但数据改为由每个bit起始处是否有额外跳变来表示。这种编码用于令牌环网等场景好处是同样具备自同步和抗极性反转能力。虽然现在很少见但理解它对理解“时钟携带”和“数据携带”的分工很有帮助。3. 横向对比与参数解读3.1 四张“成绩单”摆在一起看把RZ、NRZ、NRZI和曼彻斯特编码放在同一张表里对照各自的性格差异马上就能看出来。表格里我按“自同步能力、带宽效率、直流分量、实现复杂度、典型应用”五个维度做了总结编码方式自同步能力带宽效率直流分量抗极性反转典型应用RZ较强bit中有回零沿约50%脉冲窄导致高频分量多有否低频测量、磁记录NRZ无连续同电平必失锁100%效率最高有否UART、SPI、SATA配合扰码NRZI依赖位填充/同步码连续1可自同步100%与NRZ相当有是USB低速/全速、光纤通道曼彻斯特强每个bit中间必跳变约50%波特率翻倍无否差分版本可抗10BASE-T、RFID、NFC这张表里有个容易混淆的点NRZI虽然也以“差分”开头但这里的“差分”指的是“逻辑差分”——信息存储在电平变化中与物理层是不是差分线没有关系。USB的D/D-是一对差分线但NRZI本身不要求物理差分只要能检测到电平跳变单端线也能用NRZI。反过来RS485是物理差分线但传输的仍然是NRZ数据。这两个维度不要混在一起。“带宽效率”那一栏里的数字也要正确理解。NRZ的100%效率意味着每1Hz带宽能传输1bit/s的数据而曼彻斯特编码需要2倍带宽所以效率记作50%。RZ因为脉冲变窄频谱展宽实用效率也接近50%。在选型时带宽效率直接决定了传输介质和驱动电路的成本这就是为什么高速接口几乎都用NRZ加扰码/均衡的组合而不是直接上曼彻斯特编码。3.2 为什么10M以太网选曼彻斯特而100M不选很多人会奇怪同样是以太网为什么10M和100M物理层差异这么大答案就藏在编码方式的带宽账本里。10BASE-T数据率只有10Mbps用曼彻斯特编码后波特率20Mbaud当时的芯片工艺、变压器和布线技术完全可以承受还能白赚自同步和零直流分量两个优势。到了100BASE-TX数据率是100Mbps。如果照搬曼彻斯特编码线上波特率会变成200Mbaud。这个频率下双绞线的衰减和电磁辐射都变得非常棘手设计成本和量产难度会爆炸式上升。于是工程师换了个思路先用4B5B编码把数据流转换成更适合传输的码型再用MLT-3三电平编码进一步降低线路频率。MLT-3不是把高电平当作1、低电平当作0而是让电平在三个状态之间循环切换比如从0到1到0再到-1像走台阶一样这样既能表达信息又把信号最高频率限制在数据率的1/4以下。100BASE-TX最终跑出的线路速率为125Mbaud比曼彻斯特方案的200Mbaud低了37.5%这就是工程权衡的典型范式。所以编码方式的选择从来不是理论题而是算账题。低速时可以奢侈地用带宽买可靠性和简单性高速时必须精打细算每一赫兹和每一个dB的代价。任何编码方案能活下来都是因为它让系统总成本最低。3.3 差分编码为什么抗干扰NRZI的隐藏优势NRZI常被包装成“抗干扰编码”但它的抗干扰能力到底来自哪里很多资料没说透。NRZI表达信息的载体是电平变化而不是电平本身。这意味着只要跳变沿没有丢失、没有产生虚假跳变哪怕整个信号被叠加了固定的直流偏移、哪怕线缆两端的地电位有差异解码依然正确。举个例子如果你的连接器公头和母头接触不良产生了几百毫伏的接触电阻压降NRZ信号的绝对电平可能被拉低到逻辑阈值以下解码直接失败。但NRZI信号只是整个波形向下平移跳变沿依然存在接收端照样能从变化中恢复数据。这个特性在工业现场长距离布线的场景特别有价值因为地电位漂移和直流偏移几乎无法完全消除。需要清醒的一点是NRZI抗的是“缓变干扰”和“极性颠倒”它并不抗随机噪声。如果噪声大到让电平在非预期时刻跳变接收端就会把噪声当成数据解出来照样产生误码。所以NRZI并不是万能的“防误码保险”它只是在特定干扰模型下表现更好。理解了这个细节你在项目里取舍时就不会被宣传话术带偏。4. 实际工程中的选型与调试经验4.1 从应用场景反推编码选型接手一个新项目时我不会先想着“用哪种编码最先进”而是先问三个问题传输距离有多远数据率有多高有没有现成的时钟线。如果距离短、速率低、有专属时钟线比如板级SPI通信直接用NRZ编码加一根SCLK时钟线最简单可靠。不要为了炫技引入曼彻斯特编码那只会徒增逻辑复杂度和信号频率。如果信道只有一对线或者一个光口无法单独传时钟数据率又不高曼彻斯特编码是最稳妥的选择像早期的10M以太网用磁隔离加曼彻斯特编码硬件上几乎不用为时钟恢复额外写代码。如果数据率很高比如几百Mbps以上老老实实回到NRZ体系同时在协议层加扰码、8b/10b编码或位填充来保证翻转密度。这种方案能维持带宽效率代价是链路层逻辑更复杂接收端还需要CDR时钟数据恢复电路。NRZI则适合中等速率、线序经常可能接反、又不想增加太多带宽开销的场景——USB的低速/全速模式就是活例子。我个人经验是能靠协议层解决的问题就不要在物理层硬扛。反过来也一样如果物理层已经到了极限比如距离实在太远、信噪比太低那就得考虑换编码方式而不是继续堆均衡器。4.2 用示波器看波形时的几个要点调编码相关的问题示波器是标配工具但有三个细节经常被忽略第一触发方式要选对。观察NRZ信号时如果用上升沿触发长串的0和1之间可能很久都没触发波形看起来会“停住”不动误以为链路死了。实际上把触发方式改成脉宽触发或协议触发或者直接看长时间段内的波形轮廓就能发现信号其实是活的。我踩过好几次这个坑一开始对着屏幕上的“静态波形”分析半天其实只是触发没设置好。第二采样率要留足余量。用逻辑分析仪解码曼彻斯特编码时采样率至少要达到波特率的8倍以上最好16倍。采样率不够的话跳变沿会被漏检解码结果里会出现随机错误位。那种“时好时坏”的现象先查工具采样率再怀疑协议栈。第三注意观察直流偏移。NRZ和NRZI都带有直流分量如果你的链路是交流耦合的比如经过电容或变压器长连续1会让电容充电波形会慢慢漂移最终导致接收端误判电平。在示波器上如果看到波形基线在长时间高电平后明显下沉就是直流恢复出了问题。这时候要么改用曼彻斯特编码要么在接收端加基线恢复电路。4.3 常见问题和排查思路我整理了几类在调试这几种编码时反复出现的问题按频率从高到低排个序第一类接收端数据错位。现象是偶尔多一个bit或少一个bit尤其在传输长字符串时发生。这通常不是电平问题而是时钟同步问题。对于UART这类NRZ要查双方波特率误差是否在2%以内晶振负载电容有没有匹配对于曼彻斯特编码要测中间跳变的相位抖动是否过大PLL环路带宽是否合适。第二类信号正常但误码率高。先看眼图如果波形交叉点上下不一致、边沿抖动大、过冲明显先检查阻抗匹配和走线长度。10M以太网上匹配电阻没焊或者焊错位置经常导致曼彻斯特编码信号反射严重。第三类NRZI解码偶尔出错。USB这类系统里多半是位填充的插入和删除逻辑没有对齐。发送端在连续6个1后插入0接收端也要在同样位置删掉这个0任何一次计数偏差都会导致后续所有bit错位。调试时可以用协议分析仪对比插入前后的数据帧定位是发送侧还是接收侧的填充逻辑出了问题。第四类差分信号接反。理论上NRZI不怕线序接反但如果你用的是NRZ加差分线比如RS485线序接反就直接全错。解决办法是设备端加自动极性检测或者在线缆端统一标号。很多现场故障其实是这种低级原因排查却绕了一大圈。4.4 关于编码的几个容易踩的坑最后一个部分我把自己积累的几条经验列一下每条都是真金白银换来的。第一编码方式和线路码型是两回事。NRZI、曼彻斯特编码描述的是数据到符号的映射规则而MLT-3、PAM-4描述的是电平域的信号形态。前者解决的是“怎么让接收端知道bit边界”后者解决的是“怎么在有限的带宽里塞进更多符号”。讨论问题时先把这两层分清楚否则很容易得出“百兆以太网用曼彻斯特编码所以带宽翻倍”这种错误结论。第二RZ编码里的“回零”是硬性要求。有些实现为了节省功耗会缩短脉冲宽度看起来像是占空比变小了实际上如果回零保持时间不足接收端的采样窗口会变小时序容限急剧恶化。测量时别只看波形“像不像RZ”要用示波器测一下回零点的建立时间是否满足下级的输入需求。第三曼彻斯特编码的中间跳变不能被误当成毛刺过滤。很多逻辑分析仪默认会做毛刺滤波把脉宽小于某个阈值的跳变忽略掉。如果你的滤波阈值设置得太大曼彻斯特编码那些本来就是“半个bit宽度”的电平会被当成噪声滤掉分析结果自然全乱。我建议解码曼彻斯特信号时把毛刺滤波关掉或者把阈值设为信号脉宽的四分之一以下。第四不要忽视编码对EMI的影响。NRZ信号的频谱能量集中在低频EMI较低曼彻斯特编码跳变密集频谱能量更高对PCB布局和屏蔽要求更苛刻。如果你的设计主板通过辐射骚扰测试有困难除了查时钟电路也可以回头看看是不是编码方式导致的高速跳变太多。我个人的体会是编码方式这块内容乍看属于教科书里基础得不能再基础的知识但真正在项目中踩过坑之后才发现几乎所有棘手的信号完整性问题最后都能回溯到当初编码选型时没有想清楚的那一个权衡。RZ、NRZ、NRZI、曼彻斯特编码这四兄弟没有谁比谁高级只有谁比谁更适配你的距离、速率和成本。下一次再看到示波器上那些“看不懂”的波形你不妨先问问自己这是哪一种编码它的时钟信息藏在哪里答案出来了问题大概率也就解决了一半。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进