编码与码制

        数字系统的主要功能是处理信息。因此必须将信息表示成电路能够识别,便于运算存储的形式。信息主要有两类:数值信息和非数值信息。数值:可以用来算数运算的数据。如张三的学习成绩考了多少分。非数值:不能用来算数运算的数据。如某球员球衣上的编号。数值的表示方法:进制。非数值的表示方法:编码。

       在数字技术中,常用二进制码0和1来表示文字符号信息,这种特定的二进制码称为代码。如:计算机键盘上面的字母和数字这些特定的信息,对于计算机来说它不能识别这些特定的信息,而计算机只识别0和1组成的代码,因此需要将这些特定的代码转换成计算机可以识别的0和1代码。

       建立这种代码于信息的一一对应的关系称为编码。例如:CPU和键盘之间必须有一个编码器来将键盘上所表示的信息与对应的代码的对应关系。完成这种编码的电路称为编码器。

       为了分别表示N个字符,至少需要二进制数的位数为n,例如有10个信息,用2进制表示,就需要有4位2进制表示。
       
       一个代码的好坏和它的编码非常相关。例如:如果我们要去调查某某人的的姓名、出身时间会非常复杂,所以我们国家为我们每个人都安排了身份证,如果身份证以11111、22222、33333的方式去排列这使我们查找很不方便,所以身份证以420000198801222541使我们很容易分辨出此身份证是湖北人1988年1月22日出身的。

      编码可以有多种,数字电路中所用的主要是二-十进制码(BCD(binary-Coded-Decimal))。
      BCD码:用二进制码表示一位十进制数的代码。在BCD码中,用四位二进制数表示0~9十个数码。四位二进制数最多可以表示16个字符(2^4=16),因此0~9十个字符与这16个组合之间可以有多种情况,不同的对应便形成了一种编码。这里主要介绍:8421码、2421码、5421码、余3码、格雷码(循环码)、余3循环码。重码:凡是有权值相同的码都会有重码。如2421(权值2出现了2次)、5211(权值1出现了2次)。
     8421码:指每一位的权值是8(第四位的权值2^3)、4(第三位的权值2^2)、2(第二位的权值2^1)、1(第一位的权值2^0)。
     0000=0*2^3+0*2^2+0*2^1+0*2^0=0*8+0*4+0*2+0*1=0+0+0+0=0
     0001=0*2^3+0*2^2+0*2^1+1*2^0=0*8+0*4+0*2+1*1=0+0+0+1=1
     0010=0*2^3+0*2^2+1*2^1+0*2^0=0*8+0*4+1*2+0*1=0+0+2+0=2
     0011=0*2^3+0*2^2+1*2^1+1*2^0=0*8+0*4+1*2+1*1=0+0+2+1=3
     0100=0*2^3+1*2^2+0*2^1+0*2^0=0*8+1*4+0*2+0*1=0+4+0+0=4
     0101=0*2^3+1*2^2+0*2^1+1*2^0=0*8+1*4+0*2+1*1=0+4+0+1=5
     0110=0*2^3+1*2^2+1*2^1+0*2^0=0*8+1*4+1*2+0*1=0+4+2+0=6
     0111=0*2^3+1*2^2+1*2^1+1*2^0=0*8+1*4+1*2+1*1=0+4+2+1=7
     1000=1*2^3+0*2^2+0*2^1+0*2^0=1*8+0*4+0*2+0*1=8+0+0+0=8
     1001=1*2^3+0*2^2+0*2^1+1*2^0=1*8+0*4+0*2+1*1=8+0+0+1=9

      2421码:指每一位的权值是2(第四位的权值)、4(第三位的权值)、2(第二位的权值)、1(第一位的权值)。
      0000=0*2+0*4+0*2+0*1=0+0+0+0=0
      0001=0*2+0*4+0*1+1*1=0+0+0+0=1
      0010=0*2+0*4+1*2+0*1=0+0+2+0=2
      0011=0*2+0*4+1*2+1*1=0+0+2+1=3
      0100=0*2+1*4+0*2+0*1=0+4+0+0=4
      1011=1*2+0*4+1*2+1*1=2+0+2+1=5
      1100=1*2+1*4+0*2+0*1=2+6+0+0=6
      1101=1*2+1*4+0*2+1*1=2+4+0+1=7
      1110=1*2+1*4+1*2+0*1=2+4+2+0=8
      1111=1*2+1*4+1*2+1*1=2+4+2+1=9

      5421码:指每一位的权值是5(第四位的权值)、4(第三位的权值)、2(第二位的权值)、1(第一位的权值)。
      0000=0*5+0*4+0*2+0*1=0+0+0+0=0
      0001=0*5+0*4+0*1+1*1=0+0+0+0=1
      0010=0*5+0*4+1*2+0*1=0+0+2+0=2
      0011=0*5+0*4+1*2+1*1=0+0+2+1=3
      0100=0*5+1*4+0*2+0*1=0+4+0+0=4
      1000=1*5+0*4+0*2+0*1=5+0+0+0=5
      1001=1*5+0*4+0*2+1*1=5+0+0+1=6
      1010=1*5+0*4+1*2+0*1=5+0+2+1=7
      1011=1*5+0*4+1*2+1*1=5+0+2+1=8
      1100=1*5+1*4+0*2+0*1=5+4+0+0=9

      余3码:在8421码的基础上多3(偏移3)(无权码)。
      0011=0*8+0*4+1*2+1*1=0+0+2+1=3  -3=0
      0100=0*8+1*4+0*2+0*1=0+4+0+0=4  -3=1
      0101=0*8+1*4+0*2+1*1=0+4+0+1=5  -3=2
      0110=0*8+1*4+1*2+0*1=0+4+2+1=6  -3=3
      0111=0*8+1*4+1*2+1*1=0+4+2+1=7  -3=4
      1000=1*8+0*4+0*2+0*1=8+0+0+0=8  -3=5
      1001=1*8+0*4+0*2+1*1=8+0+0+1=9  -3=6
      1010=1*8+0*4+1*2+0*1=8+0+2+1=10-3=7
      1011=1*8+0*4+1*2+1*1=8+0+2+1=11-3=8
      1100=1*8+1*4+0*2+0*1=8+4+0+0=12-3=9

     循环码(格雷码 Grey Code):循环码是一种无权码,循环码编排的特点是相邻两个数码之间符合卡诺图中的邻接条件,即相邻两个数码之间只有一位码元不同,码元就是组成数码的单元。符合这个特点的有多种方案(不止一种编码方式),但循环码只能是表中的那种。循环码的优点是没有瞬时错误,因为在数码变换过程中,在速度上会有快有慢,中间经过其它一些数码形式,称它们为瞬时错误。这在某些数字系统中是不允许的,为此希望相邻两个数码之间仅有一位码元不同,即满足邻接条件,这样就不会产生瞬时错误。循环码就是这样一种编码,它可以在卡诺图中依次循环得到。
     在数据传输当中采用循环码的传输方式来进行编码,我们检测就知道,前面一个数和后面一个数它只有一位不同,如果它有两位不同,就说明这个数据在传输过程中受到干扰,这个数据在传输过程中就产生了错误,我就可以报错。

     格雷码优点:某叉车数控调速系统,其速度分为10 档,试用8421BCD 码和格雷码分别对10档速度进行编码。并将这10档速度分别用8421BCD码和格雷码(Gray)码编码,如下表所示。叉车数控调速系统档位编码
     速度档    8421BCD码    格雷码    速度档    8421BCD码    格雷码
     0              0000                0000       5              0101                0111
     1              0001                0001       6              0110                1111
     2              0010                0011       7              0111                1110
     3              0011                0010       8              1000                1100
     4              0100                0110       9              1001                1000

     如果速度用8421BCD码来表示,则将3档速度调到4档速度就意味着将编码从0011变为0100。显然,4位编码中有3位发生了变化。由于1和0在数字电路中是用电路高电平和低电平来表示的,由高电平变为低电平的时间与由低电平变为高电平的时间不可能完全一致。假设由低电平变为高电平(0→1)的转换比由高电平变为低电平(1→0)的转换快,电路中会瞬间出现0111(七档)这个中间状态,从而造成叉车在换档时的明显抖动。档位切换情况如上表所示。如果速度采用格雷码编码,由于相邻码间只有一位不同,将不会中间状态,消除了档位切换时的抖动。由于格雷码从一个数过渡到相邻数时,不会瞬间出现别的码组,所以它是错误最小化编码,属于一种可靠性编码,因此获得广泛应用。

      从二进制编码得到相应的格雷码:设4位二进制码为a3a2a1a0,4位格雷码为b3b2b1b0,可以通过以下规律将二进制码转换为格雷码。
     (1)如果a0和a1相同,则b0为0,否则为1;
     (2)如果a1和a2相同,则b1为0,否则为1;
     (3)如果a2和a3相同,则b2为0,否则为1;
     (4)b3和a3相同。
     上述规律还可以用以下逻辑逻辑表达式描述:b0=a1 ⊕ a0,b1=a2 ⊕ a1,b2=a3 ⊕ a2,b3=a3。式中“⊕”为“异或”逻辑运算符。

      0000=0
      0001=1
      0011=2
      0010=3
      0110=4
      0111=5
      1111=6
      1110=7
      1100=8
      1000=9

      余3循环码:在循环码的基础上偏移3(不是+3,余3循环码没有权值)。     

      0010=0
      0111=1
      0111=2
      0111=3
      0100=4
      1100=5
      1101=6
      1111=7
      1110=8
      1010=9

      若要用BCD码来表示n位十进制数,则需要用n个BCD码来表示。

      例如:用8421BCD码和2421BCD码来表示(1689)(10进制),可写成

     (1689)(10进制)=(0001  0110  1000  1001)8421BCD
     (1689)(10进制)=(0001  1100  1110  1111)2421BCD

      反之,已知BCD码,可直接写成十进制数。
      如:(0101  0110  1000  1001.1001)(8421BCD)=(568.9)(10进制)

      ASCⅡ码:采用7位二进制代码对字符编码,故可表示128(2^7=128)个字符,包括控制符号、阿拉伯数字、英文大小写字母及专用符号。如0~9的ASCⅡ码为30H~39H,英文大写字母A~Z的ASCⅡ码为41H~5AH。      一个字节为8位,在用一个字节表示一个ASCⅡ码时。通常认为最高位为0。有时根据需要也用最高位作为奇偶效验位。ASCⅡ码表:
 

      奇偶校验码:是计算机常用的一种可靠性代码,其主要用途是检查数据传送过程中数码1(或0)的个数的奇偶性是否正确。奇偶校验码由信息位和校验位两部分组成。信息位就是要传送的二进制信息本身,校验位则是附加的冗余位(多余位)。在信息中添加校验位的作用是使得数据发送端的奇偶校验码具有统一的奇偶性,以便于数据接收端的验证。例如,设信息具有四个数据位与一个校验位,在信息传递过程中需要对信息作奇校验,即要求奇偶校验码始终具有奇数个1。当信息为0101 时,校验位应该为1,即包含校验位的奇校验码为01011;当信息为0111 时,校验位应该为0,包含校验位的奇校验码为01110。
      奇偶校验,内存中最小的单位是比特,也称为“位”,位有只有两种状态分别以1和0来标示,每8个连续的比特叫做一个字节(byte)。不带奇偶校验的内存每个字节只有8位,如果其某一位存储了错误的值,就会导致其存储的相应数据发生变化,进而导致应用程序发生错误。而奇偶校验就是在每一字节(8位)之外又增加了一位作为错误检测位。在某字节中存储数据之后,在其8个位上存储的数据是固定的,因为位只能有两种状态1或0,假设存储的数据用位标示为1、1、1、0、0、1、0、1,那么把每个位相加(1+1+1+0+0+1+0+1=5),结果是奇数,那么在校验位定义为1,反之为0。当CPU读取存储的数据时,它会再次把前8位中存储的数据相加,计算结果是否与校验位相一致。从而一定程度上能检测出内存错误,奇偶校验只能检测出错误而无法对其进行修正,同时虽然双位同时发生错误的概率相当低,但奇偶校验却无法检测出双位错误。
  奇偶校验码是奇校验码和偶校验码的统称,是一种最基本的检错码。它是由n-1位信息元和1位校验元组成,可以表示成为(n,n-1)。如果是奇校验码,在附加上一个校验元以后,码长为n的码字中“1”的个数为奇数个;如果是偶校验码,在附加上一个校验元以后,码长为n的码字中“1”的个数为偶数个。奇偶校验由校验方程来解决。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平