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

news2024/11/17 13:58:22

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.coloradmin.cn/o/1040119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

登录业务实现 - token登录鉴权

登录业务实现: 登录成功/失败实现 -> pinia管理用户数据及数据持久化 -> 不同登录状态的模板适配 -> 请求拦截器携带token(登录鉴权) -> 退出登录实现 -> token失效(401响应拦截) 1. 登录成…

超详细C语言实现——通讯录

目录 一、介绍 二、源代码 test.c: Contact.c: Contact.h: 代码运行结果: 三、开始实现 1.基本框架: 2.添加联系人: 3.显示联系人信息: 4.删除联系人信息: 5.查看指定联系人信息: 6.修改联系人…

多维时序 | MATLAB实现PSO-BP多变量时间序列预测(粒子群优化BP神经网络)

多维时序 | MATLAB实现PSO-BP多变量时间序列预测(粒子群优化BP神经网络) 目录 多维时序 | MATLAB实现PSO-BP多变量时间序列预测(粒子群优化BP神经网络)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现PSO-BP粒子群优化BP神经网络多变量时间序列预测&#xff…

初学vue.js

准备Vue.js环境 ① 下载环境: javaScript语言的程序包:外部js文件 对于Vue来说,导入Vue的外部js文件就能够使用Vue框架了。 Vue框架的js文件获取: 官网提供的下载地址:https://cdn.jsdelivr.net/npm/vue/dist/vue.js ②导入环境…

Kotlin中使用Java数据类时引发的一个Bug

文章目录 基础复习:Kotlin语言中的对象比较背景问题出现解决方式方式一方式二 基础复习:Kotlin语言中的对象比较 比较对象的内容是否相等 ( 或者 equals ):Kotlin 中的操作符 和 equals效果相同 ,都用于比较对象的内容是否相等,…

Wespeaker框架数据集准备(1)

1. 数据集准备(Data preparation) 进入wespeaker目录文件/home/username/wespeaker/examples/voxceleb/v2 对run.sh文件进行编辑 vim run.sh 可以看到run.sh里面的配置内容 #数据集下载,解压 stage1 #插入噪音,制作音频文件 stop_stage2 #数据集放置…

递归算法讲解,深度理解递归

首先最重要的就是要说明递归思想的作用,在后面学习的高级数据接口,树和图中,都需要用到递归,即深度优先搜索,如果递归掌握的不好,后面的数据结构将举步为艰。 加油 首先看下如何下面两个方法有什么区别&a…

基于Java+SpringBoot+Vue3+Uniapp前后端分离考试学习一体机设计与实现2.0版本(视频讲解,已发布上线)

博主介绍:✌全网粉丝4W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

Allegro如何将丝印文字Change到任意层面操作指导

Allegro如何将丝印文字Change到任意层面操作指导 在用Allegro进行PCB设计的时候,有时需要将丝印文字change到其它层面,如下图 可以看到丝印文字是属于REFDES这个Class的 如果需要把丝印文字change层面,只支持REFDES中以下的层面中来change

【深入浅出设计模式--命令模式】

深入浅出设计模式--命令模式 一、背景二、问题三、解决方案四、试用场景总结五、后记 一、背景 命令模式是一种行为设计模式,它可以将用户的命令请求转化为一个包含有相关参数信息的对象,命令的发送者不需要知道接收者是如何处理这条命令,多个…

Qt Chats(一)绘制折线图

1、一个简单的QChart绘图程序 Qt Charts基于Qt的Graphics View架构,其核心组件是QChartView 和 QChart QChartView是显示图标的视图,基类为QGraphicsViewQChart的基类是QGraphicsltem QChart类继承关系 QPolarChart 用于绘制 极坐标图的图表类 1.项目…

(自学)黑客技术——网络安全

如果你想自学网络安全,首先你必须了解什么是网络安全!,什么是黑客!! 1.无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如 Web 安全技术,既有 Web 渗透2.也有 Web 防…

基于微信小程序的婚庆婚纱摄影预约平台(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

彩色文本进度条

动态加色打印,\033控制,显示进行到的百分比,实时更新总共用时。 (本笔记适合能熟练应用字符串和循环技能的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程…

开发者必备!如何将闲置iPad Pro打造为编程工具,使用VS Code编写代码

文章目录 前言1. 本地环境配置2. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.2 创建HTTP隧道 3. 测试远程访问4. 配置固定二级子域名4.1 保留二级子域名4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问6. ipad pro通过软件远程vscode6.1 创建TCP隧道 7. ip…

数据结构 | 队列

队列&#xff08;First In First Out&#xff09; 顺序队列 #include <iostream>class MyQueue {private:// store elementsvector<int> data; // a pointer to indicate the start positionint p_start; public:MyQueue() {p_start 0;}/** In…

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

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

UNet网络模型学习总结

github&#xff1a;Machine_Learning/网络模型/UNet at main golitter/Machine_Learning (github.com) 因为VOC数据集太大&#xff0c;上传github很慢&#xff0c;所以就没有上传VOC数据&#xff0c;只有参考的目录位置。 数据集自行下载&#xff1a;https://host.robots.ox.…

顾曼宁(顾曼):漂流伞创始人与杭州高层次人才的杰出代表

杭州&#xff0c;这座以创新与活力为标签的城市&#xff0c;吸引了无数优秀的人才。在这座城市中&#xff0c;一位杰出的女性企业家以其独特的创业智慧和卓越的领导力&#xff0c;成为了杭州高层次人才的杰出代表之一&#xff0c;她的名字叫顾曼宁&#xff08;顾曼&#xff09;…

21天学会C++:Day14----模板

CSDN的uu们&#xff0c;大家好。这里是C入门的第十四讲。 座右铭&#xff1a;前路坎坷&#xff0c;披荆斩棘&#xff0c;扶摇直上。 博客主页&#xff1a; 姬如祎 收录专栏&#xff1a;C专题 目录 1. 知识引入 2. 模板的使用 2.1 函数模板 2.2 类模板 3. 模板声明和定义…