数字电路与逻辑设计(第2版)
上QQ阅读APP看书,第一时间看更新

1.2 数制和编码

1.2.1 数制

数制是计数进位制的简称,是指按进位的方法来进行计数。常用的数制有:十进制、二进制、八进制和十六进制。在数制中,有基数(Radix)和位权值(Weight)两个基本概念。基数是指表示计数进位制所用字符或数码的个数,写为数的下标,如(536.9)10,(1101.011)2,(13)8等,位权值是指数制中每个数位对应的位值,如十进制的百位(第3位)的位权值为102=100。

1.十进制

日常生活中最常用的是十进制(Decimal Number System)。十进制有0,1,2,3,4,5,6,7,8,9共10个基本数码,其基数为10,遵循的计数规则是逢10进1,借1当10。第n位十进制整数的位权值是10n−1,第m位十进制小数的位权值是10m,可以用位权值展开的方法描述1个十进制数,如

其中,5是最左边的数码,是该数中位权最大的数位,叫最高有效位或高阶位,用MSD(Most Significant Decimal)表示。9是最右边的数码,是该数中位权最小的数位,叫最低有效位或低阶位,用LSD(Least Significant Decimal)表示。

任意一个形如的十进制数N10都可按位权展开为

2.二进制

最简单的数制是二进制(Binary Number System)。二进制只有0,1两个基本数码,其基数为2,遵循的计数规则是逢2进1,借1当2。第n位二进制整数的位权值是2n−1,第m位二进制小数的位权值是2m,二进制各个数位的位权值如表1-1所示,其中4位二进制的位权值分别是8421。

表1-1 二进制的位权值

同样,任意一个二进制数N2都可按位权展开为

数字系统常用二进制来表示数和进行运算,二进制具有如下优点。

(1)数字系统常采用具有两个稳定开关状态的开关元件的状态来表示0和1,如继电器的通与断、触发器的饱和与截止等。这些元件在电路技术和工程实现上都非常容易获得,而且它们可靠性很高,抗干扰能力很强。

(2)二进制运算非常简单,只需定义加、乘两种基本运算便能实现其他各种运算。

(3)数字系统具有存储信息的优点,而存储二进制信息所需要的设备量接近最低。

(4)有非常成熟的布尔代数为分析和设计数字系统提供数学基础。

二进制的缺点是:书写长,难以辨认,不易记忆,不符合人类使用十进制数的习惯,人机对话时需要转换等。显然,二进制的缺点也是非常鲜明的,但这丝毫不影响其应用价值。了解它的缺点是为了更有效地应用它。

二进制数最左边的位即最高有效位或高阶位(MSB),最右边的位即最低有效位或低阶位(LSB)。

3.八进制和十六进制

八进制(Octal Number System)的基数为8,有0,1,2,3,4,5,6,7共8个基本数码,遵循的计数规则是逢8进1,借1当8。第n位八进制整数的位权值是8n−1,第m位八进制小数的位权值是8m。任意一个八进制数N8按位权展开式为

十六进制(Hexadecimal Number System)的基数为16,有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个基本数码,其中A,B,C,D,E,F六个符号依次表示数10~15。遵循的计数规则是逢16进1,借1当16。第n位十六进制整数的位权值是16n−1,第m位十六进制小数的位权值是16m。任意一个十六进制数N16按位权展开式为

八进制和十六进制的基数均为2的幂,采用八进制和十六进制,可以压缩二进制数的书写长度,方便了数字系统中多位数的简写,用汇编语言编写的程序中,就是用十六进制数来描述二进制数的。表1-2提供了十进制数、二进制数、八进制数和十六进制数的对照关系。

表1-2 十进制数、二进制数、八进制数和十六进制数

用不同数制表示同一个数时,除了用基数作下标表示外,还可以用数制英文全称的第一个字母来表示,即用D,B,O,H分别表示十,二,八,十六进制。如:(15)10=15D=(1111)2=1111 B=(17)8=17O=(F)16=FH。

1.2.2 不同数制间的转换

人们熟知十进制,所以数字系统如计算机的原始输入输出数据一般采用十进制数,但计算机中数据的存储和运算却都是按二进制来进行,这样就有讨论数制转换的必要了。本书仅讨论二进制数、八进制数、十进制数和十六进制数之间的相互转换。

1.R进制数转换成十进制数

R(二、八、十六)进制数转换成十进制数,采用按位权展开求和的方法。就是将二进制数、八进制数、十六进制数的各位位权值乘以系数后相加求和,即可得到与之等值的十进制数。

【例1-1】(1110.011)2=(?)10

(1110.011)2=1×23+1×22+1×21+0×20+0×2−1+1×2−2+1×2−3=(14.375)10

【例1-2】(144)8=(?)10

(144)8=1×82+4×81+4×80=(100)10

【例1-3】(1CF)16=(?)10

(1CF)16=1×162+12×161+15×160=(463)10

2.十进制数转换成R进制数

十进制数转换成R(二、八、十六)进制数,需要将被转换的十进制数分成整数和小数两部分,分别按一定方法进行转换,再将整数部分和小数部分用小数点合成为完整的R(二、八、十六)进制数。下面以十进制数转换成二进制数为例,介绍如下。

十进制整数转换成二进制整数,采用如下方法。

(1)以被转换之十进制整数作为被除数,以二进制的基数2为除数做除法,得商和余数,所得余数即为转换所得二进制整数的最低位(LSB);

(2)将所得之商再作为被除数,做相同的除法,又得商和余数,该余数即为二进制整数的次低位;

(3)继续做相同的除法,直到商0为止,得到余数,即为转换成的二进制整数的最高位(MSB)。

归纳上述转换过程,常将这一转换方法称为连除取余法,也叫短除法。

【例1-4】(90)10=(?)2

所以(90)10=(1011010)2

值得注意的是,一些特殊的十进制数转换成对应二进制数的情况,如:

(32)10=(2510=(100000)2

(1024)10=(21010=(10000000000)2

十进制小数转换成二进制小数,采用如下方法。

(1)以被转换之十进制小数作为一个乘数,以二进制的基数2为另一个乘数做乘法,得积;所得积之整数部分即为转换所得二进制小数的最高位(MSB);

(2)将所得积之小数部分保留不变,而整数部分改写为0,再作为一个乘数,做相同的乘法,又得积;所得积之整数部分即为转换所得二进制小数的次高位;

(3)继续做相同的乘法,直到积的小数部分等于0时为止,此时得到的积的整数部分,即为转换成的二进制小数的最低位(LSB);

归纳上述转换过程,常将这一转换方法称为连乘取整法。

【例1-5】(0.6875)10=(?)2

0.6875×2=1.375........1  MSB

0.375×2=0.75.........0 整数部整分数部分

0.75×2=1.5 .........1

0.5×2=1.0 .........1  LSB

所以(0.6875)10=(0.1011)2

【例1-6】(90.6875)10=(?)2

分别将整数部分连除取余和小数部分连乘取整后,再将所得结果合并即可。

所以(90.6875)10=(1011010.1011)2

十进制数转换成二进制数,在整数部分转换时,采用连除取余法,无论整数部分的数值如何,总可以使其最终的商为0,从而完全确定二进制数的各个数位,即十进制整数总可以精确地转换成一个等值的二进制数。

而在小数部分转换时,采用连乘取整法,可能出现小数部分永不为0即循环小数的情况,这必然存在转换误差。因此,需要根据转换精度的要求来确定转换后的二进制小数的位数。

若要求转换精确到10-k,假设转换后的二进制小数的位数是m位,则m应满足不等式:2-m≤10-k,即mk/lg2=3.32k。根据m≥3.32k,可计算出转换后的二进制小数的位数。如要求转换精确到10-4,则转换成二进制需取小数的位数是14位。也可根据数制估算出转换位数。如要求转换后的精度达到0.1%,则二进制小数的位数是10位,八进制小数的位数是4位,十六进制小数的位数是3位。

【例1-7】将(0.3)10转换成二进制小数,要求转换后的精度达到0.1%。

因为1/210=1/1024,所以需要精确到二进制小数10位。

所以(0.3)10=(0.0100110011)2

同理,如果要十进制数转换成任意R进制数,只需将上述转换方法中的基数2改成R进制数的基数R即可。而任意两个非十进制数制的数需要相互转换时,都可以用十进制过渡完成。

3.二进制数、八进制数和十六进制数的相互转换

八进制数和十六进制数的基数分别为8=23,16=24,所以3位二进制数相当一位八进制数,4位二进制数相当一位十六进制数,它们之间的相互转换是很方便的。

二进制数转换成八进制数的方法是:以小数点为原点,分别向左右以每3位分组,当最高位和最低位不足3位时,应添0补足3位,然后写出每一组等值的八进制数。

二进制数转换成十六进制数的方法是:以小数点为原点,分别向左右以每4位分组,当最高位和最低位不足4位时,应添0补足4位,然后写出每一组等值的十六进制数。

【例1-8】求(101110.1010)2等值的八进制数和十六进制数。

(101110.1010)2=(0010 1110.1010)2=(2E.A)16=(101 110.101)2=(56.5)8

八进制数、十六进制数转换成二进制数的方法是:以小数点为原点,向左、向右分别按位将八(十六)进制数的整数部分和小数部分用3(4)位等值的二进制数替换,保留书写顺序和小数点位置不变,即得等值的二进制数。

【例1-9】求(17.34)8等值的二进制数。

(17.34)8=(1111.0111)2

由于二进制数、八进制数、十六进制数之间的转换比较简单,在十进制数与八进制数、十六进制数之间相互转换时,常常可借助二进制数作为中介过渡实现其转换。

【例1-10】求(BE.29D)16等值的二进制数和八进制数。

(BE.29D)16=(1011 1110.0010 1001 1101)2=(276.1235)8

1.2.3 常用编码

二进制数不仅可以表示数值大小,更重要的是,它可以代表一定的信息,代表了信息的0和1称为二进制码元,将若干个二进制码元顺序排列在一起,称为二元码序列,建立二元码序列和信息之间的一一对应关系的过程称为编码。经过编码后代表一个确定信息的二元码序列称为代码。

1.自然二进制代码

自然二进制代码是按照二进制代码各位权值大小,以自然向下加一,逢二进一的方式来表示数值的大小所生成的代码。显然,n位自然二进制代码共有2n种状态取值组合,表1-3列出了四位自然二进制代码,由于代码中各位的位权值分别为23,22,21,20,即8421,所以也称为8421码。这种每位二进制码元都有确定的位权值的编码,称为有权码。相应的,没有确定的位权值的编码叫无权码。

表1-3 8421码

2.可靠性编码

代码在产生和传输的过程中,由于噪声、干扰的存在,使得到达接收端的数据有可能出现错误。为减少错误的发生,或者在发生错误时能迅速地发现或纠正,广泛采用了可靠性编码技术。能够检测信息传输错误的代码称为检错码(Error Detection Code),能够纠正信息传输错误的代码称为纠错码(Correction Code)。最常用的可靠性代码有循环码和奇偶校验码。

(1)循环码

循环码(Gray Code)也叫格雷码、单位距离码、反射码或最小误差编码等,循环码有两个特点,一个是相邻性,另一个是循环性。相邻性是指任意两个相邻的代码中仅有1位取值不同,循环性是指首尾的两个代码也具有相邻性。凡是满足这两个特性的编码都称为循环码。

循环码的编码方案有多种,典型的循环码的生成规律是以最高位互补反射,其余低位数沿对称轴镜像对称。利用这一反射特性可以方便地构成位数不同的循环码,表1-4列出了四位循环码。循环码中每位的位权值并不固定,属于无权码。

表1-4 典型的4位循环码

循环码的抗干扰能力最强,当时序电路中采用循环码编码时,不仅可以有效地防止波形出现毛刺(Glitch),而且可以提高电路的工作速度。循环码一般还用于将诸如角度变换器的每分钟转数和旋转方向等机械量转换为电量。

(2)奇偶校验码

奇偶校验码(Party Check Code)是最简单也是最重要的一种检错码,它能够检测出传输码组中的奇数个码元错误,可以提高信息传输的可靠性。

奇偶校验码的编码方法非常简单,由信息位和一位奇偶检验位两部分组成。信息位是位数不限的任一种二进制代码。奇偶检验位仅有一位,它可以放在信息位的前面,也可以放在信息位的后面。它的编码方式有两种:一种是使得一组代码中信息位和检验位中1的个数之和为奇数,称为奇检验;另一种是使得一组代码中信息位和检验位中1的个数之和为偶数,称为偶检验。例如,十进制数3的8421码0011增加校验位后,奇校验码是10011,偶校验码是00011,其中最高位分别为奇校验位1和偶校验位0。

3.二—十进制代码(BCD码)

用以表示十进制数0~9的二进制代码称为二—十进制代码(Binary Coded Decimal,BCD)。

对0~9这10个十进制数码符号编码所需要的二进制代码长度n,应满足2n≥10的条件,即n=4,也就是说BCD码需用4位二进制代码来表示。原则上可从4位二进制代码的16个码组中,任意选择其中10个来实现编码,多余的6个码组称为禁用码,平时不允许使用。那么,可供选择的编码方案有种,实用中仅选择有鲜明特点、有规律的编码方案使用。表1-5列出了常用BCD代码。

表1-5 常用BCD代码

表1-5中有权BCD码为:8421码,5421码和2421码。其中,8421BCD码选用了8421码中前10组代码,各位的权依次为8421。5421BCD码各位的权依次为5421,编码方案不唯一。表中所示是对称的5421码,其显著特点是最高位连续5个0后连续5个1,当计数器采用这种编码时,最高位可产生对称方波输出。2421BCD码各位的权依次为2421。编码方案也不唯一。表中所示是对称的2421码,其显著特点是,将任意一个十进制数符D的代码的各位取反,正好是与9互补的那个十进制数符(9-D)的代码。例如,将3的代码0011取反,得到的1100正好是9-3=6的代码。这种特性称为自补特性,具有自补特性的代码称为自补码(Self Complementing Code)。2421BCD码是一种对9的自补代码,在运算电路中使用比较方便。

表1-5中无权BCD码为:余3BCD码(XS3 Code),循环码,余3循环码和移存码。其中,余3码也是一种对9的自补码,常用于BCD码的运算电路中。余3码可由8421码去除首尾各3组代码得到,即它总是比对应的8421BCD码多3(0011)。循环BCD码也满足相邻性和循环性,选用了循环码中前10组代码,即用0000~1101分别代表它所对应的十进制数0~9(参见表1-4),但这样选用时,可以发现(9)10的循环BCD码是1101,而(0)10的循环BCD码是0000,这两个相邻代码中有多个数码不同,因此,将(9)10的循环BCD码改为1000。余3循环BCD码是由4位二进制循环码去除首尾各3组代码得到,具有循环码的特性。移存BCD码是满足移存规律(左移或右移)的BCD码。

所有BCD码具有的共同特点是:BCD码具备二进制数的形式,满足十进制的进位规律。用多组BCD码表示多位十进制数时,要注意BCD码的特点。

【例1-11】请写出和(15)10等值的8421码、8421BCD码、循环码、循环 BCD码和余3BCD码。

(15)10=(1111)8421=(0001 0101)8421BCD=(1000)循环码=(0001 0111)循环BCD码=(0100 1000)余3BCD码

请注意,多位十进制数中的每1位,都需用1组8421BCD码与之对应。

【例1-12】请写出和(395)10等值的二进制和8421BCD码。

(395)10=(110001011)2=(0011 1001 0101)8421BCD

请注意:(0011 1001 0101)8421BCD≠(0011 1001 0101)2,因为十进制的基数是10,不是2的幂。

4.ASCII码

美国标准信息交换代码(American Standard Code for Information Interchange,ASCII)是目前国际上最通用的一种字母数字混合编码。计算机输出到打印机的字符码就采用ASCII码。

ASCII码采用7位二进制编码,提供了128个字符,表示十进制符号、英文大小写字母、运算符、控制符以及特殊符号,用于代表键盘数据和一些命令编码,如表1-6所示。从表中可见,数字0~9,相应用0110000~0111001来表示,ASCII码也常通过增加1位校验位0扩展为8位(8位在计算机中称为1个字节,Byte),因此0~9的ASCII码为30H~39H,大写字母A~Z的ASCII码为41H~5AH等。

表1-6 ASCII码