计算机基础系列 —— CPU

“Make everything as simple as possible, but no simpler.” – Albert Einstein

文中提到的所有实现都可以参考:nand2tetris_sol,但是最好还是自己学习课程实现一遍,理解更深刻。

之前的文章里我们介绍了 Register、PC、RAM 和 ALU,这节课我们来介绍如何把这些芯片组合起来成一个 CPU 和一个能运行上篇文章介绍的汇编语言的电脑 —— Hacker。

我们来看一看 Hacker 的架构。

总线

上图里的各个模块通过总线连接起来,什么是总线呢,看下图:

总线就是把数据、地址、程序在各个模块之间传递的“公交车”(buses)总线的英文太形象了,01010101 就是车上的“人”。

Fetch-Excute Cycle

那么 CPU 干了什么事呢,就是不断执行 fetch-excute cycle 的循环,fetch 阶段去获取指令,excute 阶段去执行指令。比如现代电脑的开机,打开开机键后执行 fetch 阶段,获取操作系统程序的地址,然后 excute 第一行指令后,再去 fetch 第二行指令,如此往复,直到开机成功。

上篇文章我们知道 A 指令可以同时访问 RAM[A] 和 ROM[A],把指令和数据放在不同的 Memory 里,那么我们可不可以把他们放在同一个 Memory 里,然后根据需要把 RAM[A] 解释成数据或者指令。当然可以,第一种是空间换时间的方法(Harvard architecture),第二种是时间换空间的方法,所以这两种方法的优缺点很明显。我们来看看这两种不同的 Fetch-Excute Cycle:

课程里选择了 single cycle,two-memory machine 这种实现,接下来我们继续来看 Hacker 里各个模块的实现。

CPU

CPU 的作用是读取指令,执行指令,读取数据,写入数据。我们可以对应着看上面两张图,「inM、outM、writeM(bool)、addressM」对应着「write、read、address(data memory)」,「instruction、pc」对应着「insturction、address(instruction memory)」, reset 的作用就是相当于重启按钮。接下来我们来看看具体实现。

这里出现的都是之前文章里提到过的元器件,接下来我们逐一解释这些元器件是如何实现上述的 CPU 的。图中,“c”表示“控制位”,控制位来自指令;他们告诉各种芯片部件该做什么。

A 指令的实现很简单,看下图:

我们来看 C 指令的实现:

和 A 指令一样,C 指令的最高位决定第一个 Mux16 的输入:

acccccc 用来决定的 cccccc ALU 的 zx nx zy ny f no 的引脚。a 来决定输入 ALU 的是 A 还是 M。

ddd 用来决定 ALU 的输出是否保存到相应的位置:

jjj 用来决定执行哪一条指令:

这里 jjj 可以通过 f(zr, ng) 来获得。PC 的输出就是下一条要执行指令的地址。这里一个可以执行汇编程序的 CPU 就实现了,我只想说,太优雅了!!!

接下来我们把剩余的模块和 CPU 连接起来组成 Hacker。

Data Memory

这里用到了我们之前实现的 RAM16K,屏幕是 RAM8K 连接着显示屏。(为了简便,Keyboard 和 Screen 都是内置的模块,直接调用即可)。

Instruction Memory

/** Read-Only memory (ROM),
acts as the Hack computer instruction memory. */
CHIP ROM32K {IN address[15];OUT out[16];BUILTIN ROM32K;
}

Instruction Memory 也是内置的模块,和 RAM32K 的唯一区别就是 ROM32K 是只读的,所以每次载入新程序,相当于把之前的程序删除掉,再载入新程序。就和单片机下载程序一样。

Hacker

到这里 Hacker 就实现完成了,下篇文章会介绍如何实现汇编器。

缓存

最后解释下 Hacker 没有外接存储设备,也没有多级缓存的原因。

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

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

相关文章

【Linux实践室】Linux用户管理实战指南:用户密码管理操作详解

🌈个人主页:聆风吟_ 🔥系列专栏:Linux实践室、网络奇遇记 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 🔔用户密码存放地及方式2.2 🔔使用…

PAT乙级 1046 划拳 C语言实现

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒。两人同赢或两人同输则继续下一轮&…

游戏本续航@控制中心的省电模式效果如何

文章目录 节能模式长续航模式👺相关工具 节能模式长续航模式👺 蓝天模具Control Center中的模式 根据我的试验,以及软件的提示,可以发现 Power Saving是最省电的,儿Quiet模式并不省电,它会启用独立显卡,只不过风扇的转速不像娱乐模式和性能模式那么积极而…

UE5学习日记——蓝图节点前缀关键字整理

一、起因 节点如海,中英文翻译的时候还是有差别的,比如: 同一个中文,可能在英文里完全不同,连出现位置可能都不一样 附加 Attach Actor To Component(将Actor附加到组件)Append Array&#xf…

mac 配置 ssh

mac 系统如何生成秘钥的方法 【第一步】. 启动台打开终端,输入 cd ~/.ssh 检查是否已经存在了SSH密钥。如果你看到类似id_rsa.pub的文件,说明你已经有了一对公钥和私钥,可以跳过第 2 步和第 3 步。 【第二步】 在终端输入ssh-keygen -t rsa …

1.3-数组-977. 有序数组的平方★

977. 有序数组的平方 ★ 力扣题目链接&#xff0c;给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 1 < nums.length < 104-104 < nums[i] < 104nums 已按 非递减顺序 排序 示例…

如何结合NLP和图像描述技术

结合自然语言处理&#xff08;NLP&#xff09;和图像描述技术的例子有很多&#xff0c;以下是一些具体的应用场景&#xff1a; 1. **自动图像描述生成器**&#xff1a; - 用户上传一张图片到应用程序。 - 应用程序使用计算机视觉技术分析图片内容。 - NLP算法如序列到…

Python中模块的定义、用法

在Python中&#xff0c;模块是一个包含了Python代码的文件。模块可以包含变量定义、函数、类等&#xff0c;并且可以在其他Python脚本中被导入和使用。模块的定义和用法如下所示&#xff1a; 模块的定义&#xff1a; 创建模块文件&#xff1a;在Python中&#xff0c;一个模块就…

数据分析和机器学习库Pandas的使用

Pandas 库是一个免费、开源的第三方 Python 库&#xff0c;是 Python 数据分析和机器学习的工具之一。Pandas 提供了两种数据结构&#xff0c;分别是 Series&#xff08;一维数组结构&#xff09;与 DataFrame&#xff08;二维数组结构&#xff09;&#xff0c;极大地增强的了 …

ubuntu18.04安装docker 并修改其默认路径

ubuntu18.04安装docker 并修改其默认路径 0 删除已有docker sudo apt-get remove docker docker-engine docker.io containerd runc1 使用 Docker 仓库进行docker安装 两个方法可以较差借鉴用 方法一&#xff08;实测成功&#xff09;&#xff1a; 参考链接&#xff1a;ht…

文件路径中的 ./ 和 ../ 和 / 的区别

路径中的“./”、“../”和“/”分别代表以下含义&#xff1a; “./”&#xff1a;代表当前所在的目录。在路径中使用它&#xff0c;表示你正在引用当前目录下的一个文件或子目录。“../”&#xff1a;代表上一层目录。当你在路径中使用“../”&#xff0c;你正在引用当前目录…

Web API —— DOM 学习(四)(完结)

目录 一、日期对象 &#xff08;一&#xff09;实例化 &#xff08;二&#xff09;日期对象方法 1.时间戳介绍 2.获得时间戳的方式 getTime()方法 new Date()方法 Date.now()方法 二、节点操作 &#xff08;一&#xff09;DOM 节点 1.节点类型 元素节点 &#xff08…

1+x中级题目练习复盘(20220625 1+X 中级理论考试)

Override 用于标注重写方法 函数式接口是指有且只有一个抽象方法的接口&#xff1b;

vue项目使用eletron将打包成桌面应用(.exe)

vue项目使用eletron将打包成桌面应用(.exe) 1.前期准备 两个项目&#xff1a; 1、自己用vue cli创建的项目 2、第二个是去gitee将案例clone下来 案例地址 https://gitee.com/qingplus/electron-quick-start.git 2、测试案例是否可以正常运行 # 进入项目 cd electron-quick-…

任务管理工具Trello体验如何?一文揭秘

Trello是一款高效的协作与工作管理应用&#xff0c;这里我们将详细介绍Trello的功能、特点、优劣势、价格、定价、发展历程、使用场景以及使用技巧等等。 一、Trello 是什么 Trello是一款高效的协作与工作管理应用&#xff0c;设计用于跟踪团队项目、凸显当前活动任务、指派责…

索引器(indexer)demo

1.索引器允许类或者结构的实例按照与数组相同的方式进行索引。 索引器类似于属性&#xff0c;不同之处在于他们的访问采用参数。 2.索引器必须以this关键字定义&#xff0c;这个this代表类实例化后的对象,如下定义一个类的索引器实例&#xff1a; public class IDXer …

POJ3037 + HDU-6714

两道最短路好题 POJ3037 手玩一下 发现每一点的速度可以直接搞出来&#xff0c;就是pow(2,h[1][1]-h[i][j])*V 那么从这个点出发到达别的点的耗费的时间都是上面这个数的倒数&#xff0c;然后直接跑最短路就好了 #include<iostream> #include<vector> #include<…

某头部券商企业:朗思Agent 数字员工上岗,提质增效,释放人力

在数字化转型背景下&#xff0c;越来越多证券企业积极探索数字员工在运营管理和业务经营中的应用&#xff0c;全面提升服务效能&#xff0c;推进数智化建设&#xff0c;以应对行业内的诸多挑战。 某券商企业加强数字赋能&#xff0c;积极部署数字员工&#xff0c;仅财务中心工…

赛氪网积极参与千校万企协同创新行动,推动产学研深度融合

3月17日&#xff0c;中国千校万企协同创新推进会在北京盛大召开&#xff0c;会议旨在实现高校与行业龙头企业技术升级需求的精准对接&#xff0c;加速新质生产力的形成与发展。教育部党组成员、副部长孙尧&#xff0c;科技部成果转化司副司长秦浩源&#xff0c;国家知识产权局知…

王者荣耀国服米莱迪 - 出装打法详细教学视频(最新)

01. 恰到好处的一技能 02. 灵魂二技能 03. 无敌大招连招 04. 为所欲为的出装 05. 拥有这个召唤师技能赢一半 06. 英雄克制 07. 整局精讲 08. 米莱迪最强出装 09. 米莱迪最强出装的铭文 发送内容: "米莱迪", 获取提取码