首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

处理器结构体系-1

处理器结构体系-1

本帖最后由 look_w 于 2017-9-22 21:32 编辑

处理器体系结构




ISA一个处理器支持的指令指令的字节级编码称为它的指令集体系结构ISA
虽然每个厂商制造的处理器性能和复杂性不断提高,但是不同型号在ISA级别上都保持着兼容。因此,ISA在编译器编写者和处理器设计人员之间提供了一个概念抽象层
这个概念抽象层即ISA模型:CPU允许的指令集编码,且顺序地执行指令,也就是先取出一条指令,等到她执行完毕,再开始下一条。然而,现代处理器的实际工作方式可能跟ISA隐含的计算模型大相径庭。通过同时处理多条指令的不同部分,处理器可以获得较高的性能。但其必须对外表现出符合ISA模型的执行结果。
在计算机科学中,用巧妙的方法在提高性能的同时,又保持一个更简单、更抽象模型的功能,这种思想是众所周知的(抽象)。

CPU硬件简介
大多数现代电路设计都是用信号线上的高电压和低电压来表示不同的位值。
要实现一个数字系统需要三个主要的组成部分:
①计算对位进行操作的函数的组合逻辑(ALU)
②存储位的存储器元素(寄存器)
③控制存储器元素更新的时钟信号

逻辑门是数字电路的基本计算元素,它们产生的输出,等于它们输入位值的某个布尔函数。
将很多逻辑门组合成一个网,就能构建计算块,称为组合电路。(相当于一个表达式)

算术/逻辑单元(ALU)是一种很重要的组合电路,这个电路有三个输入:两个数据输入及一个控制输入。根据控制输入的设置,电路会对数据输入执行不同的算术或逻辑操作。

存储器和时钟组合电路从本质上讲,不存储任何信息。它们只是简单地响应输入信号,产生等于输入的某个函数的输出。为了产生时序电路,也就是有状态并且在这个状态上进行计算的系统,我们必须引入按位存储信息的设备。
存储设备都是由同一个时钟控制,时钟是一个周期性信号,决定了什么时候要把新值加载到设备中

大多数时候,寄存器都保持在稳定状态(用x表示),产生的输出等于它的当前状态。信号沿着寄存器前面的组合逻辑传播,这时,产生了一个新的寄存器输入(用y表示),但只要时钟是低电位的,寄存器的输出就仍然保持不变。当时钟变成高电位的时候,输入信号才加载到寄存器中,成为下一个状态y,直至下一个时钟的上升沿。
寄存器是作为电路不同部分中的组合逻辑之间的屏障。每当每个时钟到达上升沿时,值才会从寄存器的输入传送到输出

寄存器文件(通用寄存器组成的逻辑块) 有两个读端口,还有一个写端口。电路可以读两个程序寄存器的值,同时更新第三个寄存器的状态。每个端口都有一个地址输入,表明选择哪个程序寄存器。
虽然寄存器文件不是组合电路,因为它有内部存储。不过,从寄存器文件读数据就好像它是一个以地址为输入、数据为输出的一个组合逻辑块。

指令编码指令集的一个重要性质就是字节编码必须有唯一的解释。任意一个字节序列要么是一个唯一的指令序列的编码,要么就不是一个合法的字节序列。因为每条指令的第一个字节有唯一的代码和功能组合,给定这个字节,我们就可以决定所有其他附加字节的长度和含义

每条指令需要1——6个字节不等,这取决于需要哪些字段。每条指令的第一个字节表明指令的类型:高4位是代码部分(例:6为整数类操作指令),低4位是功能部分(例:1为整数类中的减法指令) 61合起来即为sub指令。

处理一条指令的序列:
取指(fetch)
取值阶段从存储器读取指令字节,放到指令存储器(CPU中)中,地址为程序计数器(PC)的值。
它按顺序的方式计算当前指令的下一条指令的地址(即PC的值加上已取出指令的长度)

译码(decode)
ALU从寄存器文件(通用寄存器的集合)读入最多两个操作数。(即一次最多读取两个寄存器中的内容)

执行(execute)
在执行阶段会根据指令的类型,将算数/逻辑单元(ALU)用于不同的目的。对其他指令,它会作为一个加法器来计算增加或减少栈指针,或者计算有效地址,或者只是简单地加0,将一个输入传递到输出。
条件码寄存器(CC)有三个条件位。ALU负责计算条件码新值。当执行一条跳转指令时,会根据条件码和跳转类型来计算分支信号cnd。

访存(memory)
访存阶段,数据存储器(CPU中)读出或写入一个存储器字。指令和数据存储器访问的是相同的存储器位置,但是用于不同的目的。

写回(write back)
写回阶段最多可以写两个结果到寄存器文件。寄存器文件有两个写端口。端口E用来写ALU计算出来的值,而端口M用来写从数据存储器中读出的值。

更新PC(PC update)
根据指令代码和分支标志,从前几步得出的信号值中,选出下一个PC的值。



我们以SEQ(sequential 顺序的)处理器为例讲解CPU的基本原理。每个时钟周期上,SEQ执行处理一条完整指令所需的所有步骤。不过这需要一个很长的时钟周期时间,因此时钟周期频率会低到不可接受。


SEQ的时序

组合逻辑不需要任何时序或控制——只要输入变化了,值就通过逻辑门网络传播。
我们也将随机访问存储器(寄存器文件、指令存储器和数据存储器)看成和组合逻辑一样的操作。(随机访问存储器需要等待高电平)
由于指令存储器只用来读指令,因此我们可以将这个单元看成是组合逻辑。(内存向指令存储器中写指令是CPU外部的事件 不属于CPU内的时序)

每个时钟周期,程序计数器都会装载新的指令地址。
只有在执行整数运算指令时,才会装载条件码寄存器。
只有在执行mov、push、call指令时,才会写数据存储器。

要控制处理器中活动的时序,只需要寄存器和存储器的时钟控制
因为指令运行计算的结果,写入寄存器存储器中。
我们可以把取指、译码、执行等过程看做是组合逻辑的处理过程(因为它们不涉及写入寄存器)。把写回看做是另一个过程。
则整个过程可简化为下图所示:


举例详解
有如下指令:
0x000 : irmovl  $0x100, %ebx
0x006 : irmovl  $0x200, %edx
0x00c : addl    %edx, %ebx
0x00e : je  dest
0x013 : rmmovl  %ebx, 0(%edx)
0x019 : dest: halt

在我们的SEQ处理器中,一个时钟周期(即两次高电平时间的时间间隔)执行一条指令。


时钟周期3开始时(点1处),一个高电平打入,地址0x00c载入程序计数器PC中。这样,与PC相连的MCU(主存控制单元)就在内存中把地址0x00c处的addl指令提取出来,加载到指令存储器中。(从内存中读取数据很慢,这个过程会很久,所以我们的时钟周期要很长,才能做到一个时钟周期执行一条指令)同时,PC的值加上addl指令的长度,得出新PC值,新PC值通过总线传播,等待下次高电平时写入PC。

组合逻辑指令存储器中的输入一变化,值(addl指令)就通过逻辑门网络传播。故,瞬间读出了寄存器文件中%edx、%ebx的值(因为读寄存器文件不需要高电平触发)

读出的%edx、%ebx的值瞬间流动到组合逻辑ALU中,ALU根据之前传播的addl指令,知道此为加法指令,瞬间计算出这两个值的结果valE。valE通过总线传播瞬间到达寄存器文件,但是此时还不能向寄存器文件写入,必须等待下次的高电平。
故此时,寄存器文件和存储器中保存的还都是上条指令的结果值。(点1、2处)

时钟周期4开始时(点3处),一个高电平打入,上周期产生的新PC值写入程序计数器,上周期计算得到的addl的结果valE值写入寄存器文件中的%ebx中。
因为地址0x00e载入了程序计数器中,故会取出并执行跳转指令je。因为条件码ZF为0,所以不会选择分支。在这个周期末尾(点4),程序计数器已经产生了新值0x013。但是直到下个周期开始之前,寄存器和存储器中的状态还是保持着addl指令设置的值。

【如此例所示,用时钟来控制状态元素的更新,以及值通过组合逻辑来传播,足够控制我们SEQ实现中每条指令执行的计算了。每次时钟由低变高时,处理器开始执行一条新指令。】
返回列表