此组合电路将 4 位二进制数据字转换为反射格雷码;连续整数对应的码字恰好只有一个比特不同。
学习目标
- 推导 G3 = B3,并将每个较低格雷码位表示为相邻二进制位的 XOR。
- 将全部 16 个 4 位二进制值转换为反射格雷码。
- 验证连续格雷码字恰好只有一个位置不同。
- 说明格雷码为何能够减少位置编码器在边界处的歧义。
- 区分减少同时翻转与同步或纠错。
工作原理
最高有效格雷码位直接复制:G3 = B3。其余每个格雷码位均为相邻两个二进制位的 XOR:G2 = B3 ⊕ B2、G1 = B2 ⊕ B1、G0 = B1 ⊕ B0。因此,该电路只需三个 XOR 门和 B3 的直接连接。
反射格雷码对 16 个码字进行排序,使相邻整数值的汉明距离为一。从 0111₂ 到 1000₂ 的二进制转换会改变全部四位,而相应的格雷码转换为 0100₂ 到 1100₂,仅改变 G3。当多个物理二进制信号无法保证在完全相同的时刻变化时,此特性可减少读数歧义。
格雷码不会自动保证异步总线采样安全。在跨时钟域场景中,设计人员仍需使用同步器,并约束格雷码状态的推进方式。格雷码只减少相邻状态之间的变化位数,不能消除亚稳态,也不能纠正任意采样错误。
真值表
此表列出完整的 4 位反射格雷码映射。输入和输出均按从最高有效位到最低有效位的顺序排列。
| 输入 | 输出 | |||||||
|---|---|---|---|---|---|---|---|---|
| B3 | B2 | B1 | B0 | G3 | G2 | G1 | G0 | |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 二进制零映射为格雷码零。 |
| 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 第一次递增仅改变 G0。 |
| 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | |
| 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | |
| 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | |
| 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | |
| 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | |
| 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 十进制 7 映射为 0100₂。 |
| 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 跨越 7 → 8 时,尽管全部二进制位均发生变化,格雷码只改变 G3。 |
| 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | |
| 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | |
| 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | |
| 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | |
| 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | |
| 1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | |
| 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 十进制 15 映射为 1000₂。 |
布尔表达式
最高有效位直接传递,保持不变。
G2 指示 B3 与 B2 是否不同。
G1 指示 B2 与 B1 是否不同。
G0 指示 B1 与 B0 是否不同。
逐步尝试
在上方嵌入式电路中设置输入,然后阅读预期结果并验证。
- 1B3..B0 = 0000预期:
G3..G0 = 0000观察结果: 所有相邻二进制位对均相等,因此每个格雷码输出均为低电平。 - 2B3..B0 = 0111预期:
G3..G0 = 0100观察结果: 二进制 0111₂ 即十进制 7,转换后得到格雷码 0100₂。 - 3B3..B0 = 1000预期:
G3..G0 = 1100;跨越 7 至 8 的边界时仅 G3 发生变化观察结果: 二进制 1000₂ 即十进制 8,转换后得到格雷码 1100₂。与上一步比较,可直接观察到单比特转换。 - 4B3..B0 = 1111预期:
G3..G0 = 1000观察结果: 输入为二进制 1111₂ 时,各相邻位均相等,只有直接复制的最高有效格雷码位保持高电平。
所用元件
实际应用
旋转编码器与线性编码器。 相邻位置仅有一个码位不同,可减少物理边界附近的读数歧义。
异步 FIFO(先进先出) 指针。 读写指针通常在同步前转换为格雷码,使每次递增仅改变一个指针位。
位置与角度检测。 绝对式编码器使用格雷码图样,以便可靠地区分相邻机械位置。
卡诺图。 行列标签采用格雷码顺序,使相邻单元格仅有一个变量不同,从而保持逻辑相邻性。
状态编码与低翻转接口。 某些设计采用类似格雷码的状态序列,以减少同时翻转并简化相邻状态检测。
常见问题
为什么连续格雷码值之间只改变一个比特?
反射格雷码的构造方式保证每个相邻码字仅有一个位置不同。对于连续二进制整数,二进制到格雷码的 XOR 方程会保持这种顺序。
格雷码是否为有权数制?
不是。格雷码的各位没有固定的 2 的幂次权值。执行普通算术运算或判断数值大小前,应先将格雷码转换回二进制。
如何将格雷码转换回二进制?
先设置 B3 = G3,再向低位逐级累积 XOR:B2 = B3 ⊕ G2、B1 = B2 ⊕ G1、B0 = B1 ⊕ G0。
格雷码能否消除亚稳态?
不能。异步信号仍可能违反建立时间或保持时间要求。格雷码将合法的相邻转换限制为一个变化位,而亚稳态风险仍需通过同步器级和时序约束加以控制。
如果信号源跳过多个格雷码状态,会发生什么?
跳变起点与终点可能有多个数据位不同,因此单比特转换保证不再适用于该次观测跳变。异步 FIFO 等系统会据此约束指针移动方式和采样假设。