cisen / blog

Time waits for no one.
133 stars 20 forks source link

RAM #1122

Open cisen opened 2 years ago

cisen commented 2 years ago

总结

https://www.jianshu.com/p/55e20e9e03cb https://www.jianshu.com/p/cda38610c5a3

cisen commented 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》一书的理解总结,这本书目前还没人翻译。建议英文条件好的同学都去买英文原本看下,或者网上也有电子书。

芯片内部什么样子

芯片电路图 27222352-92409a4dd8319763

学过数字电路的同学是不是感觉上面的电路图并不复杂?目测就一百多个门电路和封装好的译码器、移位器等拼一块儿竟然就成了一个8位CPU芯片。最右边是输入机器码的地方。红色是每个时钟电路的通路。

记住这一点:CPU芯片本质上只是在不断的重复取指令、计算、输出结果,而取值、计算、输出本质上就是芯片内部的不同通路。而不同通路的选择以及值的传递靠的是门电路。下面我们就来从头开始DIY自己的8位CPU芯片,借此理解芯片的工作原理。

一点背景知识

开始动手DIY芯片之前,我们要了解一下基础的数字电路。这些并不复杂,只要你懂基本的逻辑运算就可以。门电路只不过换了一种符号体系来表示数学运算。

与非门

c = !(a & b),其中c是输出,a、b是输入。这个计算公式表达的含义就是将a、b做与运算后再取非。注意:a和b都是一根线,换句话说都是一个bit。对应数字电路的与非门:

与非门 27222352-98c4376dde8af565

27222352-532561ce0509e58d

真值表 请各位同学记住:这是这个芯片里面最重要的基本电路。

非门

c = !(a & a)。与非门大家看懂了,这个就没啥好说的了。纯粹就是拿与非门实现了非门电路 27222352-cf9f78650264a9b0

非门电路与真值表

1bit存储单元

来了,重点来了,我们开始用基本的门电路搭建一bit的存储单元。数字电路有很多的稳定的状态(简称稳态),有的稳态输出0,有的稳态输出1。输出从0切换为1,或者从1切换为0,都只不过是外部条件触发从一个问题切换到另一个稳态。

废话不再多说,上电路图: 27222352-36ad1ca019ae5453

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内存单元。支持写入,支持读取。

8bit存储单元

1bit我们做好了,8bit就是集合8个1bit单元。用一个开关位控制(如果多个开关位也可以,那就表示CPU支持位操作指令) 27222352-047d790e49fef6b9

8bit存储单元

总线

我们先来介绍一个新的电路,由多个与门电路组成。这个电路当e关闭时,无论i输入怎么变化,输出的值都是0。当e打开时,输出和输入保持一致。 27222352-4dac326c8a9294c0

使能电路 我们把这个电路和前一个电路串联起来,得到下面这个电路,这个就是我们后面要用到的8bit寄存器了。这个电路很重要,前面的B允许我们读取输入并保存起来(无论输入后面怎么变化)。后面的E允许我们该输出的时候才输出: 27222352-0c4616acd4eedc20

寄存器电路 再来加入一个关键概念总线:

我们把8bit线的连接用“=”符号替换,这就是总线了。这里也能看出一个重要概念,总线其实是有位数的概念的。

符号简化后的总线 27222352-d0488701e4d3cf03

27222352-b4f47bfab1b24462

其他表示方法

译码器

再来最后一个译码器电路。其实就是将abc的值,翻译成具体的值。 27222352-acb1a5743d910332

译码器 好了,我们可以继续了。有了这些背景知识,你就可以做一个CPU了。下个小节我们正式开始

cisen commented 2 years ago

https://www.jianshu.com/p/cda38610c5a3 1.3:从芯片说起~自己动手做RAM

我们在1.2小节给大家展示了芯片的电路图,也介绍了一些基本的门电路知识。下面我们就迈出万里长征第一步,自己动手做RAM。期望大家自己动手用仿真器制作一下,这样动手实操过,那就一切搞明白了。

完整电路图:

256字节RAM 27222352-5c7ac031bd87c5cd

工具:

仿真器:Logisim。

链接:http://www.cburch.com/logisim/download.html

优点:不用买硬件,对于不舍得花钱买硬件或硬件开发小白的同学是个开发神器(我也是硬件小白[微笑])。

1BIT:

1.2小节我们介绍了1BIT内存单元的电路,下面我们先试验一把,给大家看下仿真的效果。

1bit内存电路动图 27222352-582a0e87a9d640b3

1bit电路 是不是很简单:

开关S打开(左边的小绿框显示1):输出O = 输入I

开关S关闭:输出O的值保持不变。

大家有没有想过这个问题:开关S关闭,输入I=0时,又没人给O供电,O咋就保持1了呢?

门电路实际供电

实际上门电路的输入只是起到开关作用,并不会供电。供电是单独的,所以输出可以保持1(高电平)。这里也能看到,其实芯片设计是和硬件强相关的,你要考虑供电、压降、电流、热效应等等半导体特性问题,怎么样保证电路能否正常工作,其实是个很难的问题。要不然高通芯片也不会被人叫火龙了。

8BIT:

8bit电路图 27222352-1a2fc401baa28b40

8bit电路 8bit没啥稀奇的地方,就是把8个1bit电路并联了起来。按照1.2节,我们再加上ENABLE电路

enable电路 27222352-4eedfc68105132a9

enable电路 串联ENABLE和8BIT组成REGISTER电路: 27222352-582a0e87a9d640b3

register电路 依然很简单,对不对?看着这复杂的连线,开始有点集成电路图的意思了。我们继续来个更复杂的,制作64K RAM。

256 Byte RAM

我们有了256个字节,不再是只有一个字节了。那么如何在“256个字节“中,选中我们要改变的那个字节呢?毕竟我们的总线宽度是8bit,一次只能操作一个字节。

使用4*16译码器选中想要的BYTE: 27222352-5cad9138e4bb5942

4x16译码器工作动图 27222352-4c57f1f7f8a46a07

每次右边只有一根线为高电平,代表选中状态。

4x16译码器完整电路图 27222352-cbe027d5400a5f9c

完善REGISTER电路

增加观察点,观察寄存器内部的值。方便后续仿真调测

增加复位功能。当复位使能时,可以一次性将所有字节设置为0。

增加观察点和复位功能 译码器连接256个REGISTER 译码器连接register 27222352-bec8cf304bb99db8