计算机科学丛书
点击查看第二章
点击查看第三章
数字设计和计算机体系结构(原书第2版·ARM版)
Digital Design and Computer Architecture, ARM Edition
莎拉·L.哈里斯(Sarah L. Harris)
戴维·莫尼·哈里斯(David Money Harris)
陈俊颖 等译
第1章
二进制
1.1 课程计划
在过去的30年里,微处理器彻底变革了我们的世界。现在一台笔记本电脑的计算能力都远远超过了过去一个房间大小的大型计算机。一辆高级汽车上包含了大约100个微处理器。微处理器的进步使得移动电话和Internet成为可能,并且极大地促进了医学的进步。全球集成电路工业销售额从1985年的210亿美元发展到2013年的3060亿美元,其中微处理器占据重要部分。我们相信微处理器不仅仅是对技术、经济和社会有重要意义,而且潜在地激发了人类的创造力。在学习完这本书后,读者将学会如何设计和构造属于自己的微处理器。这些基本技能将为读者设计其他数字系统奠定坚实的基础。
我们假设读者对电子学有基本的认识,有一定的编程经验和基础,同时对理解微处理器的内部运行原理有浓厚的兴趣。这本书将集中讨论基于0和1的数字系统的设计。我们从接收0和1作为输入,产生0和1作为输出的逻辑门开始本课程。接着,我们将研究如何利用这些逻辑门构成加法器、存储器等比较复杂的模块。随后,我们将学习使用以微处理器的语言—汇编语言进行程序设计。最后,我们将上述内容结合起来以构造一个能执行汇编程序的微处理器。
数字系统的一个重要优点是其构造模块相当简单:仅仅包括0和1。它不需要繁杂的数学知识或高深的物理学知识。相反,设计者的最大挑战是如何将这些简单的模块组合起来构成复杂的系统。微处理器可能是读者构造的第一个复杂系统,其复杂性可能一下子难以全部接受。因此,如何管理复杂性是贯穿全书的重要主题。
1.2 管理复杂性的艺术
与非专业人员相比,计算机科学家或工程师的一个重要特征是掌握了系统地管理复杂性的方法。现代数字系统由上百万甚至数十亿的晶体管构成,没有人能通过为每个晶体管的电子运动建立并求解方程的方法来理解这样的系统。读者必须学会如何管理复杂性,从而理解如何在不陷入细节的情况下构造微处理器系统。
1.2.1 抽象
管理复杂性的关键技术在于抽象(abstraction):隐蔽不重要的细节。一个系统可以从多个不同层面抽象。例如,美国的政治家将世界抽象为城市、县、州和国家。一个县包含了若干城市,而一个州则包含了若干县。当一个政治家竞选总统时,他对整个州的投票情况更有兴趣,而非单个县。因此,州在这个层次中的抽象更有益处。另一方面,美国人口调查局需要统计每个城市的人口,因此必须考虑更低层次抽象的细节。
图1-1给出了一个电子计算机系统的抽象层次,其中在每个层次中都包含了典型的模块。最底层的抽象是物理层,即电子的运动。电子的特征由量子力学和麦克斯韦(Maxwell)方程描述。我们的系统由晶体管或先前的真空管等电子器件(device)构造。这些器件都有明确定义的称为端子(terminal)的外部连接点,并建立每个端子上电压和电流之间的关系模型。通过器件级的抽象,我们可以忽略单个电子。更高一级抽象为模拟电路(analogy circuit)。在这一级中,器件组合在一起构造成放大器等组件。模拟电路的输入和输出都是连续的电压值。逻辑门等数字电路(digital circuit)则将电压控制在离散的范围内,以表示0和1。在逻辑设计中,我们将使用数字电路构造更复杂的结构,例如,加法器或存储器。
微结构(micro-architecture)将逻辑和体系结构层次的抽象连接在一起。体系结构(architecture)层描述了程序员观点的计算机抽象。例如,目前广泛应用于个人计算机(Personal computers,PC)的Intel公司的x86体系结构定义了一套指令系统和寄存器(用于存储临时变量的存储器),从而程序员可以使用这些指令和寄存器。微结构将逻辑组件组合在一起以实现体系结构中定义的指令。一个特定的体系结构可以有不同的微结构实现方式,以取得在价格、性能和功耗等方面的不同折中。例如,Intel公司的Core i7、80486和AMD公司的Athlon等都是x86体系结构的不同微结构实现。
进入软件层面后,操作系统负责处理底层的抽象,例如访问硬盘或管理存储器。最后,应用软件使用操作系统提供的这些功能以解决用户的问题。正是借助于抽象的威力,年迈的祖母可以通过计算机上网,而不用考虑电子的量子波动或计算机中的存储器组织问题。
这本书将主要讨论从数字电路到体系结构之间的抽象层次。当读者处于某个抽象层次时,最好能了解当前抽象层次之上和之下的层次。例如,计算机科学家不可能在不理解程序运行平台体系结构的情况下来充分优化代码。在不了解晶体管具体用途的情况下,器件工程师也不能在晶体管设计时做出明智的设计选择。我们希望读者学习完本书后,能选择正确的层次以解决问题,同时评估自己的设计选择对其他抽象层次的影响。
1.2.2 约束
约束(discipline)是对设计选择的一种内在限制,通过这种限制可以更有效地在更高的抽象层次上工作。使用可互换部件是约束的一种常见应用,其典型例子是来复枪的制作。在19世纪早期,来复枪靠手工一支支地制作。来复枪的零件从很多不同的手工制作商那里买来,然后由一个技术熟练的做枪工人组装在一起。基于可互换部件的约束变革了这个产业:通过将零件限定为一个误差允许范围内的标准集合,就可以很快地组装和修复来复枪,而且不需要太熟练的技术。做枪工人不再需要考虑枪管和枪托形状等较低层次的抽象。
在本书中,对数字电路的约束非常重要。数字电路使用离散电压,而模拟电路使用连续电压。因此,数字电路是模拟电路的子集,而且在某种意义上其能力要弱于范围更广的模拟电路。相对而言,然而数字电路的设计很简单。通过数字电路的约束规则,我们可以很容易地将组件组合成复杂的系统,而且这种数字系统在很多应用上都远远优于由模拟组件组成的系统。例如,数字化的电视、光盘(CD)以及移动电话正在取代以前的模拟设备。
1.2.3 三条原则
除了抽象和约束外,设计者还使用另外三条原则来管理系统的复杂性:层次化(hierar-chy)、模块化(modularity)和规整化(regularity)。这些原则对于软硬件的设计都是通用的。
- 层次化:将系统划分为若干模块,然后更进一步划分每个模块,直到这些模块都很容易理解。
- 模块化:所有模块有定义好的功能和接口,以便于它们之间可以很容易地相互连接而不会产生意想不到的副作用。
- 规整化:在模块之间寻求一致,通用的模块可以重新使用多次,以减少设计不同模块的数量。
我们通过制作来复枪的例子来解释这三条原则。在19世纪早期,来复枪是最复杂的常见物品之一。使用层次化原理,我们可以将它划分为图1-2所示的几个组件:枪机、枪托和枪管。
枪管是一个长金属管子,子弹就是通过这里射出的。枪机是一种射击设备。而枪托是用木头制成的,它将各种部件连接起来并且为使用者提供牢固的握枪位置。更进一步,枪机包含扳机、击锤、燧石、扣簧和药锅。对每种组件都可以展开更详细的层次化描述。
模块化使得每个组件都有明确的功能和接口。枪托的功能是装配枪机和枪管,它的接口包括长度和装配钉的位置。在模块化的来复枪设计中,只要枪托和枪管长度正确并有适当的安装机制,那么来自不同制造商的枪托就可以用于特定的枪管。枪管的功能是使子弹更加精确地射出,模块化设计规定它不能对其他部件产生影响:对枪托的设计不能影响到枪管的功能。
规整化表明可互换部件是一个好方法。利用规整化原则,损坏的枪管可以用相同的部件取代。可以在装配线上更有效地生产枪管,而不是辛苦地手工制作。
层次化、模块化和规整化三条原则在本书中很重要,它们将贯穿本书。
1.3 数字抽象
大部分物理变量是连续的,例如电线上的电压值、振动的频率、物体的位置等都是连续的值。相反,数字系统使用离散值变量(discrete-valued variable)来表示信息,也就是说,变量是有限数目的不同离散值。
早期Charles Babbage的分析机使用了具有10个离散值变量的数字系统。1834~1871年,Babbage一直在设计和尝试制作这种机械计算机。分析机使用0~9号10个齿轮表示0~9这10个数字,这很像汽车里的机械里程表。图1-3展示了这种分析机的原型,其中每一行表示一个数字,Babbage使用了25行齿轮,因此这台机器的精度为25位数字。
与Babbage的机器不同的是,大部分电子计算机使用二进制表示,其中高电压表示1,低电压表示0。这是因为区分2种电压要比区分10种容易得多。
有N个不同状态的离散值变量的信息量(amount of information)D由比特(bit)衡量,N和D之间的关系是:
D=log2N bit(1.1)
一个二进制状态变量包含了log2 2=1比特的信息,事实上,bit是binary digit的缩写。每一个Babbage的齿轮包含log2 10=3.322比特的信息,这是因为它能够表示23.322=10种不同状态中的一种。一个连续的信号在理论上包含了无穷多的信息,因为它可以表示无穷多个数值。实际上对于很多连续的信号来说,噪声和测量误差将信息量限制在10~16比特之内。如果需要对信号进行快速测量,其信息量将更低(例如8比特)。
本书着重讲述使用二进制变量1和0表示的数字电路。George Boole发明了一种针对二进制变量进行逻辑操作的系统,称为布尔逻辑(Boolean logic)。每个布尔变量都是TRUE和FALSE中的一种。电子计算机普遍使用正电压表示1,使用0电压表示0。本书中将使用1、TRUE和HIGH表示同等的含义。同样,本书中使用的qqqqqqqw0、FALSE和LOW也可以相互替换。
数字抽象(digital abstraction)的优势在于设计者可以只关注0和1,而忽略布尔变量的物理表示到底是特定电压,还是旋转的齿轮,或者是液体的高度。计算机编程人员不需要了解计算机硬件的细节就能工作。此外,对硬件细节的理解使得程序员可以针对特定计算机来优化软件。
仅仅一个比特并没有太多的信息。下一节将用一组比特来表示数字,后面几节将使用一组比特来表示字母和程序。
1.4 数字系统
我们已经习惯于使用十进制数字。但在由0和1组成的数字系统中,二进制或者十六进制数字使用起来更方便。本节将介绍在后续章节中要用到的几种数字系统。
1.4.1 十进制数
小学就已经学习过用十进制(decimal)来计数和做算术。如同我们有10个手指一样,十进制也是由0,1,2,…,9这10个数字组成。多个十进制数字组合在一起可以形成更大的十进制数。十进制数字中,每一列的权都是前一列的10倍。从右到左,每一列的权分别为1、10、100、1000等。十进制数的基数(base)为10。基往往通过数值后方的下标表示,以避免与原数值混淆。例如,图1-4描述了十进制数974210是根据每一列的权和该列的数字相乘之后求和而得到的。
一个N位的十进制数表示了10N个数字中的某一个:0,1,2,3,…,10N-1,称为数的表示范围(range)。例如,一个3位的十进制数表示了0~999的1000个数字中的某一个。
1.4.2 二进制数
一位比特表示0和1两个值中的一个。将多个比特合并在一起就形成了一个二进制数(binary number)。二进制数的每一列权都是前一列的2倍,因此二进制数的基数是2。在二进制数中,每一列的权(从右到左)分别为1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,依次类推。如果你经常在二进制数下工作,记住这些2的n次方(n≤16)会节省你很多时间。
一个N位的二进制数代表2N个数字中的某一个:0,1,2,3,…,2N-1。表1-1显示了1位、2位、3位和4位二进制数和与之相等的十进制数。
例1.1 二进制转换为十进制。将二进制数101102转换为十进制。
解:图1-5给出了转换方法。
例1.2 十进制转换为二进制。将十进制数8410转换为二进制。
解:需要判断每一列的二进制数值是1还是0。从二进制数的最左或最右边都可以进行。
从左开始,首先从小于等于给定十进制数的2的最高次幂开始(本例中是64),84≥64,因此权为64的这一列是1;还剩84-64=20,20<32,所以权为32的这一列是0;20≥16,所以权为16的这一列是1;剩下20-16=4,4<8,所以权为8的这一列是0;4≥4,因此权为4的这一列为1,剩下4-4=0。因此权为2和1的列的二进制数值均为0。将它们组合在一起,8410=10101002。
从右开始,用2重复除给定的十进制数,余数放在每一列中。84/2=42,因此权为1的这一列为0;42/2=21,因此权为2的这一列为0;21/2=10,余数是1,因此权为4的这一列为1;10/2=5,权为8的这一列为0;5/2=2,余数是1,权为16的这一列为1;2/2=1,权为32的这一列为0;1/2=0,余数是1,权为64的这一列为1。从而8410=10101002。
1.4.3 十六进制数
书写一个很大的二进制数将十分冗长且易出错。4位一组的二进制数可以表示24=16种数。因此,有时使用基数为16的表示会更方便,这称为十六进制(hexadecimal)。十六进制数使用数字0~9和字母A~F,如表1-2所示,十六进制数每一列的权分别是1、16、162(256)、163(4096),依次类推。
例1.3 十六进制转换为二进制和十进制。将十六进制数2ED16转换为二进制和十进制。
解:十六进制和二进制之间的转换很容易,其中每个十六进制数字相当于4位二进制数字。216=00102,E16=11102,D16=11012,因此2ED16=0010111011012。十六进制转换为十进制需要计算,图1-6给出了计算过程。
例1.4 二进制转换为十六进制。将二进制数11110102转换为十六进制。
解:转换非常容易,从右往左读取数据,4个最低位是10102=A16,下面是1112=716。因此11110102=7A16。
例1.5 十进制转换为十六进制和二进制。将十进制数33310转换为十六进制和二进制。
解:如同十进制转换为二进制那样,十进制转换为十六进制可以从左或从右进行。
从左开始时,从小于等于给定十进制数的16的最高次幂开始(本例中是256),333中仅包含了1个256,所以在权为256的这一列是1,还剩333-256=77;77中有4个16,所以在权为16的这一列是4;还剩77-16×4=13;1310=D16,所以在权为1的这一列是D。因此,33310=14D16。如例1.3所示,将十六进制转换为二进制是很容易的,14D16=1010011012。
从右开始,用16重复除以给定的十进制数,余数放在每一列中。333/16=20,余数是1310=D16,所以权为1的这一列为D;20/16=1,余数为4,所以权为16的这一列为4;1/16=0,余数是1,所以权为256的这一列为1。最后,结果为14D16。
1.4.4 字节、半字节和字
8个一组的比特位称为字节(byte),它能表示28=256个数字。计算机内存中存储的数据习惯于用字节作单位,而不用位。
4个一组的比特位或者半个字节称为半字节(nibble),它能表示24=16个数字。一个十六进制数占用1个半字节,两个十六进制数占用一个字节。半字节已经不是一个常用的单位,但这个术语很吸引人。
微处理器处理的一块数据称为字(word)。字的大小取决于微处理器的结构。在写作本书的2015年,很多计算机都采用64位处理器,意味着它们对64位的字进行操作。同时,老的处理32位字的计算机也被广泛应用。比较简单的微处理器,特别是应用在诸如烤面包机等小设备中的处理器,使用8位或16位字。
在一组位中,权为1的那一位称为最低有效位(least significant bit,lsb),处于另一端的位称为最高有效位(most significant bit,msb),如图1-7a所示的6位二进制数。同样,对于一个字来说,也可用最低有效字节(Least Signi-ficant Byte,LSB)和最高有效字节(Most Significant Byte,MSB)来表示,如图1-7b所示。该图是一个4字节的数据,用8个十六进制数表示。
可以利用一个很方便的巧合,2^10=1024≈10^3,因此kilo(希腊文的千)表示2^10。例如,2^10字节是1千字节(1KB)。类似地,mega(百万)表示2^20≈10^6,giga(十亿)表示2^30≈10^9。如果你知道2^10≈1千,2^20≈1兆,2^30≈10亿,而且记住2的n次方(n≤9)的值,你将很容易地得出2的任意次方的值。
例1.6 估算2的n次方。不用计算器求224的近似值。
解:将指数分成10的倍数和余数。2^24=2^20×2^4。2^20≈1兆,2^4=16。因此2^24≈16兆。精确地说,2^24=16 777 216,但是16兆这个数据已经足够精确。
1024字节称为1千字节(kilobyte,KB)。1024比特称为1千比特(kilobit、Kb或Kbit)。类似地,MB、Mb、GB和Gb分别叫作兆字节、兆比特、吉字节和吉比特。内存容量经常用字节做单位,信息传输速率一般用比特/秒做单位。例如,拨号的调制解调器最大传输速率为56Kb/s。
1.4.5 二进制加法
二进制加法与十进制加法相似但更简单,如图1-8所示。在十进制加法中,如果两个数据之和大于单个数字所能表示的值,将在下一列的位置上标记1。图1-8比较了二进制加法与十进制加法。图1-8a的最右端的一列,7+9=16,因为16>9,故不能用单个数字表示,因此记录权为1的列结果(6),然后将权为10的列结果(1)进位到更高一列中。同样,在二进制加法中,如果两个数相加之和大于1,那么我们将此按二进制进位到更高一列,如图1-8b所示,在图的最右端一列,1+1=210=102,使用1个二进制位无法表示此结果,因此记录此和中权为1的列结果(0),并将权为2的列结果(1)进位到更高一列中。在加法的第二列中,1+1+1=310=112,记录此和的权为1的列结果(1),并将权为2的列结果(1)进位到更高一列。为了更明确地表示,进位到相邻列的位称为进位(carry bit)。
例1.7 二进制加法。计算01112+01012。
解:图1-9给出了相加结果11002。进位用粗体标出,可以通过计算它们的十进制来检验计算结果。01112=710,01012=510,结果为1210=11002。
数字系统常常对固定长度的数字进行操作。如果加法的结果太大,超出了数字的表示范围,将产生溢出(overflow)。例如,一个4位数的表示范围是[0, 15],如果两个4位数相加的结果超过了15,那么就会产生溢出。结果的第5位被抛弃,从而产生一个不正确的结果。可以通过检查最高一列是否有进位来判断是否溢出。
例1.8 有溢出的加法。计算11012+01012,有没有产生溢出?
解:图1-10给出了计算结果是100102。此结果超出了4位二进制数的表示范围。如果结果一定要存储为4位的二进制数,那么它的最高位将被抛弃,剩下一个不正确的结果00102。如果计算结果使用5位或更多位来表示,结果100102将会是正确的。
1.4.6 有符号的二进制数
到目前为止,我们只考虑了表示正数的无符号(unsigned)二进制数。我们还需要一种能表示正数和负数的二进制数字体系。有多种方案可以表示有符号(signed)二进制数,其中最常用的两种为:带符号的原码和二进制补码。
1.带符号的原码
带符号的原码(sign/magnitude)是一种直观的数据表示方式,符合我们写负数的习惯:把负号标在数字前面。一个N位带符号的原码数中的最高位为符号位,剩下的N-1位为数值(绝对值)。符号位为0表示正数,1表示负数。
例1.9 带符号的原码表示的数。用4位带符号的原码表示5和-5。
解:两个数字的值均为510=1012,所以,510=01012,-510=11012。
遗憾的是,普通的二进制加法无法在带符号的原码下实现。例如,-510和510相加,用这种格式计算出来的结果是1101 2+0101 2=10010 2,这是没有道理的。
N位的带符号的原码的数据表示范围是[-2N-1+1, 2N-1-1]。这种格式在表示0时有两种方法:+0和-0。对于同一个数字有两种不同的表示方法有可能会造成麻烦。
2.二进制补码
二进制补码中最高位的权是-2N-1而不是2N-1,其他位的表示方法与无符号二进制数相同。它克服了带符号的原码格式中0有两种表示方式的缺点。在二进制补码中,0只有一种表示方式,而且也可以使用普通的加法。
在二进制补码中,0表示成00…0002。正数的最高位为0,01…1112=2N-1-1。负数的最高位是1,10…0002=-2N-1,-1表示成11…1112。
注意:正数的最高位都是0,负数的最高位都是1,所以最高位可以当作符号位,然而剩余那些位的解释与带符号的原码有所不同。
二进制补码的符号位在求二进制补码(taking the two's complement)的过程中保持不变。在此过程中首先对数据的每一位取反,然后在数据的最低位加1。这对于计算负数的二进制补码表示或根据二进制补码表示计算负数的值是很有用的。
例1.10 负数的二进制补码表示。把-210表示成一个4位的二进制补码数。
解:+210=00102,为了得到-210的值,将所有位取反后加1。00102取反之后为11012,11012+1=11102,所以-210=11102。
例1.11 二进制补码的负数的值。求二进制补码数据10012的十进制数值。
解:10012最高位是1,所以它一定是一个负数。为了求取它的值,将所有位取反然后加1。10012取反后的结果是01102,01102+1=01112=710,所以,10012=-710。
用二进制补码表示的数据有一个明显的优点,加法操作对正数和负数都可得出正确的结果。当进行N位的数据加法时,第N位的进位(即第N+1位结果)被抛弃。
例1.12 两个二进制补码数据相加。使用补码计算(a)-210+110和(b)-710+710的结果。
解:(a)-210+110=11102+00012=11112=-110。(b)-710+710=10012+01112=100002,第五位被丢弃,剩下后四位结果00002。
减法是将第二个操作数改变符号后求取补码,然后跟第一个操作数相加来完成。
例1.13 两个二进制补码数据相减。使用4位二进制补码计算(a)510-310和(b)310-510的结果。
解:(a)310=00112,取二进制补码得-310=11012,计算510+(-310)=01012+11012=00102= 210。注意,因为使用4位表示结果,其最高位的进位被丢弃。(b)第二个操作数510取补码得-510=1011,计算310+(-510)=00112+10112=11102=-210。
计算0的二进制补码时,需要将所有的二进制位取反(产生11…1112),然后加1,丢弃最高位,剩余00…000。因此,0的表示是唯一的。与带符号的原码系统不同,二进制补码表示方法中没有-0。0被认为是正数,因为它的符号位为0。
如同无符号数,N位二进制补码数能够表示2N种数值,但是这些数分为正数和负数。例如,一个4位的无符号数可以表示16种数值:0~15,一个4位的二进制补码也可以表示16个数值:-8~7。一般而言,N位二进制补码的表示范围是[-2N-1, 2N-1-1]。注意到负数比正数多一个,这是因为没有-0。最小的负数是10…0002=-2N-1,这个数有时被叫作怪异数(weird number)。求取它的二进制补码时,首先各位取反变成01…1112,然后加1,变成10…0002,与原数相同。因此,这个负数没有与之对应的正数。
两个N位正数或者负数相加,如果结果大于2N-1-1或者小于-2N-1,则会产生溢出。一个正数和一个负数相加肯定不会导致溢出。不像无符号整数加法中,最高位产生进位表示溢出。二进制补码加法中判定溢出的条件是:相加的两个数符号相同且结果的符号与被加数符号相反,表示发生溢出。
例1.14 有溢出的二进制数加法。用4位二进制数计算410+510。判断结果是否有溢出。
解:410+510=01002+01012=10012=-710。结果超过4位二进制补码整数的表示范围,产生了不正确的负值结果。如果使用5位或更多位数计算,则结果为正确的值010012=910。
当二进制补码数扩展到更多位数时,需要将符号位复制到所有的扩展高位中。这个过程称为符号扩展(sign extension)。例如,数字3和-3的二进制补码表示分别为0011和1101。将这两个数扩展为7位时,可以将符号位复制到新的高三位中,分别得到0000011和1111101。
3.数制系统的比较
三种最常见的二进制数值系统分别为:无符号数、二进制补码和带符号的原码。表1-3比较了这三种数值系统中N位数的表示范围。由于二进制补码可以表示正数和负数,而且可以使用常见的加法,所以这个编码方式最为方便。减法采用将减数取反(即采用二进制补码)再和被减数相加的方法实现。除非特殊声明,我们都使用二进制补码表示有符号数。
图1-11给出了每个数字系统中4位数的表示方法。无符号数在[0, 15]范围内按照正常的二进制顺序排列。二进制补码表示范围为[-8, 7]。其中非负数[0, 7]的编码与无符号数相同,负数[-8, -1]中越大的二进制数越接近0。注意,怪异数1000表示-8,没有正数与之对应。符号/数值表示的范围为[-7, 7]。最高位为符号位。正数[1, 7]的编码与无符号数相同。负数表示与整数对称,而仅仅符号位为1。0可以表示为0000或1000。由于0有两种表示方法,所以N位符号/数值仅可以表示2N-1个整数。
1.5 逻辑门
现在我们已经知道如何使用二进制变量表示信息,下面将研究对这些二进制变量进行操作的数字系统。逻辑门(logic gate)是最简单的数字电路,它们可以接收一个或多个二进制输入并产生一个二进制输出。逻辑门用电路符号画出,并表示出输入和输出。输入往往画在左侧(或上部),输出往往画在右侧(或下部)。数字设计师往往使用字母表开始部分的字母表示门的输入,用Y表示门的输出。输入和输出之间的关系由真值表或布尔表达式描述。真值表(truth table)的左侧列出输入,右侧列出对应的输出,而且每种可能的输入组合对应一行。布尔表达式(Boolean equation)是基于二进制变量的数学表达式。
1.5.1 非门
非门(NOT gate)有一个输入A和一个输出Y,如图1-12所示。非门的输出是输入之反。如果A为FALSE,则Y为TRUE。如果A为TRUE,则Y为FALSE。这个关系由图中的真值表和布尔表达式所表示。布尔表达式中A上面的横线读作NOT,因此读作“Y等于NOT A”。非门也称为反相器(inverter)。
还有一些对非逻辑的表示,例如Y=A、Y=珹或Y=~A。我们仅使用,Y=A但读者在碰到其他类型的表示时也不要被迷惑。
1.5.2 缓冲
另一种单输入逻辑门称为缓冲(buffer),如图1-13所示。它仅仅将输入传递到输出。
从逻辑的角度看,缓冲和电线没有差异,好像没有用。然而,从模拟电路的角度看,缓冲可能有一些很好的特征使得它可以向电机传递大电流,或者将输出更快地传递到多个门的输入上。这个例子也说明了为什么我们要考虑整个系统的多个层次抽象;数字抽象掩盖了缓冲的真实作用。
三角符号表示一个缓冲。输出上的圆圈称为气泡(bubble),用来表示取反,正如图1-12中的非门符号一样。
1.5.3 与门
两输入逻辑门更加有趣。图1-14中的与门(AND gate)在所有输入A和B都为TRUE时,输出Y才为TRUE。否则输出为FALSE。为了方便起见,输入按照00、01、10、11的二进制递增顺序排列。与门的布尔表达式可以写成多种方式:Y=A·B,Y=AB或者Y=A∩B。其中∩符号读作“intersection”(交),常常由逻辑学家使用。我们更常用Y=AB,读作“Y等于A与B”。
1.5.4 或门
图1-15的或门(OR gate)中只要输入A和B中有一个为TRUE,输出Y就为TRUE。或门的布尔表达式可以写为:Y=A+B或者Y=A∪B。其中∪符号读作“union”(并),常常由逻辑学家使用。数字电路工程师更常用Y=A+B,读作“Y等于A或B”。
1.5.5 其他二输入逻辑门
图1-16给出了其他常见的二输入逻辑门。异或门(exclusive OR,XOR)的输入A和B中有且仅有一个输入为TRUE时,输出为TRUE。异或操作由⊕表示,它是一个带圈的加号。如果门后面有一个气泡,表示进行取反操作。NAND门执行与非操作。它的两个输入为TRUE时才为FALSE,其他情况都为TRUE。NOR门执行或非操作。它在输入A和B都不为TRUE时才输出TRUE。N输入XOR门有时也称为奇偶校验(parity)门,即有奇数个输入为TRUE时产生TRUE输出。正如二输入门一样,真值表中的输入组合按照二进制递增顺序排列。
例1.15 XNOR门。图1-17给出两输入XNOR门的电路符号和布尔表达式。它执行异或非逻辑。请完成真值表。
解:图1-18给出了真值表。在所有输入都为TRUE或都为FALSE的情况下,XNOR输出TRUE。两输入XNOR门有时称为相等(equality)电路,因为在输入相等时输出为TRUE。
1.5.6 多输入门
有很多需要三个或三个以上输入的布尔函数。最常见的是AND、OR、XOR、NAND、NOR和XNOR。N输入与门在所有输入都为TRUE时才产生TRUE。N输入或门在有一个输入为TRUE时就产生TRUE。
例1.16 三输入NOR门。图1-19给出了三输入NOR门的电路符号和布尔表达式。请完成真值表。
解:图1-20给出了真值表。只有在所有输入都不为TRUE时,输出才为TRUE。
例1.17 四输入AND门。图1-21给出了四输入AND门的电路符号和布尔表达式。请完成真值表。
解:图1-22给出真值表。只有所有的输入都为TRUE时,输出才为TRUE。
1.6 数字抽象之下
数字系统采用离散取值的变量。然而这些变量需要由连续的物理量来表示,例如电线上的电压、齿轮的位置或者桶中的水位高度。所以,设计者必须找到一种方法将连续变量和离散变量联系在一起。
例如,考虑采用电线上的电压来表示二进制信号A。当电压为0V时,表示A=0;为5V时,表示A=1。任何实际系统都必须能容忍一定的噪声,因此4.97V可能也可以解释为A=1。但是对于4.3V呢?对于2.8V或2.500 000V呢?
1.6.1 电源电压
假设系统中最低的电压为0V,称为地(ground,GND)。系统中最高的电压来自电源,常称为VDD。在20世纪70年代和80年代的技术下,VDD一般为5V。当芯片采用了更小的晶体管,VDD降到了3.3V、2.5V、1.8V、1.5V、1.2V,甚至更低以减少功耗和避免晶体管过载。
1.6.2 逻辑电平
通过定义逻辑电平(logic level),可以将连续变量映射到离散的二进制变量,如图1-23所示。第一个门称为驱动源(driver),第二个门称为接收端(receiver)。驱动源的输出连接到接收端的输入上。驱动源产生LOW(0)输出,其电压处于0~VOL之间;或者产生HIGH(1)输出,其电压处于VOH~VDD之间。如果,接收端的输入电压处于0~VIL之间,则接收端认为其输入为LOW。如果接收端的输入电压处于VIH~VDD之间,则接收端认为其输入为HIGH。如果由于噪声或部件错误原因,接收端输入电压处于VIL~VIH之间的禁止区域(forbidden zone),则输入门的行为不可预测。VOH和VOL称为输出高和输出低逻辑电平,VIH和VIL称为输入高和输入低逻辑电平。
1.6.3 噪声容限
如果驱动源的输出能够被接收端的输入正确解释,我们必须选择VOL<VIL,VOH>VIH。因此,如果驱动源的输出被一些噪声干扰,接收端的输入依然能够检测到正确的逻辑电平。可以加在最坏情况输出上但依然能正确解释为有效输入的噪声值,称为噪声容限(noise margin)。如图1-23可以看出,低电平和高电平的噪声容限分别为:
例1.18 计算噪声容限。考虑图1-24中的反相器。VO1是反相器I1的输出电压,VI2是反相器I2的输入电压。两个反向器遵循同样的逻辑电平特征:VDD=5V,VIL=1.35V,VIH=3.15V,VOL=0.33V,VOH=3.84V。反相器的低电平和高电平噪声容限分别为多少?这个电路可否承受VO1和VI2之间1V的噪声?
解:反相器的噪声容限为:NML=VIL-VOL=(1.35V-0.33V)=1.02V,NMH=VOH-VIH=(3.84V- 3.15V)=0.69V。电路在输出为LOW时,可以承受1V的噪声电压(NML=1.02V);但是在输出为HIGH时,不能承受此噪声电压(NMH=0.69V)。例如,在驱动源I1输出的HIGH值处于最坏情况,即VO1=VOH=3.84V。如果噪声导致电压在到达接收端输入前降低了1V,VI2= (3.84V-1V)=2.84V。这已经小于可接受的HIGH逻辑电平VIH=3.15V,因此接收端将无法检测到正确的HIGH输入。
1.6.4 直流电压传输特性
为了理解数字抽象的局限性,我们必须深入考察门的模拟特征。门的直流电压传输特性(DC transfer characteristic)描述了当输入电压变化足够慢而保证输出能跟上输入的变化时,输出电压随输入电压变化的函数关系。这个函数之所以称为传输特性,是因为它描述了输入和输出电压之间的关系。
理想的反相器应在输入电压达到门限VDD/2时产生一个跳变,如图1-25a所示。对于V(A)<VDD/2,V(Y)=VDD。对于V(A)>VDD/2,V(Y)=0。此时,VIH=VIL=VDD/2,VOH=VDD且VOL=0。
真实的反相器在两个极端之间变化得更缓慢一些,如图1-25b所示。当输入电压V(A)等于0时,输出电压V(Y)=VDD。当V(A)=VDD时,V(Y)=0。然而,在这两个端点之间的变化是平滑的,而且可能并不会恰恰在中点VDD/2突变。这就产生了如何定义逻辑电平的问题。
一种选择逻辑电平的合理方法是选择在传输特征曲线斜率dV(Y)/dV(A)为-1的位置。这两个位置称为单位增益点(unity gain point)。在单位增益点选择逻辑电平可以最大化噪声容限。如果VIL减少,VOH将仅仅增加一点。如果VIL增加,VOH则将显著降低。
1.6.5 静态约束
为了避免输入落到禁止区域,数字逻辑门的设计需要遵循静态约束(static discipline)。静态约束要求对于给定的有效逻辑输入,每个电路元件应该能产生有效的逻辑输出。
为了满足静态约束,数字电路设计师需要牺牲使用任意模拟器件的*,但是换回了数字电路的简单性和健壮性。通过从模拟到数字之间抽象层次的提高,可以隐藏无须了解的细节来提高设计生产率。
VDD和逻辑电平可以任意选择,但是所有相互通信的逻辑门必须保持兼容的逻辑电平。因此,逻辑门可以按照逻辑系列(logic family)来区分,其中同一逻辑系列的所有门都遵循相同的静态约束。同一逻辑系列中的逻辑门像积木一样组合在一起,使用相同的电源电压和逻辑电平。
20世纪70年代到90年代有4种主流的逻辑系列:TTL(Transistor-Transistor Logic,晶体管-晶体管逻辑),CMOS(Complementary Metal-Oxide-Semiconductor Logic,互补性金属-氧化物-半导体逻辑),LVTTL(Low Voltage TTL,低电压TTL),LVCMOS(Low Voltage CMOS,低电压CMOS)。表1-4比较了它们的逻辑电平。随着电源电压的不断降低,不断分化出新的逻辑系列。附录A.6更加详细地讨论了常见的逻辑系列。
例1.19 逻辑系列兼容性。表1-4中的哪些逻辑系列可以可靠地和其他逻辑系列通信?
解:表1-5列举了逻辑系列之间的兼容性。注意5V的TTL或CMOS逻辑系列可能产生的HIGH信号输出电压为5V。如果5V信号驱动3.3V的LVTTL或LVCMOS逻辑系列输入,可能会损坏接收端,除非接收端特殊设计为“5V兼容”。
1.7 CMOS晶体管
本节和后续带*的章节是可选的。它们对理解本书的核心内容并不重要。
Babbage的分析机由齿轮构造,早期的电子计算机由继电器和真空管构成。现代计算机则由廉价、微型和可靠的晶体管构成。晶体管(transistor)是一个电子的可控开关:当由电压或者电流施加到控制端时,它将在ON和OFF之间转换。晶体管有两大类:双极晶体管(bipolar junction transistor)和金属-氧化物-半导体场效应晶体管(Metal-Oxide-Semiconductor field effect transistor,MOSFET或MOS)。
1958年,德州仪器(Texas Instrument)的Jack Kilby制造了第一个具有两个晶体管的集成电路。1959年,仙童半导体(Fairchild Semiconductor)申请了在一个硅芯片上连接多个晶体管的专利。在那个年代,每个晶体管的造价是10美元。
半导*造技术经过40多年的空前进步,人们已经可以在一个1平方厘米的芯片上集成30亿个MOS晶体管,而每个晶体管的造价已经低于1-6美分。集成度和价格每8年左右改进一个数量级。MOS晶体管现在已经用于构造几乎所有的数字电路系统。本节中,我们将进入电路抽象层以下,来看看如何使用MOS晶体管构造逻辑门。
1.7.1 半导体
MOS晶体管由岩石和沙子中最主要的元素—硅构成。硅(Silicon,Si)是第Ⅳ族元素,因此其化合价外层有4个电子,并与4个相邻元素紧密连接,形成晶格(lattice)。图1-26a中简化显示了二维网格,但网格实际上形成三维晶格结构。图中的每条线表示一个共价键。在此结构下,因为硅的电子都被束缚在共价键中,其导电性很弱。但是如果在其中加入少量杂质(掺杂元素,dopant atom),硅的导电性就会大大提高。如果加入第V族元素(例如砷,As),掺杂元素就会有额外的一个电子不受共价键的束缚。这个电子可以在晶格中*移动,而留下一个带正电的掺杂元素(As+),如图1-26b所示。由于电子带有负电荷,所以我们称砷为n类掺杂元素。另一方面,如果掺入第Ⅲ族元素(例如,硼(B)),掺杂元素就将失去一个电子,如图1-26c所示。失去的电子称为空穴(hole)。掺杂元素临近的硅原子可以移动一个电子过来以填充共价键,而产生一个带负电荷的掺杂元素(B-),并在临近硅原子中产生空穴。类似地,空穴可以在晶格中迁移。空穴缺少一个负电荷,像一个具有正电的粒子。因此,我们称硼为p类掺杂元素。当掺杂浓度发生变化时,硅的导电性可以相差好几个数量级,硅就被称为半导体(semiconductor)。
1.7.2 二极管
p类硅和n类硅之间的连接点称为二极管(diode)。p类区域为阳极(anode),n类区域为阴极(cathode),如图1-27所示。当阳极的电压高于阴极时,二极管处于正向偏压,电流从阳极流向阴极。当阳极的电压低于阴极时,二极管处于反向偏压,没有电流流动。二极管符号表示了电流仅能沿一个方向流动。
1.7.3 电容
电容(capacitor)由夹着绝缘体的两片导体构成。当电压V加到电容一端的导体时,这个导体将积累电荷Q,而另一端导体将积累电荷-Q。电容C的电容量C(capacitance)是充电电荷和电压之比:C=Q/V。电容量正比于导体的尺寸,反比于导体之间的距离,电路符号如图1-28所示。
电容之所以重要是因为导体的充电或放电需要时间和能量。大电容意味着电路比较慢,而且需要更多的能量。速度和能量问题将在本书中进一步讨论。
1.7.4 nMOS和pMOS晶体管
MOS晶体管由多层导体和绝缘体构成。MOS晶体管在直径15~30厘米的硅片(wafer)上制造。制造过程从一个原始硅片开始,包括了掺杂元素的注入,氧化硅膜的生长和金属的淀积等多个步骤。在每个步骤之间,晶片上将形成特定图形使得需要的部分才暴露在外部。由于晶体管的尺寸仅有微米(1m=10-6m)级别,而一次可以处理整个晶片,所以一次制作几十亿个晶体管的成本并不高。一旦处理结束,晶片将被切割成很多长方形的部分,每个部分包含了成千上万,甚至十亿个晶体管,称为芯片(chip或dice)。这些芯片经过测试后,放置在塑料或陶瓷封装中,并通过金属引脚连接到电路板上。
MOS晶体管中最底层是硅晶片衬底(substrate),最顶上是导电的栅极(gate),中间是由SiO2构成的绝缘层。过去栅极是由金属构造,因此被称为金属-氧化物-半导体。现在的制造工艺采用多晶硅制造栅极,以避免金属在后续的处理工艺中融化。二氧化硅常用于制造玻璃,在半导体工业中简称为oxide。MOS结构中,金属和半导体衬底之间的极薄二氧化硅电介质(dielectric)形成一个电容。
现有两类MOS晶体管:nMOS和pMOS(读作“n-moss”和“p-moss”)。图1-29给出了从侧面观察它们的截面图。nMOS晶体管在p型衬底上由两个与栅极相连的n类型掺杂区域,分别称为源极(source)和漏极(drain)。pMOS晶体管刚刚相反,在n型衬底上构造p型源极和漏极。
MOS晶体管特性是一个由电压控制的开关:栅极电压将产生一个电场使得源极和漏极之间的连接处于导通或截止状态。场效应晶体管正是来源于这个操作原理。下面让我们继续研究nMOS晶体管的操作过程。
nMOS晶体管的衬底一般都连接到地(系统中最低的电压)。首先考虑当栅极电压为0V的情况,如图1-30a中所示。由于源极或漏极的电压大于0,所以它们和衬底之间的二极管处于反向偏压状态,因此此时源极和漏极之间没有电流,晶体管处于截止状态。接着考虑当栅极电压为VDD的情况,如图1-30b所示。当正电压加在电容的上表面时,将建立一个电场并在上表面吸收正电荷,在下表面吸收负电荷。当电压足够大时,大量的负电荷积聚在栅极下层,使得此区域从p型反转为n型。这个反转区域称为沟道(channel)。此时就有了一个从n型源极经n型沟道到n型漏极之间的通路,电流就可以从源极流到漏极,晶体管就处于导通状态。导通晶体管的栅极电压称为门限电压(threshold voltage,VT),一般为0.3~0.7V。
pMOS晶体管的工作方式刚刚相反,也可以从图1-31的电路符号上看出。pMOS晶体管的衬底电压为VDD,当栅极电压为VDD时,处于截止状态。当栅极接地时,沟道反转为p类型,处于导通状态。
MOS晶体管并不是完美的开关。对于nMOS晶体管能很好地导通低电平,但导通高电平的能力比较弱:当栅极电压为VDD时,漏极电压在0V到VDD-VT之间。同样,pMOS晶体管导通高电平的能力很好,但是导通低电平的能力较弱。但是,我们仍然可以仅仅利用晶体管较好的模式来构造逻辑门。
nMOS晶体管需要p型衬底,而pMOS晶体管需要n型衬底。为了在同一个晶片上同时构造这两种类型晶体管,制造过程采用p类型晶片,然后在需要pMOS晶体管的地方扩散n类型区域构成阱(well)。这种同时提供两种类型晶体管的工艺称为互补型MOS(Complemen-tary MOS,CMOS)。CMOS工艺已经成为当前集成电路制造的主要方法。
总而言之,CMOS工艺提供了两种类型的电控制开关,如图1-31所示。栅极(g)的电压控制了源极(s)和漏极(d)之间的电流流动。nMOS晶体管在栅极为低电平时截止,为高电平时导通。pMOS晶体管刚刚相反,在栅极为低电平时导通,为高电平时截止。
1.7.5 CMOS非门
图1-32给出了用CMOS构成非门的电路原理图,其中三角形表示地,横线表示电源VDD(这些标号在后续电路原理图中不再标出)。nMOS晶体管N1连接了地和输出Y,pMOS晶体管P1连接了电源和输出Y。两个晶体管的栅极都由输入A控制。
如果A=0,则N1截止,P1导通,因此Y相当于连接到电源VDD,而与地断开。由于P1可以很好地导通高电平,Y可以被拉升到逻辑1(高电平)。如果A=1,则N1导通,P1截止,由于N1可以很好导通低电平,Y被拉至逻辑0。。与图1-12中的真值表对比,可以看到这个电路实现了一个非门。
1.7.6 其他CMOS逻辑门
图1-33给出了两输入与非门的CMOS电路原理图。在电路原理图中,线总是在三路相交的节点上连接,只有在有点的情况下才是四路连接。nMOS晶体管N1和N2串联:只有两个nMOS晶体管都导通,输出才被拉低到地。pMOS晶体管P1和P2并联:只要有一个pMOS晶体管导通就可以将输出拉升到VDD。表1-6给出了上拉网络和下拉网络的操作与输出的状态,显示出该电路完成与非功能。例如,当A=1,B=0时,N1导通,但N2截止,阻塞了从输出Y到地之间的通道;同时,P1截止,但P2导通,建立了从电源到输出Y的通道。因此,输出Y被上拉到高电平。
图1-34显示了构造任意反向逻辑门(例如非门、与非门、或非门等)的通用结构。nMOS晶体管可以很好地导通低电平,因此下拉网络采用nMOS晶体管连接输出和地,以将输出完整地下拉到低电平。pMOS晶体管可以很好地导通高电平,因此上拉网络采用pMOS连接输出和电源,以将输出完整地上拉到高电平。当晶体管并联时,只要有一个晶体管导通整个网络就导通。当晶体管串联时,只有所有的晶体管导通网络才能导通。输入上的斜线表示逻辑门可以有多个输入。
如果上拉网络和下拉网络同时导通,则会在电源和地址之间产生短路(short circuit)。门的输出电压可能处于禁止区域,而晶体管将消耗大量能量,很可能会使其烧毁。另一方面,如果上拉网络和下拉网络同时截止,输出将既不连接到电源,也不连接到地,处于浮空状态(float)。浮空状态的电压是不确定的。通常不希望有浮空输出,但是在2.6节中可以看到,浮空也可以偶尔使用。
在具有正常功能的逻辑门中,上拉或下拉网络必然有一个导通,另一个截止,这样输出就可以被上拉至高电平或低电平,而不会产生短路或浮空。我们利用传导互补规则来保证这一点,即nMOS采用串联时,pMOS必须使用并联;nMOS使用并联时,pMOS必须使用串联。
例1.20 三输入与非门原理图。使用CMOS晶体管画一个三输入与非门的原理图。
解:与非门只有在所有的输入都为1时,输出才为0。因此,下拉网络必须是三个串联的nMOS晶体管。根据传导互补规则,pMOS晶体管必须采用并联。电路原理图如图1-35所示,读者可以自行验证其功能是否和真值表吻合。
例1.21 两输入或非门原理图。使用CMOS晶体管画一个两输入或非门。
解:或非门只要有一个输入为1,输出就为0。因此,下拉网络应该由两个并联的nMOS晶体管构成。根据传导互补规则,pMOS晶体管应该使用串联方式。电路原理图如图1-36所示。
例1.22 两输入与门原理图。画一个两输入与门的原理图。
解:不能用一个单独的CMOS门构成一个与门。但是与非门和非门却很容易构造。因此,使用CMOS构造与门的最佳方法是将与非门的输出连接到非门的输入上,如图1-37所示。
1.7.7 传输门
有时,设计者需要一个理想的开关能同时很好地通过0或1。注意到nMOS可以很好地导通0,pMOS可以很好地导通1,两者的并联就可以很好地导通两种电平。图1-38给出了传输门(transmission gate或pass gate)的电路符号。由于开关是双向的,所以两边A和B不区分输入或输出。控制信号称为使能(Enable),EN和EN。当EN=0且EN=1时,两个晶体管都截止。因此,传输门是关闭(禁用),所以A和B未连接。当EN=1且EN=0时,传输门导通(使能),任意逻辑值可以在A和B之间传递。
1.7.8 类nMOS逻辑
在一个N输入或非门中需要N个nMOS晶体管并联和N个pMOS晶体管串联。正如多个电阻串联阻值要大于并联,多个串联的晶体管速度也较慢。此外,由于pMOS晶体管的空穴在晶格中的移动速度要低于电子速度,所以pMOS晶体管的速度要慢于nMOS晶体管。因此,并联的多个nMOS晶体管速度要快于串联的多个pMOS晶体管,尤其当串联的晶体管数目较多时,速度差异更大。
类nMOS逻辑(pseudo-nMOS logic)将上拉网络中的pMOS晶体管替换为单个始终导通的pMOS晶体管,如图1-39所示。这个pMOS晶体管经常称为弱上拉(weak pull-up),其物理尺寸被设计成满足当所有nMOS晶体管都不导通时,这个弱上拉pMOS晶体管可以维持输出高电平;只要有一个nMOS晶体管导通就能超过这个弱上拉pMOS晶体管,将输出Y下拉到地,而产生逻辑0。
可以利用类nMOS逻辑的特点构造多输入快速或非门。图1-40中给出了一个4输入或非门的类nMOS示例。类nMOS门很适合构造存储器和逻辑阵列(第5章中介绍)。其缺点在于当输出为低电平时,弱pMOS晶体管和所有的nMOS晶体管都导通,在电源和地之间有短路。短路将持续消耗能量,因此类nMOS逻辑必须谨慎使用。
类nMOS门在20世纪70年代得名,当时的制造工艺仅能生产nMOS晶体管,还不能制造pMOS晶体管,因此使用一个弱nMOS晶体管来实现上拉。
1.8 功耗
功耗(power consumption)是单位时间内所消耗的能量,在数字系统中非常重要。在手机、笔记本电脑等移动系统中,电池的使用时间取决于功耗。功耗对固定电源供电的系统也很重要,因为电力消耗需要花钱,而且如果功耗过高将导致系统过热。
数字系统包含动态功耗(dynamic power)和静态功耗(static power)。动态功耗是信号在0和1变化过程中电容充电所耗费的能量。静态功耗是信号不发生变化,系统处于空闲状态下的功耗。
逻辑门和连接它们的线都具有电容。将电容C充电到电压VDD所需的能量为CV2DD。如果电容电压变换的频率为f(即每秒变化f次),即在1秒内要将电容充电f/2次,放电f/2次。由于放电过程不需要从电源中获取能量,所以动态功耗为:
电子系统在空闲的时候也需要一些电流。当晶体管处于截止状态时,仍会有少量漏电流。有一些电路,例如1.7.8节中讨论的类nMOS电路,在电源和地之间始终有通路。这个静态电流IDD也称为电源和地之间的漏电流(leakage current)或静态电源电流。静态功耗正比于静态电流。
例1.23 功耗。某手机的电池容量为6Wh,电源电压为1.2V。假设手机通话时的工作频率为300MHZ,芯片中平均电容为10nF,天线需要3W功率。手机不通话时因为所有的信号处理过程停止,所以动态功耗降低到0。但是手机无论是否工作仍然具有40mA的漏电流。请确定不通话情况和连续通话情况下电池的使用时间。
解:静态功耗Pstatic=(0.040A)(1.2V)=48mW。如果手机不通话,仅有静态功耗,因此其电池使用时间为(6Wh)/(0.048W)=125小时(约5天)。如果手机通话,其动态功耗为Pdynamic=(0.5)(10-8F)(1.2V)2(3×108Hz)=2.16W。加上静态功耗和天线功耗,总的通话功耗为2.16W+3W+ 0.048W=5.2W。因此电池使用时间为6Wh/5.2W=1.15小时。这个例子对手机的实际操作进行了简化,但是可以说明功耗的关键性问题。
1.9 总结和展望
世界上有“10”种类型的人:可以用二进制计数的人和不能用二进制计数的人。
本章介绍了理解和设计复杂系统的基本原则。虽然真实世界是模拟世界,但是数字电路设计师将这些模拟值约束起来,仅仅使用可能信号中的离散子集。特别地,二进制变量只有两个状态:0和1,也称为FALSE和TRUE,或者LOW和HIGH。逻辑门根据一个或多个二进制输入计算一位二进制输出。一些常见的逻辑门包括:
- NOT:输入为FLASE时,输出TRUE;
- AND:所有输入都为TRUE时,输出TRUE;
- OR:只要有一个输入为TRUE时,输出TRUE;
- XOR:奇数个输入为TRUE时,输出TRUE。
逻辑门常用CMOS晶体管构成。CMOS的行为类似于电子控制开关:nMOS在栅极为1时导通,pMOS在栅极为0时导通。
第2~5章中,我们将继续研究数字逻辑。第2章中着重研究输出仅仅依赖于当前输入的组合逻辑(combinational logic)。前面介绍的逻辑门都是组合逻辑的实例。在此章中将学习使用多个门来设计电路,以实现通过真值表或逻辑表达式描述的输入和输出之间的关系。第3章将着重研究时序逻辑(sequential logic),其输出依赖于当前输入和过去的输入。作为基本的时序器件,寄存器(register)可以记住它们以前的输入。基于寄存器和组合逻辑构成的有限状态机(finite state machine)提供了一种强有力的系统化方法来构造复杂系统。我们还将研究数字系统的时序,从而分析系统最快的运行速度。第4章介绍了硬件描述语言(HDL)。硬件描述语言和传统的程序设计语言相关,但是它们用于模拟和构造硬件系统而非软件。现代的大多数数字系统都使用硬件描述语言设计。System Verilog和VHDL是两种流行的硬件描述语言。它们在本书中并列介绍。第5章中将研究其他组合逻辑和时序逻辑模块,例如加法器、乘法器和存储器等。
第6章将转移到计算机体系结构。此章介绍了信息产业常用的ARM处理器。该处理器用于几乎所有的智能手机和平板电脑等诸多设备中,从弹球机到汽车和服务器。ARM体系结构由寄存器和汇编语言指令集定义。此章中将学习如何用汇编语言为ARM处理器书写程序,这样就可以用处理器自身的语言和它们通信了。
第7章和第8章填补了数字逻辑和计算机体系结构之间的空隙。第7章将研究微结构,即如何将加法器、寄存器等数字模块组合在一起来构成微处理器。此章中,可以学习如何构造自己的ARM处理器。而且,可以学习到三种不同的微结构,来说明在性能和成本之间的不同折中。处理器性能按照指数方式增长需要更复杂的存储器系统以提供处理器不断提出的数据需求。第8章深入介绍存储器系统体系结构。第9章(作为网络补充内容,参见前言)描述了计算机和显示器、蓝牙无线电以及电机等外部设备进行通信的方法。
习题
1.1 用一段话解释以下领域中出现的至少三个层次的抽象:
(a)生物学家研究细胞的操作;
(b)化学家研究物质的构成。
1.2 用一段话解释以下领域中使用的层次化、模块化和规整化技术:
(a)汽车设计工程师;
(b)管理业务的商人。
1.3 Ben正在盖房子。解释他如何应用层次化、模块化和规整化原则在建房过程中节省时间和金钱。
1.4 一个模拟信号的范围为0~5V。如果测量的精度为±50mV,此模拟信号最多可以传递多少位的信息?
1.5 教室中的旧钟的分针已经折断。
(a)如果你可以读取的时针接近于15分钟,时钟传递了多少位的时间信息?
(b)如果你知道现在是否临近中午,则可以再多获得多少位关于时间的附加信息?
1.6 巴比伦人在4000年前提出了六十进制(sexagesimal)的数制系统。一个六十进制的数字可以传递多少位信息?你应该如何用六十进制方式写400010这个数字?
1.7 16位可以表示多少个不同的数?
1.8 最大的无符号32位二进制数是多少?
1.9 对于以下三种数制系统,最大的16位二进制数是多少?
(a)无符号数
(b)二进制补码数
(c)符号/数值数
1.10 对于以下三种数制系统,最大的32位二进制数是多少?
(a)无符号数
(b)二进制补码数
(c)符号/数值数
1.11 对于以下三种数制系统,最小的16位二进制数是多少?
(a)无符号数
(b)二进制补码数
(c)符号/数值数
1.12 对于以下三种数制系统,最小的32位二进制数是多少?
(a)无符号数
(b)二进制补码数
(c)符号/数值数
1.13 将下列无符号二进制数转化为十进制。
(a)10102
(b)1101102
(c)111100002
(d)0001000101001112
1.14 将下列无符号二进制数转化为十进制。
(a)11102
(b)1001002
(c)110101112
(d)0111010101001002
1.15 重复习题1.13,但要转换为十六进制。
1.16 重复习题1.14,但要转换为十六进制。
1.17 将下列十六进制数转换为十进制。
(a)A516
(b)3B16
(c)FFFF16
(d)D000000016
1.18 将下列十六进制数转换为十进制。
(a)4E16
(b)7C16
(c)ED3A16
(d)403FB00116
1.19 重复习题1.17,但要转换为无符号二进制数。
1.20 重复习题1.18,但要转换为无符号二进制数。
1.21 将下列二进制补码数转换为十进制。
(a)10102
(b)1101102
(c)011100002
(d)100111112
1.22 将下列二进制补码数转换为十进制。
(a)11102
(b)1000112
(c)010011102
(d)101101012
1.23 重复习题1.21,但是这些二进制数采用的符号/数值方式。
1.24 重复习题1.22,但是这些二进制数采用的符号/数值方式。
1.25 将下列十进制数转换为无符号二进制数。
(a)4210
(b)6310
(c)22910
(d)84510
1.26 将下列十进制数转换为无符号二进制数。
(a)1410
(b)5210
(c)33910
(d)71110
1.27 重复习题1.25,但是要转换为十六进制。
1.28 重复习题1.26,但是要转换为十六进制。
1.29 将下述十进制数转为8位二进制补码,并指出哪些十进制数超出了相应的表示范围。
(a)4210
(b)-6310
(c)12410
(d)-12810
(e)13310
1.30 将下述十进制数转为8位二进制补码,并指出哪些十进制数超出了相应的表示范围。
(a)2410
(b)-5910
(c)12810
(d)-15010
(e)12710
1.31 重复习题1.29,但是转换为8位符号/数值表示。
1.32 重复习题1.30,但是转换为8位符号/数值表示。
1.33 将下列4位二进制补码数转换为8位二进制补码。
(a)01012
(b)10102
1.34 将下列4位二进制补码数转换为8位二进制补码。
(a)01112
(b)10012
1.35 重复习题1.33,但二进制数为无符号二进制数。
1.36 重复习题1.34,但二进制数为无符号二进制数。
1.37 基为8的数制系统称为八进制数(octal)。将习题1.25中的数转换为八进制数。
1.38 基为8的数制系统称为八进制数(octal)。将习题1.26中的数转换为八进制数。
1.39 将下述八进制数转换为二进制、十六进制和十进制。
(a)428
(b)638
(c)2558
(d)30478
1.40 将下述八进制数转换为二进制、十六进制和十进制。
(a)238
(b)458
(c)3718
(d)25608
1.41 有多少个5位二进制补码数大于0?有多少小于0呢?这个结果和符号/数值数的结果有区别吗?
1.42 有多少个7位二进制补码数大于0?有多少小于0呢?这个结果和符号/数值数的结果有区别吗?
1.43 在一个32位字中有多少字节?多少半字节?
1.44 在一个64位字中有多少字节?
1.45 某DSL modem的数据传输率为768Kbps。它一分钟内可以接收多少字节?
1.46 USB 3.0的数据传输率为5Gbps。它一分钟可以发送多少字节?
1.47 硬盘制造商使用MB字节表示106字节,使用GB表示109字节。在一个50GB的硬盘上真正能用于存储音乐的空间有多大?
1.48 不用计算器估计231有多大?
1.49 Pentium Ⅱ计算机上的存储器按照位阵列的方式组织。其中有28个行和29个列。不用计算器估计存储容量有多少位?
1.50 针对3位无符号数、二进制补码和符号/数值数画出类似于图1-11的图。
1.51 针对2位无符号数、二进制补码和符号/数值数画出类似于图1-11的图。
1.52 对下列无符号二进制数进行加法。指出在结果为4位的情况下,和是否会溢出。
(a)10012+01002
(b)11012+10112
1.53 对下列无符号二进制数进行加法。指出在结果为8位的情况下,和是否会溢出。
(a)100110012+010001002
(b)110100102+101101102
1.54 重复习题1.52,并假设二进制数采用二进制补码表示。
1.55 重复习题1.53,并假设二进制数采用二进制补码表示。
1.56 将下列十进制数转换为6位二进制补码表示,并完成加法操作。指出对于6位结果是否产生溢出。
(a)1610+910
(b)2710+3110
(c)-410+1910
(d)310+-3210
(e)-1610+-910
(f)-2710+-3110
1.57 对下列数字重复习题1.56。
(a)710+1310
(b)1710+2510
(c)-2610+810
(d)3110+-1410
(e)-1910+-2210
(f)-210+-2910
1.58 对下列无符号十六进制数进行加法操作。指出对于8位结果是否产生溢出。
(a)716+916
(b)1316+2816
(c)AB16+3E16
(d)8F16+AD16
1.59 对下列无符号十六进制数进行加法操作。指出对于8位结果是否产生溢出。
(a)2216+816
(b)7316+2C16
(c)7F16+7F16
(d)C216+A416
1.60 将下列十进制数转换为5位二进制补码,并进行相减。指出对于5位结果是否产生溢出。
(a)910-710
(b)1210-1510
(c)-610-1110
(d)410- -810
1.61 将下列十进制数转换为6位二进制补码,并进行相减。指出对于6位结果是否产生溢出。
(a)1810-1210
(b)3010-910
(c)-2810-310
(d)-1610-2110
1.62 在N位二进制偏置(biased)数制系统中,对于偏置量B,正数或负数的表示为其值加上B。例如,在偏置量为15的5位数制系统中,0表示为01111,1表示为10000,等等。偏置数制系统可以用于浮点算术中,详细内容在第5章中讨论。考虑一个偏置量为12710的8位二进制偏置数制系统。
(a)二进制数100000102对应的十进制数为多少?
(b)表示0的二进制数是多少?
(c)最小负数的值是多少?二进制表示是怎样?
(d)最大正数的值是多少?二进制表示是怎样?
1.63 针对偏置量为3的3位偏置数制系统,画出类似图1-11的数图。(参见习题1.62中对偏置数制系统的定义)。
1.64 在BCD(binary coded decimal)系统中,用4位二进制数表示0~9的十进制数字。例如,3710表示为00110111BCD。
(a)写出28910的BCD码表示。
(b)将100101010001BCD转换为十进制数。
(c)将01101001BCD转换为二进制数。
(d)解释为什么BCD码也是一种常用的数字表示方法。
1.65 回答下列与BCD系统相关的问题(BCD系统的定义请看习题1.64)。
(a)写出37110的BCD码表示。
(b)将000110000111BCD转换为十进制数。
(c)将10010101BCD转换为二进制数。
(d)说明BCD码与二进制数字表示方法相比较的劣势。
1.66 一艘飞碟坠毁在Nebraska的庄稼地里。联邦调查局检查了飞碟残骸,并在一个工程手册中发现了按照Martin数制系统写的等式:325+42=411。如果等式是正确的,Martin数制系统的基数是多少?
1.67 Ben和Alyssa在争论一个问题。Ben说:“所有大于0且能被6整除的正数的二进制表示中必然只有两个1”。Alyssa不同意。她说:“不是这样,所有这些数的二进制表示中有偶数个1”。你同意Ben还是Alyssa,或者都不同意?解释你的理由。
1.68 Ben和Alyssa又争论另外一个问题。Ben说:“我可以通过将一个数减1,然后将结果各位取反来得到这个数的二进制补码”。Alyssa说:“不,我可以从一个数的最低位开始检查每一位,从发现的第一个1开始,将后续的所有位取反来获得这个数的二进制补码”。你同意Ben还是Alyssa,或都同意或都不同意?解释你的理由。
1.69 以你喜欢的语言(C、Java、Perl)写一个程序将二进制转换为十进制。用户应输入无符号二进制数,程序打印出十进制值。
1.70 重复习题1.69,但是将任意基b1的数转换为另一基b2的表示。支持的最大基为16,使用字母表示大于9的数。用户输入b1和b2,然后输入基为b1的数。程序打印出基为b2的等价数。
1.71 针对下述逻辑门,给出其电路符号、布尔表达式和真值表。
(a)三输入或门
(b)三输入异或门
(c)四输入异或非门
1.72 针对下述逻辑门,给出其电路符号、布尔表达式和真值表。
(a)四输入或门
(b)三输入异或非门
(c)五输入与非门
1.73 表决器电路在多于一半的输入为TRUE时输出TRUE。请给出图1-41所示的三输入表决器真值表。
1.74 如图1-42所示的三输入AND-OR(AO)门将在A和B都为TRUE,或者C为TRUE时输出TRUE。请给出其真值表。
1.75 如图1-43所示的三输入OR-AND-INVERT(OAI)门将在C为TRUE,且A或B为TRUE时输出FALSE。其余情况将产生TRUE。请给出其真值表。
1.76 对于两个输入变量,请列出所有16种不同的真值表。对于每种真值表,请给一个简短的名字(例如OR、NAND等)。
1.77 对于N个输入变量,有多少种不同的真值表?
1.78 如果某器件的直流传输特性如图1-44所示,该器件可否作为反相器使用?如果可以,其输入和输出的高低电平(VIL、VOL、VIH和VOH),以及噪声容限(NML和NMH)分别是多少?如果不能用作反相器,请说明理由。
1.79 对图1-45所述部件重复习题1.78。
1.80 如果某器件的直流传输特性如图1-46所示,该器件可否作为缓冲器使用?如果可以,其输入和输出的高低电平(VIL、VOL、VIH和VOH),以及噪声容限(NML和NMH)分别是多少?如果不能用作缓冲器,请说明理由。
1.81 Ben发明了一个缓冲器电路,其直流传输特性如图1-47所示,这个缓冲器能正常工作吗?请解释原因。Ben希望宣称这个电路和LVCMOS和LVTTL逻辑兼容。Ben的这个缓冲器可否正确接收这些逻辑系列的输入?其输出可否正确驱动这些逻辑系列?请解释原因。
1.82 Ben在黑暗的小巷中碰到了一个两输入门,其转换功能如图1-48所示。其中A、B为输入,Y为输出。
(a)他发现的逻辑门是哪种类型?
(b)其大约的高低逻辑电平是多少?
1.83 对图1-49重复习题1.82。
1.84 用最少的晶体管画出下述CMOS逻辑门的晶体管级电路。
(a)四输入NAND门
(b)三输入OR-AND-INVERT门(参见习题1.75)
(c)三输入AND-OR门(参见习题1.74)
1.85 用最少的晶体管画出下述CMOS逻辑门的晶体管级电路。
(a)三输入NOR门
(b)三输入AND门
(c)二输入OR门
1.86 “少数”电路在少于一半的输入为TRUE时输出TRUE,否则输出为FALSE。请用最少的晶体管画出三输入CMOS“少数”电路的晶体管级电路。
1.87 请给出图1-50所示逻辑门的真值表。真值表的输入为A和B。请说明此逻辑功能的名称。
1.88 请给出图1-51所示逻辑门的真值表。真值表的输入为A、B和C。
1.89 仅使用类nMOS逻辑门实现下述三输入逻辑门。该逻辑门的输入为A、B和C。使用最少的晶体管。
(a)三输入NOR门
(b)三输入NAND门
(c)三输入AND门
1.90 电阻晶体管逻辑(Resistor-Transistor Logic,RTL)使用nMOS晶体管将输出下拉到LOW,在没有回路连接到地时使用弱电阻将输出上拉到HIGH。使用RTL构成的一个非门如图1-52所示。画出用RTL构成的三输入NOR门。使用最少数目的晶体管。
面试问题
1.1 请画出CMOS四输入NOR门的晶体管级电路。
1.2 国王收到了64个金币,但是其中有一个是假的。他命令你找出这个假币。如果你有一个天平,请问需要多少次才能找到哪个比较轻的假币?
1.3 一个教授、一个助教、一个数字设计专业的学生和一个新生需要在黑夜里经过一座摇摇晃晃的桥。这座桥很不稳固,每次只能有两个人通过。他们只有一把火炬,而且桥的跨度太大无法把火炬扔回来,因此必须有人要把火炬拿回来。新生过桥需要1分钟,数字设计专业的学生过桥需要2分钟,助教过桥需要5分钟,教授过桥需要10分钟。所有人都通过此桥的最短时间是多少?