目录
1 引言
2 定义与数学性质
2.1 汉明距离与格雷码定义
2.2 超立方体解释
2.3 反射构造法
3 二进制与格雷码的相互转换
3.1 二进制转格雷码
3.2 格雷码转二进制
3.3 C语言实现
4 在绝对式编码器与SSI协议中的应用
4.1 消除位置转换歧义
4.2 SSI协议中的格雷码传输
4.3 格雷码与CRC的互补关系
5 在异步FIFO中的应用
6 局限与变体
6.1 不能检测单比特错误
6.2 平衡格雷码
6.3 n进制格雷码
6.4 Beckett-Gray码
7 结论
摘要:格雷码(Gray Code)是一种相邻码字汉明距离恒为1的二进制编码,由Frank Gray于1953年提出并应用于脉冲编码通信。其核心特性——相邻位置仅有一位变化——使其在绝对式编码器、旋转位置传感器和跨时钟域数据传输中具有不可替代的工程价值。本文从数学定义出发,阐释格雷码与n维超立方体哈密顿回路之间的等价关系,给出反射构造法和二进制互转算法;进而分析格雷码在SSI协议中的具体应用,包括位置数据的位序传输、控制器端解码以及其与CRC校验的互补关系;最后讨论格雷码不能检测单比特错误的固有局限,并简要介绍平衡格雷码、n进制格雷码等变体。本文旨在为格雷码的理论理解与工程应用提供一份系统性的技术参考。
关键词:格雷码;二进制反射码;汉明距离;绝对式编码器;SSI协议;异步FIFO
1 引言
在数字系统中,自然二进制码是最直观的数值表示方式,但其相邻数值之间往往存在多个位同时翻转。例如,从3(0011)到4(0100)有4位发生变化。当多个位同时翻转时,由于各信号路径的传播延迟不同,接收端在转换瞬间可能采样到既非旧值也非新值的中间态错误码。在机械编码器中,这一问题更为严重:多个轨道同时改变状态时,读取头的微小偏移即可导致完全错误的位置读数。
格雷码正是为解决这一问题而设计的编码方案。其核心性质是:在编码序列中,任意两个相邻码字之间恰好只有一位二进制位不同。这一性质使成为绝对式位置编码、旋转编码器和异步FIFO指针跨时钟域传输的首选编码。本文系统阐述格雷码的数学构造、编码转换算法及其在SSI协议和异步FIFO中的工程应用,并分析其固有局限。
2 定义与数学性质
2.1 汉明距离与格雷码定义
两个等长二进制码字之间的汉明距离定义为对应位不同的位数。n位格雷码是个n位二进制码字的序列 G=(g0,g1,…,g2n−1),满足:
若进一步满足首尾码字也仅有一位不同,即 dH(g2n−1,g0)=1,则称为循环格雷码。标准二进制反射格雷码(Binary Reflected Gray Code, BRGC)是循环格雷码。
2.2 超立方体解释
将n位二进制码字视为n维超立方体 Qn 的顶点,顶点之间的边对应汉明距离为1。格雷码序列正是 Qn 的一条哈密顿路径;循环格雷码则是 Qn 的哈密顿回路。这一几何解释揭示了格雷码的深层结构:它遍历了所有 2n 个顶点且不重复,每一步只沿一条边移动。
2.3 反射构造法
BRGC可通过递归反射法构造:
例如,2位格雷码为 00,01,11,10;3位格雷码为:
000,001,011,010,110,111,101,100
该序列中任意相邻码字仅一位不同,且首尾 000000 与 100100 也仅一位不同。
3 二进制与格雷码的相互转换
3.1 二进制转
3.2 格雷码转二进制
逆转换从最高位开始:
也可使用前缀异或形式:
3.3 C语言实现
/* 二进制转格雷码 */ uint32_t bin2gray(uint32_t b) { return b ^ (b >> 1); } /* 格雷码转二进制 */ uint32_t gray2bin(uint32_t g) { uint32_t b = 0; while (g) { b ^= g; g >>= 1; } return b; }gray2bin利用前缀异或的迭代形式,对32位以内的格雷码均适用。在SSI解码中,控制器接收完整格雷码字后调用该函数即可得到自然二进制位置值。
4 在绝对式编码器与SSI协议中的应用
4.1 消除位置转换歧义
绝对式编码器的码盘上刻有多个同心轨道,每个轨道对应一位编码。若采用自然二进制码,当位置从3(0011)变化到4(0100)时,四个轨道同时改变状态。读取头在转换瞬间可能采样到任意中间组合,导致位置读数出现严重错误。
格雷码通过保证相邻位置仅有一位变化,从根本上消除了这一歧义。在转换瞬间,读取头最多只能读到旧值或新值,不会产生中间错误码。这一特性使格雷码成为绝对式编码器的标准编码方式。
4.2 SSI协议中的格雷码传输
SSI协议采用同步串行方式传输绝对位置。编码器内部将位置值以格雷码形式存储,SSI帧从最高有效位(MSB)开始逐位输出。控制器在每个时钟周期读取一位,经过 NN 个时钟后组成完整的格雷码字,再通过gray2bin转换为二进制值参与控制运算。
以25位多圈编码器为例,数据帧通常包含12位圈数和13位单圈位置。圈数和单圈位置可分别采用格雷码编码,也可整体编码。部分编码器在帧的高2位附加诊断信息,这些诊断位不参与格雷码转换,需单独解析。
4.3 格雷码与CRC的互补关系
格雷码消除的是“相邻位置转换时的多比特翻转歧义”,但它不是纠错码。事实上,格雷码的相邻码字汉明距离为1,意味着一个单比特错误可能将当前码字变为相邻的合法码字,从而无法被检测。例如,若正确位置为3(格雷码0010),最高位翻转得到1010,这可能是另一个合法格雷码,对应完全不同的位置。
因此,SSI协议本身不提供数据完整性校验,其可靠性依赖于RS-422差分传输的物理层抗扰度。部分编码器厂商在SSI帧中附加可选的CRC或奇偶校验位,以弥补这一不足。在强干扰环境中,应优先选用带CRC校验的编码器接口,或采用BiSS-C等标准内置CRC的协议。
5 在异步FIFO中的应用
格雷码的另一重要应用是跨时钟域数据传输中的指针同步。在异步FIFO中,读指针和写指针分别位于不同的时钟域,需要将写指针同步到读时钟域以判断空状态,将读指针同步到写时钟域以判断满状态。
若指针采用自然二进制码,递增时可能有多位同时变化。同步器采样时若恰好遇到多位跳变,可能采到错误的中间值。采用格雷码后,指针每次递增仅一位变化,同步器最多采到旧值或新值,不会产生中间错误码。这一特性使格雷码成为异步FIFO设计的标准做法,也是Cummings在CDC设计方法学中重点推荐的技术。
6 局限与变体
6.1 不能检测单比特错误
如前所述,格雷码的相邻码字汉明距离为1,单比特翻转可能产生另一个合法码字。因此格雷码不具备错误检测能力,必须与CRC、奇偶校验或冗余传输配合使用。
6.2 平衡格雷码
在某些旋转编码器应用中,希望码盘中“1”和“0”的数量尽可能平衡,以减少读取头的直流偏置影响。平衡格雷码(Balanced Gray Code)要求每个码字中1的个数尽可能相等。对于偶数n,存在每个码字恰好有 n/2n/2 个1的平衡格雷码。
6.3 n进制格雷码
格雷码的概念可推广到n进制:相邻码字仅有一位数码变化。n进制格雷码在光通信和多电平信号传输中有潜在应用,但其构造比二进制格雷码复杂。
6.4 Beckett-Gray码
Beckett-Gray码用于旋转编码器的单轨编码,通过更复杂的序列设计实现更紧凑的码盘布局。其构造不遵循简单的反射规则,通常需要计算机搜索。
7 结论
格雷码以其“相邻码字仅一位变化”的核心性质,在数字系统、位置反馈和跨时钟域通信中发挥着不可替代的作用。其数学本质是n维超立方体的哈密顿回路,反射构造法提供了简洁的递归生成方式,而异或运算则给出了二进制与格雷码之间的高效转换算法。在绝对式编码器和SSI协议中,格雷码消除了位置转换瞬间的多比特翻转歧义,使读取头在任意采样时刻都能获得有效位置值。在异步FIFO中,格雷码保证了跨时钟域指针同步的可靠性。
然而,格雷码不是纠错码,不能检测单比特错误。在SSI等无CRC的协议中,数据完整性依赖于物理层质量。工程实践中,应根据应用场景选择是否附加CRC校验,或在高速高可靠场景中选用BiSS-C、EnDat 2.2等内置校验的编码器接口。格雷码的简洁性与有效性使其在可预见的未来仍将是绝对位置反馈和跨时钟域设计的基础编码方案。