前面一小节介绍了芯片是什么。我们虽然知道了芯片是个什么东西,但是仍然不知道芯片是如何工作的。我们还是要了解芯片的具体工作原理,才能真正理解编译器设计机器码、中间代码的原因。下面我们就从学习一个最简单的8位CPU的设计原理,来搞懂芯片到底是如何工作的。当前CPU设计已经很复杂了,原理也和本文的内容有很大差异,但是万变不离其宗,最基本的原理还是一致的。
注:本小节内容主要是对《But How Do It Know? - The Basic Principles of Computers for Everyone》一书的理解总结,这本书目前还没人翻译。建议英文条件好的同学都去买英文原本看下,或者网上也有电子书。
学过数字电路的同学是不是感觉上面的电路图并不复杂?目测就一百多个门电路和封装好的译码器、移位器等拼一块儿竟然就成了一个8位CPU芯片。最右边是输入机器码的地方。红色是每个时钟电路的通路。
记住这一点:CPU芯片本质上只是在不断的重复取指令、计算、输出结果,而取值、计算、输出本质上就是芯片内部的不同通路。而不同通路的选择以及值的传递靠的是门电路。下面我们就来从头开始DIY自己的8位CPU芯片,借此理解芯片的工作原理。
开始动手DIY芯片之前,我们要了解一下基础的数字电路。这些并不复杂,只要你懂基本的逻辑运算就可以。门电路只不过换了一种符号体系来表示数学运算。
与非门
c = !(a & b),其中c是输出,a、b是输入。这个计算公式表达的含义就是将a、b做与运算后再取非。注意:a和b都是一根线,换句话说都是一个bit。对应数字电路的与非门:
请各位同学记住:这是这个芯片里面最重要的基本电路。
非门
c = !(a & a)。与非门大家看懂了,这个就没啥好说的了。纯粹就是拿与非门实现了非门电路
1bit存储单元
来了,重点来了,我们开始用基本的门电路搭建一bit的存储单元。数字电路有很多的稳定的状态(简称稳态),有的稳态输出0,有的稳态输出1。输出从0切换为1,或者从1切换为0,都只不过是外部条件触发从一个问题切换到另一个稳态。
废话不再多说,上电路图:
我们来分析下电路的输出:
1.i=0 s=1。此时a=1,b=0,c=1,o=0。
2.i=1 s=1。此时a=0,b=1,o=1,c=0。
规律1:当s=1时,o的值和i保持一致。i就是输入,o就是输出。
3.i=0, s=0。此时a=1,b=1,o和c的值既可以是0,也可以是1,或者说保持原有值。
4.i=1, s=0。此时a=1,b=1,o和c的值既可以是0,也可以是1,或者说保持原有值。
规律2:当s=0时,o的值维持自己的值不变,无论i怎么变化。
看到没!!!规律1+规律2是不是造就了一个可以保存输入值的电路,这就是1bit内存单元。支持写入,支持读取。
8bit存储单元
1bit我们做好了,8bit就是集合8个1bit单元。用一个开关位控制(如果多个开关位也可以,那就表示CPU支持位操作指令)
总线
我们先来介绍一个新的电路,由多个与门电路组成。这个电路当e关闭时,无论i输入怎么变化,输出的值都是0。当e打开时,输出和输入保持一致。
我们把这个电路和前一个电路串联起来,得到下面这个电路,这个就是我们后面要用到的8bit寄存器了。这个电路很重要,前面的B允许我们读取输入并保存起来(无论输入后面怎么变化)。后面的E允许我们该输出的时候才输出:
再来加入一个关键概念总线:
我们把8bit线的连接用“=”符号替换,这就是总线了。这里也能看出一个重要概念,总线其实是有位数的概念的。
译码器
再来最后一个译码器电路。其实就是将abc的值,翻译成具体的值。
好了,我们可以继续了。有了这些背景知识,你就可以做一个CPU了。下个小节我们正式开始
本文由梁桂钊于2023-09-13发表在梁桂钊的博客,如有疑问,请联系我们。
本文链接:https://720ui.com/13038.html