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

简介: 本节书摘来自华章计算机《逻辑与计算机设计基础(原书第5版)》一书中的第1章,第1.7节,作者:(美)M.莫里斯·马诺(M. Morris Mano)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.7 格雷码

当我们采用二进制编码进行向上或向下计数时,每次计数会导致二进制值向下一个值变化,而每次变化时,二进制编码中需要翻转的位的个数是不一样的。如表1-7所示,表左边列出的是二进制编码的八进制数字,当我们从000到111计数再回到000,每次计数值变化时,二进制编码中需要翻转的位数为1~3。image

对于很多应用,多个二进制位同时发生变化并不是问题。但在某些应用中,计数时如果有多个位同时发生变化会导致很严重的问题,图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中的格雷码做的光学轴角编码器。可以看到盘中任意相邻的两个编码分块区域只有一个部分是不同的(透明或不透明)。

image

光学轴角编码器充分展现了格雷码的作用。其实在其他类似的应用领域,需要将某些连续变化的物理量,比如位置或电压转换成数字信号,格雷码也同样有用,格雷码在低功耗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范围内顺序变化的特殊二进制编码,其格雷码编制方法是:保留原二进制码的左边最高位,剩下的位由原二进制码的各位与其左边相邻位的偶校验构成。

相关文章
|
Linux 异构计算 Docker
实战 Google Colab,一起用 GPU
实战 Google Colab,一起用 GPU
776 0
|
芯片
通用译码器
二——十进制译码器也称BCD译码器,它的功能是将输入的BCD码(4位二级制码)译成对应的10个十进制输出信号,因此也称4线——10线译码器。常用的二——十进制集成译码器型号有74LS42、T1042、T4042等。
2305 0
通用译码器
|
10月前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
671 23
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
371 5
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
246 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
267 4
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
229 6
|
Go vr&ar 图形学
重塑体验:AR/VR技术在游戏与娱乐行业的创新应用
【10月更文挑战第29天】本文探讨了AR/VR技术如何改变游戏与娱乐行业,介绍了AR和VR的基本概念及其在游戏和娱乐中的应用实例,包括《精灵宝可梦GO》的AR开发和VR视频播放器的实现代码,并展望了未来的发展趋势。
885 2
|
安全 搜索推荐 Unix
如何提取指定镜像的 Dockerfile
如何提取指定镜像的 Dockerfile
513 0
二进制数从0开始的前几个数
二进制数从0开始的前几个数:
1636 0