使用ALU,RAM,寄存器打造一个CPU

CPU简介

计算机的心脏是中央处理单元,简称“CPU” 。这篇文章就利用前几篇文章中提到过的ALU,RAM,寄存器组件做一个CPU。

CPU负责运行程序,程序是由一个个操作组成的,这些操作叫做指令,因为他们“指示”计算机要做什么.

CPU能做什么

数学计算指令:让ALU去做加减乘除或者更复杂的数学计算

内存指令:CPU会和内存(RAM)通信,然后操作内存进行读写值

组装CPU零件

16位内存条

首先把上一篇文章的RAM拿出来(只有16个地址意味着是每个内存是16位的,每个地址又可以存8位可以得出是8个内存组装在一起的;因此这个RAM可以看到是由8个16位内存组成)。

内存条的寻址空间意味着每块内存可以可以存储的位数,内存条中的每个地址可以存多少位又是由多少个内存组成。

可以看到每个地址都存储着8位,在后面讲解指令表的时候要注意这八位数字的表示方式。前四位代表操作码,后四位代表的是地址OR寄存器

四个八位的寄存器

回顾一下:

上一篇文章中讲到八位的寄存器无非是把八个锁存器链接在一起,8个数据输入线,8个数据输出线,还有一个链接着所有锁存器中的允许写入线。总共17条线

寄存器的作用:用来临时存储数据和操作数据

指令表

数据是以二进制值存储在内存里,程序也可以在内存里。

指令:所有CPU支持的指令都会分配一个指令ID也就是表中的第一个INSTRUCTION中的LOAD_A

描述:就是描述这个指令ID是用来做什么操作的

4-BIT OPCODE(操作码):这个指令要做的操作,用4位的操作码表示

ADDRESS OR REGISTERS(地址OR 寄存器):也是4位,表示的是操作码需要使用的地址或者寄存器(比如加载一个内存里的值放入寄存器中就需要指定打开的是哪个内存地址)

在之前我们拿出RAM,可以看到每个地址都存储着8位数字,前四位代表的就是操作码,后四位代表的是地址OR寄存器 .

之后我们会模拟CPU的执行过程,要执行怎样的操作以及怎么样执行就是通过RAM中存储的这八位数字来运行的。

两个八位的寄存器

指令地址寄存器:追踪程序运行到哪里了。用于通过地址定位到内存条中的哪条指令,也就是存储当前指令的内存地址ADDRESS

指令寄存器:用于存储当前运行的指令DATA。通过指令地址寄存器读取RAM中指定ADDRESS的DATA然后并写入这个寄存器

开始运行

启动计算机时,所有的寄存器都是0.

在RAM中放了一个程序(ADDRESS,DATA),现在就是要过一遍运行这个程序的过程

取指令阶段

该阶段负责拿到指令,即指令地址寄存器读取RAM中对应地址的值复制到指令寄存器

1.首先将指令地址寄存器连接到RAM中(ADDRESS INPUT),寄存器的初始值为0,因此会去读取RAM中ADDRESS为0的DATA

2.DATA会被复制到指令寄存器中,现在指令寄存器存储了00101110这个指令

解码阶段

现在我们拿到了指令,前四位是操作码对应的是指令表中的LOAD A指令。对应的描述是将RAM的值放入寄存器A

后四位1110是RAM的内存地址,转成十进制就是14.

控制单元

指令通过”控制单元“进行解码。解码的作用就是判断这个操作码对应的操作是什么(通过少量的逻辑门即可判断)

针对不同的操作码有对应的指令判断电路从而执行不同的操作。例如下面这个就是检查操作码是不是LOADA(0010)指令。

执行阶段

指令寄存器拿到数据DATA后通过控制单元进行解码,现在我们知道了这个是LOADA指令,就可以进行执行阶段了

1.打开RAM允许读取线:我们将检查LOADA指令的电路连接到RAM的READ ENBALE中(如果LOADA输输出为1那么READN ENANLE也是1因此就会打开RAM的允许读取线),并把地址14传入过去。

2.读取RAM 对应地址的值:RAM拿到地址14上的值,0000 0001也就是十进制的三

3.RAM DATA线连接所有的寄存器:LOAD_A指令代表这个值存储在A寄存器中并不影响其他寄存器。因此需要将RAM读出来的值给到寄存器,所以RAM的DATA数据线需要将所有的寄存器都连接起来(DATA线既可以用来做输入又可以用来做输出使用)。

4.打开指定寄存器的允许输入线:用检查“是否为LOADA指令的电路”打开寄存器A的允许写入线(因为是LOADA指令,所以需要将A寄存器的允许写入打开),这样就将RAM中地址为14的值输出保存到了寄存器A中。

5.取下一条指令指令地址寄存器+1:执行阶段结束。开始下一个取指令阶段(读取0001的RAM地址到指令寄存器中,然后在解码执行........之后一直重复这个过程)

抽象--控制单元

上面解释的只是一个LOADA指令,不同的指令由不同的逻辑电路解码,这些逻辑电路会配置CPU内的组件来执行对应操作。这些逻辑电路太复杂我们可以把整个逻辑电路封装为上面所说的控制单元。

小结

也就是下图中的线路。可以看到控制单元链接了所有的寄存器(用于存放和读取数字),和RAM链接的是允许读取和允许输入线(READ ENABLE WRITE ENABLE),还有一条线是ADDRESS INPUT ,这条线是用来告知使用的是16个地址空间中的哪个地址(比如之前的14)

上面解释了指令表中的LOADA指令,LOADB指令和LOADA原理一致,包括STOREB也是只不过是相反过来打开寄存器的允许读取和RAM的允许写入传入地址最后将寄存器的值通过DATA线给到RAM对应地址。但是ADD指令有些不同,我们看下这个操作码是如何做处理的。

ADD操作码

后四位ADDRESS OR REGISTERS解释

在指令表中我们看到ADD指令的后四位寄存器 OR RAM地址一列中,列出来的不是之前的RAM地址而是两位的寄存器ID。两位可以表示四个数字,正好对应ABCD四个寄存器。

解码过程

从上面的RAM中可以看到,指令地址2就是一个ADD的指令

拆解出这个ADD要使用的两个寄存器(后四位):0100

01表示寄存器B,00表示寄存器A。

所以1000 0100的意思是:将寄存器B的值加到寄存器A中

执行过程

加法需要利用到上一篇文章讲的ALU逻辑运算单元。因为ALU需要接受输入而控制单元可以控制素有的寄存器所以需要把ALU连接至控制单元。通过控制单元打开对应的寄存器输出来让ALU接受输入,来看下面的步骤:

1.让ALU接受输入:控制单元启用寄存器B的允许读取线,作为ALU的第一个输入,控制单元启用寄存器A的允许读取线,作为ALU的第二个输入

2.告知ALU进行哪种运算操作: 控制单元传递ALU中的ADD操作码告知ALU进行加法运算

3.ALU输出结果保存:注意此时的A的允许读取还打开着并且ALU还在继续工作,如果控制单元直接把输出给到寄存器A,那么ALU就会不断进行运算。所以控制单元有一个自己的寄存器暂时保存结果,接着关闭ALU,然后把值再写入正确的寄存器A中

4.取下一条指令指令地址寄存器+1:执行阶段结束。开始下一个取指令阶段,又开始下一次的循环~~

总结

用一张图来表示。当ALU计算出结果后将结果传送至控制单元,控制单元内部寄存器存储这个结果,然后把ALU关闭,再把内部寄存器存储的值给到寄存器A(这是打开的是寄存器A的允许写入)

时钟速度,时钟周期

刚刚我们是一步一步进行讲解的这个过程:”取指令-》解码-》执行“,计算机中控制执行这个循环的节奏是通过”时钟“来负责的。

时钟以精确的间隔,触发电信号,控制单元用这个信号,推进CPU的内部操作,确保一切按顺序执行。时钟不能太快,因为就算是电也要有一定时间来传输

定义

CPU ”取指令-》解码-》执行“的速度叫做”时钟速度“。单位是赫兹HZ,赫兹是用来表示频率的单位,一赫兹表示一个周期。下面那个Clock就是时钟的代表

第一个单芯片CPU-英特尔4004

这是他的微架构,可以看到和我们上面组装的差不多。

降频&超频

上面的第一个单芯片CPU,它的时钟速度达到了740千次赫兹,每秒74万次,这已经很快了,但是现在更快~~

一兆赫兹是一秒一百万个时钟周期,现在人们用的电脑和手机肯定几千兆赫兹,也就是一秒钟十亿次时钟周期

超频

也就是修改时钟速度,加快CPU速度

芯片制造商经常给CPU留一点余地,可以接受一点超频,但是超频过多会让CPU过热或产生乱码,因为信号跟不上时钟

降频省电

有时我们没有必要让处理器全速允许,比如用户走开了,或者在跑一个性能要求极低的程序,把CPU的速度降下来,可以省很多电.

动态调整频率

省电对于用电池的设备很重要,比如笔记本和手机,为了更省电,很多现代处理器可以按需求加快或减慢时钟速度,这叫动态调整频率.

抽象-CPU

RAM是在CPU外面的独立组件,CPU和RAM之间通过”地址线“,”数据线“和”允许读/写线“进行通信, 上面提到的很多机制依然存在于现代处理器里。

结束

下一篇文章我们进行加强CPU,给他扩展更多指令

原文视频

【计算机科学速成课】[40集全/精校] - Crash Course ComputerScience

Youtube 原视频

原文链接:使用ALU,RAM,寄存器打造一个CPU - 掘金 (juejin.cn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/141248.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法通过村第九关-二分(中序遍历)黄金笔记|二叉搜索树

文章目录 前言1. 有序数组转二叉搜索树2. 寻找连个正序数组的中位数总结 前言 提示:有时候,我感觉自己一辈子活在两个闹钟之间,早上的第一次闹钟,以及5分钟之后的第二次闹钟。 --奥利弗萨克斯《意识的河流》 每个专题都有简单题&a…

上海亚商投顾:沪指震荡反弹 汽车产业链全天强势

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 大小指数昨日集体反弹,沪指3100点失而复得,创业板指一度涨超1.5%,随后涨幅…

echarts学习总结

一、新建一个简单的Echarts 首先新建一个vue2的项目,项目中安装Echarts cnpm install echarts --save1、title标题组件,包含主标题和副标题。 2、tooltip提示框组件 3、 legend图例组件 4、 series

springboot项目中定时任务注解@Scheduled未按cron表达式执行

springboot项目中定时任务注解Scheduled未按cron表达式执行 背景问题复现原因分析解决方法其他原因 背景 在将一个类注入到ioc后,其中定义了几个定时任务,分别是每隔十秒执行一次,但实际情况却是半小时才执行一次,故开始分析原因&…

爬虫怎么批量采集完成任务

目录 一、了解网络爬虫 二、Python与网络爬虫 三、批量采集任务的实现 1.确定采集网站及关键词 2.安装相关库 3.发送请求并获取响应 4.解析HTML文档 5.提取文章内容 6.保存文章内容 7.循环采集多篇文章 8.增加异常处理机制 9.优化代码性能 四、注意事项 总结 在当…

细胞机器人系统的概念

摘要 本文讨论了一种新型机器人系统的理论和工程的概念基础。该系统由协作完成任务的自主机器人单元组成。本文在描述了该系统与细胞自动机和神经网络的相关性和差异后,建立了该系统的基础属性及其对机器人单元结构的影响、它们操作的空间以及它们完成全局任务的算法…

virtualbox安装的linux虚拟机安装并启动Tomcat过程(结合idea操作)记录,并使用宿主机访问页面

virtualbox安装的linux虚拟机安装并启动Tomcat过程(结合idea操作)记录,并使用宿主机访问页面 参考教程地址linux版本Tomcat下载地址上传解压 启动TomcatVirtualBox虚拟机本地可访问宿主机尚未可以访问关闭防火墙宿主机可以访问 参考教程地址 …

vivado乘法器IP核进行无符号与有符号数相乘问题的验证

本文验证乘法器IP核Multiplier进行无符号(unsigned)与有符号数(signed)相乘的正确性,其中也遇到了一些问题,做此记录。 配套工程:https://download.csdn.net/download/weixin_48412658/88354179 文章目录 问题的讨论验证过程IP核配置例化乘…

ElementUI之登陆+注册

一.什么是ElementUI 二.ElementUI完成用户注册登录界面搭建 使用命令npm install element-ui -S,添加Element-UI模块 导依赖 建立登录和注册页面 ​编辑 配置样式 编写登录页面(Login) 编写注册页面(reginter) …

基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(五)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 数据增强3. 模型构建4. 模型训练及保存5. 模型评估6. 模型测试 系统测试1. 训练准确率2. 测试效果3. 模型应用1)程序下载运行2)应用使用说明3)测试结果 相关其它…

Spring源码相关

总分结构回答,突出关键接口、类、方法名 run -> AbstractApplicationContext.refresh()程序的入口 在IOC中的操作都是基于DefaultListableBeanFactory bd对象保存在map集合中 refresh方法宝包括了整个Spring的执行流程和bean的完整生命…

企业做软文推广的三大错误有哪些?媒介盒子为您解答

软文营销已经成为企业宣传的主要方式,但有很多企业来找媒介盒子咨询,明明花了大量成本来做软文推广,为什么就是没效果呢?小编看了下,发现大部分企业做软文推广效果不明显,基本上犯了三大错误,接…

解决 react 项目启动端口冲突

报错信息: Emitted error event on Server instance at:at emitErrorNT (net.js:1358:8)at processTicksAndRejections (internal/process/task_queues.js:82:21) {code: EADDRINUSE,errno: -4091,syscall: listen,address: 0.0.0.0,port: 8070 }解决方法&#xff…

OpenLayers实战,OpenLayers调用手机陀螺仪方向实现指南针效果

专栏目录: OpenLayers实战进阶专栏目录 前言 本章讲解OpenLayers如何使用手机陀螺仪实现指南针,除了需要调用陀螺仪外,还需要获取手机的实时位置。 通过获取到的实时位置显示箭头图标位置,通过获取陀螺仪水平方向来调整箭头指向。 注意:必须在https请求(带ssl证书)下才…

信创之国产浪潮电脑+统信UOS操作系统体验1:硬件及软件常规功能支持情况介绍

一、引言 由于公司要求支持国产信创,最近办公的笔记本电脑换成了软硬件全国产,由于国产操作系统是在开源linux基础上演进的,在换之前,非常担心操作不方便,周边应用软件少,功能差,内心是比较抗拒…

常见的文件格式

一、C:\fakepath\新建文本文档.txt [object String] 实现方式&#xff1a; <input onchange"test(this.value)" type"file"></input><script>function test(e){console.log(e,Object.prototype.toString.call(e))}</script> 二、…

第77篇:美国APT入侵西北工业大学使用的5款远控后门揭秘

Part1 前言 大家好&#xff0c;我是ABC_123。在几个月前&#xff0c;我反复研读国家计算机病毒应急处理中心的多篇报告及360安全公司发布的各种关于该事件的报道&#xff0c;再结合国外对于美国APT研究报告&#xff0c;花了半个多月的时间复盘了美国APT入侵中国西北工业大学的…

红米note13 秒解锁BL 跳过168 秒解锁BL,红米Redmi Note 13 Pro+ 系列 无需等待168小时,刷入magisk教程 刷机包下载

最近入手了一台红米note13&#xff0c;发现需要等待168小时才能解锁BL&#xff0c;这让我感到非常困扰。不过&#xff0c;经过一番研究&#xff0c;我发现了一个秒解锁BL的方法&#xff0c;无需等待168小时&#xff0c;而且还可以刷入magisk&#xff0c;非常方便。 首先&#x…

[C++ 网络协议] I/O流分离所带来的半关闭问题

1.问题和解决方法 根据所学内容&#xff0c;I/O流分离现如今有如下2种方法&#xff1a; 1.调用进程fork函数&#xff0c;分离出子进程&#xff0c;主进程和子进程分别进行输入流的读和输出流的写。 2.用FILE指针按读模式和写模式将输入流和输出流进行区分。 第一种方法&#…

概率深度学习建模数据不确定性

https://zhuanlan.zhihu.com/p/568912284理解论文 What uncertainties do we need in Bayesian deep learning for computer vision? &#xff08;NeurIPS 2017) [1]中的数据不确定性建模&#xff0c;并给出公式推导。论文[1]指出不确定性uncertainty分为随机不确定性(aleator…