计算机组成原理--常说的格雷码

  有一个设计电路的问题:要求输入二进制代码,输出格雷码。
  题目链接:二进制转格雷码

  具体要求:设计一个代码转换电路,输入为 4 位二进制代码,输出为 4 位格雷码。可以采用各种逻辑功能的门电路来实现。学过了数据选择器,加法器,全加器,半全加器,数值比较器。
  高手帮帮忙啊,明天就要交了~~!!!!!
  悬赏分:30 - 解决时间:2009-12-14 23:58
------------------------
  做而论道给出的答案如下:
  格雷码(编码):从最右边一位起,依次将输入二进制数的每一位与左边一位相异或 (XOR),作为对应格雷码该位的值,最左边一位不变(相当于其左边是 0)。
  电路见下面的插图。

  图中使用了三个异或门,Di 是输入的二进制代码,Gi 是输出的格雷码。
  回答者: 做而论道 - 十一级   2009-12-14 23:32
-------------------------

  后记:做而论道回答这个问题的时间,是很早以前了。但是百度知道经过几次改版,真实的时间,都不显示了。 另外,这种问题,重复出现了许多次,其中一个可见:百度知道


  下面介绍一些关于格雷码的常识。
  格雷码,是一种代表数字的二进制编码。
  数字,都是有权的,但是,格雷码却是无权码。

  格雷码的特点是:在任意两个相邻数字的格雷码中,仅有一位码元不同,而且首尾两数的格雷码,也是只有一位码元不同。
  又因为格雷码具有这种 “首尾相连” 的特点,所以,格雷码也称为循环码。
  下面是数字与其 2~4 位格雷码的对应关系。

 ---------------+------+---------------------
     数   字  | 4 位 | 常 说 的 格 雷 码
 --------+------+ 8421 +------+------+-------
  十进  | 二进 |  码  | 2 位 | 3 位 | 4 位
 --------+------+------+------+------+-------
   0  |    0 | 0000 |  00  |  000 | 0000 
   1  |    1 | 0001 |  01  |  001 | 0010
   2  |   10 | 0010 |  10  |  011 | 0011
   3  |   11 | 0011 |  11  |  010 | 0010
   4  |  100 | 0100 |  --  |  110 | 0110
   5  |  101 | 0101 |  --  |  111 | 0111
   6  |  110 | 0110 |  --  |  101 | 0101
   7  |  111 | 0111 |  --  |  100 | 0100
   8  | 1000 | 1000 |  --  |  --- | 1100
   9  | 1001 | 1001 |  --  |  --- | 1101
   10   | 1010 | 1010 |  --  |  --- | 1111
    11   | 1011 | 1011 |  --  |  --- | 1110
    12   | 1100 | 1100 |  --  |  --- | 1010
    13   | 1101 | 1101 |  --  |  --- | 1011
    14   | 1110 | 1110 |  --  |  --- | 1001
    15   | 1111 | 1111 |  --  |  --- | 1000
 --------+------+------+------+------+-------

  仔细观察各个数字的格雷码,可以看出,相邻两数的格雷码,确实是只有一位码元不同,而且最大数和最小数的格雷码,也是只有一位码元不同。 因此,这些格雷码,确实是格雷码。

  再观察一下 4 位的格雷码吧,从上往下看仔细看。
  依次读出格雷码的最后一位,是:0110 0110 0110 0110;
  依次读出格雷码的倒数第二位,是:00111100 00111100;

  依次读出格雷码的倒数第三位,是:0000 11111111 0000;
  依次读出格雷码的最高位,是:00000000 11111111。
  看出规律了吗? 好像,除了最高位之外,有点镜像的关系。
  镜像!因为具有这个规律,就被某些人称为:反射特性。
  因此,格雷码,就又被一些人牵强附会称为:反射码。

  但是,并非所有格雷码都是具有反射特性的,至少,不是很鲜明。且看下面的数据。

  8421码 格雷码
  0000  0000
  0001  0100
  0010  1100
  0011  1101
  0100  1001
  0101  1000
  0110  1010
  0111  1110
  1000  1111
  1001  1011
  1010  0011
  1011  0010
  1100  0110
  1101  0111
  1110  0101
  1111  0001

  这一组数据,也是符合格雷码特点的。应该说,这也是格雷码。 但是,它的反射特性呢?归纳起来,可就不那么容易了。
  通过观察上面的数据,应该认识到:格雷码,并非只有一种。

  教材中常说的格雷码,只能说它是:常说的格雷码。并非是:唯一的格雷码。
  常说的格雷码,与其代表数字的关系,还是比较简单的。就是【逐位异或】的关系。

  设有 N 位二进制数,怎样才能把它转换成常说的格雷码呢?
  首先要把二进制数,写成 8421 码(称为 B(i),其中 0 <= i <= N - 1),然后再把 8421 码转换成 N 位的格雷码 G(i)。 转换公式如下:
    G(i) = B(i)      ;  i = N - 1;
    G(i) = B(i+1) ⊕ B(i) ; 0 <= i < N - 1
  简单来说,就是:最高位不变;由高位到低位,逐位进行异或。

  如果是通过编程计算进行变换,就需要使用这个公式逐位的计算;
  如果是使用硬件电路进行变换,就简单多了。

---------------------------

  把格雷码转换到二进制数,也就是上述过程的逆过程。

  设有 N 位格雷码 G(i) (0 <= i <= N - 1),把它转换成 8421 码的算法如下:
    B(i) = G(i)       ;  i = N - 1

    B(i) = B(i+1) ⊕ G(i) ; 0 <= i < N - 1
  简单来说,也是:最高位不变;由高位到低位,逐位进行异或。

  得到了 8421 码之后,再转换成二进制数,就没有任何难度了。

---------------------------

  数字,与其格雷码的互相转换,虽说都是:由高到低逐位异或,但是,还是有所不同的。
  正变换、逆变换,要用到两种不同的电路,可见下图。

  懂电路的人,一看便知,无须赘述。

--本文完--

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值