格雷码(英文:Gray Code,又称作葛莱码,二进制循环码)是1880年由法国工程师Jean-Maurice-Emlle Baudot发明的一种编码。因由贝尔实验室的Frank Gray于20世纪40年代提出用来在使用PCM方法传送讯号时避免出错,并于1953年3月17日取得美国专利而得名。
因为,虽然Bin 码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的7 ( 0111 ) 过渡为8 ( 1000 )时, 4 bit 的Bin 码每一个bit 都要发生变化,在实际电路中数码各个bit 的状态变化是占有一点时值的,4个bit 的变化不可能绝对同时发生,系统在这期间检测到的编码就会是“误码”!如1100、1111等等。而Gray 码则没有这一缺点,它在相邻数字量间过渡时,仅有一个bit 发生变化。它克服了由一个状态到下一个状态时逻辑的混淆。
Gray 码的定义是,相邻数码仅有一个bit 不同;且,一组Gray码的最大数码与最小数码也仅有一个bit 不同。(这就是它的另一个名称“循环码”的由来)
由定义可知,Gray Code 的编码方式不是唯一的,我们这里讨论的是最常用的一种(典型格雷码)。为了不致发生歧义,我们约定:在不作特别提醒的情况下,我们所提到的Gray 码都是指“典型格雷码”。
Gray码属于可靠性编码,是一种错误最小化的编码方式。
但Gray 码不是权重码,每一位数码没有确定的大小,不能直接进行比较大小和算术运算,也不能直接转换成模拟量信号,所以需要进行 Gray 码到 Bin 码的解码变换。
要了解 Gray 码到 Bin 码的解码原理,就得先从 Bin 码到 Gray 码的变换开始认识 Gray 码的编码原理。
4 楼的方法只是把着眼点放在格雷码编码的一个一个的 bit 上来做转换的。如果编码的 bit 数多一点,则这种转换方法就显得笨拙!
现在,我们把着眼点放在高层次上,以Word 为单位来着手格雷码的转换:
前面讲的格雷码转换原理说把原码(Bin)的最高位的值直接赋给转换码(Gray)的最高位。我们可以这样来理解它:“用‘0’跟原码的最高位做‘异或’运算,把运算结果赋给转换码的最高位;用原码的最高位跟原码的次高位做‘异或’运算,其运算结果作转换码的次高位;……以此类推依次把‘异或’运算的结果作转换码对应位的值。”
用图形来表达比较易于网友们领会。
再给大家提供一个自动验证“WXOR”指令替代“GRY”指令实现编码转换的功能:
(这是在FX2n系列的PLC上做的验证)
该例程中,字“K4M0”是一个二进制计数器,计数内容以 Bin 编码表示。字“K4M17”的内容为计数器内容对应的“Gray 码”,它是由“WXOR”指令替代“GRY”来实现的编码转换所得到的“Gray 码”。而另一个字“K4M33”中的内容是直接用三菱的“GRY”专用功能指令得到的与二进制计数器内容对应的“Gray 码”。例程中最后一条比较指令“CMP”用来把“K4M17”跟“K4M33”这两个字的内容自动进行比较。如果这两个字的内容出现不相等,则说明由“WXOR”指令替代“GRY”来实现的编码转换是不行的。以此送给那些持否定态度的人一个有力的证据来否定这种替代!但是,事实上这个比较结果始终表明这个替代是正确的!
上例中“CMP”比较指令的“目标操作数”是以M100起始的3个M为“标志位”。其中M100动作,标志“K4M17”>“K4M33”;“M102”动作,标志“K4M17”<“K4M33”。
只要“K4M17”和“K4M33”这两个字的内容出现不等,M100 和 M102 中就有一个的闭接点会使二进制计数器停止计数。相反,只要“K4M17”和“K4M33”这两个字的内容始终是相等的,则M100 和 M102 的闭接点就始终保持为闭合的,二进制计数器“K4M0”就一直处于计数状态。M8012 以10 Hz 的频率触发二进制计数器“K4M0”计数。这个计数器最大计数值为65536,运行110分钟足以使该计数器的编码状态通走一遍。经过几百分钟的运行实践事实证明:用“WXOR”指令与“GRY”专用指令在编码转换中所起的作用完全相等!
下面是该例程的运行监视图片: