《计算机系统:系统架构与操作系统的高度集成》——3.3 重要的硬件概念

简介:

本节书摘来自华章计算机《计算机系统:系统架构与操作系统的高度集成》一书中的第3章,第3.3节,作者:(美)拉姆阿堪德兰(Ramachandran, U.)(美)莱希(Leahy, W. D.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.3 重要的硬件概念

3.3.1 电路
组合逻辑 这种逻辑电路的输出是输入的布尔组合。也就是说,这里没有状态(即记忆)的概念。这种电路由基本的逻辑门(AND、OR、NOT、NOR、NAND)组成。另一种认识这类电路的方式是,它们没有从输入回到输入的反馈。
考虑一个混合了许多麦克风的输入并给扬声器产生一个复合输出的插线板。扬声器的输出取决于接线板选择的麦克风以便产生复合声音。这个接线板就是一种组合逻辑电路的例子。在处理器的数据通路中能发现的组合逻辑电路包括多路复用器、解复用器、编码器、解码器和算术/逻辑单元。
时序逻辑 时序逻辑电路的输出是当前输入与当前状态的布尔组合。除了组成组合逻辑电路的那些基本的逻辑门外,组成时序逻辑电路还需要一种称为触发器的记忆元件作为关键部分。
考虑一个车库门开关控制电路。这个电路的输入就是一个按钮以及一些表示门开着还是关着的开关。电路的输出是一个控制电机升高或降低车库门的信号。动作的方向取决于门的当前状态。因此,车库开关门控制器是一个时序逻辑电路。处理器数据通路中的寄存器和内存也是时序逻辑电路的例子。
3.3.2 数据通路的硬件资源
处理器的数据通路包含了组合逻辑与时序逻辑元件。根据第2章中给出的LC-2200指令集,我们来确定数据通路需要哪些资源。
我们需要内存来保存指令和操作数。我们需要算术/逻辑单元(ALU)来执行算术/逻辑指令。我们需要寄存器堆,因为它是大部分指令集体系结构中操作的重点。绝大部分指令使用寄存器堆。我们需要程序计数器(以后简称为PC)来指向当前指令以及用于实现第2章中讨论过的分支跳转指令。当一条指令从内存中取出后,它需要存储在数据通路的某个地方,所以我们引入了指令寄存器(IR)来保存指令。
顾名思义,寄存器堆就是体系结构中程序员可见的寄存器的集合。我们需要控制线路和数据线路来操作寄存器堆。这包括用来寻找某一特定寄存器的地址线以及读/写寄存器的数据线。只允许同时读单个寄存器的寄存器堆称为单端口寄存器堆(SPRF)。允许同时读两个寄存器的寄存器堆,称为双端口寄存器堆(DPRF)。例3-1给出了寄存器堆所需的所有控制线和信号线。
例3-1 下图是一个双端口寄存器堆(DPRF),包含64个寄存器。每个寄存器32位长。Aaddress和Baddress是端口A和端口B所读寄存器的地址。Caddress是数据Data_in写入的寄存器的地址。RegWrEn是寄存器堆的写使能信号。图中的每个箭头各有几根线?
image

答:

  1. Data_in有32根线。
  2. 端口A有32根线。
  3. 端口B有32根线。
  4. Aaddress有6根线。
  5. Baddress有6根线。
  6. Caddress有6根线。
  7. RegWrEn有1根线。
    3.3.3 边沿触发逻辑

寄存器内容从当前状态改变到新状态是对时钟信号的响应(见图3-1)。

image

输入变化引起输出变化的具体时间取决于这个元件是电平逻辑还是边沿触发逻辑。在电平逻辑中,只要时钟信号是高电平,那么变化就会发生。而在边沿触发逻辑(见图3-2)中,变化只会发生在时钟的上升沿或下降沿。如果状态变化发生在上升沿,则称为正边沿触发逻辑;如果变化发生在下降沿,则称为负边沿触发逻辑。

image

图3-2 时钟。时钟周期指的是两个连续的上升沿(或下降沿)之间的时间间隔
在后面的讨论中,我们假设数据通路中所有的寄存器都使用正边沿触发逻辑。我们将在3.4.2节中讨论选择时钟周期宽度的细节。
例3-2 寄存器A、B和C连接成了下面的电路:
image

ldA、ldB和ldC是寄存器A、B和C的时钟信号。如果在某个时钟周期内A、B、C的值如图中所示,那么下一个时钟周期它们的值又是什么?
答:
各个寄存器的输入都将会变成它们的输出,因此,
image

内存元件比较特殊(见图3-3)。正如第1章中看到的,在讨论计算机系统组成时,实际上,内存子系统是完全与处理器分离的。然而,出于简化处理器实现有关基本概念的目的,我们将内存包含在数据通路设计中。出于讨论的目的,我们认为内存不是边沿触发的。

image

例如,为了读取某个内存单元,你给内存提供“地址”和“读”信号,过了有限的一段时间(称为内存的读访问时间)后,该地址的内容就出现在“数据输出”线上。同样,为了写某个内存单元,你提供“地址”、“数据输入”,以及“读”信号,在一段有限时间(写访问时间)后,该内存单元的值就会变成通过“数据输入”写入的值。我们在第9章中会更详细地讨论内存系统。
3.3.4 连接数据通路元件
让我们考虑执行LC-2200指令集中的ADD指令需要什么,并由此推出数据通路元件应该如何连接。
1)步骤1:我们需要PC来指明指令在何处(见图3-4)。
2)步骤2:指令从内存中读出后,就保存到IR中(见图3-5)。
image

  
3)步骤3:IR中的指令可用后,就可以使用(IR中的)指令中给出的寄存器号从寄存器堆(双端口,与例3-1中的类似)中读对应的寄存器。使用ALU进行加法操作,并将结果写回到寄存器堆中对应的寄存器(见图3-6)。
image

图3-6 步骤3。执行将两个寄存器值相加并写入第三个寄存器中
前面的3个步骤给出了ADD指令执行的路线图。我们看看这三步能不能在一个时钟周期内完成。前面提到,所有的存储元件(除了内存外)都是正边沿触发的。这意味着,在一个时钟周期内(如果相对于逻辑器件的延迟来说,时钟周期足够长的话),我们能将信息从一个存储元件传送到另一个存储元件(途中经过组合逻辑和内存)。所以,步骤1和步骤2可以在一个时钟周期内完成。但步骤3不能在同一周期内完成。在步骤3中,我们需要从IR中将寄存器号取出传送给寄存器堆。但由于IR的边沿触发特性,所以只有到下一个时钟周期后IR中的指令才可用(见图3-7)。

image

事实证明,步骤3可以在一个时钟周期内完成。在下一个时钟周期开始时,IR的输出可以用来索引需要从寄存器堆中读出的具体的源寄存器。寄存器值读出后(读寄存器的过程与读内存是类似的),将它们传递给ALU,执行ADD操作,将结果写入目的寄存器(由IR给出)。图3-8阐明了步骤3在第二个时钟周期内的完成情况。
决定时钟周期 我们重新审视步骤1和步骤2,我们说过它们可以在一个时钟周期内完成。要完成这些步骤,时钟周期需要多长呢?根据图3-7,从第一个上升沿开始,我们可以枚举所有与这两个步骤相关的组合逻辑的延迟:
等待PC输出稳定到可以读取的时间(Dr-output-stable)。
PC输出传播到内存地址输入的线延迟(Dwire-PC-Addr)。
读取指定地址单元的内存访问时间(Dmem-read)。
内存读出值传播到IR输入的线延迟(Dwire-Dout-IR)。
在第二个时钟上升沿前,IR的输出需要达到稳定,这段时间称为建立时间(Dr-setup)。
在第二个时钟上升沿后,IR输出需要保持不变一段时间,这称为保持时间(Dr-hold)。
完成步骤1和步骤2所需要的时钟宽度必须大于上述延迟的总和:
时钟宽度> Dr-output-stable + Dwire-PC-Addr + Dmem-read + Dwire-Dout-IR + Dr-setup + Dr-hold
我们对每个时钟周期内所有可能的信号传播路径进行分析。然后,令时钟宽度大于整条路径的最坏情况下信号传播延迟。在3.4.2节中,我们将形式化定义计算时钟周期涉及的术语。
例3-3 给出下面的参数(单位是皮秒(ps)),确定系统所需要的最小时钟宽度(仅考虑前面所说的步骤1~3):
image

答:
image

例子中的数据是相当准确的数据(2007年前后)。从例子中明显可以看出线延迟占主要地位。
3.3.5 基于总线的设计
为了执行ADD指令,为数据通路上的元件建立了专门的连接。为了实现其他指令(如LD),我们需要建立一条从内存到寄存器堆的路径。以此类推,我们可以想象数据通路上的所有元件都相互连接。事实证明,这没有必要,也不是正确的方法。我们检查连接ALU到寄存器堆涉及什么。我们需要与位宽相应数量的线路来连接两个元件。对于32位的机器,需要32根线。当我们增加数据通路元件的连通性时,需要的线路就会快速增加。从占用硅片面积的角度来说,连线是非常昂贵的,所以我们需要减少连线数量以使硅片真正用于数据通路中活动的元件。而且,仅仅增加线路并不会带来性能的提高。例如,从内存到寄存器的线路对于ADD指令的实现一点帮助都没有。
所以,我们需要更加细致地考虑数据通路元件的连接问题。具体来说,前面讨论给我们的启发是,与其在每两个元件之间连线,不如设计数据通路让各元件共享线路。让我们来研究需要多少线以及如何共享它们。
单总线设计 最极端的一种情况是,只有一组总线,所有的元件都共享它。这就像小组开会一样,一个人说,大家都在听。如果有必要参与讨论,每个人都会轮到发言。如果同时有多人讲话,当然就会很混乱。这就是单总线系统(一组线路被所有元件共享)的工作方式。图3-9就是这样一个系统。
image

图3-9  单总线设计。仅有一个数据通路元件能够将它的输出放到总线上,这是通过相应的“驱动”信号来实现的
总线说明这组线路是共享。第一点需要注意的是,灰线是一条电气单总线,也就是说,总线上的数据在总线的任意一段都是可用的。第二点需要注意的是,在元件和总线之间有些三角形。它们是驱动器(也称为三态缓冲器)。每个元件需要连接到总线的输出上,都会有这样一个驱动器。它们将数据通路元件和总线进行电气隔离。所以,为了“连接”元件1与总线,相应的驱动器必须是“开”的。这可以通过选择相应的“驱动”信号来完成。然后,我们就说数据通路元件1在“驱动”总线。同时存在多个元件驱动总线是错误的。所以控制逻辑的设计者需要保证任意一个时钟周期内仅有一个驱动器处于“开”状态。如果多个驱动器同时处于“开”状态,那么除了总线上的值变得无法预测之外,还可能对电路造成致命伤害。另一方面,总线上的元件在每个时钟周期都会尝试获取总线上的数据。为此,元件上对应的WrEn(写使能)信号必须为“开”。
双总线设计 图3-10展示了一个双总线设计。在这个设计中,寄存器是双端口的,类似于例3-1中的那样。因此,在一个时钟周期内可以同时读两个寄存器并传送给ALU。顶部的灰线和底部的黑色点线都是传输地址和数据值的总线,具体传输的内容取决于在这个时钟周期内需要什么。然而,在名义上,灰色总线传输地址而黑色虚线总线在元件之间传输数据。
虽然图中没有画出,但在每个元件的输出端都有驱动器连接到总线上。完成3.3.4节中的步骤1~3需要几个时钟周期呢?每个周期分别发生了什么呢?
我们来探讨这两个问题。

image

第一个时钟周期:
从PC到灰色总线(注意:在这个周期内没有其他元件能够驱动灰色总线)。
从深灰色总线到内存地址。
内存读取Addr指定的单元。
数据从Dout到黑色虚线总线(注意:此时没有其他元件能驱动黑色虚线总线)。
从黑色虚线总线到IR。
时钟触发IR。
我们在一个时钟周期内完成了步骤1和步骤2。

image

第二个时钟周期:
IR将寄存器号提供给寄存器堆(见IR到寄存器堆的那个箭头,它表示对应的线路),包括两个源寄存器和一个目的寄存器。
读寄存器堆,从两个源寄存器中取出数据。
寄存器堆将两个源寄存器的数据值提供给ALU(见寄存器堆到ALU的箭头表示的线路)。
执行ALU的ADD操作。
将ALU结果提供给黑色虚线总线(注意,这个时钟周期内没有其他元件能够驱动黑色虚线总线)。
从黑色虚线总线到寄存器堆。
根据IR给出的目标寄存器号,写入寄存器堆。
在这个时钟周期内我们完成了步骤3。
image

前面讨论中最关键的地方是,我们使用两根共享总线(以及寄存器堆到ALU的连接和IR到寄存器堆的选择线路)而不是每一对元件间的专设线路完成了步骤1~3。
3.3.6 有限状态机
目前为止,我们总结了电路元件以及它们如何组装到处理器的数据通路中。这只是处理器设计的一部分。处理器设计中同等重要的一部分是控制单元。最好将控制单元理解为一个有限状态机(Finiut State Machine,FSM),因为将数据通路通过状态切换来完成指令的执行。
有限状态机,顾名思义,有有限个状态。在图3-11中,标记为S1、S2、S3的圆圈是FSM的状态。箭头则是状态之间的转移。FSM是任意时序逻辑电路的抽象。它描述了电路的行为。FSM的状态对应着时序逻辑电路的某些实际的物理状态。描述一个转移的两个参数是:1)触发状态发生变化的外部输入;2)电路在状态转移中产生的输出信号。因此,FSM描述实际电路所有硬件细节是很方便的。
例如,图3-12中的简单FSM就表示了之前介绍的车库门开关控制电路。表3-1给出了这个FSM的状态转移表,包括导致转移的输入以及产生的相应输出。
状态“打开”表示门是开着的,而“关闭”表示门是关着的。输入是一个遥控器按钮。输出是控制马达开关门的信号。标记为“0”和“1”的转移表示是没有按下按钮的情况。标记为“2”和“3”的转移则表示按钮被按下。转移“2”产生一个控制门升起的输出信号,而转移“3”产生一个使门降下的信号。学过逻辑设计课程的人都知道,给出FSM和状态转移表后,设计时序逻辑是一种很简单的练习。(见本章末尾与车库门开关控制器有关的两道题。)
image

  
image

我们知道时序逻辑可以是同步的或异步的。对于前者,状态转移是与时钟沿同步的,而后者的状态转移在输入变化时就立刻发生。
处理器的控制单元也是时序逻辑电路。我们用图3-13中的FSM表示控制单元。

image

FETCH:这个状态表示将指令从内存中取出。
DECODE:这个状态表示对读出的指令进行解释以确定需要什么操作数以及做什么操作。
EXECUTE:这个状态表示执行指令。
我们在3.5节中还会再讲到控制单元。

相关文章
|
24天前
|
存储 分布式计算 大数据
大数据-169 Elasticsearch 索引使用 与 架构概念 增删改查
大数据-169 Elasticsearch 索引使用 与 架构概念 增删改查
52 3
|
7天前
|
安全 算法 Unix
深入浅出操作系统:从基础概念到实践应用
【10月更文挑战第22天】本文旨在以浅显易懂的语言,为读者揭开操作系统的神秘面纱。我们将从操作系统的基本概念出发,逐步深入其核心功能与设计哲学,并通过具体代码示例,展示操作系统如何在实际中发挥作用。无论你是计算机科学的学生,还是对技术有浓厚兴趣的爱好者,这篇文章都将为你提供一次轻松愉快的操作系统之旅。
19 4
|
26天前
|
消息中间件 NoSQL Kafka
大数据-52 Kafka 基础概念和基本架构 核心API介绍 应用场景等
大数据-52 Kafka 基础概念和基本架构 核心API介绍 应用场景等
56 5
|
26天前
|
消息中间件 存储 分布式计算
大数据-53 Kafka 基本架构核心概念 Producer Consumer Broker Topic Partition Offset 基础概念了解
大数据-53 Kafka 基本架构核心概念 Producer Consumer Broker Topic Partition Offset 基础概念了解
56 4
|
29天前
|
Ubuntu Java Linux
Linux操作系统——概念扫盲I
Linux操作系统——概念扫盲I
37 4
|
2月前
|
存储 算法 安全
深入理解操作系统:从基础概念到代码实践
【9月更文挑战第23天】本文将带领读者深入探索操作系统的奥秘,从基础概念出发,逐步揭示操作系统的工作原理和设计哲学。我们将通过实际代码示例,展示操作系统如何与硬件交互、管理资源以及提供用户界面。无论你是计算机专业的学生还是对操作系统感兴趣的开发者,这篇文章都将为你打开一扇通往操作系统世界的大门。
66 16
|
2月前
|
监控 Android开发 iOS开发
深入探索安卓与iOS的系统架构差异:理解两大移动平台的技术根基在移动技术日新月异的今天,安卓和iOS作为市场上最为流行的两个操作系统,各自拥有独特的技术特性和庞大的用户基础。本文将深入探讨这两个平台的系统架构差异,揭示它们如何支撑起各自的生态系统,并影响着全球数亿用户的使用体验。
本文通过对比分析安卓和iOS的系统架构,揭示了这两个平台在设计理念、安全性、用户体验和技术生态上的根本区别。不同于常规的技术综述,本文以深入浅出的方式,带领读者理解这些差异是如何影响应用开发、用户选择和市场趋势的。通过梳理历史脉络和未来展望,本文旨在为开发者、用户以及行业分析师提供有价值的见解,帮助大家更好地把握移动技术发展的脉络。
73 6
|
25天前
|
存储 分布式计算 算法
大数据-105 Spark GraphX 基本概述 与 架构基础 概念详解 核心数据结构
大数据-105 Spark GraphX 基本概述 与 架构基础 概念详解 核心数据结构
36 0
|
25天前
|
消息中间件 分布式计算 Kafka
大数据-98 Spark 集群 Spark Streaming 基础概述 架构概念 执行流程 优缺点
大数据-98 Spark 集群 Spark Streaming 基础概述 架构概念 执行流程 优缺点
34 0
|
26天前
|
存储 SQL 消息中间件
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
41 0