贵州电子信息职业技术学院实训中心电工电子与控制 · 虚拟仿真

二进制到格雷码转换器

将 4 位二进制数转换为格雷码,使连续数值恰好只有一位不同。每个格雷码位都是相邻二进制位的 XOR。

交互式仿真

本地工程状态

原作者完整工程已本地恢复;实际验证范围见交付清单。原远程交互电路已停用。

载入 H23 二进制到格雷码转换器 的本机副本。载入前会确认当前工程的保存选择。

此组合电路将 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 位反射格雷码映射。输入和输出均按从最高有效位到最低有效位的顺序排列。

输入输出
B3B2B1B0G3G2G1G0
00000000二进制零映射为格雷码零。
00010001第一次递增仅改变 G0。
00100011
00110010
01000110
01010111
01100101
01110100十进制 7 映射为 0100₂。
10001100跨越 7 → 8 时,尽管全部二进制位均发生变化,格雷码只改变 G3。
10011101
10101111
10111110
11001010
11011011
11101001
11111000十进制 15 映射为 1000₂。

布尔表达式

G3=B3G_3 = B_3

最高有效位直接传递,保持不变。

G2=B3⊕B2G_2 = B_3 \oplus B_2

G2 指示 B3 与 B2 是否不同。

G1=B2⊕B1G_1 = B_2 \oplus B_1

G1 指示 B2 与 B1 是否不同。

G0=B1⊕B0G_0 = B_1 \oplus B_0

G0 指示 B1 与 B0 是否不同。

逐步尝试

在上方嵌入式电路中设置输入,然后阅读预期结果并验证。

  1. 1
    B3..B0 = 0000
    预期: G3..G0 = 0000
    观察结果: 所有相邻二进制位对均相等,因此每个格雷码输出均为低电平。
  2. 2
    B3..B0 = 0111
    预期: G3..G0 = 0100
    观察结果: 二进制 0111₂ 即十进制 7,转换后得到格雷码 0100₂。
  3. 3
    B3..B0 = 1000
    预期: G3..G0 = 1100;跨越 7 至 8 的边界时仅 G3 发生变化
    观察结果: 二进制 1000₂ 即十进制 8,转换后得到格雷码 1100₂。与上一步比较,可直接观察到单比特转换。
  4. 4
    B3..B0 = 1111
    预期: G3..G0 = 1000
    观察结果: 输入为二进制 1111₂ 时,各相邻位均相等,只有直接复制的最高有效格雷码位保持高电平。

所用元件

实际应用

旋转编码器与线性编码器。 相邻位置仅有一个码位不同,可减少物理边界附近的读数歧义。

异步 FIFO(先进先出) 指针。 读写指针通常在同步前转换为格雷码,使每次递增仅改变一个指针位。

位置与角度检测。 绝对式编码器使用格雷码图样,以便可靠地区分相邻机械位置。

卡诺图。 行列标签采用格雷码顺序,使相邻单元格仅有一个变量不同,从而保持逻辑相邻性。

状态编码与低翻转接口。 某些设计采用类似格雷码的状态序列,以减少同时翻转并简化相邻状态检测。

常见问题

为什么连续格雷码值之间只改变一个比特?

反射格雷码的构造方式保证每个相邻码字仅有一个位置不同。对于连续二进制整数,二进制到格雷码的 XOR 方程会保持这种顺序。

格雷码是否为有权数制?

不是。格雷码的各位没有固定的 2 的幂次权值。执行普通算术运算或判断数值大小前,应先将格雷码转换回二进制。

如何将格雷码转换回二进制?

先设置 B3 = G3,再向低位逐级累积 XOR:B2 = B3 ⊕ G2、B1 = B2 ⊕ G1、B0 = B1 ⊕ G0。

格雷码能否消除亚稳态?

不能。异步信号仍可能违反建立时间或保持时间要求。格雷码将合法的相邻转换限制为一个变化位,而亚稳态风险仍需通过同步器级和时序约束加以控制。

如果信号源跳过多个格雷码状态,会发生什么?

跳变起点与终点可能有多个数据位不同,因此单比特转换保证不再适用于该次观测跳变。异步 FIFO 等系统会据此约束指针移动方式和采样假设。

继续学习

进阶课程