Open cisen opened 2 years ago
https://www.jianshu.com/p/55e20e9e03cb 1.2:从芯片说起~芯片是如何工作的
前面一小节介绍了芯片是什么。我们虽然知道了芯片是个什么东西,但是仍然不知道芯片是如何工作的。我们还是要了解芯片的具体工作原理,才能真正理解编译器设计机器码、中间代码的原因。下面我们就从学习一个最简单的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)。与非门大家看懂了,这个就没啥好说的了。纯粹就是拿与非门实现了非门电路
非门电路与真值表
来了,重点来了,我们开始用基本的门电路搭建一bit的存储单元。数字电路有很多的稳定的状态(简称稳态),有的稳态输出0,有的稳态输出1。输出从0切换为1,或者从1切换为0,都只不过是外部条件触发从一个问题切换到另一个稳态。
废话不再多说,上电路图:
1bit存储电路 我们来分析下电路的输出:
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内存单元。支持写入,支持读取。
1bit我们做好了,8bit就是集合8个1bit单元。用一个开关位控制(如果多个开关位也可以,那就表示CPU支持位操作指令)
8bit存储单元
我们先来介绍一个新的电路,由多个与门电路组成。这个电路当e关闭时,无论i输入怎么变化,输出的值都是0。当e打开时,输出和输入保持一致。
使能电路 我们把这个电路和前一个电路串联起来,得到下面这个电路,这个就是我们后面要用到的8bit寄存器了。这个电路很重要,前面的B允许我们读取输入并保存起来(无论输入后面怎么变化)。后面的E允许我们该输出的时候才输出:
寄存器电路 再来加入一个关键概念总线:
我们把8bit线的连接用“=”符号替换,这就是总线了。这里也能看出一个重要概念,总线其实是有位数的概念的。
符号简化后的总线
其他表示方法
再来最后一个译码器电路。其实就是将abc的值,翻译成具体的值。
译码器 好了,我们可以继续了。有了这些背景知识,你就可以做一个CPU了。下个小节我们正式开始
https://www.jianshu.com/p/cda38610c5a3 1.3:从芯片说起~自己动手做RAM
我们在1.2小节给大家展示了芯片的电路图,也介绍了一些基本的门电路知识。下面我们就迈出万里长征第一步,自己动手做RAM。期望大家自己动手用仿真器制作一下,这样动手实操过,那就一切搞明白了。
256字节RAM
工具:
仿真器:Logisim。
链接:http://www.cburch.com/logisim/download.html
优点:不用买硬件,对于不舍得花钱买硬件或硬件开发小白的同学是个开发神器(我也是硬件小白[微笑])。
1.2小节我们介绍了1BIT内存单元的电路,下面我们先试验一把,给大家看下仿真的效果。
1bit内存电路动图
1bit电路 是不是很简单:
开关S打开(左边的小绿框显示1):输出O = 输入I
开关S关闭:输出O的值保持不变。
大家有没有想过这个问题:开关S关闭,输入I=0时,又没人给O供电,O咋就保持1了呢?
门电路实际供电
实际上门电路的输入只是起到开关作用,并不会供电。供电是单独的,所以输出可以保持1(高电平)。这里也能看到,其实芯片设计是和硬件强相关的,你要考虑供电、压降、电流、热效应等等半导体特性问题,怎么样保证电路能否正常工作,其实是个很难的问题。要不然高通芯片也不会被人叫火龙了。
8bit电路图
8bit电路 8bit没啥稀奇的地方,就是把8个1bit电路并联了起来。按照1.2节,我们再加上ENABLE电路
enable电路
enable电路 串联ENABLE和8BIT组成REGISTER电路:
register电路 依然很简单,对不对?看着这复杂的连线,开始有点集成电路图的意思了。我们继续来个更复杂的,制作64K RAM。
我们有了256个字节,不再是只有一个字节了。那么如何在“256个字节“中,选中我们要改变的那个字节呢?毕竟我们的总线宽度是8bit,一次只能操作一个字节。
使用4*16译码器选中想要的BYTE:
4x16译码器工作动图
每次右边只有一根线为高电平,代表选中状态。
4x16译码器完整电路图
增加观察点,观察寄存器内部的值。方便后续仿真调测
增加复位功能。当复位使能时,可以一次性将所有字节设置为0。
增加观察点和复位功能 译码器连接256个REGISTER 译码器连接register
总结
https://www.jianshu.com/p/55e20e9e03cb https://www.jianshu.com/p/cda38610c5a3