格雷码和二进制的相互转换-vhdl程序剖析
格雷码简介及格雷码与二进制的转换程序解读
格雷码简介及格雷码与二进制的转换程序格雷码简介及格雷码与二进制的转换程序格雷码简介格雷码(英文:GrayCode,GreyCode,又称作葛莱码,二进制循环码)是1880年由法国工程师Jean-Maurice-EmlleBaudot发明的一种编码[1],因FrankGray于1953年申请专利“PulseCodeCommunication”得名。
当初是为了机械应用,后来在电报上取得了巨大发展[2],现在则常用于模拟-数字转换[3]和转角-数字转换中[4]。
典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特格雷码简介及格雷码与二进制的转换程序格雷码简介格雷码(英文:Gray Code, Grey Code,又称作葛莱码,二进制循环码)是1880年由法国工程师Jean-Maurice-EmlleBaudot发明的一种编码[1] ,因Frank Gray于1953年申请专利“Pulse Code Communication”得名。
当初是为了机械应用,后来在电报上取得了巨大发展[2],现在则常用于模拟-数字转换[3]和转角-数字转换中[4] 。
典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便[5] 。
格雷码属于可靠性编码,是一种错误最小化的编码,因为它大大地减少了由一个状态到下一个状态时电路中的混淆。
由于这种编码相邻的两个码组之间只有一位不同,因而在用于模-数转换中,当模拟量发生微小变化而可能引起数字量发生变化时,格雷码仅改变一位,这样与其它码同时改变两位或多位的情况相比更为可靠,即可减少出错的可能性.这就允许代码电路能以较少的错误在较高的速度下工作。
格雷码在现代科学上获得了广泛的应用,人们还发现智力玩具九连环的状态变化符合格雷码的编码规律,汉诺塔的解法也与格雷码有关。
除了已知的特点,格雷码还有一些鲜为人知的性质。
二进制与格雷码之间的转换
二进制与格雷码之间的转换二进制与格雷码都是数字编码方式,它们在计算机领域中被广泛使用。
二进制码的优点是易于理解和计算,而格雷码的优点是在数字变化时只会发生一位的变化,因此可以提高信号传输的效率,同时也减少误差的产生。
在实际应用中,我们需要经常进行二进制和格雷码之间的转换。
下面将分步骤阐述这个过程。
1. 二进制转化为格雷码首先,我们需要理解格雷码的生成方式。
对于n位二进制码,格雷码的生成方式如下:(1)第一位不变;(2)第二位开始,每位格雷码的数值等于其前一位与二进制码的当前位异或得出的结果。
明白了格雷码的生成方式之后,我们可以采用以下步骤将二进制转换为格雷码。
(1)将当前位的二进制编码保留;(2)右移一位,将二进制码的第一位考虑为符号位,用最高位的数值填充最高位,使得移位后的二进制码的位数不变;(3)将当前位的二进制编码和右移后的二进制编码异或,得出格雷码的当前位。
举例来说,将二进制数11101转换为格雷码:(1)取第一位1,保留不变,得到格雷码的第一位为1;(2)将11101右移一位,最高位使用0填充,得到00111;(3)将二进制码的当前位1和右移后的二进制码0011异或得到1,得出格雷码的第二位;(4)以此类推,得到的格雷码为10110。
2. 格雷码转化为二进制根据格雷码的生成方式,我们可以采用以下步骤将其转换为二进制。
(1)最高位保持不变,第二位开始,将当前位的格雷码与上一位的二进制码异或得出的结果作为当前位的二进制码;(2)依次执行上述步骤,直到转换完成。
举例看,将格雷码1101转换为二进制:(1)最高位1保持不变;(2)将格雷码1和上一位的二进制码1异或,得到当前位二进制为0;(3)将当前位格雷码0和上一位二进制码1异或,得到当前位二进制为1;(4)将当前位格雷码1和上一位二进制码0异或,得到二进制的第四位为1;(5)得到二进制码1101。
通过上述步骤,我们可以将二进制与格雷码之间转换。
二进制码和格雷码的转换
二进制码和格雷码的转换二进制码(Binary code)和格雷码(Gray code)是两种表示数字的编码方式。
它们之间的转换可以通过以下方法实现:1.二进制码转格雷码:o从左到右,将二进制码的第一位保持不变作为格雷码的第一位。
o从左到右依次处理二进制码的每一位,按照以下规则确定格雷码的对应位:▪如果当前的二进制位与前一位相同,则对应格雷码位为0。
▪如果当前的二进制位与前一位不同,则对应格雷码位为1。
o重复上述步骤,直到处理完所有位数,得到相应的格雷码。
2.格雷码转二进制码:o从左到右,将格雷码的第一位保持不变作为二进制码的第一位。
o从左到右依次处理格雷码的每一位,按照以下规则确定二进制码的对应位:▪如果当前的格雷码位与对应的二进制码位相同,则对应二进制码位为0。
▪如果当前的格雷码位与对应的二进制码位不同,则对应二进制码位为1。
o重复上述步骤,直到处理完所有位数,得到相应的二进制码。
下面是一个示例,将二进制码0101转换为格雷码和将格雷码0110转换为二进制码的过程:•二进制码0101转换为格雷码:o首位保持不变:0o第二位:0 ⊕ 1 = 1o第三位:1 ⊕ 0 = 1o第四位:0 ⊕ 1 = 1o最终格雷码:0111•格雷码0110转换为二进制码:o首位保持不变:0o第二位:0 ⊕ 1 = 1o第三位:1 ⊕ 1 = 0o第四位:0 ⊕ 0 = 0o最终二进制码:0100使用这些规则,可以在二进制码和格雷码之间进行相互转换。
这种转换在数字通信和数字电路设计中经常用到。
二进制与格雷码之间的转换
二进制与格雷码之间的转换在公司的PLC 改造项目中,我们经常要用到格雷码输出的绝对型旋转编码器。
由于格雷码是一种非加权码,不能直接反应出当前的角度值,所以必须在PLC 程序中将它转换成能反应当前实际位置的二进制码。
为了让我们的工程技术人员均能很好的掌握格雷码与二进制码之间的转换方法,我根据自己的一些经验和参考资料,将格雷码的相关知识作了些整理,在公司的刊物上发表出来,希望能和大家一起对这个问题来加以讨论和学习,共同提高我们的技术水平。
一、 格雷码(Gray Code )的概念格雷码是我们在工程中常会遇到的一种编码方式,例如,大多数绝对型旋转编码的输出就是采用格雷码的编码格式。
它是一种非加权码,由二进制码派生而来。
常用的二进制数与格雷码间的转换关系如下表:从上表我们可以看出,与普通二进制编码相比,格雷码的特点是相邻两个数之间只有1个二进制位发生了变化。
正是这个特点,使它更适合于用在数据传输的场合。
二、 二进制与格雷码之间的转换(一)、二进制码转为格雷码二进制码转为格雷码的算法较简单,将所需转换的数的二进制码右移一位后与原数相异或即可。
例:十进制数9的格雷码为:9的二进制数形式 9的格雷码形式 9的二进制数右移1位后的结果 两者相异或(二)、格雷码转为二进制码格雷码转为二进制码的算法则较为繁琐,计算公式如下: Rn 为n 位的格雷码,Cn 为转换后的二进制码C n = R n ,C n-1 = R n ⊕R n-1,C n-2 = R n ⊕R n-1⊕R n-2,…C 1 = R n ⊕R n-1⊕R n-2⊕…⊕R 2⊕R 1,C 0 = R n ⊕R n-1⊕R n-2⊕…⊕R 2⊕R 1⊕R 0例:格雷码(1001)转位二进制数C 4= R 4=1C 3= R 4⊕R 3=1⊕0=1C 2= R 4⊕R 3⊕R 2= C 3⊕R 2=1⊕0=1C1= R 4⊕R 3⊕R 2⊕R1= C 2⊕R 1=1⊕1=0三、 编程举例根据工业控制的特点,现分别给出在PLC 梯形图中和在VB 中实现格雷码转二进制码的程序。
格雷码与二进制码的互转
格雷码与二进制码的互转
格雷码(Gray Code)与二进制码(Binary Code)是一种二进制变换编码形式,被用于错误纠正、机器人控制以及防止计算机硬件而设计出来的。
1. 格雷码的定义:
格雷码的定义是每多加一位二进制,所生成的一串编码依次改变一组
比特后得到,而它只有两个状态:1和0。
也就是说,在每一位的变化
范围中,都只有一次变化,当变化完成后又重新回到原有状态,即前
一步的状态,这样就形成了一种叫做“码”的序列,也就是格雷码。
2. 格雷码与二进制码的区别:
a)二进制码是一种线性变换,格雷码是一种非线性变换,因此具有明显的非线性特性。
b)二进制码的前一位改变时会使所有位都发生改变,而格雷码的前一
位变化时只会造成下一位的改变,说明上一位的改变有限制体现。
c)由于格雷码包含非线性特性,所以它在采用某些特殊信号中会比二
进制码拥有更好的可靠性和抗干扰性,这也是它被用于错误纠正、机
器人控制以及防止计算机硬件而设计出来的原因之一。
3. 格雷码与二进制码的互转:
(1)格雷码转换成二进制码:在格雷码中,G3到G7是
011→001→101→100,那么转换成二进制码的就是
011→111→101→110,即G3到G7的二进制码就是0111101110。
(2)二进制码转换成格雷码:比如说01101000,第一位没有变化,从第二位开始,那么他就是0110→0100→1100→1000,因此,01101000就转换成了01100100。
格雷码转换为二进制码
格雷码转换为二进制码
要将格雷码转换为二进制码,可以按照以下步骤进行操作:
1. 将格雷码的最高位和二进制码的最高位保持一致。
2. 从高位到低位,依次进行异或运算。
如果格雷码当前位与前一位相同,对应的二进制码为0;如果格雷码当前位与前一位
不同,对应的二进制码为1。
3. 将异或运算的结果依次组合起来,即可得到对应的二进制码。
例如,将格雷码1101101转换为二进制码:
格雷码:1 1 0 1 1 0 1
二进制码:1 0 1 1 1 1 0
因为第一个位的格雷码与二进制码相同,所以最高位保持一致。
接下来,通过异或运算得到其他位的二进制码:1⊕1=0,
0⊕0=0,0⊕1=1,1⊕1=0,0⊕0=0,0⊕1=1。
将异或运算的
结果组合在一起即可得到二进制码1011110。
二进制转格雷码四位
二进制转格雷码四位二进制转格雷码四位二进制码和格雷码是数字电路中常用的编码方式,其中格雷码的特点是相邻的两个码只有一位不同。
因此,格雷码在数字电路中的应用非常广泛。
在数字电路中,我们经常需要将二进制码转换为格雷码,这里我们介绍一种将四位二进制码转换为四位格雷码的方法。
首先,我们需要了解二进制码和格雷码之间的转换规则。
对于一个n 位的二进制码,其对应的n位格雷码可以通过以下方式得到:1.将二进制码的最高位作为格雷码的最高位。
2.从左到右依次处理每一位,如果当前位和前一位相同,则该位的格雷码为0,否则为1。
例如,对于一个四位的二进制码1101,其对应的四位格雷码可以通过以下步骤得到:1.将二进制码的最高位1作为格雷码的最高位。
2.处理第二位,当前位为1,前一位为1,因此该位的格雷码为0。
3.处理第三位,当前位为0,前一位为1,因此该位的格雷码为1。
4.处理第四位,当前位为1,前一位为0,因此该位的格雷码为1。
因此,1101的四位格雷码为1010。
接下来,我们介绍一种将四位二进制码转换为四位格雷码的方法。
该方法基于以下两个事实:1.对于一个n位的二进制码,其对应的n位格雷码可以通过将二进制码的最高位保留不变,然后对剩余的n-1位进行异或运算得到。
2.对于一个n位的二进制码,其对应的n位格雷码可以通过将二进制码的最高位保留不变,然后对剩余的n-1位进行异或运算得到。
因此,我们可以将四位二进制码转换为四位格雷码的步骤如下:1.将二进制码的最高位保留不变。
2.对二进制码的第二位和第三位进行异或运算,得到格雷码的第二位。
3.对二进制码的第三位和第四位进行异或运算,得到格雷码的第三位。
4.对二进制码的第四位和第一位进行异或运算,得到格雷码的第四位。
例如,对于一个四位的二进制码1101,其对应的四位格雷码可以通过以下步骤得到:1.将二进制码的最高位1保留不变。
2.对二进制码的第二位1和第三位0进行异或运算,得到格雷码的第二位1。
格雷码、二进制码转换
entity and_gate is port(a,b: IN std_logic; y: out std_logic); end and_gate; architecture rhl of and_gate is begin y<=a and b; end rhl;
条件句中的“=>”不是操作符,只相当于“THEN”作用。
南理工紫金学院
EDA设计实验
由于case属于顺序语句, 在VHDL中顺序语句只能存 在与进程中。
南理工紫金学院
VHDL 常用基本语句
EDA设计实验
进程语句
进程主要用于描述顺序语句,其格式如下:
标记:process (敏感信号表 ) --变量声明语句; begin --顺序语句 end process; 敏感信号(包括端口信号)指那些值发生改变后能引起 进程语句执行的信号。当敏感信号发生改变时,进程启 动,begin和end之间的语句从上到下顺序执行一次,然 后返回进程语句开始,等待下一次敏感信号的变化。因 此进程语句有两种状态:等待状态和执行状态。 南理工紫金学院
1 声明部分包括:结构体所用的内部信号及数据类型; 元件例化声明。
2 结构体部分主要包括:并行语句信号赋值; 进程(顺序语句); 元件例化语句。 3 最后以end结束结构体部分。 南理工紫金学院
EDA设计实验
逻辑运算符
And(与),Or(或),Not(非), Nand(与非),Nor(或非),Xor(异或), Xnor(同或)。
EDA设计实验
第二节 格雷码、二进制码转换
南理工紫金学院
EDA设计实验
实验内容
格雷码简介及格雷码与二进制的转换程序
格雷码简介及格雷码与二进制的转换程序一、格雷码简介格雷码(英文: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。
格雷码、二进制转换电路,vhdl南京理工大学紫金学院实验报告,eda
对于 n 位二进制码转换为格雷码的码转换电路,转换表达式如下:
g n an gi ai1 ai
2、GENERIC、GENERATE 语句 a、GENERIC GENERIC 被称为参数传递映射语句,它描述响应的元件类属参数间的衔接和传送方式。 参数传递语句用于设计从外部端口改变原件内部参数或结构规模的元件, 也可称其为类书元 件。该语句在改变电路结构或元件硬件升级方面显得尤为便捷。
1)学习用 VHDL 代码描述组合逻辑电路的方法。 2) 掌握 when…else…和 generate 并行语句的使用。
二、 实验原理
1、格雷码、二进制码转换理论分析 4 位格雷码二进制转换的真值表如图 1。
图 1 4 位格雷码二进制转换的真值表 由真值表得到的表达式如下:
B3 G 3 B 2 B3 G 2 B1 B 2 G1 B0 B1 G 0
将未配置的管脚设置为高阻态。 注意:总线“b”和总线“g”不需要配置管脚。 注意:配置好管脚后一定要记得编译。 4、下载 将文件下载到实验箱,对实验箱进行操作,将键 1~键 8 按钮设置为不同的电平,观察 D1~D8 发光二极管的情况。
四、 小结与体会
通过这次实验,我对理论课上老师所讲的 generate 并行语句有了更深一步的了解。 本次实验是我们的第二次实验,但是是第一次在 Quartus II 软件上编写代码。我掌握 when…else…和 generate 并行语句的使用, 并利用 generate 并行语句做了了 8 位二进制码 /格雷码转换电路,且利用实验箱验证了所设计电路的正确性。
注意: “Count every”值一定要比“End time”值小,且“Count every”值最好不要 设置太小 (如 10ns) , 避免在时序仿真是由于延时造成结果不正确。 “Count every” 值和 “End time”值共同决定了输入信号值的数目。 注意:每次仿真时最好从“Simulator Tool”中导入要仿真的文件,而不是直接点击工 具栏上的按钮,尤其是当工程中存在多个仿真文件时。 3、管脚配置 利用实验箱的模式 5 来验证设计电路的正确性。 用键 1~键 8 表示输入管脚 g0~g7,发光二极管 D1~D8 表示输出管脚 b0~b7。 选择“Assignment→Assignment Editor”弹出管脚配置图,在“Location”一栏中填 入相应器件的管脚。如下图。
二进制和格雷码转换
⼆进制和格雷码转换⼗进制 586 =⼆进制 1001001010 =格雷码 1101101111。
⼆进制码 ----> 格雷码(编码):从最右边⼀位起,依次将每⼀位与左边⼀位异或(XOR),作为对应格雷码该位的值,最左边⼀位不变(相当于左边是0)。
格雷码的是特点是:相邻两数的格雷码,仅仅有⼀位⼆进制发⽣变化。
⽽且在其范围内的最⼩值和最⼤值,也仅仅有⼀位⼆进制发⽣变化。
例如下⾯两数:最⼩:⼆进制0000=格雷码0000最⼤:⼆进制1111=格雷码1000看到了吧,0000 和 1000,仅仅有⼀位数发⽣变化。
-------如果在变换的过程中,先把⼗进制转换成BCD码,这就失去了格雷码的特点。
因为在BCD码中:最⼩:⼆进制0000=格雷码0000最⼤:⼆进制1001=格雷码1101可以看出,它们之间有三位发⽣变化。
通过BCD码来变换格雷码,思路不对。
变换出来的,并不是原数的格雷码。
后记:⾃然⼆进制数与格雷码的互换公式与电路⾃然⼆进制数转换到格雷码------------设有 N 位⼆进制数 B(i),其中 0 <= i <= N - 1;它可以变换成为同样位数的格雷码 G(i)。
⼆进制数与格雷码的转换公式如下: G(i) = B(i+1) XOR B(i) ; 0 <= i < N - 1 G(i) = B(i) ; i = N - 1如果是通过编程计算进⾏变换,就需要使⽤这个公式逐位的计算;如果是使⽤硬件电路进⾏变换,就可以使⽤做⽽论道前⾯在回答问题时给出的电路。
格雷码转换到⾃然⼆进制数------------设有 N 位格雷码 G(i),把它转换成⾃然⼆进制数的算法如下。
⾃然⼆进制码的最⾼位等于雷码的最⾼位;⾃然⼆进制码的次⾼位为最⾼位⾃然⼆进制码与次⾼位格雷码相异或;⾃然⼆进制码的其余各位与次⾼位⾃然⼆进制码的求法相类似。
转换公式如下: B(i) = G(i) ; i = N - 1 B(i) = B(i+1) XOR G(i) ; 0 <= i < N - 1。
二进制与格雷码转换
在精确定位控制系统中,为了提高控制精度,准确测量控制对象的位置是十分重要的。
目前,检测位置的办法有两种:其一是使用位置传感器,测量到的位移量由变送器经A/D转换成数字量送至系统进行进一步处理。
此方法精度高,但在多路、长距离位置监控系统中,由于其成本昂贵,安装困难,因此并不实用;其二是采用光电轴角编码器进行精确位置控制。
光电轴角编码器根据其刻度方法及信号输出形式,可分为增量式、绝对式以及混合式三种。
而绝对式编码器是直接输出数字量的传感器,它是利用自然二进制或循环二进制(格雷码)方式进行光电转换的,编码的设计一般是采用自然二进制码、循环二进制码、二进制补码等。
特点是不要计数器,在转轴的任意位置都可读出一个固定的与位置相对应的数字码;抗干扰能力强,没用累积误差;电源切断后位置信息不会丢失,但分辨率是由二进制的位数决定的,根据不同的精度要求,可以选择不同的分辨率即位数。
目前有10位、11位、12位、13位、14位或更高位等多种。
其中采用循环二进制编码的绝对式编码器,其输出信号是一种数字排序,不是权重码,每一位没有确定的大小,不能直接进行比较大小和算术运算,也不能直接转换成其他信号,要经过一次码变换,变成自然二进制码,在由上位机读取以实现相应的控制。
而在码制变换中有不同的处理方式,本文着重介绍二进制格雷码与自然二进制码的互换。
一、格雷码(又叫循环二进制码或反射二进制码)介绍在数字系统中只能识别0和1,各种数据要转换为二进制代码才能进行处理,格雷码是一种无权码,采用绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。
格雷码属于可靠性编码,是一种错误最小化的编码方式,因为,自然二进制码可以直接由数/模转换器转换成模拟信号,但某些情况,例如从十进制的3转换成4时二进制码的每一位都要变,使数字电路产生很大的尖峰电流脉冲。
二进制数和格雷码的转换
二进制数和格雷码的转换二进制数和格雷码是数字电路中常用的编码方式,它们在数据传输、存储等方面都有广泛的应用。
下面我们来介绍一下二进制数和格雷码的转换方法。
一、二进制数转换为格雷码1.将二进制数的最高位复制到格雷码的最高位上。
2.从左到右扫描二进制数的每一位,如果该位与前一位相同,则在格雷码中该位上写入0,否则写入1。
例如,将二进制数101101转换为格雷码:第一步:将最高位1复制到格雷码的最高位上,得到10xxxx。
第二步:从左到右扫描剩余部分,第2位与第1位不同,故在格雷码中该位上写入1;第3、4、5位与前一位相同,故在格雷码中这三个位置上均写入0;第6位与前一位不同,故在格雷码中该位置上写入1。
最终得到的格雷码为111001。
二、格雷码转换为二进制数1.将格雷码的最高位复制到二进制数的最高位上。
2.从左到右扫描剩余部分,在每个位置上依次执行以下操作:若该位置上的数字为0,则在对应位置上写入前一个数字的值;若该位置上的数字为1,则在对应位置上写入前一个数字的值的补数。
例如,将格雷码111001转换为二进制数:第一步:将最高位1复制到二进制数的最高位上,得到1xxxxx。
第二步:从左到右扫描剩余部分,第2位是1,则在二进制数中该位置上写入前一个数字0的补数1;第3、4、5位均为1,则在二进制数中这三个位置上写入前一个数字0的补数1;第6位为0,则在二进制数中该位置上写入前一个数字1的值0。
最终得到的二进制数为101101。
总结:以上就是二进制数和格雷码之间转换的方法,需要注意的是,在实际应用中要根据具体情况选择合适的编码方式,并且要注意编码转换过程中可能出现的错误。
二进制与格雷码转换
之阳早格格创做正在粗决定位统造系统中,为了普及统造粗度,准确丈量统造对于象的位子是格中要害的.暂时,检测位子的办法有二种:其一是使用位子传感器,丈量到的位移量由变收器经A/D变更成数字量收至系统举前进一步处理.此要领粗度下,但是正在多路、少距离位子监控系统中,由于其成本下贵,拆置艰易,果此本来不真用;其二是采与光电轴角编码器举止透彻位子统造.光电轴角编码器根据其刻度要领及旗号输出形式,可分为删量式、千万于式以及混同式三种.而千万于式编码器是曲交输出数字量的传感器,它是利用自然二进造或者循环二进造(格雷码)办法举止光电变更的,编码的安排普遍是采与自然二进造码、循环二进造码、二进造补码等.个性是不要计数器,正在转轴的任性位子皆可读出一个牢固的与位子相对于应的数字码;抗搞扰本领强,出用乏积缺面;电源切断后位子疑息不会拾得,但是辨别率是由二进造的位数决断的,根据分歧的粗度央供,不妨采用分歧的辨别率即位数.暂时有10位、11位、12位、13位、14位或者更下位等多种.其中采与循环二进造编码的千万于式编码器,其输出旗号是一种数字排序,不是权沉码,每一位不决定的大小,不克不迭曲交举止比较大小战算术运算,也不克不迭曲交变更成其余旗号,要通过一次码变更,形成自然二进造码,正在由上位机读与以真止相映的统造.而正在码造变更中有分歧的处理办法,本文着沉介绍二进造格雷码与自然二进造码的互换.一、格雷码(又喊循环二进造码或者反射二进造码)介绍正在数字系统中只可辨别0战1,百般数据要变更为二进造代码才搞举止处理,格雷码是一种无权码,采与千万于编码办法,典型格雷码是一种具备反射个性战循环个性的单步自补码,它的循环、单步个性与消了随机与数时出现要害缺面的大概,它的反射、自补个性使得供反非常便当.格雷码属于稳当性编码,是一种过得最小化的编码办法,果为,自然二进造码不妨曲交由数/模变更器变更成模拟旗号,但是某些情况,比圆从十进造的3变更成4时二进造码的每一位皆要变,使数字电路爆收很大的尖峰电流脉冲.而格雷码则不那一缺面,它是一种数字排序系统,其中的所有相邻整数正在它们的数字表示中惟有一个数字分歧.它正在任性二个相邻的数之间变更时,惟有一个数位爆收变更.它大天面缩小了由一个状态到下一个状态时逻辑的殽杂.其余由于最大数与最小数之间也仅一个数分歧,故常常又喊格雷反射码或者循环码.下表为几种自然二进造码与格雷码的对于照表:二、二进造格雷码与自然二进造码的互换1、自然二进造码变更成二进造格雷码自然二进造码变更成二进造格雷码,其规则是死存自然二进造码的最下位动做格雷码的最下位,而次下位格雷码为二进造码的下位与次下位相同或者,而格雷码其余诸位与次下位的供法相类似.2、二进造格雷码变更成自然二进造码二进造格雷码变更成自然二进造码,其规则是死存格雷码的最下位动做自然二进造码的最下位,而次下位自然二进造码为下位自然二进造码与次下位格雷码相同或者,而自然二进造码的其余诸位与次下位自然二进造码的供法相类似.三、二进造格雷码与自然二进造码互换的真止要领1、自然二进造码变更成二进造格雷码A)、硬件真止法(拜睹示例工程中的Binary to Gray) 根据自然二进造变更成格雷码的规则,不妨得到以下的代码:static unsigned int DecimaltoGray(unsigned int x){return x^(x>>1);}//以上代码真止了unsigned int型数据到格雷码的变更,最下可变更32位自然二进造码,超出32位将溢出. static int DecimaltoGray( int x){return x^(x>>1);}//以上代码真止了 int型数据到格雷码的变更,最下可变更31位自然二进造码,超出31位将溢出.上述代码即可用于VC统造步调中,也不妨用于单片机统造步调中.正在单片机步调安排时,若采与汇编谈话编程,不妨按相共的本理安排步调;若采与C谈话编程,则不妨曲交利用上述代码,但是修议用unsigned int函数.B)、硬件真止法根据自然二进造变更成格雷码的规则,不妨得到以下电路图:上图所示电路图即可用同或者集成电路74ls136真止,也不妨利用可编程器件PLD等编程真止.2、二进造格雷码变更成自然二进造码A)、硬件真止法(拜睹示例工程中的 Gray to Binary )根据二进造格雷码变更成自然二进造码的规则,不妨得到以下的三种代码办法:• static unsigned int GraytoDecimal(unsigned int x)• {• unsigned int y = x;• while(x>>=1)• y ^= x;• return y;• }• static unsigned int GraytoDecimal(unsigned int x)• {• x^=x>>16;• x^=x>>8;• x^=x>>4;• x^=X>>2;• x^=x^1;• return x;• }• static unsigned int GraytoDecimal(unsigned int x)• {• int i;• for(i=0;(1<<i)<sizeof(x)*8;i++)• {• x^=x>>(1<<i);• }• return x;• }//以上代码真止了unsigned int型数据到自然二进造码的变更,最下可变更32位格雷码,超出32位将溢出.将数据典型改为int型即可真止31位格雷码变更.上述代码即可用于VC统造步调中,也不妨用于单片机统造步调中.正在单片机步调安排时,若采与汇编谈话编程,不妨按相共的本理安排步调;若采与C谈话编程,则不妨曲交利用上述代码,但是修议用unsigned int 函数.B)、硬件真止法根据二进造格雷码变更成自然二进造码的规则,不妨得到以下电路图:上图所示电路图即可用同或者集成电路74ls136真止,也不妨利用可编程器件PLD等编程真止.。
格雷码和二进制码之间的转换
二进制与格雷码之间的转换在公司的PLC 改造项目中,我们经常要用到格雷码输出的绝对型旋转编码器。
由于格雷码是一种非加权码,不能直接反应出当前的角度值,所以必须在PLC 程序中将它转换成能反应当前实际位置的二进制码。
为了让我们的工程技术人员均能很好的掌握格雷码与二进制码之间的转换方法,我根据自己的一些经验和参考资料,将格雷码的相关知识作了些整理,在公司的刊物上发表出来,希望能和大家一起对这个问题来加以讨论和学习,共同提高我们的技术水平。
一、 格雷码格雷码((Gray Code )的概念格雷码是我们在工程中常会遇到的一种编码方式,例如,大多数绝对型旋转编码的输出就是采用格雷码的编码格式。
它是一种非加权码,由二进制码派生而来。
常用的二进制数与格雷码间的转换关系如下表:从上表我们可以看出,与普通二进制编码相比,格雷码的特点是相邻两个数之间只有1个二进制位发生了变化。
正是这个特点,使它更适合于用在数据传输的场合。
二、 二进制与格雷码之间的转换(一)、二进制码转为格雷码二进制码转为格雷码的算法较简单,将所需转换的数的二进制码右移一位后与原数相异或即可。
例:十进制数9的格雷码为:数值 二进制码格雷码 数值 二进制码格雷码0 0000 0000 9 1001 1101 1 0001 0001 10 1010 1111 2 0010 0011 11 1011 1110 30011 0010 12 1100 1010 40100 0110 13 1101 1011 50101 0111 14 1110 1001 60110 0101 15 1111 1000 70111 0100 81000 1100 9的二进制数形式 9的格雷码形式 9的二进制数右移1位后的结果 两者相异或(二)、格雷码转为二进制码格雷码转为二进制码的算法则较为繁琐,计算公式如下: Rn 为n 位的格雷码,Cn 为转换后的二进制码C n = R n ,C n-1 = R n R ⊕n-1,C n-2 = R n R ⊕n-1R ⊕n-2,…C 1 = R n R ⊕n-1R ⊕n-2…R ⊕⊕2R ⊕1,C 0 = R n R ⊕n-1R ⊕n-2…R ⊕⊕2R ⊕1R ⊕0例:格雷码(1001)转位二进制数C 4= R 4=1C 3= R 4⊕R 3=1⊕0=1C 2= R 4⊕R 3⊕R 2= C 3⊕R 2=1⊕0=1C1= R 4⊕R 3⊕R 2⊕R1= C 2⊕R 1=1⊕1=0三、 编程举例根据工业控制的特点,现分别给出在PLC 梯形图中和在VB 中实现格雷码转二进制码的程序。
二进制转换为格雷码
二进制转换为格雷码
1二进制与格雷码的转换
二进制是用于计算的一种逻辑编码,由0和1组成,它是其他编码的基础。
格雷码是在二进制编码系统上进行改良的一种编码方式,它被广泛应用于数学和电子设备之间的数据传输等场合。
格雷码是传统二进制编码的优化,可以降低结构上的错误率。
传统的二进制编码要求每一个位(Bit)编码变化才能表示新的字符,而格雷码只要求相邻的位有一个变化就可以了。
因此,经过优化的格雷码在实现下一个编码时可以更快、更有效地实现。
2格雷码的生成
一位格雷码由二进制的“镜像”模式来生成,即第一位不变,其余位置上,该位和它左侧的位的异或结果即为该位的格雷码的值。
要生成多位格雷码,也只需要按照这种方式把位`依次处理大即可,即从最低位开始,第i位和他左边i-1位异或则为第i位格雷码。
3二进制与格雷码之间的转换
当转换二进制到格雷码时,可以逐位处理,即先生成第1位格雷码,然后在此基础上生成第2位格雷码(以第一位格雷码为左侧位),依此类推即可。
转换格雷码到二进制,可以采用简单的计算方法,原则上从低位开始转换,第一位格雷码和其相应的二进制位相同,其余几位二进制位等于该位格雷码加上它左边位的二进制值再取反。
以上就是二进制与格雷码之间转换的原理与方法,二进制和格雷码都是用来存储和传递数据的常用编码方法,理解其之间的原理和使用方法有助于提高计算机的工作效率。
格雷码、二进制转换电路
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 ==⊕=⊕=⊕五、电路仿真结果六、管脚配制。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.B2G_converter
1)Screenshot of iSim simulation results:
note: from the beginning point at 1,000ns, input(i5binary) changes every other 50ns
a)i5binary input from 0 to 6
b)i5binary input from 7 to 13
c)i5binary input from 14 to 20
d)i5binary input from 21 to 27
e)i5binary input from 28 to 31
2)VHDL for Binary-to-Gray-Code converter:
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 13:02:37 09/15/2015
-- Design Name:
-- Module Name: b2g_converter - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity b2g_converter is
Port ( i5Binary : in STD_LOGIC_VECTOR (4 downto 0);
o5GrayCode : out STD_LOGIC_VECTOR (4 downto 0));
end b2g_converter;
architecture Behavioral of b2g_converter is
signal gbuffer: std_logic_vector (4 downto 0);
begin
o5GrayCode<=gbuffer;
gbuffer(4)<=i5Binary(4);
label1:
for i in 3 downto 0 generate
gbuffer(i)<= i5Binary(i+1) xor i5Binary(i);
end generate;
end Behavioral;
2.G2B_converter
1)Gray-code-to-Binary conversion
From the combinational logic described for gray-code-to-binary conversion, we obtain:
Thus, for a n-bit graycode number g, g=g(n-1)g(n-2)…g(2)g(1)g(0), the corresponding n-bit binary number b, b=b(n-1)b(n-2)…b(2)b(1)b(0) is computed using the following description:
b(n-1)=g(n-1) for the MSB, and
b(i)= g(i) b(i+1) for bits in position 0 to n-2
2)Screenshot of iSim simulation results:
note: from the beginning point at 1,000ns, input(i5graycode) changes every other 50ns
a)i5graycode input from 0 to 6
b)i5graycode input from 7 to 13
c)i5graycode input from 14 to 20
d)i5graycode input from 21 to 27
e)i5graycode input from 28 to 31
3)VHDL for Gray-Code-to-Binary converter:
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 15:20:03 09/15/2015
-- Design Name:
-- Module Name: g2b_converter - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
---------------------------------------------------------------------------------- library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity g2b_converter is
Port ( i5GrayCode : in STD_LOGIC_VECTOR (4 downto 0);
o5Binary : out STD_LOGIC_VECTOR (4 downto 0)); end g2b_converter;
architecture Behavioral of g2b_converter is
signal bbuffer: std_logic_vector (4 downto 0);
begin
o5Binary <= bbuffer;
bbuffer(4)<= i5GrayCode(4);
label1:
for i in 3 downto 0 generate
bbuffer(i)<= bbuffer(i+1) xor i5GrayCode(i); end generate;
end Behavioral;。