【Computer Organization】The Core Design Thinking of single cycle CPU

1 Overview

This section introduces someting that maybe you need to know before learning.

Note:This CPU is based on MIPS instruction set.

1.1 Tools

  • Logisim
  • CS 3410 Components
  • MARS MIPS simulator
  • Win10 or Mac OS

1.2 Courses

  • 自己动手画CPU《计算机组织与结构实验》
  • 计算机硬件系统设计

1.3 Front Knowledge & Reference Books

  • Computer Organization and Design
  • Degital Logic Applications and Design
  • See MIPS Run

2 Core Thinking

本小节将会介绍设计单周期CPU的核心思想和重要观念。

注:本文讨论的单周期CPU完全理想化,不考虑时间延迟问题。

2.1 基于组合逻辑的单周期CPU

我们先来谈谈 组合逻辑器件存储器件

  • 组合逻辑器件:就像一个两边开口的水管,水进水口(输入端)进入,经过水管“处理”(指组合逻辑器件的功能),从出水口(输出端)流出,没有任何的阻拦
  • 存储器件:就像两边都带阀门的水管,在闸门没有开的时候,既不能进入,也不能出去
    • 读取:将出水口(输出端)的阀门打开
    • 写入:将进水口(输入端)的阀门打开

我们再来看一个做好的单周期CPU
在这里插入图片描述
图中框出的部分是存储器件,其余部分全是组合逻辑器件

紫色框的器件是指令存储器,它的读取是不受限制的,给出地址就能立即读出,因此它的功能可以理解为一个组合逻辑。

红色框的器件自左到右分别是PC寄存器、寄存器堆和数据存储器,它们的读取是不受限制的,但是写入受到限制,这些确实发挥了存储器件的功能。

  • PC寄存器的写入是下降沿触发,当时钟变化为1-->0的时候,能够写入新的值
  • 寄存器堆和数据存储器是上升沿触发,写入控制信号为1且时钟变化为1-->0的时候,能够写入新的数据

显然,这个系统是一个由时钟控制、由组合逻辑器件和存储器件共同构成的时序逻辑电路,它的工作情况是(以add指令为例):

  • 当时钟1-->0的时候,PC写入新的值,这个值就是指令的地址,指令由指令寄存器输出
  • 指令被译码,发送给中心控制器,ALU控制器,以及寄存器堆
  • 寄存器堆的数据被读出,送给ALU,ALU根据译码结果运算,得到的结果被送到寄存器堆的门口,等待写入

以上的过程,都是在时钟信号为0的时候,以极快的速度,按顺序地、无阻拦地执行和完成的。 很明显,这具备组合逻辑器件的特征,看起来,这就像是一个复杂的组合逻辑器件而已。

简化来说,这就像是

  • 将指令码输入该器件
  • 该器件直接输出add的结果,该结果会被拦在寄存器堆的“入口”

当然,如果是sw指令的话,数据一样会被运算出来,然后被拦在数据存储器的“入口”。

以上过程,是近乎完全的组合逻辑,这也就意味着,它非常容易设计,甚至,只需要给出输入和输出,就能被自动地生成,现代计算机完全可以做到这点。

接下来,我们再看看被拦在寄存器堆(Register Files)入口的数据吧。

  • 时钟信号变化:0-->1,如果允许写入的信号有效,“门”就会被打开
  • 之后数据就能够被写入进去了

再之后,时钟1-->0又开始重复之前的过程……

回看本小节的标题,我像你能够理解什么是基于组合逻辑的单周期CPU了。

2.2 信号的设计:受外部约束的信号 与 自由设计的内部信号

在CPU的设计中,我们需要指令译码,通过控制器生成控制信号,来控制CPU各部件的工作,因此,我们就需要设计合理的控制信号。

我们来看看CPU的控制部件:
在这里插入图片描述
这里的CPU设计了4个控制部件

  • 中心控制器
  • ALU控制器
  • 移位操作控制器
  • jr操作控制器

我们这里只说关注两种,了解后两种。

分治思想

首先,我们要分清楚,必须遵循的MIPS指令集信号自行设计的内部信号

我们的CPU要实现MIPS指令集的一部分,因此,必须遵循它的设计规范,例如

  • 中心控制器的输入端必须是MIPS的Op字段中的信号
  • ALU控制器的func输入端必须是MIPS的func字段的信号
  • 移位控制器的输入必须是MIPS的Shamt字段的信号

而我们内部信号的设计,是可以自己决定的,只要能够正确地完成指令规定的功能就可以,当然要考虑复杂度等问题,这点我们先不关注,例如:

  • 中心控制器的输出信号,控制着各部件的运行状态,必须与指令功能匹配
  • ALU控制器的输出信号,决定了ALU的运算类型,必须与指令功能匹配
  • ……

这里,我们也可以将中心控制器和ALU控制器合并在一起,拆开是为了硬件设计的降低复杂度,你可以看到,我们还拆开出了移位控制器和jr控制器,事实上,都可以任意地合并,甚至ALU本身也可以集成进去,这完全取决于你的设计,这很自由,唯一可能的constraint可能就是你要让器件逻辑清晰并且性能较好

3 Design a CPU: A Top-Down Approach

本节介绍了设计CPU的核心方法,我们采用自顶向下和知识屏蔽的方法,快速完成一个简易CPU的设计。

3.1 CS 3410 Components Guide

  • CS 3410 Components Guide

我们先来简要地介绍一下我们需要使用的CS 3410器件,在此特别感谢加利福尼亚大学提供的宝贵资源!

3.1.1 Register Files

在这里插入图片描述

A 32-bit wide by 32-registers deep register file. Register $0 is hard-wired to zero at all times, and writes to $0 are ignored. You can rely on register $0 always containing 0, and do not need to test that its value does not change. Inputs rA and rB are used to select register values to output on the A and B outputs. When the clock is triggered, if WE is high, the data value at input W is stored in register rW. The register file can be configured to use rising clock edges as trigger (the default), falling edge, or to be level sensitive.

3.1.2 MIPS ALU

在这里插入图片描述
Computes a result as follows. You do not need to test the provided ALU, and can assume it will work exactly as specified.
在这里插入图片描述
为简化起见,我们最开始只使用这两个器件,其余的使用Logisim自动的就好。

3.1.2 MIPS Program ROM

在这里插入图片描述
我们不使用提供的指令ROM器件,但是,有一些重要的东西需要强调,非常重要!

An interesting aspect of the ROM is that the offset for branch instructions must be a multiple of 4, which assembles to an output offset divided by 4. This output offset follows the MIPS specification and needs to be left shifted by 2 to be added to PC. For example, given an instruction BEQ $0, $0, 4, the outputted offset in binary is 1.

我们采用的ROM是存储单元是32位的,并不是8位,这也就意味着我们的指令地址是1的倍数而不是4的倍数,我们的PC自动机,先PC << 2,然后+4,之后再PC << 2,而对于branch指令,我们需要先offset << 2然后与PC + 4相加,之后再>> 2,最后赋给PC,这一点在设计的时候要尤为注意,后面的示例中,这个地方的设计是错误的,请读者来修改。

3.2 The soul of CPU design:Abstract and Logic Design

CPU设计最重要的就是逻辑和抽象设计,实现是将抽象转化为现实,并且反过来验证它,毫无疑问的是,无设计,无实现,这可不可能像你最开始学习C语言那样,随便想想就开始写,一个复杂系统的实现,必须:

  1. 先有现实世界的需求
  2. 再有抽象的逻辑设计
  3. 再进行计算机世界的实现
  4. 反复迭代上述3个过程

让我们来看看CPU的设计,需要做哪些工作吧。

现在我们拥有的

  • MIPS Instruction Set
  • ALU Control Signal

我们需要设计的

  • 中心控制器的信号
  • ALU控制器的信号

我们只需要将这几个控制器协调好,帮助我们完成MIPS指令的功能,就能够让CPU执行对应的指令了。

我们可以使用Excel表格来记录,这很方便,并且很清晰,例如:
在这里插入图片描述
具体CPU的设计,你可以在开头提及的MOOC的CPU设计的章节进行学习。

3.3 Implement our design: A Minimum System

让我们先来实现一个最小的,最简单的CPU,并且验证它的正确性,之后我们可以根据成功的经验,来实现更多的指令了。

完成了CPU的逻辑设计,我们就可以按照逻辑设计进行实现了,对于组合逻辑我们完全可以使用自动生成电路功能来完成它,没有必要手动完成。

看示例:
在这里插入图片描述
这是一个极简功能的CPU,甚至可能,它的设计是有些问题的,但是不妨碍我们真的实现了一个CPU,你可以参考它完成自己的CPU。

注意:我们前面提到的ROM器件中特别强调了地址是4的整数倍的问题,这里的设计有问题,在branch指令中并没有移位就直接加了PC,请读者自行学习改进。

3.4 Verify our design using MARS MIPS simulator

现在,我们设计了一个简单的CPU,现在需要验证正确性了,我们需要使用MARS模拟器,编辑一些简单的MIPS指令。

在这里插入图片描述

然后我们将其编译,运行

在这里插入图片描述
这样,我们就可以获得寄存器堆数据存储器的值了。

之后我们将指令导出,加载到我们刚刚设计的CPU的存储器中去,执行指令,看看结果与MARS的结果是否一致,如果一致,就设计正确,不一样就依次查找,找到出错的信息,然后纠正它。

在导出之前,我们需要设置一下MARS,将其数据段地址从0开始。
在这里插入图片描述
在这里插入图片描述
然后,我们就可以导出了
在这里插入图片描述
在这里插入图片描述
可以分别导出.text.data,以十六进制形式,然后加载到我们的Logsim指令存储器和数据存储器中去。

右键单击,选择加载即可。
在这里插入图片描述

4 Surprise

好吧,我想现在还没有惊喜……后续我会将一些可参考的CPU上传,这样大家就可以参考学习了。

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

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

相关文章

【汇编语言】王爽 - 内中断复习

0 前言 基于王爽《汇编语言》和Coursera的《计算机组成》课程。 1 中断分类 CPU在执行指令的过程中&#xff0c;产生了一个异常/中断&#xff0c;因为CPU只能同时执行一条指令&#xff0c;所以需要暂停该指令的执行&#xff0c;转而去处理异常/中断信息。 这个异常可以来…

【算法】蛮力法/穷举法/枚举法 的基本问题分析

炮兵问题的优化&#xff0c;设立逻辑数组 蛮力法设计思想 有策略地穷举 验证 制定穷举策略避免重复 简单来说&#xff0c;就是列举问题所有可能的解&#xff0c;然后去看看是否满足题目要求&#xff0c;是一种逆向解题方式。&#xff08;我也不知道答案是什么&#xff0c;…

【计算机网络实验·北航】实验一:网络实验入门(1)

1.3 远程在线环境使用 PCA、PCB、PCC和PCD&#xff1a;4台PC机S1、S2&#xff1a;2台交换机R1、R2&#xff1a;2台路由器中间的设备&#xff1a;组网连线器 远程组网连线&#xff1a; 使用PCA上的组网连线软件&#xff0c;配置组网连线器&#xff0c;实现组网连线。 PCA和PCB…

【操作系统】虚拟化CPU、Memory,共享文件

几个概念 CPU、虚拟CPU进程内存、虚拟地址空间 物理的CPU被OS虚拟成了多个虚拟的CPU&#xff0c;这些虚拟CPU分别运行各自的程序&#xff0c;这些正在运行的程序被称为进程。物理内存被OS虚拟成了多个虚拟地址空间&#xff0c;每个进程都有独立的、自己的地址空间&#xff0c;…

【Linux】编译C语言文件(-o -lpthread)

在gcc中使用-o编译 对于一个一般的程序&#xff0c;直接使用gcc <C语言文件名> -o <编译后生成的文件名>即可&#xff0c;例如以下程序&#xff1a; // cpu.c #include <stdio.h> #include <unistd.h> #include <stdlib.h>int main(int argc,…

【Linux】Ubuntu下进行C语言编程

前言 需要您会使用Windows下cd切换目录的基本命令&#xff0c;否则请先自学相关知识&#xff0c;之后再阅读本文。 0 基础命令 介绍最基础的Linux终端命令。 su - root&#xff1a;切换到root用户&#xff08;不用也可以&#xff09;ls&#xff1a;查看当前目录位置cd&…

【Linux】Ubuntu 18下安装Vim自动补全插件YouCompleteMe(可高速下载安装)

前言 本文写于2020年10月&#xff0c;如果你多年后看见这篇文章&#xff0c;方法可能已经失效&#xff0c;但是请牢记&#xff0c;尽量下载你所处时代的最新版本的软件&#xff0c;会减少很多麻烦。 摆正心态 即便按照本文操作&#xff0c;由于你的系统状态和我的不一样&…

【操作系统】进程调度(1):FIFO(先进先出)算法 原理与实践

0 前言 本文基于书籍《Operating System&#xff1a;Three Easy Pieces》。 中译本&#xff1a;《操作系统导论》&#xff0c;中译本质量还可以&#xff0c;但是英文版后来的更新&#xff0c;中文版目前没有进行同步更新&#xff08;写下此文的时间是2020年10月&#xff09; 1…

【操作系统】进程调度(2a):SJF(短任务优先) 算法 原理与实践

0 前言 接上一篇文章&#xff1a;进程调度&#xff08;1&#xff09;&#xff1a;FIFO&#xff08;先进先出&#xff09;算法 原理与实践 1 前提铺垫 请参考上一篇文章的前提铺垫部分&#xff0c;本文与之完全一致。 2 SJF 原理 SJF&#xff08;Shortest Job First&#x…

【操作系统】进程调度(2b):STCF(最短完成时间优先) 算法 原理与实践

0 前言 接上一篇文章&#xff1a;进程调度&#xff08;2a&#xff09;&#xff1a;SJF&#xff08;短任务优先&#xff09; 算法 原理与实践 1 前提铺垫 与上一篇同。 2 STCF 原理 STCF&#xff08;Shortest Time-to-Completion First&#xff09;最短完成时间优先。 2.1…

【操作系统】进程调度(3):RR(轮转) 算法 原理与实践

0 前言 接上一篇文章&#xff1a;进程调度&#xff08;2b&#xff09;&#xff1a;STCF&#xff08;最短完成时间优先&#xff09; 算法 原理与实践 1 前提铺垫 除了与上一篇相同的&#xff0c;这里介绍新的基础知识。 1.1 三种类型的程序 计算密集型&#xff08;CPU导向&…

【操作系统】进程调度(4):I/O、不可预测的运行时间

0 前言 上一篇文章&#xff1a;进程调度&#xff08;3&#xff09;&#xff1a;RR&#xff08;轮转&#xff09; 算法 原理与实践 1 前提铺垫 与上一篇同。 2 引入I/O操作 之前我们一直提及的是计算密集型程序&#xff0c;现在我们的程序可以进行I/O交互了&#xff0c;它会…

【计算机系统设计】重点 · 学习笔记(0)

HDL等硬件描述语言&#xff0c;例如Verilog&#xff0c;是并行的&#xff0c;而不像软件一样的顺序执行的&#xff0c;例如很多的always块&#xff0c;initial块&#xff0c;都是并行的&#xff0c;他们会转换为硬件电路&#xff0c;而在仿真的时候&#xff0c;他们也是并发执行…

【计算机系统设计】学习笔记(1)03,04

疑问&#xff1a;sw和lw指令&#xff0c;获取的地址不是4的整倍数&#xff08;字节不对齐&#xff09;的时候&#xff0c;应该如何处理&#xff1f; 东南大学MOCC 计算机系统综合设计 03 03-1 寄存器 介绍了MIPS寄存器&#xff0c;32个寄存器的基本功能和使用&#xff0c;注…

【期末考试】计算机网络、网络及其计算 考试重点

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 计算机网络及其计算 期末考点 &#x1f680;数…

【计算机系统设计】学习笔记(2)

5.1 对于CPU与外界的读写&#xff0c;只有load和store指令能够做&#xff0c;所以很多情况下&#xff0c;直接通过bypass跳过去了&#xff0c;或者闲置&#xff0c;尤其对于流水线&#xff0c;更应该直接跳过而不是闲置&#xff08;如何设计?&#xff09;。 另一方面&#xf…

【计算机系统设计】重点 · 学习笔记(1)(资源消耗)

这一点先浅显理解&#xff0c;就好比我要造一个楼 我是用现成的材料造节省?还是需要用XX材料&#xff0c;但是XX材料还需要现成材料造呢&#xff1f; 这也不一定&#xff0c;但是基本来说&#xff0c;如果使用现有资源&#xff0c;能够直接用&#xff0c;那其实是最好不过的…

【计算机系统设计】重点 · 学习笔记(0)(数据通路设计思想)

重点1&#xff1a;05.1 设计思想 设计思想至关重要&#xff0c;这决定了你能不能自己根据ISA设计出来CPU架构&#xff0c;而不是只是抄别人的&#xff0c;也决定你能不能完成自己的设计更优化的架构。 描述方式约定 6 数据通路 ≠ Verilog代码 我们构建的数据通路&#…

【计算机系统设计】实践笔记(1)数据通路构建:取指部件分析

0 核心思想 根据指令功能&#xff0c;分析出需求&#xff0c;从而得出需要的部件、控制信号以及其他设计。 1. 针对的指令 取指阶段&#xff0c;针对所有指令&#xff0c;任何指令都需要进行取指。 2 功能&#xff08;需求&#xff09;分析 CPU的内部采用的是字节编址&…