CPU主要包括逻辑运算单元和存储单元,我们讲讲半导体如何实现逻辑运算功能和存储功能。
半导体实现逻辑运算的功能,这很大程度源于MOS晶体管开关切换的频率可达一秒几百次,几万次,甚至几千万次。但是具体是如何根据这个特性实现CPU逻辑运算功能的呢,下边会有详细的说明。
而半导体实现存储功能,其实就是写入并保持区分两个不同的状态就好,这样就可以记录二进制数据,也就可以记录数据世界了。
逻辑运算
逻辑运算的理论基础是数理逻辑学的布尔代数,布尔代数的基础就是,与(AND)、或(OR)、非(NOT),这是高中学到的概念。
其中三大基本逻辑电路(也叫门电路)就是NOT电路(非门)、OR电路(或门)、AND电路(与门)。三生万物,这三大门电路可以组成所有有趣的逻辑运算电路,以实现数字运算和逻辑运算。而一般一个普通的民用CPU中,就有数以亿计的这种逻辑电路,如此才成就了我们现在的高性能计算机。大型游戏的实况模拟、高采样率高压缩率视频音频的解码、动漫电影行业的视频图片渲染、各类应用的秒开等、各种民用、军事国防、科研计算等许多情形都需要强大的计算能力保证,故人类一直不懈努力地追求更高性能的计算。
当我们通过鼠标,键盘下达指令,用电脑进行播放视频,浏览网页等操作时。CPU在干嘛呢?这些指令通过具体的应用程序和操作系统,传达到CPU,CPU只是做数字逻辑运算和数据写入存储而已。
那么什么是数字运算和逻辑运算?
数字运算也就是加减乘除四则运算,比如加法电路,分为不考虑从后一位进位的半加法电路和考虑从后一位进位的全加法电路,减法电路,分为不考虑从前一位借位的半减法电路和考虑借位的全减法电路。
逻辑运算,也就是一些基本逻辑判断,比如比较电路(比较两个信号大小),异或电路(判断两个信号是否一致)。
注意,CPU的数字和逻辑运算,都是在二进制下进行的,比如,我们说的加法57+23,电脑会转换成二进制数字后进行计算,57的二进制数是111001,23的二进制数是10111,所以电脑做加法是111001+10111,之后有需要时,再将这些数换算成十六进制数或者十进制数。
实现以上这些运算的电路我并不打算长篇累牍去展开讲,有很多优秀成熟的书籍都讲得非常好,如果想要了解,可以去翻阅教科书。
在此我打算讲讲,如何用几个MOS晶体管,构成三大逻辑电路之一的NOT电路(也叫非门、反相器,其实用一个CMOS就构成了NOT电路,也就是实现取反的功能,输入0,输出1;输入1,输出0。
Figure 反相器电路图和工作原理,引用自图灵社区:http://www.ituring.com.cn/book/tupubarticle/1768
其中,最左边的图标注了①-⑥一共6个节点。
- 是输入信号,⑥是输出信号;
信号②和③是两个MOS晶体管的栅电极;
信号④,VDD为工作电压,假设为5V;
信号⑤,VSS接地,0V。
之前已经说过,简而言之,MOS是一个开关,和普通开关的区别是,它不是人用手去按这个开关,它是用一个电信号去代替人的手按开关,来控制电路的通断,且其开关频率可以做到很高,一秒内可以开关几百万次甚至更多(随意估计的,真实范围可以跨度更大)。栅电极②和③就是这个“控制开关的手”,只要给栅电极②和③输入电信号,就可以分别控制两个开关的连通和断开,而PMOS和NMOS的具体区别就是:
上边的P型MOS,当②处给高电压,④和⑥断开;当②处给低电压,④和⑥连通。
而下边的N型MOS,刚好相反,当③处给高电压,⑤和⑥连通;当③处给低电压,⑤和⑥断开。
我们假设,高电压5V是信号1,低电压0V是信号0,那么按照以上PMOS和NMOS的工作原理,就可以很容易知道,取反是如何实现的了,如下:
当输入信号①处输入高电压5V(信号1),也就是②③处都给高电压,此时PMOS断开,NMOS连通,输出信号⑥和接地⑤,0V连通,即输出信号⑥是低电压0V(信号0)。
反之,当输入信号①处给低电压0V(信号0),也就是②③处都给低电压,此时PMOS连通,NMOS断开,输出信号⑥和工作电压④连通,即输出信号⑥是高电压5V(信号1)
呀哈!!从上面可以看到神奇的事情已经发生了,输入0,输出1;输入1,输出0!这就是我们想要的反相器功能。
而三大基本逻辑电路中的OR电路,AND电路用MOS晶体管的具体实现思路差不多,就不展开讲了。当我们可以实现了,与(AND)、或(OR)、非(NOT)三大基本门电路,就可以用这些门电路来组合实现更复杂的电路,来实现加减乘除等算法。具体看数电相关的教科书。
另外,网上有很多相关的优秀的回答和科普,关于CPU是如何实现计算的,链接如下:
如何通俗的解释计算机是如何实现1+1=2计算的?再推荐一本相关的书《编码:隐匿在计算机软硬件背后的语言》,接下来讲讲存储器。
存储器
大家应该对存储器的存储原理很好奇,一块小小的硬盘或者U盘,他究竟是如何存下海量的音乐,视频,文档和其他各种电子资料呢?
首先,万物皆可量化(也就是模拟信号转化为数字信号),比如室温25摄氏度,身高178厘米,声音频率440HZ。图像1920*1080分辨率,某个像素点(绿色)的RGB值(R:0 G:255 B:0),北京的坐标是39.9042° N, 116.4074° E,海拔100m,而文字、字母、标点符号等则可以通过ASCII码等各种编码方式转换成数字,比如”I love you!”的十六进制ASCII码表示为:\x49\x20\x4c\x6f\x76\x65\x20\x59\x6f\x75\x21。
从以上的例子,我们知道,其实存储器并不是将一个图片,一段视频,一个文档,变得很小很小存放在一个一个小格子里面的(说不定某个魔法或者神话世界是这么存储海量东西的)。而是将它们全都转化成了一串串的二进制数字记录下来了。
而现在,问题就简化为,存储器是如何存储二进制数字的,更加简单一点儿说,存储器是如何记录0和1的。
简单些说,半导体导电性能可控,所以控制某个半导体器件,将其变为绝缘体,就表示为0;将其变为导体,就表示为1,好了,现在有了0和1,然后我们就可以用成千上万的半导体器件,存储下0和1的字符串,比如101010110111000111100101,就这样实现了存储啦!
就这么讲完了,我估计大家听了想打人。所以接下来更详细一下讲讲,存储器是如何记录0和1的,如下图,是一个内存单元。
图中①处:字线(Word Line,有些书上也写作Address Line)连接着N型MOS晶体管的栅极
图中②处:电容的正极连接着N型MOS的源极
图中③处:位线(Bit line,有些书上也写作Data Line)连接着N型MOS的漏极。
在此处这个存储单元中:
当字线(Word Line),也就是①处给高电压,N型MOS的开关连通,也就是②和③连通;此时如果位线,也就是③处,给高电压,就给左边的电容充电,电容充电状态表示写入信号1;如果位线给低电压,左边的电容放电,写入信号0。
而读取就是字线①处给高电压时候,N型MOS开关连通,根据从电容中放电还是充电,监测③处的电势,作为1或者0被检验出来。
以上就是0和1信号的写入和读取过程,之后就大量复制这样的单元,形成阵列,就是我们通常意义上的存储器啦。
以上说的这种内存叫做DRAM(动态随机存取存储器,Dynamic Random Access Memory),DRAM是挥发性内存,其切断电源后,信息会消失,并且即便是在接通电源的前提下,用于存储信息的电荷也会由于电容的漏电而慢慢消失,因此隔一段时间必须进行电荷补充,也就是刷新。其实存储器,远不只有DRAM这一种,还有SRAM、ROM等许多许多种类,就不展开讲了,想要进一步了解请查阅专业书籍。
另外,其实人们存储数据不是原封不动地将其转换为二进制数据存储的,人们为了节省空间,会通过某些算法来压缩这些存储数据,以使相同的存储空间,能存下更多的数据,比如图像从RAW格式到JPG格式,比如说视频从mts格式到rmvb格式,比如说音频从wav格式到mp3格式。比如说某个文件夹到7z的压缩包,这些都是压缩。
最后,存储的数据,有时候也会写入和读取出错,特别是这种几亿几十亿个字节的存储,所以,就有许多校验码的存在,比如奇偶校验码、海明校验码等,以保证数据在写入、读取和传递出错的时候,可以被纠正过来。(如图是奇偶校验码,是一种增加二进制传输系统最小距离的简单和广泛采用的方法。是一种通过增加冗余位使得码字中"1"的个数恒为奇数或偶数的编码方法,)