《逻辑与计算机设计基础(原书第5版)》——1.7 格雷码

1.7 格雷码

当我们采用二进制编码进行向上或向下计数时,每次计数会导致二进制值向下一个值变化,而每次变化时,二进制编码中需要翻转的位的个数是不一样的。如表1-7所示,表左边列出的是二进制编码的八进制数字,当我们从000到111计数再回到000,每次计数值变化时,二进制编码中需要翻转的位数为1~3。《逻辑与计算机设计基础(原书第5版)》——1.7 格雷码

对于很多应用,多个二进制位同时发生变化并不是问题。但在某些应用中,计数时如果有多个位同时发生变化会导致很严重的问题,图1-6a所示的光学轴角编码器就可以用来说明这种情况。这种编码器用一个加装在一根轴上的圆盘来测量轴的转动角度,圆盘表面被分成很多区域,透明的表示二进制1,不透明的则表示二进制0。在圆盘的一侧有一个光源,另一侧有多个光学传感器,每个传感器用来感知对应位置的光,并转换为对应的二进制值0(黑暗)或1(有光)。当圆盘的透明区域处于光源和传感器之间时,传感器输出二进制1,当不透明区域处于光源和传感器之间时,传感器输出二进制0。
但是,轴本身可以旋转到任何角度。例如,轴和圆盘可能会转到某一角度,传感器正好处于011和100区域间的边界上。这时,在B2、B1和B0的传感器所接收的光被部分遮挡,在这种情况下,很难判定这3个传感器是否接收到光,每个传感器既可以产生二进制0也可以产生二进制1信号。这样,在3与4之间,可能会出现的编码就会有000、001、010、011、100、101、110或111,其中只有011和100是符合要求的,其他的都是错误的编码。
看看有什么其他方法可以解决这一问题。我们注意到当二进制值向下一个或上一个值进行变化时,如果只有一个二进制位发生翻转,这个问题就不会出现。例如,当传感器位于2与3的区域边界时,传感器能产生的二进制信号只可能是010或011,它们都符合要求。因此,如果我们改变从0到7的编码方式,使得在进行加计数或减计数(从7回到0)时只有一个二进制位需要翻转,则轴处于任何角度传感器都能产生正确的信号。计数过程中相邻编码之间只有一位不同的编码称为格雷码(Gray code),以Frank Gray的名字命名,他在1953年申请了这种编码用于转轴编码的专利。对于n(n为偶数)个连续整数的集合,可以有多种格雷编码。
表1-7右侧列出的是一种八进制数字的格雷码,称为二进制反射格雷码(binary reflected Gray code)。注意,二进制编码的计数顺序现在是:000、001、011、010、110、111、101、100和000。如果我们需要对编码表示的数字信息进行进一步处理,可以采用专用的硬件电路或软件将格雷码转换为它所对应的二进制值。
图1-6b给出的就是采用表1-7中的格雷码做的光学轴角编码器。可以看到盘中任意相邻的两个编码分块区域只有一个部分是不同的(透明或不透明)。

《逻辑与计算机设计基础(原书第5版)》——1.7 格雷码

光学轴角编码器充分展现了格雷码的作用。其实在其他类似的应用领域,需要将某些连续变化的物理量,比如位置或电压转换成数字信号,格雷码也同样有用,格雷码在低功耗CMOS(Complementary Metal Oxide Semiconductor)逻辑电路中的应用则更为特别。在CMOS电路中,仅仅当二进制位发生变化时才消耗功率。如果按表1-7中的两种编码进行顺序计数(向上或向下),完成一个8次计数的循环,二进制编码总共有14个位发生了翻转,而格雷码则只需要翻转8位。由此可见,采用格雷码的计数电路的动态功耗只有二进制编码计数电路的57%。
n(n必须为偶数)位二进制计数序列数值的格雷码可以通过以下方法编制:首先对于序列的前n/2个二进制编码,我们设目的格雷码的左边最高位为0,然后往右的各位由原二进制编码的每一位与它左边相邻位的偶校验构成,如二进制编码0100的格雷码的构成是这样的:0,偶校验(0, 1),偶校验(1, 0),偶校验(0, 0)=0110;接着,将已构成的格雷码序列按逆序排列,并将左边最高位设为1,这样就构成原序列中的后n/2个二进制编码所对应的格雷码序列。例如,对于BCD码而言,对应的前5个格雷码为0000、0001、0011、0010和0110,将这个编码序列逆序排列,并将左边最高位置1,就可得到最后5个格雷码:1110、1010、1011、1001和1000。对于数值在0~2n―1范围内顺序变化的特殊二进制编码,其格雷码编制方法是:保留原二进制码的左边最高位,剩下的位由原二进制码的各位与其左边相邻位的偶校验构成。

上一篇:《规范敏捷交付:企业级敏捷软件交付的方法与实践》——1.4 注重学习


下一篇:IBM郭继军:机器学习配合行业经验将帮助企业成就未来