首页 > 其他分享 >19 | 建立数据通路(下):指令+运算=CPU

19 | 建立数据通路(下):指令+运算=CPU

时间:2023-01-16 11:37:38浏览次数:54  
标签:19 数据通路 CPU 指令 寄存器 时钟 我们 译码器


上一讲,我们讲解了时钟信号是怎么实现的,以及怎么利用这个时钟信号,来控制数据的读写,可以使得我们能把需要的数据“存储”下来。那么,这一讲,我们要让计算机“自动”跑起来。


我们还需要一个能够帮我们在内存里面寻找指定数据地址的译码器,以及解析读取到的机器指令的译码器。这样,我们就能把所有学习到的硬件组件串联起来,变成一个 CPU,实现我们在计算机指令的执行部分的运行步骤。


PC 寄存器所需要的计数器


我们常说的 PC 寄存器,还有个名字叫程序计数器。下面我们就来看看,它为什么叫作程序计数器。


有了时钟信号,我们可以提供定时的输入;有了 D 型触发器,我们可以在时钟信号控制的时间点写入数据。我们把这两个功能组合起来,就可以实现一个自动的计数器了。


于是,D 型触发器里面的数据就会在固定的时钟信号为 1 的时候更新一次。



19 | 建立数据通路(下):指令+运算=CPU_计算机原理


程序计数器


同一个程序的指令应该要顺序地存放在内存里面。这里就和前面对应上了,顺序地存放指令,就是为了让我们通过程序计数器就能定时地不断执行新指令。


加法计数、内存取值,乃至后面的命令执行,最终其实都是由我们一开始讲的时钟信号,来控制执行时间点和先后顺序的,这也是我们需要时序电路最核心的原因。


在最简单的情况下,我们需要让每一条指令,从程序计数,到获取指令、执行指令,都在一个时钟周期内完成。如果 PC 寄存器自增地太快,程序就会出错。因为前一次的运算结果还没有写回到对应的寄存器里面的时候,后面一条指令已经开始读取里面的数据来做下一次计算了。这个时候,如果我们的指令使用同样的寄存器,前一条指令的计算就会没有效果,计算结果就错了。


我们需要在一个时钟周期里,确保执行完一条最复杂的 CPU 指令,也就是耗时最长的一条 CPU 指令。这样的 CPU 设计,我们称之为 单指令周期处理器 (Single Cycle Processor)。


因为即便只调用一条非常简单的指令,我们也需要等待整个时钟周期的时间走完,才能执行下一条指令。在后面章节里我们会讲到,通过流水线技术进行性能优化,可以减少需要等待的时间,这里我们暂且说到这里。


读写数据所需要的译码器


现在,我们的数据能够存储在 D 型触发器里了。如果我们把很多个 D 型触发器放在一起,就可以形成一块很大的存储空间,甚至可以当成一块内存来用。像我现在手头这台电脑,有 16G 内存。那我们怎么才能知道,写入和读取的数据,是在这么大的内存的哪几个比特呢?


于是,我们就需要有一个电路,来完成“寻址”的工作。这个“寻址”电路,就是我们接下来要讲的译码器。


在现在实际使用的计算机里面,内存所使用的 DRAM,并不是通过上面的 D 型触发器来实现的,而是使用了一种 CMOS 芯片来实现的。不过,这并不影响我们从基础原理方面来理解译码器。在这里,我们还是可以把内存芯片,当成是很多个连在一起的 D 型触发器来实现的。


2-1 选择器


我们通过一个反相器、两个与门和一个或门,就可以实现一个 2-1 选择器。通过控制反相器的输入是 0 还是 1,能够决定对应的输出信号,是和地址 A,还是地址 B 的输入信号一致。



19 | 建立数据通路(下):指令+运算=CPU_单片机_02


2-1 选择器电路示意图


一个反向器只能有 0 和 1 这样两个状态,所以我们只能从两个地址中选择一个。如果输入的信号有三个不同的开关,我们就能从 23 ,也就是 8 个地址中选择一个了。这样的电路,我们就叫 3-8 译码器 。现代的计算机,如果 CPU 是 64 位的,就意味着我们的寻址空间也是 264 ,那么我们就需要一个有 64 个开关的译码器。



19 | 建立数据通路(下):指令+运算=CPU_fpga开发_03


当我们把译码器和内存连到一起时,通常会组成这样一个电路


所以说,其实译码器的本质,就是从输入的多个位的信号中,根据一定的开关和电路组合,选择出自己想要的信号。除了能够进行“寻址”之外,我们还可以把对应的需要运行的指令码,同样通过译码器,找出我们期望执行的指令,也就是在之前我们讲到过的 opcode,以及后面对应的操作数或者寄存器地址。只是,这样的“译码器”,比起 2-1 选择器和 3-8 译码器,要复杂的多。


建立数据通路,构造一个最简单的 CPU


D 触发器、自动计数以及译码器,再加上一个我们之前说过的 ALU,我们就凑齐了一个拼装一个 CPU 必须要的零件了。下面,我们就来看一看,怎么把这些零件组合起来,才能实现指令执行和算术逻辑计算的 CPU。



19 | 建立数据通路(下):指令+运算=CPU_计算机原理_04


CPU 实现的抽象逻辑图



首先,我们有一个自动计数器。这个自动计数器会随着时钟主频不断地自增,来作为我们的 PC 寄存器。



在这个自动计数器的后面,我们连上一个译码器。译码器还要同时连着我们通过大量的 D 触发器组成的内存。



自动计数器会随着时钟主频不断自增,从译码器当中,找到对应的计数器所表示的内存地址,然后读取出里面的 CPU 指令。



读取出来的 CPU 指令会通过我们的 CPU 时钟的控制,写入到一个由 D 触发器组成的寄存器,也就是指令寄存器当中。



在指令寄存器后面,我们可以再跟一个译码器。这个译码器不再是用来寻址的了,而是把我们拿到的指令,解析成 opcode 和对应的操作数。



当我们拿到对应的 opcode 和操作数,对应的输出线路就要连接 ALU,开始进行各种算术和逻辑运算。对应的计算结果,则会再写回到 D 触发器组成的寄存器或者内存当中。


这样的一个完整的通路,也就完成了我们的 CPU 的一条指令的执行过程。在这个过程中,你会发现这样几个有意思的问题。


第 6 讲 讲过的程序跳转所使用的条件码寄存器。那时,讲计算机的指令执行的时候,我们说高级语言中的 if…else,其实是变成了一条 cmp 指令和一条 jmp 指令。cmp 指令是在进行对应的比较,比较的结果会更新到条件码寄存器当中。jmp 指令则是根据条件码寄存器当中的标志位,来决定是否进行跳转以及跳转到什么地址。


不知道你当时看到这个知识点的时候,有没有一些疑惑,为什么我们的 if…else 会变成这样两条指令,而不是设计成一个复杂的电路,变成一条指令?到这里,我们就可以解释了。这样分成两个指令实现,完全匹配好了我们在电路层面,“译码 - 执行 - 更新寄存器“这样的步骤。


cmp 指令的执行结果放到了条件码寄存器里面,我们的条件跳转指令也是在 ALU 层面执行的,而不是在控制器里面执行的。这样的实现方式在电路层面非常直观,我们不需要一个非常复杂的电路,就能实现 if…else 的功能。


第 17 讲


所以,执行一条计算机指令,其实可以拆分到很多个时钟周期,而不是必须使用单指令周期处理器的设计。


而是通过流水线、分支预测等技术,来实现在一个周期里同时执行多个指令。


总结延伸


好了,今天我们讲完了,怎么通过连接不同功能的电路,实现出一个完整的 CPU。


我们可以通过自动计数器的电路,来实现一个 PC 寄存器,不断生成下一条要执行的计算机指令的内存地址。然后通过译码器,从内存里面读出对应的指令,写入到 D 触发器实现的指令寄存器中。再通过另外一个译码器,把它解析成我们需要执行的指令和操作数的地址。这些电路,组成了我们计算机五大组成部分里面的控制器。


我们把 opcode 和对应的操作数,发送给 ALU 进行计算,得到计算结果,再写回到寄存器以及内存里面来,这个就是我们计算机五大组成部分里面的运算器。


我们的时钟信号,则提供了协调这样一条条指令的执行时间和先后顺序的机制。同样的,这也带来了一个挑战,那就是单指令周期处理器去执行一条指令的时间太长了。而这个挑战,也是我们接下来的几讲里要解答的问题。


课后思考


CPU 在执行无条件跳转的时候,不需要通过运算器以及 ALU,可以直接在控制器里面完成,你能说说这是为什么吗?


欢迎在留言区写下你的思考和疑惑,你也可以把今天的内容分享给你的朋友,和他一起学习和进步。


标签:19,数据通路,CPU,指令,寄存器,时钟,我们,译码器
From: https://blog.51cto.com/u_15202985/6010261

相关文章

  • 使用cgroup限制CPU核数
    在性能测试的时候,有的时候需要限制CPU为指定核数,我们很容易想到docker,其实还可以通过cgroup来实现。关于cgroupcgroups全称controlgroups,是Linux内核提供的物理资源隔......
  • CPU中断
    什么是中断假设你在玩王者荣耀,突然一个电话过来…,这就是​​中断​​!对CPU来说就是:CPU在执行某一段程序的时候收到某些特定信号转而去执行另一段特定程序的过程。那为......
  • 19.PyQt5【基本组件】消息对话框-QMessageBox
    一、前言QMessageBox是一种常用的模态对话框,用于显示一些信息性消息,并可选择要求用户通过单击其上的任何一个标准按钮来做出响应。每个标准按钮都有一个预定义的标题、一......
  • cpu profiler及火焰图学习
    转自:https://blog.csdn.net/10km/article/details/838200801.profiler输出 大字体显示的节点就是CPU使用率的’热点’。上述为SVG模式,可伸缩向量图形(ScalableVectorG......
  • day4 | 24.两两交换链表中的结点、19.删除链表的倒数第N个结点、面试题:链表相交、142.
    题目链接:24.两两交换链表中的节点-力扣(LeetCode)题目描述:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(......
  • Win Server 2019 HIDI2C驱动安装
    IntelNUCM15随带Win11,设备驱动均正常,安装双系统Win2019后,发现触摸板不工作,很不方便,查资料后解决。一、WinServer2019忘记安装HIDI2C驱动,需自行手工安装,文件hidi2c.inf......
  • S2 - Lesson 19 - Sold out
    Wordshurryhurrytotheticketofficehurryuphurriedlydosth.hurriedly ticketoffice sadly exclaim returnreturnthebooksreturnhome retu......
  • [Oracle19C 数据库管理] 管理存储
    存储概览存储的架构ControlFile:储存了数据物理存储的信息。存在多个副本来避免单点故障。没有控制文件,数据库无法打开。DATAFile:存储用户与应用的信息,以及元数据与......
  • 代码随想录day04|24. 两两交换链表中的节点; 19.删除链表的倒数第N个节点 ; 面试题 02.0
    24190207142关键内容:双指针链表应用,空指针情况考虑代码随想录相关总结首先,还是那句话,链表的操作可以先设置一个虚拟头节点,也可以直接对原链表操作。这次刷题过程中学......
  • P1972 [SDOI2009] HH的项链
    题目传送门题意分析题目部分本题核心:如何判断一个区间内的贝壳是否重复?当右端点\(r\)固定时,不论\(l\)取何值,对于任意一组重复的贝壳,都可以只统计最右端的贝壳。原......