前言
当你打开手机,聊天、购物、刷视频的时候,有没有想过,手机是如何工作的?但凡完成九年义务教育的学生都大概知道不论手机还是电脑,其心脏有一颗心脏————CPU。了解过新闻的人士都知道,我国在CPU方面一直被欧美卡脖子。你是否好奇这个CPU是怎么进行工作的呢?又为什么难以设计制造呢?
CPU是一堆晶体管组成的逻辑门电路,单个门电路结构也不是很复杂,学过数字电路的都容易理解。但是从简单的逻辑门电路怎么就组装成一个可以刷视频的手机心脏呢?脑子有点跟不上了。现在的CPU已经高达几百亿个晶体管,非常人可以阅读了。我们得从计算机的历史说起。
二进制指令
现在习惯了Java、Python、JS、C、C++等高级编程语言,而却对计算机底层却越来越模糊。高级编程语言是不能直接被CPU理解的,经过编译等翻译成CPU可以识别的机器码才能执行。
早期的计算机,没有高级编程语言,用二进制进行编程。例如早期的打孔卡录入程序。打孔卡和我们的答题卡很像,打孔的表示1,不打孔表示0。但实际是一串二进制编码。 
外行人看来,好像是毫无规律的0和1,但是科学家们对数据制定了规则。比如第0~6位是操作码,第n~m代表地址,第p~q是数据等等。然而有了规范CPU就能读取吗?还不行。科学家们按照制定的规范,还得设计相应的电路。这样CPU就能知道如何截取和操作输入的二进制串了。这里的规范就是指令集,设计的电路就是CPU的解码器等。 指令集如果用二进制不方便人类阅读,于是又整理出来汇编语言。汇编指令翻译成CPU可以执行的机器码。 指令集和CPU的电路设计是配套的,只要电路能实现指令集功能即可,可以有不同的实现方式。例如Apple的M系列芯片只是采用了ARM的指令集,没有使用ARM的设计电路,而从0设计的电路。

译码器
所谓的操作码也无非是一串0和1组成的数字,那么这怎么对应操作呢?这里得用到译码器。译码器把操作码对应到特定的电路上,从而完成特定的操作。 例如,七段数码管的显示。数码管显示0~9个数字对于人是有意义的,每个数字对应多个数码管段,如何按0~9显示,这个电路就是译码器。
CPU电路图
说了这么多,CPU到底里面什么样子呢?下面是著名的6502CPU电路图,6502曾经是Apple I的CPU。虽然年代久远,但是麻雀虽小五脏俱全。对于理解CPU有很大的帮助。 在没有计算机制图的年代,科学家们用手工绘制图纸。


