简易计算机的搭建
1、一些无关紧要的前置知识
现代计算机类设备的主流架构一般有两种:一为冯诺依曼体系架构;一为哈弗架构。
主流计算机采用的架构一般为冯诺依曼体系,是将程序和数据放在一起存储的架构;
单片机设备一般采用哈弗架构,是将程序与数据分开存储的一种架构。
以下基本都是有关冯诺依曼架构的知识
冯诺依曼架构提出计算机由四个子系统构成:存储器(寄存器、内存、硬盘)、计算单元(ALU)、控制单元(进行协调各个单元)、输入输出单元(外设)。
CPU(中央处理器)是由寄存器、计算单元、控制单元组成。
一般64位机的系统为64bit.
CPU和内存、硬盘、外设等非CPU内部组件连接的中介为总线。总线分为 数据总线(两端组件可双向通信)、地址总线(单向)、控制总线(单向,用于传送指令)。
一个机器周期:取指令 ----> 译码 ----> 执行。有流水线时,可以相较来说同时进行,比如可在译码时进行下一个周期的取指令。
CPU指令架构分为 CISC复杂指令集(一般 x86CPU 电脑)和 RISC精简指令集(一般 ARM的CPU 手机、单片机)。
2、复用器(选择器)
复用器的作用是选择使用哪一个组件输入进来的数。
最简单的复用器是输入两个二进制位,输出指定的一个。这个功能可以使用一个单刀双掷的继位器实现,控制继位器的触点选择和继位器的高低电平实现选择输出。
多位的复用器可以使用几个单个复用组成。一个复用器分高低电平,低走下一层第一个复用器,高走下一层第二个复用器,如此反复可实现多位复用器。
输入n个二进制位和一个选择数,选择数可以是十进制,十进制0即走第零个,以此类推。也可以将十进制拆成二进制来选择,拆成二进制时,把整个复用器看作好几个组合成的,最高位走最后一个小的二选一复用器进行次层两边的选择,依此类推。
n位复用器即2^n个输入和一个位数选择和一个输出
3、简易的计算单元(ALU)
由加法器、减法器(实际计算机中没使用,这里直接用了)、与、或和两个复用器及一些输入输出构成。输入为两个操作数、一个进位数、一个选择数(选择输出哪个运算结果。截取一下这个选择数的低一位,作为加法器和减法器的进位/借位选择,不截取的话复位器要选择位数多的,造成浪费。)。输出为一个结果和一个进位/借位。
我们做的ALU会把所有运算都做一遍输出选择的运算,有没有办法让它只作我们选择的运算?
不知道。但不重要。首先说全算一遍根本不会影响运算速度,因为是并联,所以运算总时间只是耗费最多时间那个时间,所以这样做只会多耗一些电。我们用的电脑也是全算一遍,只不过实际的CPU对比如ALU这些电路逻辑作了简化,即电路组合后将表达式化简组成为新的电路,很晦涩,看不懂,但这样优化更节省时间和电。
4、PC计数器
一个加法器和一个寄存器和几个输入输出组成。寄存器的输出传给加法器的一个操作数,同时寄存器的输出作为计数器的结果,第一次寄存器的输出为0,所以计数器从0开始计数;加法器的另一个操作数为1,进位器0;加法器的输出有两个,一个相加的结果,放进寄存器的输入,进行下次加一,另一个输出为进位,溢出后,相加结果变为零,进行第二轮的计数。寄存器有一个使能开关,和一个时钟。一次时钟周期进行一次加一计数。
5、实现一块内存
使用分线器和n个寄存器即可实现一个n位寻址的存储,具体细节略。
6、带内存和寄存器和ALU的CPU (最最最初步的CPU)
只说下原理。可以对PC计数器操作实现从内存的不同地址读出数据(可以通过输入往内存中输入数据),读出数据后通过ALU与寄存器中的数相加(寄存器中初始为0),即第一次相加得到第一个数放到寄存器中,如此循环,可以实现从内存中不断读数并不断相加。
提一句,我们做的这个ALU在CPU中没有使能开关和时钟,所以它不受总的时钟控制,当有操作数和运算符(指令)时它就运算;当操作数和运算符发生改变时它也进行运算。
7、给最最最初步的CPU加个指令操作
添加一块指令内存。在指令内存中填入指令,下面我只举例子,咱制作时都可以随意指定每个地址里指令位代表的含义。我这里添加的内存是8位寻址,即256个地址,每个地址16位数据。
以下为个人定义的,可随意作修改
最低两位作为ALU的操作运算的选择;
将第14位作为总时钟周期的控制,将它和总时钟作一个与操作,只有当它为1时,这些组件(寄存器、PC计数器、
内存);
数据内存的输出接一个复用器,0为从内存中取数,1为取0,将第十三位作为这个复用器的选择位;
第十二位作为存操作数的寄存器的使能;
第十一位作为数据内存的输入使能;
第十位作为数据内存的输出使能;
存操作数的寄存器输出连接一个复用器,0为从中取数,1为取0,将第九位作为这个复用器的选择位;
现在想要实现跳转到指定地址去取操作数和指令(可通过这个实现一个循环),需要修改PC计数器的逻辑。原来的PC计数器是由一个寄存器和一个加法器构成,将加一的结果不断放到寄存器中,现在需要将加一的结果进行复用器的和要跳转的地方作选择。来个图:
加了 要跳去地址的输入 和 选择走之前计数的逻辑还是后来输入的那个逻辑的输入(选择位)。要跳去的地址在数据内存中,所以直接连数据内存输出即可。将第八位作为选择是否走跳转的选择位;
接下来还要加一个比较,即将寄存器里的数据和内存中走到的数据作一个比较,以作后续的分支操作。这里需要对ALU添加一个比较的逻辑(比较器的组成大概可以用异或非和一些与或的逻辑实现,这里不写了),再在我们的CPU中加一个寄存器用来存放比较的结果,这个寄存器的时钟连总时钟,这个寄存器的值一直保持到下次作运算。将第七位作为这个寄存器的使能开关。
以下为现在CPU的样子:
上面的位数太乱了,下面也许就位数和位数控制的隧道名作了改变
指令里面来一个位表示控制条件跳转,起名je。比较寄存器中的输出和je作与,如果都为真,则走这个跳转,也就是je和cmp与之后再和jmp来个或,表示当条件成立时跳转或者无条件跳转。
8、查找表
指令位输出换成查找表(3-8译码器),做一个映射,将指令位数缩小一下,以方便后面将指令和数据地址放到一起。注意,这个查找表只是个映射,可不是比如00对应0,01对应1。可以0000对应0101010101010101......
将输入和指令对应上,以后往查找表输入少的位数即映射出真正的指令。
9、合并内存
接下来要做的是将数据和指令放到一个内存中,所以我们往内存中写指令时,就不能像之前那样写了。我们这里是16bit内存,我们将高5bit定义为指令,将低11bit定义为数据所在的地址。这样我们一个时钟周期就不能完成一个指令操作了,因为现在的指令为 指令 + 要操作的数据所在的地址,我们第一个时钟周期需要将整个指令取出来,并将高11位(指令)放到寄存器放起来,因为还没有数据,与此同时,将数据的地址放到PC里查出数据来;第二个时钟周期运行指令。这样两个时钟周期执行一条指令被称为两个时钟周期为一个机器周期。
大体来说:取指一个周期,操作一个周期。取指这个周期就是把指令(指令+数据地址)拿出来,操作就是运行。可以用一个时钟周期加一个D触发器实现每次取上次反操作。这个不能作为真实的指令,但可以放到查找表的最高位输入,因为放到最高位,它为0时即可设置后面的位数指令全为取值,它为1可操作后面的操作指令,这样就区分开来了。有点抽象,哎。
10、简易CPU
以上的步骤已将让我们得到了一个简易的CPU,现在可以把一些输入输出提出来,以方便将CPU封装使用。
首先,CPU中的内存不能叫内存了,把它看作一个Flash闪存,然后将它的寻址位改小,这里改为8bit。原来为11bit,高出的3bit作为扩充外部存储器的使用。复用器选择完地址后,不直接交给CPU中的Flash处理了,先处理一下,这里规定这11位地址的高三位全0走CPU中的Flash,否则走外设中的存储。所以先将这11bit作一个分线,将低8bit放到Flash的地址位,然后用高三位和使能开关做处理决定这个Flash走不走这个地址(高三位先做或非操作,全0才输出1,之后分别和使能输入和使能输出做与操作并连接Flash的使能输入和使能输出)。
这个简易CPU对外暴露的管脚称为总线。分别有:控制器的输入使能 和 控制器的输出使能 作为控制总线; 11bit的寻址(3bit选择存储+地址)作为地址总线;立即数(作为输入口)和 ALU的运算结果 作为数据总线。
除了以上几个管脚外,我们的CPU在使用时还需要一个时钟输入
可以把我们的CPU使用起来,以下是CPU接了两个存储和一个终端,具体操作看图:
这个终端我们指定了地址不是一个范围,就是 011 00000000, 所以每一位都需要参与或非运算。一些或非前面的非运算是因为那一位需要取1。其他参考CPU内部的Flash的介绍。
11、引导分区
对于单片机来说,代码是烧录在CPU中的,所以无所谓引导不引导了。
对于PC机来说,硬盘上从上往下分为:引导区 --》 分区表(看作目录)--》C盘 / D盘 ..文章来源:https://www.toymoban.com/news/detail-749187.html
有的CPU内部有一块存储空间可以写程序,作为引导(X86CPU无内部无存储,它是通过BIOS来存储这段引导程序的)。无论内存中的这段代码还是BIOS中的这段代码,它的作用是从硬盘中读取一段固定(这个大小是和CPU厂商协调好的)的数据(代码)放到内存中,硬盘中的这段代码用来执行(可抽象地看作指向)我们的操作系统,这样可以将操作系统运行起来。这样跳一下而不是直接在硬盘中将操作系统放到内存里是因为不同的操作系统内核大小不同,我们去跳到操作系统的这段程序大小是和CPU厂商协调好的,也就是CPU从硬盘中0地址读取比如32Byte大小的代码加载到内存,我们在这32Byte中写代码调用操作系统。文章来源地址https://www.toymoban.com/news/detail-749187.html
到了这里,关于简易计算机的搭建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!