数字逻辑与EDA设计
上QQ阅读APP看书,第一时间看更新

1.2 数制与码制

1.2.1 数制

数制也称计数制,是指用一组固定的符号和统一的规则来表示数值的方法。由于按进位的方法进行计数,故也称进位计数制。在日常生活中,人们普遍采用十进制计数方式,而在数字系统中,最广泛使用的是二进制计数方式。

学习数制,必须首先掌握数码、基数和位权这三个概念。

数码:数制中为表示基本数值大小所使用的不同数字符号。例如,十进制有10个有效数字:0,1,2,3,4,5,6,7,8,9。二进制有2个有效数字:0和1。

基数:数制中所使用数码的个数。例如,十进制计数制使用10个数码,故基数为10;二进制计数制使用2个数码,故基数为2。

位权:数制中某位置上的数字1所表示数值的大小。例如,十进制的435中,4所在位置上的位权是100,3的位权是10,5的位权是1。

下面介绍常用的进位计数制及数制之间的转换。

1. 十进制数

十进制数(Decimal)的特点如下。

(1)由10个数码0~9组成。

(2)基数是10,运算规则是逢十进一。

(3)在小数点左边,从右至左各位的位权依次是:100、101、102、103等;在小数点右边,从左至右各位的位权依次是:10-1、10-2、10-3、10-4等。

任意一个十进制数,都可以用位权展开式表示为

其中:di表示各个位置上的十进制数码。例如,十进制数826.78的位权展开式为

(826.78)10=8×102+2×101+6×100+7×10-1+8×10-2

2. 二进制数

二进制数(Binary)的特点如下。

(1)由两个数码0、1组成。

(2)基数是2,运算规则是逢二进一。

(3)在小数点左边,从右至左各位的位权依次是:20、21、22、23等;在小数点右边,从左至右各位的位权依次是:2-1、2-2、2-3、2-4等。

任意一个二进制数,都可以用位权展开式表示为

其中:bi表示各个位置上的二进制数码。例如,二进制数1011.101的位权展开式为

(1011.101)2=1×23+0×22+1×21+1×20+1×2-1+0×2-2+1×2-3

3. 八进制数

八进制数(Octal)的特点如下。

(1)由8个数码0~7组成。

(2)基数是8,运算规则是逢八进一。

(3)在小数点左边,从右至左各位的位权依次是:80、81、82、83等;在小数点右边,从左至右各位的位权依次是:8-1、8-2、8-3、8-4等。

任意一个八进制数,都可以用位权展开式表示为

其中:oi表示各个位置上的八进制数码。例如,八进制数723.24的位权展开式为

(723.24)8=7×82+2×81+3×80+2×8-1+4×8-2

4. 十六进制数

十六进制数(Hexadecimal)的特点如下。

(1)由16个数码0~9及A~F组成。

(2)基数是16,运算规则是逢十六进一。

(3)在小数点左边,从右至左各位的位权依次是:160、161、162、163等;在小数点右边,从左至右各位的位权依次是:16-1、16-2、16-3、16-4等。

任意一个十六进制数,都可以用位权展开式表示为

其中:xi表示各个位置上的十六进制数码。例如,十六进制数2D9.A8的位权展开式为

(2D9.A8)16=2×162+13×161+9×160+10×16-1+8×16-2

5. 数制之间的转换

1)十进制数与非十进制数之间的转换

(1)非十进制数转换成十进制数。非十进制数转换成十进制数的方法是:将非十进制数按位权展开后求和。

【例1-1】 将(1011.101)2、(723.24)8、(2D9.A8)16分别转换成十进制数。

 (1011.101)2=1×23+0×22+1×21+1×20+1×2-1+0×2-2+1×2-3

=8+0+2+1+0.5+0+0.125=11.625

(723.24)8=7×82+2×81+3×80+2×8-1+4×8-2

=448+16+3+0.25+0.0625=467.3125

(2D9.A8)16=2×162+13×161+9×160+10×16-1+8×16-2

=512+208+9+0.625+0.03125=729.65625

(2)十进制数转换成非十进制数。十进制数转换成非十进制数,需要分别对整数部分和小数部分进行转换。

① 整数部分的转换方法:不断除以基数取余数,直到商为0,从下到上读取余数。

【例1-2】 将(179)10分别转换成二进制、八进制、十六进制数。

② 小数部分的转换方法:不断乘以基数取整数,从上到下读取整数,直到满足精度要求为止。

【例1-3】 将(0.6875)10分别转换成二进制、八进制、十六进制数。

2)二进制数与八进制或十六进制数之间的转换

虽然在数字系统中使用的是二进制数,但由于二进制数往往很长,不便书写及识别,因此常使用八进制数或十六进制数来表示二进制数,以减少书写的长度。

由于八进制数、十六进制数的基数都是2nn=3,4),因此1位2n进制数所能表示的数值能恰好用n位二进制数表示,即八进制(23)数中的数码0~7与3位二进制数000~111一一对应,十六进制(24)数中的数码0~9、A~F与4位二进制数0000~1111一一对应。所以,二进制数与2n进制数之间可以按位进行转换。

(1)二进制数转换成八进制、十六进制数。将二进制数转换成2nn=3,4)进制数的方法是:以小数点为界,分别向左、右两个方向按n位进行分组,左右两端不足n位的,分别用0补够n位,再将每组二进制数转换为对应的2n进制数。

【例1-4】 将二进制数(11010101001101.11001)2分别转换为八进制数及十六进制数。

结果:(11010101001101.11001)2=(32515.62)8=(354D.C8)16

(2)八进制数或十六进制数转换成二进制数。将2nn=3,4)进制数转换成二进制数的方法与上面正好相反,将2n进制数中的每一位直接转换成n位二进制数即可。

【例1-5】 将八进制数(3701.24)8、十六进制数(4A3.E6)16分别转换成二进制数。

1.2.2 码制

1. 数字的存储形式

前面所提到的二进制数,没有考虑符号问题,所指的都是无符号数。但实际上数字是有正、负符号的,那么在数字系统中对数字进行运算操作时,正负符号该如何表示呢?

以数字6为例,数学的习惯写法上,正6的十进制数写为+6,用二进制数表示则写为+110;负6的十进制数写为-6,用二进制数表示则写为-110,这种在二进制数之前用“+”“-”表示正、负数的有符号数称为真值。

但在数字系统中,符号“+”“-”也需要数字化,常用的方法是将数的最高位定义为符号位,用“0”表示“+”号、用“1”表示“-”号,即

这种将“+”“-”符号数字化的二进制数称为机器数。机器数常用的编码方式有原码、反码、补码等。下面以有符号整数为例介绍原码、反码及补码的定义规则。

2. 原码

将数的真值形式中正数符号用符号位0表示,负数符号用符号位1表示,叫作数的原码形式,简称原码。原码的定义可用下式表示

式中:A为真值,|A|为A的绝对值的真值,AA的原码,n为二进制数码的位数。

例如,绝对值为9的数,它的真值形式和原码形式如下所示(用8位数码表示,最高位为符号位):

原码的优点是易于辨认,因为它的数值部分就是该数的绝对值,而且与真值和十进制数的转换十分方便,但在采用原码进行运算时,运算较复杂。例如当两个数相加时,需要先判断符号位是否相同,如果相同则数值直接相加,如果不同,则进行减法运算。做减法运算前,需要先比较哪个数的绝对值大,绝对值大的作为被减数,小的作为减数,差值的符号与绝对值大的数符号一致。机器要实现这样的运算需要增加判定数大小的设备以及减法器,这显然增加了设备量,是不经济实用的。为了减少设备,解决负数参加运算的问题,将减法运算变成加法运算,这就引进了反码和补码这两种机器数。

3. 反码

与原码相比较,反码也是在数码左边加上一位符号位,0代表正数,1代表负数。与原码不一样的是,反码的数码与它的符号位有关:对于正数,反码与原码相同;对于负数,反码的数码由原码逐位求反而得(不包括符号位)。反码定义可用下式表示

式中:A为原码,|A|为A的绝对值的原码,AA的反码,n为二进制数码的位数。

例如,绝对值为9的数,如用8位二进制反码表示,则+9的反码为

由此可看出:正数的反码与原码相同;负数的反码为其绝对值的原码按位取反。

4. 补码

机器数的第三种表示是补码形式。对于正数来说,其原码、反码和补码的表示是相同的;对于负数来说,表示则不相同。补码的最高位仍然是符号位,0表示正数,1表示负数。

补码定义可用下式表示

式中:A为原码,|A|为A的绝对值的原码,AA的补码,n为二进制数码的位数。

例如,绝对值为9的数,如用8位二进制补码表示,则+9的补码为

由此可看出:正数的补码与原码相同;负数的补码为其绝对值的原码按位取反之后加1,即反码加1。

机器数使用补码表示后,可将减法运算变成加法运算,补码数做运算时,其符号位与数值部分一起参加运算,运算结果也为补码数,补码的符号位相加后,如果有进位出现,要把这个进位舍去。

【例1-6】 使用8位补码数计算:(1)73-51;(2)40-78。

(1)将73和-51都转换为补码数

将两个补码数相加得到

01001001+11001101=1 00010110

将符号位相加后的进位舍去,得到和为:00010110,由于符号位是0,表示正数,转换成十进制数后得+22,即

01001001(+73)+11001101(-51)=00010110(+22)

(2)将40和-78都转换为补码数

将两个补码数相加

00101000+10110010=11011010

由于和11011010的符号位是1,表示负数,转换成十进制数是

1.2.3 常用编码

用代码表示信息的过程称为编码。在数字系统中,由于二进制数用电路实现起来比较容易,因此在编码中广泛使用的是二进制数。我们将用二进制数表示文字、符号等信息的过程称为二进制编码。

常用的二进制编码如下。

1. 顺序二进制编码

将十进制数转换成二进制数所得到的二进制编码就是顺序二进制码,简称二进制码。其特点是相邻的两个数之间的差值为1。表1-1中列出了十进制数0~15所对应的二进制码。按上一节中所介绍的进制数转换法可以得到某一个数的顺序二进制编码。

表1-1 顺序二进制编码及格雷码编码表

2. 格雷码

顺序二进制编码简单且容易转换,但在相邻的两个编码之间,可能同时有多个二进制位发生变化,例如代码0111变化为1000时,4个二进制位均发生了变化。在数字系统中,常常需要代码按一定顺序变化,但如果多个位同时发生变化,由于各个位变化在时间上的差异,往往会出现短暂的其他代码,例如代码0111变化为1000时,可能会出现短暂的1111、1011等,这有可能会导致严重的电路状态错误。使用格雷码可以避免这种错误的发生。

格雷码(Gray Code)又称为循环码,它的主要特点是相邻两个编码之间只有一个位不相同,但它不够直观。常用的典型格雷码编码规则如表1-1所示。

顺序二进制码与格雷码之间可以通过公式进行转换。设n位二进制数的顺序二进制码为B=Bn−1Bi+1BiB0,其对应的格雷码为G=Gn−1Gi+1GiG0,格雷码编码规则可表示为

Gn−1=Bn−1Gi=BiBi+1

反之,典型二进制格雷码也可转换成二进制数,其公式为:

Bn−1=Gn−1Bi=Bi+1Gi

3. 独热码

只有一个二进制位为1,其他全为0的编码叫作独热码。这种编码方式中,编码的二进制位数与需要进行编码的对象的个数相等。例如,对8个对象进行编码,这8个编码分别是:00000001、00000010、00000100、00001000、00010000、00100000、01000000、10000000。独热码常用于时序逻辑电路中状态机的设计。

4. 二—十进制编码

日常生活中最常使用的是十进制数。在数字系统中,为了既满足系统中使用二进制数的要求,又适应人们使用十进制数的习惯,常需要用二进制数来表示十进制数,即用二进制数对十进制数中的10个数符进行编码,简称二—十进制编码,又称BCD码(Binary Coded Decimal),BCD码通常都是4位编码。

二—十进制编码(BCD码)有多种不同的编码规则,常用的有8421BCD码、2421BCD码、5211BCD码、余3BCD码、余3格雷码等,见表1-2。其中8421码、2421码、5211码都属于位权码,即编码中每1位对应一个位权值,如8421BCD码中,各位的位权依次是8、4、2、1,编码1001对应的十进制数符是8+0+0+1=9。余3码是由二进制码加3(0011)后形成的,即余3码从二进制码的3开始编码。余3格雷码是由格雷码加3后形成的,即余3格雷码从格雷码的3(0010)开始编码。

表1-2 常用的二—十进制编码

【例1-7】 用8421BCD码对十进制数407.81进行编码。

 按8421BCD码编码规则对十进制数中的每个数符进行编码,得到

407.86=(0100 0000 0111. 1000 0110)8421BCD

5. ASCII码

前面介绍的只是对数字的编码,在数字系统中,字符、文字以及一些特殊符号也都必须用二进制代码来表示。用于表示各种字符(包括文字、字母、数字、标点符号、运算符及其他特殊字符等)的二进制代码称为字符编码。

ASCII(American Standard Code for Information Interchange)是美国信息交换标准代码,是目前国际通用的字符代码。ASCII码常见于通信设备和计算机中,采用7位二进制编码,共表示27(即128)个字符,其中包括0~9十个数码、大小写各26个英文字母、标点符号、运算符、一些常用符号及33个控制字符。ASCII码的编码规则见表1-3。

表1-3 ASCII码表