【工程实践保姆级教程】第12讲:从半导体电路到计算机
不知道我的读者里面有没有Minecraft玩家。考拉自己没有玩过Minecraft,但是在高中的时候,听说有人在一个游戏中自己用积木搭出了计算器,感到不可思议。后来稍微认真的学习了一下,主要靠的是有开关特性的“红石电路”,这种模块可以起到像半导体三极管一样的开关控制功能。也就从那时起,开始对数字电路到计算机的原理产生了极大的兴趣。 我们今天就来讲讲,计算机是怎么“搭积木”搭出来的。计算机的本质是半导体电路,但是大家在大学以前都很难接触到这些东西,考拉帮大家梳理一下这里面的一些思路。喵星考拉:【工程实践保姆级教程】从原理看半导体放大电路 首先,在高中物理书里面,有提到一些基本的逻辑:
在这里面,我们把开关的打开和关闭作为输入,把灯泡的亮暗作为输出,也提到了最基本的逻辑关系:与、或、非。 在这个电路里面,开关是需要人用手去拨动的。有没有可能用电去控制电的通断?大家可能会先想到“继电器”,但是继电器结构复杂(想象一下如果一个电路需要数以亿计的继电器,那继电器就算很复杂的了),难以大规模使用;实际上现在所用的电子开关,就是昨天提到的晶体管:
昨天提到三极管的比例放大特性:可以用一个小电流比例控制一个大电流的流动:
但是比例特性一定是有限度的:阀的开口有限度,当我们给基极的电流足够大的时候,集电极和发射极之间的导通程度就不能再大了;另外集电极的电源也不允许输出无穷大的电流。在这种情况下,三极管就不当成比例件使用,而是当成电子开关使用:给基极加上电压,开关导通;基极不加电压,开关关断,这就是一个最简单的开关。两个晶体管可以组合成一个非门电路:
下方的这个晶体管,称为N沟道金属氧化物半导体场效应管(表示场效应管导通时导通的沟道为N型)(N-type metal–oxide–semiconductor FET,N-MOSFET,简称NMOS)。上方的这个晶体管称为P沟道MOSFET,简称PMOS。NMOS和PMOS结合在一起,叫做CMOS(Complementary metal–oxide–semiconductor互补金属氧化物半导体),玩摄影的是不是很熟悉这个词?
NMOS和PMOS的特性是相反的。当我们给A端加一个高电平,这个时候NMOS会导通,PMOS关断,这样Y就等于是接地了,输出低电平。当我们给A端加低电平,这时候NMOS关断,PMOS导通,Y输出高电平。 非门是最简单的门电路。接下来开开脑洞:用非门就可以组合成与非门和或非门:
中间的门电路,当A、B有一个为低,输出为高;当A、B两个都为高,输出为低。我们以“1”代表高,“0”代表低,则A、B两个都为1时输出才为0,此谓与非门。右边的门电路和中间的是相反的结构,可以推出A、B两个都为0时输出才为1,也就是说A、B只要有一个为1,输出就为0,此谓或非门。 与非门和或非门如果想要变成与门、或门,就在后面再接一级非门:
上方的这个电路就是一个或非门加一级非门变成或门。当然这里会发现与门、或门的结构比与非门、或非门的结构复杂,这也就是数电里面我们经常想要基于与非门、或非门进行设计的原因。 另外,这个结构是可以增加级数的。比如我们想要有ABC三个输入的与非门:
还有一些比较复杂的门电路:比如异或门,A和B相同输出1,A和B不同输出0:
到这一层,我们就实现了从半导体到门电路。门电路是逻辑电路的基本单。由于门电路是基本单,所以就不再以这么复杂的电路结构表示门电路,而是简化成一个个的符号:
接下来我们要来了解一下电脑数据处理的一些基本逻辑: 先从最简单的加法开始:我们平时学数学的数制是十进制,而计算机采用的数制是二进制,也就是满二进一。二进制的好处是刚好和电路的通/断、开关的开/闭、电平的高/低之间建立起对应关系,所以结构非常简单。 先来看一位数的加法: 一位数的加法,A+B,会产生两个结果。其中一个结果是本位,我们知道0+0=0,1+1=10(本位为0),0+1=1。所以当A和B不同的时候,本位取1;A和B相同的时候,本位取0。这个逻辑就是刚才说的异或逻辑。接下来第二个结果是进位。我们知道只有1+1才有进位,所以这个时候进位和输入之间是与的关系,需要一个与门。
这个电路叫做半加器,因为没有考虑到前一位的进位,所以称为半加。如果需要考虑前一位怎么计算?这时候相当于是把这两位相加的结果再去和前一位的进位相加。这时候向前的进位有两种可能:一种是A和B相加得到的进位,一种是AB相加的结果和前一位进位相加得到的进位。我们知道两个进位至多有一个能满足(想象为什么),所以把两个半加器的进位结果进行“或”之后输出为向前的进位。这个电路就叫做全加器。
然后全加器也是基本单,所以也给画成了一个框:
一个全加器可以做一位二进制的全加。是不是听着觉得微不足道?但是把几十个全加器串联在一起,就可以做一个几十位数的全加了:
全加器的位数越多,一次性能计算的数据就越大。我们常说的32位、64位CPU,指的就是计算机中一次能计算的字长。32位的软件当然可以在64位硬件上跑,但是软件上只能利用到32位的部分。如果要做比较长的加法,可能就要分几次加,就会比较花时间。所以64位的软件会比32位效率要稍微高一些。 当然,实际的计算机不会这么简单。因为每一个全加器从输入数据到输出结果都需要时间;而每一个全加器都需要等低一位的全加器输出进位之后才能计算。64位全加器要等63次的进位结果。现在的计算机有各种各种硬件上的优化算法,但是原理上还是一样的。 现在加法可以做了,我们来看看减法需要怎么做。 这是个很有趣的问题。因为在计算机里面,我们为了加法设计了一整套电路,如果还要为减法再设计一套电路,就太麻烦了。于是研究者们“投机取巧”地用加法器实现了减法的运算。怎么做到的?考拉还记得,在上上上上古时代,考拉还在上幼儿园的时候,老师在教我们减法。比如说15-7,5减去7不够减,可以先加上7的“好朋友”3,变成18,再减去10,得到8。
这个教法虽然在23岁的我看来相当的弱智,但是这就真正是计算机把减法变成加法的方法。考虑一下,现在家里的时钟坏了,你换了个电池,需要调。现在是下午4点,时钟显示的是11点。最常规的方法就是往前拨7个小时,因为11-7=4。 但是还有另一个方法,我们可以往后拨5个小时。11+5=16,但是因为时钟是满12进一的,所以超过12的部分会自动被过滤掉,所以11+5=4。所以在时钟上加五等于减七(五加七等于十二);同理加4等于减8,加3等于减9。想明白了吗?我们来看看计算机是怎么实现的。 假设我们计算机的加法器是4位加法器,这个时候是满16的部分会自动减去16.[1111代表15,1111+1=(1)0000]。也就是说满16变0。所以如果有一个数是-7,在这个系统里面就可以记为+9,那么加上(-7)就等于加上(9)。这里的9称为-7的补码。进一步地,在计算机里面,对一串的二进制数我们是会把首位作为符号位的;比如说一个八位的二进制数,如果不考虑符号,8位二进制最大值是255,其中最前面一位的1代表128。我们干脆就让这个八位数只能表示0~127之间的正数,这样的话所有正数的首位都是0。而且任何一个0~-127之间的数要取补码都会大于等于127,这样首位是1。这样的好处是在加减法上不会产生矛盾。比如说我们看看64和30的运算: 64==0 30==00011110 64+30当然没问题 0 + 00011110= 0 ==94 接下来,64-30。64-30=64+(-30),为此要先求-30的补码。这个系统满256进一,所以-30的补码是256-30=226=128+64+32+2== 64-30: 0 + = 00==32+2=34如果是30-64呢?30-64=30+(-64),-64的补码是256-64=192== 00011110 + = 得到的数第一位为1,所以是负数,这里显示的是负数的补码222。实际的负数应该是222-256=-34. 弄懂了补码,接下来我们来看看乘除法。 实际上二进制的乘除法非常简单:乘法只是对一个数做移位和相加,触发只是对一个数的移位和相减:
乘法器的结构要比加法器要复杂,但是总体来说都是以规模的形式实现的:
这个时候会有些人想:我们高中学的各种指数、对数、三角函数,到底怎么样才能算出来?实际上计算机计算这些不能用加减乘除表示的超越函数,采用的都是用多项式逼近的办法,具体的理论知识来自于泰勒级数:
计算机计算这些函数,都只能计算到近似值,因为都是无限不循环小数,精度达到我们的要求就可以了。至于积分,计算机也是把连续化为离散,计算数值积分:
讲到这里大家就会大概明白,运算的部分,都是用电路搭出来的。计算机的CPU分为运算器和控制器。运算器主要负责的是算术运算(也就是加减乘除)和逻辑运算(也就是与或非等)。逻辑运算,就包括各种编码、解码的工作,比如把4位二进制数(可以表达0~9,A~F共15个数)转化为一个7位数码管上7个LED的开关:
另外CPU内会有寄存器和高速缓存(也就是大家看CPU参数里面的各级cache)。另外,显卡,也就是GPU,之所以要单独做一块芯片,是因为显卡处理的数据和CPU处理的数据类型不一样。针对处理的数据对显卡的硬件进行优化,处理速度就会更快。这一块相关的内容大家可以查阅相关资料:CPU 和 GPU 的区别是什么? 除了运算,接下来很重要的内容就是存储器了。存储器其实分很多种,比如说内存和硬盘就是两大类型。硬盘是物理记录,依靠磁盘的磁粉指向来区分0或1;闪存(也就是U盘)的存储单是EEPROM,具体的原理也可以查相关资料。我们这里讲解一下简单的内存的原理。 硬盘相当于书柜,内存相当于书桌。当我们干活的时候,从书柜里拿出书,放到桌面上,当任务完成的时候,要清空桌面,把东西放回书柜。硬盘的内容是可以断电保存的,但是内存的内容在断电后就会丢失。内存也是由一个一个位的存储单组成的,其中一位的存储单长这样:
这个存储单和前面的门电路有个不一样的地方,就是它的输出和它的输入又耦合在一起。当我们的电路有一个初始状态时,如果外界不加干扰,这个初始状态(0或1)就会始终保持在电路中,直到外界对电路写入新的数据。比如现在电路中存储着一个“0”(如图),如果R、S都为0,那么这个“0”会一直锁存在电路中;如果给S端置“1”,那么电路中就会存储一个“1”。这个结构称为锁存器,是内存的基本单。但是内存有千千万万个锁存器,我们希望数据的存储和读取都是有规律有安排地进行。所以对于这个结构,需要给前面加一级:
加入前级之后,我们采用一个脉冲信号(计算机中称为时钟信号)发送指令。当脉冲信号置1时,R、S的信号能传入锁存器;脉冲信号置0时,R、S的信号不能传入锁存器。增加了前级的这个电路称为触发器。内存是一个个的触发器组成的。 但是这种触发器有一个问题:开启时间太长。如果时钟频率是1MHz(当然现在CPU要远比这个速度快),那么每个高电平脉冲是0.5us,在这段时间里面高高低低的任何信号都会导致锁存器的内容改变,实际最终取决于脉冲变低的那一刻。于是大家改了改触发器的结构,使得触发器只在时钟跳变的时候存储数据:
触发器起到了记忆电路状态的功能。基于触发器的电路,其输出结果不仅由当时的输入决定,也由电路里面记忆的内容决定。这种电路称为时序电路。比如最简单的,一个反转开关,可以由一个触发器组成:
多个开关组合起来,可以做一个分频电路。后一级脉冲的频率是前面的一半:
还可以做一个移位寄存器,寄存器内的数据随着脉冲而移动:
基于移位寄存器可以做一个循环计数器:
通过基本的电路件,可以实现各种各样的算数、逻辑基本功能。如果我们对一些门电路阵列赋予人工编程的功能,就可以根据使用者的需要进行编程获得所需要的功能。这种设备叫做可编程逻辑门阵列(FPGA)。FPGA一般是信工专业的同学搞的,反正我看verilog是一头雾水,还望大佬提携:
FPGA可以直接编程成为一种控制器。不同于Arduino、STM32等单片机,FPGA是完全基于硬件的编程,因此处理速率非常快(比如Arduino想要给输出口设置四个高电平,就需要四行digitalWrite()函数,每行代码的执行会有一定的时间间隔;但是在FPGA编程中,就是一个开关控制四个并联输出,开关按下,四个端口同时输出,这在设计一些高速硬件的时候很重要)。以上所说的这些,就是计算机最底层用电路执行指令的原理了。这儿只是个引子,深入的知识欢迎大家学习《数字电子技术》和《计算机原理》。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/86236.html