格雷码编译码电路
- 格式:docx
- 大小:79.49 KB
- 文档页数:4
格雷码的编码、解码
摘要:
一、格雷码的定义和特点
二、格雷码的编码方法
1.仅用0和1两个数字
2.相邻两个二进制数之间仅有一位不同
三、格雷码的解码方法
1.通过编码表查找对应的十进制数
2.利用格雷码的编码特点进行解码
四、格雷码在实际应用中的优势和局限
1.优势:仅用一位进行权值处理,电路简单
2.局限:加法运算较复杂,速度受限
正文:
格雷码是一种二进制编码方式,它的特点是仅使用0和1两个数字,且相邻两个二进制数之间仅有一位不同。
这种编码方式使得在数字信号传输和处理过程中,仅用一位进行权值处理,从而使得电路设计更加简单。
格雷码的编码方法如下:首先,选择一个二进制数作为基数,例如,我们可以选择0000到1111这16个数作为基数。
然后,对于每一个十进制数,我们都可以通过相应的编码表找到对应的格雷码。
例如,对于十进制数12,我们可以通过查找编码表得到其格雷码为1100。
与编码相对应,格雷码的解码过程也比较简单。
首先,我们需要一个编码
表,这个表中列出了所有可能的格雷码以及它们对应的十进制数。
然后,我们可以通过查找这个编码表,找到对应的十进制数。
例如,如果我们收到一个格雷码1100,我们可以在编码表中找到它对应的十进制数是12。
尽管格雷码在电路设计上具有简单和清晰的优点,但是它也存在一些局限。
例如,由于格雷码是通过加法来进行编码和解码的,所以对于较大的数,加法运算会变得非常复杂,这会限制格雷码在高速信号处理中的应用。
总的来说,格雷码是一种简单且有趣的编码方式,它在数字信号处理中有着广泛的应用。
EDA技术与应用实验报告实验名称:格雷码、二进制转换及译码电路姓名:陈丹学号:2班级:电信(2)班时间:南京理工大学紫金学院电光系一、实验目的1)学习用VHDL代码描述组合逻辑电路的方法。
2) 掌握when….else….,generate和case并行语句的使用。
二、实验原理1)学习VHDL的when….else….,generate和case并行语句。
2)利用when….else….并行语句描述4位二进制码/格雷码转换电路。
3)利用generate并行语句描述n位格雷码/二进制码转换电路。
4)利用case并行语句实现译码电路。
5)利用实验箱验证所设计的电路的正确性,要求将输入输出的数据用数码管显示。
三、实验内容1、二进制转换为格雷码4位二进制格雷码转换的真值表如图所示:建立工程,输入代码先建立工程,工程命名为“btog”,顶层文件名为“btog”。
选择“file→new”,在弹出的窗口中选择“VHDL File”建立“VHDL”文件。
在新建的VHDL文件中输入二进制格雷码转换的VHDL代码,将文件保存。
二进制转换为格雷码的代码:编译仿真对当前文件进行编译,编译通过以后建立仿真波形,保存为“”.为波形文件添加节点,将“end time”设置为100μs ,将输入输出编组,并为输入信号赋值,其中“start value”为“0000”,“count every”设置为5μs.其波形如下:仿真结果2、generate语句实现格雷码转换为二进制对于n位二进制转换为格雷码的码转换电路,转换表达式如下:Bn=GnBi=Gi⊕B(i+1)建立工程,输入代码先建立工程,工程命名为“gtob”,顶层文件名为“g_to_b2”。
选择“file→new”,在弹出的窗口中选择“VHDL File”建立“VHDL”文件。
在新建的VHDL文件中输入格雷码二进制转换的VHDL代码,将文件保存。
转换代码:编译仿真对当前文件进行编译,编译通过以后建立仿真波形,保存为“”.为波形文件添加节点,将“end time”设置为100μs ,将输入输出编组,并为输入信号赋值,其中“start value”为“0000”,“count every”设置为5μs.其波形如下:3、case语句实现译码电路代码描述:仿真波形:4、管脚配置利用实验箱的模式6来验证设计电路的正确性。
EDA技术与应用实验报告实验名称:格雷码、二进制转换电路一、实验目的1、学习使用VHDL代码组合逻辑电路的方法。
2、掌握when...else...和generate并行语句的使用。
二、实验内容1、学习VHDL代码修改。
2、利用case语句描述4位格雷码/二进制码转换电路,要求将输入输出的数据用数码管显示。
3、利用generate并行语句描述n位格雷码/二进制码转换电路(n=4)。
4、利用实验箱验证所设计电路的正确性,要求将输入输出的数据用七段数码管显示。
三、实验原理1、4位格雷码转换为二进制表达式为:四、 实验代码library ieee ;use ieee.std_logic_1164.all; use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity gtob isport(g:in std_logic_vector(3 downto 0);b:buffer std_logic_vector(3 downto 0));end gtob;architecture rhg of gtob isbeginb<="0000"when g="0000"else"0001"when g="0001"else"0011"when g="0010"else"0010"when g="0011"else"0111"when g="0100"else"0110"when g="0101"else"0100"when g="0110"else"0101"when g="0111"else"1111"when g="1000"else"1110"when g="1001"else"1100"when g="1010"else"1101"when g="1011"else"1000"when g="1100"else"1001"when g="1101"else"0011"when g="1110"else"1010";end rhg;33232121010B G B B G B B G B B G ==⊕=⊕=⊕五、电路仿真结果六、管脚配制。
格雷码二进制码转换电路格雷码(Gray code),又称格雷码二进制码转换电路,是一种特殊的二进制编码方式。
它的特点是相邻的两个数值仅有一位二进制数发生变化,适用于数字和模拟电路中的编码和传输。
格雷码的起源可以追溯到19世纪,由法国数学家弗兰索瓦·格雷(François Gray)发明。
他的目的是设计一种编码方式,可以减少在数字传输过程中由于噪声、抖动等原因引起的误差。
在传统的二进制编码方式中,相邻的两个数值之间可能会发生多个二进制位的变化,这样在数字传输中就容易引起误差。
而格雷码通过仅改变一位二进制数来表示相邻的数值,可以有效地降低传输误差的风险。
格雷码的转换电路由多个逻辑门组成,常见的实现方式有反馈式和非反馈式两种。
反馈式格雷码转换电路使用触发器和逻辑门组成,适用于需要连续转换的应用场景。
非反馈式格雷码转换电路则使用逻辑门组成,适用于只需要单次转换的应用场景。
格雷码转换电路的核心是通过逻辑门的组合实现码字之间的变换。
逻辑门的输入信号由当前码字和目标码字决定,通过逻辑运算得到输出信号。
常见的逻辑门有与门、或门、非门等,它们可以实现不同的逻辑运算。
格雷码转换电路的功能包括格雷码到二进制码的转换和二进制码到格雷码的转换。
格雷码到二进制码的转换可以通过逻辑门的组合实现,将格雷码逐位进行异或运算,并与之前的结果进行与运算。
而二进制码到格雷码的转换则可以通过逻辑门的组合实现,将二进制码逐位进行异或运算,得到格雷码。
在数字电路中,格雷码转换电路广泛应用于各种编码器和解码器中。
编码器可以将多个输入信号转换为相应的格雷码输出,解码器则可以将格雷码输入转换为相应的输出信号。
格雷码转换电路还可以用于数字计数器、旋转编码器等应用中。
总结起来,格雷码二进制码转换电路是一种特殊的二进制编码方式,通过逻辑门的组合实现码字之间的变换。
它的应用范围广泛,可以用于数字电路中的编码和传输。
格雷码的特点是相邻的两个数值仅有一位二进制数发生变化,可以减少传输误差的风险。
4bit 格雷码转温度计码电路摘要:1.格雷码与温度计码简介2.4bit格雷码转温度计码电路设计原理3.电路元件及参数选择4.电路仿真与测试结果5.电路应用与优化建议正文:在日常生活中,数字温度计广泛应用于各种电子设备中,如家用电器、工业控制系统等。
温度计码是一种用于表示温度值的编码方式,而格雷码是一种无权码,具有唯一性、稳定性等优点。
本文将介绍如何设计一个4bit格雷码转温度计码电路,以便应用于实际工程中。
1.格雷码与温度计码简介格雷码(Gray Code)是一种无权码,其编码方式是相邻两位二进制代码之间仅有一位不同。
温度计码(Temperature Code)是一种用于表示温度值的编码方式,通常采用4位或更多位来表示。
在温度计码中,每一位的权值分别为1、2、4、8等,从而实现对温度值的快速计算。
2.4bit格雷码转温度计码电路设计原理要实现4bit格雷码转温度计码电路,首先需要了解格雷码与温度计码之间的转换关系。
以4bit格雷码为例,其编码方式如下:0000 - 0℃0001 - 1℃0010 - 2℃0011 - 3℃0100 - 4℃0101 - 5℃0110 - 6℃0111 - 7℃1000 - 8℃1001 - 9℃1010 - 10℃1011 - 11℃1100 - 12℃1101 - 13℃1110 - 14℃1111 - 15℃接下来,设计一个4bit格雷码转温度计码的电路。
电路的核心部分是一个4位二进制解码器,其输入为4bit格雷码,输出为对应的温度计码。
通过查阅资料,可以选择一个合适的4位二进制解码器,如74HC4511。
3.电路元件及参数选择除了4位二进制解码器外,电路还需包括与门、非门等基本逻辑元件。
在实际应用中,可以根据需求选择不同的逻辑元件,如CMOS、TTL等系列。
此外,电路中还需考虑电阻、电容等元器件的选取,以保证电路的稳定性和可靠性。
4.电路仿真与测试结果为验证4bit格雷码转温度计码电路的正确性,可以使用电路仿真软件进行模拟。
4bit 格雷码转温度计码电路如何设计一个能够将4位格雷码转换为温度计码的电路。
首先,让我们了解一下什么是4位格雷码和温度计码。
1. 4位格雷码4位格雷码是一种二进制编码方式,它的每个码字仅在一位上有变化。
相邻格雷码之间只有一个位不同,这样可以减少误解码的可能性。
4位格雷码的码字共有16个,分别是0000、0001、0011、0010、0110、0111、0101、0100、1100、1101、1111、1110、1010、1011、1001、1000。
2. 温度计码温度计码是一种将温度值编码为二进制数的方式。
它有两个基本规则:温度值越高,对应的二进制数值越大;相邻的温度之间的二进制数之间只有一个位不同,这样可以减少误差。
现在我们开始设计一个能够将4位格雷码转换为温度计码的电路。
第一步:确定元件首先,我们需要确定一些元件来完成这个电路的设计。
我们需要使用4个D型触发器、1个4:16译码器和一些逻辑门(如与门、或门和非门)。
这些元件可以在电子元器件商店购买到。
第二步:根据格雷码和温度计码的关系,设计逻辑电路图根据4位格雷码和温度计码之间的对应关系,我们可以设计一个逻辑电路图来实现这个转换功能。
首先,我们需要为每个格雷码设定一个二进制温度计码的对应值。
例如,将0000对应到0000,将0001对应到0001,将0011对应到0010,将0010对应到0011,将0110对应到0100,将0111对应到0101,将0101对应到0110,将0100对应到0111,将1100对应到1000,将1101对应到1001,将1111对应到1010,将1110对应到1011,将1010对应到1100,将1011对应到1101,将1001对应到1110,将1000对应到1111。
根据这个对应关系,我们可以使用逻辑门和触发器来实现这个转换。
第三步:完成电路布线在得到逻辑电路图后,我们需要完成电路的布线工作。
将电路中的各个元件连接起来,包括将触发器的输入和输出连接到逻辑门上,将逻辑门的输出连接到译码器上,并将译码器的输出连接到LED灯或显示器上,以方便观察温度计码的输出值。
格雷码编码器工作原理
嘿,朋友们!今天咱们来聊聊格雷码编码器的工作原理,这可真是个超级有趣的东西呢!
想象一下,格雷码编码器就像是一个神奇的转换器!比如说,你正在玩一个拼图游戏,每一块拼图就是一个信息,而格雷码编码器就是那个能把这些拼图巧妙排列组合的高手。
它的工作过程啊,就如同一场精彩的魔术表演。
当输入信号进来时,就好像魔术师手中的道具,而格雷码编码器就开始施展它的魔法啦!它通过独特的算法和逻辑,把这些输入信号转化成一种特别的编码。
这感觉不就像是把普通的物品一下子变得与众不同了吗?
比如说在数字电路中,它就像是一个聪明的指挥家,让各种信号有序地前进、转化。
哎呀,这作用可太大了!你看,要是没有它,那整个系统不就乱套啦?
再想想看,它又像是一个细心的记录员呢,准确无误地记录下每一个重要的信息转化过程。
这多厉害呀!就好比你写日记,把每天发生的重要事情都一丝不差地记下来。
其实呢,格雷码编码器的工作原理并不复杂,但却超级重要!它默默工作,却让整个系统能够顺畅运行。
这不就是那种幕后英雄吗?虽然我们平时可能不会特别注意到它,但没有它还真不行!
我觉得啊,格雷码编码器就像是一个低调的强者,不张扬却有着巨大的能量。
我们真应该好好了解它、尊重它呀!它的存在让我们的科技世界变得更加精彩和神奇。
所以,大家可千万别小看它哟!。
格雷码(Golay Code )的编码和译码算法格雷码在通信中应用广泛。
例如早在1980年俄罗斯航天仪表码研究所为了提高“星一地”、“地一星”链路数字指控信息的可靠性,研制和实现了格雷码的编码器和译码器,该设备在某型号飞行任务中成功地进行了试验。
试验表明,使用格雷码,通信系统的误码率与未编码通信系统相比减少了1-3个数量级。
格雷码通常是指线性分组(23,12)码,最小距离d min =7,纠错能力 t=3。
由于223-12=2048=1+⎪⎪⎭⎫ ⎝⎛+⎪⎪⎭⎫ ⎝⎛+⎪⎪⎭⎫ ⎝⎛323223123 ,所以格雷码是完备码,其码重分布见下面表1。
表1 格雷码的码重分布格雷码Golay (23,12)是循环码。
对于汉明码、格雷码、二次剩余码、BCH 码和R-S 码等循环码的解码有很多方法,如梅杰特解码(Meggit, 1961)、大数逻辑解码(Reed ,1954)、门限解码(Massey, 1961)、信息组解码(Prange, 1962)。
最经典的方法当属梅杰特解码,它充分利用了循环码的循环特征。
一、 格雷码的编码算法输入:信源消息u (消息分组u ) 输出:码字v 1、处理:信源输出为一系列二进制数字0和1。
在分组码中,这些二进制信息序列分成固定长度的消息分组(message blocks )。
每个消息分组记为u ,由k 个信息位组成。
因此共有2k 种不同的消息。
编码器按照一定的规则将输入的消息u 转换为二进制n 维向量v ,这里n >k 。
此n 维向量v 就叫做消息u 的码字(codeword )、码字矢量或码向量(code vector )。
因此,对应于2k 种不同的消息,也有2k 种码字。
这2k 个码字的集合就叫一个分组码(block code )。
若一个分组码可用,2k 个码字必须各不相同。
因此,消息u 和码字v 存在一一对应关系。
由于n 符号输出码字只取决于对应的k 比特输入消息,即每个消息是独立编码的,从而编码器是无记忆的,且可用组合逻辑电路来实现。
格雷码简介及格雷码与二进制的转换程序一、格雷码简介格雷码(英文:Gray Code, Grey Code,又称作葛莱码,二进制循环码)是1880年由法国工程师Jean-Maurice-EmlleBaudot发明的一种编码[1] ,因Frank Gray于1953年申请专利“Pulse Code Communication”得名。
当初是为了机械应用,后来在电报上取得了巨大发展[2],现在则常用于模拟-数字转换[3]和转角-数字转换中[4] 。
典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便[5] 。
格雷码属于可靠性编码,是一种错误最小化的编码,因为它大大地减少了由一个状态到下一个状态时电路中的混淆。
由于这种编码相邻的两个码组之间只有一位不同,因而在用于模-数转换中,当模拟量发生微小变化而可能引起数字量发生变化时,格雷码仅改变一位,这样与其它码同时改变两位或多位的情况相比更为可靠,即可减少出错的可能性.这就允许代码电路能以较少的错误在较高的速度下工作。
格雷码在现代科学上获得了广泛的应用,人们还发现智力玩具九连环的状态变化符合格雷码的编码规律,汉诺塔的解法也与格雷码有关。
除了已知的特点,格雷码还有一些鲜为人知的性质。
多数数字电子技术和计算机技术的文献认为格雷码是无权码,只有J.F.A.Thompson认为可以从格雷码直接转换成十进制数[6]。
如果将格雷码的“权”及格雷码的奇偶性等性质在数学上给予证明,将有助于格雷码研究与应用的发展,有助于自动化技术的发展,还可有助于计算机科学的发展。
二、格雷码与二进制的转换程序* 本程序采用递推的方法进行推导,可以转换0~2147483647之间的数(1~31位)* 推导方式如下(以三位格雷码为例):* 序号格雷码格雷码实值二进制码二进制实值* 0 000 0 000 0* 1 001 1 001 1* 2 011 3 010 2* 3 010 2 011 3* 4 110 6 100 4* 5 111 7 101 5* 6 101 5 110 6* 7 100 4 111 7* 由上面的数据可看出.如果,按照序号01327645的方式遍历格雷码.其编* 码实值是按自然数顺序排列.反之,如果按此顺序遍历其二进制实值.则会发* 现遍历过的数据的个数减一即为二进制码所对应格雷码的实值.再观察序号* 顺序,我们会发现: 如果把二进制码分半,前半部分从前向后遍历,后半部分* 从后向前遍历.如果分半部分可再分,则再将其分半.并按照前半部分从前向* 后遍历(分解),后半部分从后向前遍历的方式遍历(分解).直到不可分.即可* 实现按序号所描述顺序遍历二进制码.如果,按此顺序遍历二进制码,我们可* 以很方便地在序列中找到所要的二进制码与其对应的格雷码.本思想可以很* 方便地用递归实现.这样就实现了二进制到格雷码的转换.同样,格雷码到二* 进制的转换,也可以用相同的方法推出.为了加快运算,我们跳过不必要的遍* 历将递归改为递推.这样就实现了格雷码与二进制之间的快速转换.* 此算法的时间复杂度约为O(n),n为要转换数据的BIT数.* ****************************************************************** 补充说明:* 其它的转换方法还有* 1、查表法(建立一个二进制与格雷码的对应表)* 2、公式法(根据卡诺图建立一个二进制到格雷码的每一位的公式)*///#define test#i nclude <stdio.h>#ifdef test#i nclude <time.h>#endif/*** 二进制转换成格雷码* @param lStart lValue所在区间下界* @param lEnd lValue所在区间上界* @param lValue 要转换的二进制数的实值* @return 返回格雷码对应的二进制数的实值* @see g2b() g2b 格雷码转换二进制* @see BtoG() BtoG 二进制转换格雷码* @see GtoB() BtoG 格雷码转换二进制* @author 黄毅* @useage a=b2g(0,15,4); //取得4所对应格雷码的二进制值结果a等于6* @memo lValue的值必须在区间[lStart,lEnd]里,否则无法求得所求结果.相应地,如果区间越小,求得结* 果所用的时间就越少.而且lStart,lEnd的值必须为2的N次方减1. 通常lStart为0.为了方便求得* 其值,建议使用BtoG()函数来进行操作.不过这样会使计算时间加长到原来的120%~180%.*/unsigned long b2g(unsigned long lStart,unsigned long lEnd,unsignedlong lValue){unsigned long Start=lStart,End=lEnd,Temp=0,Counter=0;bool Type=true;while(Start<End){Temp=(End+Start-1)>>1;if (lValue<=Temp){if(!Type)Counter+=((End-Start+1)>>1);End=Temp;Type=true;}else{if(Type)Counter+=((End-Start+1)>>1);Start=++Temp;Type=false;}}return Counter;}/*** 格雷码转换成二进制* @param lStart lValue对应二进制数所在区间下界* @param lEnd lValue对应二进制数所在区间上界* @param lValue 要转换的格雷码的实值* @return 返回二进制数对应的格雷码的实值* @see b2g() b2g 二进制转换格雷码* @see BtoG() BtoG 二进制转换格雷码* @see GtoB() BtoG 格雷码转换二进制* @author 黄毅* @useage a=b2g(0,15,6); //取得6所对应二进制值的格雷码结果a等于4* @memo lValue对应二进制数的值必须在区间[lStart,lEnd]里,否则无法求得所求结果.相应地,如果区* 间越小,求得结果所用的时间就越少.而且lStart,lEnd的值必须为2的N次方减1. 通常lStart 为0.* 为了方便求得其值,建议使用GtoB()函数来进行操作.但会使计算时间加长到原来的105%~14 0%.*/unsigned long g2b(unsigned long lStart,unsigned long lEnd,unsignedlong lValue){unsigned long Start=lStart,End=lEnd,Counter=0,Temp=0;bool Type=true;while(Start<End){Temp=Counter+((End-Start+1)>>1);if(Type^(lValue<Temp)){if(Type) Counter=Temp;Start=(Start+End+1)>>1;Type=false;}else{if(!Type) Counter=Temp;End=(Start+End-1)>>1;Type=true;}}return Start;}//b2g外壳程序,用来算lStart,lEnd;long BtoG(unsigned long lValue){register unsigned long lV=lValue,lMax=1; while (lV>0){lV>>=1;lMax<<=1;}if (lMax==0) return -1;return b2g(0,--lMax,lValue);}//g2b外壳程序long GtoB(unsigned long lValue){register unsigned long lV=lValue,lMax=1; while (lV>0){lV>>=1;lMax<<=1;}if (lMax==0) return -1;return g2b(0,--lMax,lValue);}main(){long input=0;#ifdef test//程序测试部分clock_t cStart,cEnd;unsigned long dTime;cStart=clock();for (input=0;input<9999999;input++)BtoG(32768);cEnd=clock();dTime=(cEnd-cStart);printf("BtoG: %ld / %ld\n",dTime,CLOCKS_PER_SEC);//------------------------------------------------------cStart=clock();for (input=0;input<9999999;input++)b2g(0,65535,32768);cEnd=clock();dTime=(cEnd-cStart);printf("b2g: %ld / %ld\n",dTime,CLOCKS_PER_SEC);//------------------------------------------------------cStart=clock();for (input=0;input<9999999;input++)GtoB(32768);cEnd=clock();dTime=(cEnd-cStart);printf("GtoB: %ld / %ld\n",dTime,CLOCKS_PER_SEC);//------------------------------------------------------cStart=clock();for (input=0;input<9999999;input++)g2b(0,65535,32768);cEnd=clock();dTime=(cEnd-cStart);printf("g2b: %ld / %ld\n",dTime,CLOCKS_PER_SEC);#else//程序演试部分printf("Input(HEX):");scanf("%x",&input);while (input!=-1){printf("------BtoG------\nBinary:%08Xh\nGray:%08Xh\n------GtoB------\nGray:%08Xh\nBinary:%08Xh\n----------------\n",input,BtoG(input),input,GtoB(input)); printf("Input(HEX):");scanf("%x",&input);}#endif。
格雷码编
发布时间:2009-02-11 22:20:56 译码电路
技术类别:
CPLD/FPGA
格雷码(Gray code),又叫循环二进制码或反射二进制码
在数字系统中只能识别0和1,各种数据要转换为二进制代码才能进行处理,格雷码是一种无权码,采用绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。
格雷码属于可靠性编码,是一种错误最小化的编码方式,因为,自然二进制码可以直接由数/模转换器转换成模拟信号,但某些情况,例如从十进制的3转换成4时二进制码的每一位都要变,使数字电路产生很大的尖峰电流脉冲。
而格雷码则没有这一缺点,它是一种数字排序系统,其中的所有相邻整数在它们的数字表示中只有一个数字不同。
它在任意两个相邻的数之间转换时,只有一个数位发生变化。
它大大地减少了由一个状态到下一个状态时逻辑的混淆。
另外由于最大数与最小数之间也仅一个数不同,故通常又叫格雷反射码或循环码。
一般的,普通二进制码与格雷码可以按以下方法互相转换:
二进制码->格雷码(编码):从最右边一位起,依次将每一位与左边一位异或(XOR),作为对应格雷码该位的值,最左边一位不变(相当于左边是0);
格雷码-〉二进制码(解码):从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值(最左边一位依然不变).
数学(计算机)描述:
原码:p[0~n];格雷码:c[0~n](n∈N);编码:c=G(p);解码:p=F(c);书写时从左向右标号依次减小.
编码:c=p XOR p[i+1](i∈N,0≤i≤n-1),c[n]=p[n];
解码:p[n]=c[n],p=c XOR p[i+1](i∈N,0≤i≤n-1).
Gray Code是由贝尔实验室的Frank Gray在20世纪40年代提出的(是1880年由法国工程师Jean-Maurice-Emlle
Baudot发明的),用来在使用PCM(Pusle Code Modulation)方法传送讯号时避免出错,并于1953年3月17日取得美国专利。
由定义可知,Gray Code的编码方式不是唯一的,这里讨论的是最常用的一种。
格雷码
(英文:Gray Code, Grey Code,又称作葛莱码,二进制循环码)是1880年由法国工程师Jean-Maurice-Emlle Baudot发明的一种编码,是一种绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。
格雷码属于可靠性编码,是一种错误最小化的编码方式,因为,虽然自然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的3转换为4时二进制码的每一位都要变,能使数字电路产生很大的尖峰电流脉冲。
而格雷码则没有这一缺点,它在相邻位间转换时,只有一位产生变化。
它大大地减少了由一个状态到下一个状态时逻辑的混淆。
由于这种编码相邻的两个码组之间只有一位不同,因而在用于风向的转角位移量-数字量的转换中,当风向的转角位移量发生微小变化(而可能引起数字量发生变化时,格雷码仅改变一位,这样与其它编码同时改变两位或多位的情况相比更为可靠,即可减少出错的可能性。
但格雷码不是权重码,每一位码没有确定的大小,不能直接进行比较大小和算术运算,也不能直接转换成液位信号,要经过一次码变换,变成自然二进制码,再由上位机读取。
解码的方法是用…0‟和采集来的4位格雷码的最高位(第4位)异或,结果保留到4位,再将异或的值和下一位(第3位)相异或,结果保留到3位,再将相异或的值和下一位(第2位)异或,结果保留到2位,依次异或,直到最低位,依次异或转换后的值(二进制数)就是格雷码转换后自然码的值.
异或:异或则是按位“异或”,相同为“0”,相异为“1”。
例:
10011000 异或01100001 结果: 11111001
举例:
如果采集器器采到了格雷码:1010
就要将它变为自然二进制:
0 与第四位 1 进行异或结果为 1
上面结果1与第三位0异或结果为 1
上面结果1与第二位1异或结果为0
上面结果0与第一位0异或结果为0
因此最终结果为:1100 这就是二进制码即十进制12
当然人看时只需对照表1一下子就知道是12
下面是本人以VerilogHDL描述的电路:
格雷码编码电路Verilog描述:
module gray(in, out);
input[width-1:0] in;
output[width-1:0] out;
parameter width = 16;
assign out="in"^{1'b0,in[width-1:1]};
endmodule
格雷码计数器只需做个普通二进制计数器,输出的加个格雷码编码器就可以
module gray(clk, out);
input clk;
output[width-1:0] out;
wire[width-1:0] out;
reg[width-1:0] in;
parameter width = 16;
always@(posedge clk)//普通计数器
in <= in + 1;
assign out="in"^{1'b0,in[width-1:1]};//输出端编码电路
endmodule
格雷码译码电路Verilog描述:
module degray(in, out);
input[15:0] in;
output[15:0] out;
wire[15:0] in;
reg[15:0] out;
reg[3:0] temp;
always @(in)
begin
out[15] = in[15];
for(temp = 15;temp > 0; temp = temp - 1)
begin
out[temp-1] = in[temp-1]^out[temp];
end
end
endmodule
四位的格雷码编码电路
十六位的二进制自然码转格雷码
四位的格雷码计数器
格雷码计数器译码电路in是实际的格雷码,out是输出格雷码,二者比较
四位的格雷码译码电路
十六位的格雷码译码电路仿真图,in输入格雷码,out得到结果。