1. NRZI 编码的基本原理

  • 定义:NRZI(Non-Return-to-Zero Inverted)是一种通过电平跳变表示 0保持电平表示 1 的编码方式。
  • 规则
    • 输入 0:电平翻转(若当前为 J 则变 K,反之若当前为 K 则变 J)。
    • 输入 1:电平保持(不翻转)。
  • 目的:确保信号中有足够的跳变边缘,供接收方恢复时钟同步。

2. SYNC 字段的 NRZI 编码实现

全速 SYNC:二进制 00000001 → 电平 KJKJKJKK

  1. 初始状态假设常态电平为J(高电平1),那么起始电平为 K(低电平0)。
  2. 逐位编码
输入比特 NRZI 操作 当前电平 说明
0 翻转(JK K 第1个0,电平跳变
0 翻转(KJ J 第2个0,电平跳变
0 翻转(JK K 第3个0,电平跳变
0 翻转(KJ J 第4个0,电平跳变
0 翻转(JK K 第5个0,电平跳变
0 翻转(KJ J 第6个0,电平跳变
0 翻转(KJ K 第7个0,电平跳变
1 保持(J K 第8个1,电平保持不变
  • 最终电平序列K J K J K J K K
    SYNC域 8位中 的 最后两位 KK 是一个标记(电平未翻转,即收到数据1),用于标识SYNC域的结束和PID域的开始。

高速 SYNC 的二进制模式

  1. 规范定义(USB 2.0 协议 7.1.11.2节)
  • 二进制输入
    00000000000000000000000000000001(31个0 + 1个1,共32位)
  • 设计意图
    通过长串 0 触发 NRZI 连续跳变,生成稳定的同步信号。
  1. NRZI 编码过程
输入比特序列 NRZI 操作(初始电平 K 生成的电平序列
00000000000000000000000000000001 每个0翻转,1保持 KJ KJ KJ ... KJ KK(共32跳变)
  • 实际结果
    • 前31个0KJ交替15次 + 最后一个J(第31位)
    • 最后1个1 → 保持 J
    • 协议补 KK → 最终序列:(KJ)×15 + J + KK = 15次KJ + JKK

3. 为什么 USB 使用 NRZI?

  • 抗干扰:跳变边缘携带时钟信息,降低对绝对电平精度的依赖。
  • 效率:比曼彻斯特编码(每个比特均跳变)节省带宽。
  • 兼容性:适合 USB 的全速/高速多速率场景。