单周期cpu设计步骤_编程必备的CPU知识基础篇(二)

前言

上一篇文章通过人计算的场景讲解了CPU的整体结构,以及CPU的内存访问和程序执行原理。本文将从人执行任务的场景,讲解CPU读取到指令后的执行过程及内部结构组成,并从中总结出通用的架构原理。

CPU如何实现程序运行?

前面已经实现程序在内存中的存储,以及CPU的内存访问机制。接下来CPU就可以读取指令并执行了,下面讲解下这个过程。

寄存器

CPU需要根据地址来访问指令,必须要为CPU指定好程序的第一条指令,如何指定呢?

首先分析一下CPU的指令执行过程:CPU读取首条指令执行后,需要按顺序继续执行下一条指令。CPU必须得知道下条指令的地址,根据第一条指令的地址和指令长度可以计算下一条指令地址,即“指令地址+指令长度=下条指令地址”。依次类推,就可以顺序执行下去。可见CPU需要记忆要读取的指令地址。另外,CPU读取内存数据在计算过程中产生的临时结果也需要保存。

问题:CPU的这些记忆需求如何满足呢?

回到人做题的场景,眼睛读入的字符、计算产生的中间结果、下一步要计算的步骤等都会在大脑中临时记忆。由此可见CPU内部要有记忆部件,这就是寄存器。寄存意味着临时存储,它存储速度必须要快、存储容量不会太大否则就使用内存了。

没错,寄存器的读写速度与CPU同速,其容量与CPU一次读取的数据量匹配,比如:64位CPU的寄存器可以存储8个字节。寄存器的造价比内存要贵得多,虽然它也是由晶体管构成,但存储结构却比内存复杂、能耗更高。

根据不同的存储用途,CPU内部有多种寄存器。比如:前述存储代码地址的指令指针寄存器,存储计算和传输数据的通用寄存器,存储段地址的段寄存器等等。有些寄存器是开放给开发人员使用的“可编程寄存器”,还有CPU自用的寄存器。

对学习汇编语言来说,寄存器是要重点学习的,这里我们简单了解这些就可以了。

人执行任务的要素

CPU执行一条指令相当于完成一个计算任务,把程序中所有任务都完成则程序结束。在继续CPU执行任务前,先来看一看咱们自己是怎样完成任务的。

假如你是一位团队负责人,领导安排了一项任务。接到任务后,肯定不是自己埋头苦干,别忘了还有你的团队。你需要把任务分解成一个个可分配到个人的子任务,然后再为每个任务确定执行时间、执行人,这样就形成了一个任务执行计划。之后就是实施计划,把任务安排到人,跟踪执行过程并根据执行状态进行适当调整。另外,为保证任务按时完成,需要确保各执行人按照计划约定的时间来工作。最终,任务顺利完成,向领导交付成果。

从上述场景中我们能得出哪些任务执行的要素呢?

首先,要有任务;然后,你是任务负责人,负责任务的分解、分配、实施、跟踪、调整等管控类工作,简单说就是任务控制;再有,每个子任务都会分配到个人,这是任务执行;另外,任务执行中你会跟踪任务的执行状态并根据状态调整过程,同时你将保证执行人按时间节奏来工作以确保按时完成,这里的要素是状态和时间节奏。

经过上面简单的分析,我们得出人执行任务的3个关键要素:任务、任务控制、任务执行,其中任务控制还涉及执行状态工作节奏

如下图:

eb8c9e4910f0fd91aa6ff32b513da5ca.png

人执行任务的要素

接下来就按照这几个要素讲解CPU的内部组成结构,注意这里讲的是一个通用结构或者说是CPU的概念模型,对编程人员了解CPU来说足够了,至于CPU微架构的细节需要查看具体CPU产品。

控制器

对CPU来讲一条指令是一个工作任务,程序就是任务集合。CPU根据指令指针寄存器中地址读取一条指令,并保存在内部的指令寄存器中。

CPU内部可以有很多部件,相当于一个团队。接到任务(即指令)后,由指令译码器负责把指令分解成各执行部件可以识别的、符合一定时序的操作信号序列,相当于形成任务执行计划。

操作控制器负责“任务执行计划”的实施,即按操作信号序列的时序要求和部件间的协作关系,适时发送信号给相应执行部件共同协作完成指令任务,相当于按状态和工作节奏控制执行过程。

这样,由指令寄存器、指令译码器、操作控制器就构成了CPU的控制单元即控制器。这就是CPU内部的“任务控制”。

执行单元

经过控制器分解后的“子任务”,将被发送给相应的执行单元“执行任务”。执行单元包括:负责读写内存的加载/存储单元,负责整数运算的ALU(算术逻辑单元),负责浮点运算的FPU(浮点运算单元)以及负责地址转换的逻辑单元(如分段部件、分页部件)等等。

其中负责计算的执行单元教科书上称为运算器。下面将简单介绍一下CPU运算器的计算原理。

运算器

数字电路的基础是电子元件(如晶体管),主要有开、关两种状态,可以表示0、1,因此计算机天然支持二进制。前面讲过了可以使用晶体管构建存储元件,继而形成寄存器、内存等存储设备。那除此之外,还能做什么呢?

其实二进制的0/1除了表示数据,用来存储信息,还能参与运算。这里要说的是布尔运算,包括与、或、非、异或,举个例子:

1 and 1 = 1,1 and 0 = 0,0 and 1 = 0 ,0 and 0 = 0,and代表“与”运算

正是利用二级制的布尔运算能力,使用若干二极管、晶体管和其它电子元件就组成了数字电路中最基本的逻辑单元即门电路。最基本的门电路包括:与门、或门、非门、异或门,与布尔运算逻辑对应。

有了门电路就可以进行逻辑运算了,但算术运算(如加减法)呢?

看个题目:计算二进制0111 + 1110 =?

二进制加法规则:按位计算,每一位需要两次加法:一次加法计算当前两位,结果再加进位。这样每一位计算需要两步:先计算“和”,再加“进位”。

二进制“和”计算,如:

1+1=0,1+0=1,0+1=1,0+0=0,正好符合“异或(xor)”计算规则。

“进位”计算,如:

1+1->1,1+0->0,0+1->0,0+0->0,正好符“与(and)”计算规则。

可见使用逻辑运算就能计算加法,于是用门电路进行组合,分别计算“进位”、“和”可实现一位二进制计算,这就是一位全加器。把多个一位全加器进行级联,就形成了加法器。比如:8个一位全加器级联就构成了8位加法器,可计算字节加法。计算机用“补码”表示数据,减法也可以用加法计算,因此有加法器就能算减法,继而乘除都能算了。

类似加法器,由多个逻辑门组合实现一定逻辑功能的数字电路被称为组合电路。由组合电路就可以构成负责各类计算的运算单元即运算器,比如加法器就是ALU的核心部分

好了,这里简单讲了一下运算器的计算原理,大家了解一下就可以了。

指令周期

至此,我们讲解了CPU的基本组成结构,如下图:

3260cfa648b4469156ab387e7358f2d6.png

CPU基本组成结构

万事俱备只欠东风,如何让上述CPU结构工作起来呢?

现实生活中,我们是按照时钟来安排工作形成节奏的。比如:早上6点起床,8:30点到公司,9点晨会…。若要CPU各部件有条不紊的工作需要什么条件呢?

1. 时钟周期

与我们不同CPU的部件工作内容单一,只要有电就会一直工作,不需要休息。每个部件在完成自己工作时,也需要分成多个工作步骤,每个步骤都需要花费一定时间,且步骤之间有先后顺序。部件怎样安排自己的工作呢?

这就涉及到工作节奏,比如大名鼎鼎的“番茄工作法”,设定每个工作周期为25分钟即一个番茄周期,然后休息5分钟,接着再开启一个番茄周期,4个番茄周期为一组,再休息15~30分,如此反复就会形成一个工作节奏。

同样道理,CPU的部件在工作时也需要一个工作周期,在周期内安排好可以完成的若干工作步骤,完成之后不休息接着开启下个工作周期继续工作,如此反复就形成了CPU的工作节奏。

可见,有工作周期就能实现按节奏工作,CPU得有块“钟表”才行。在集成电路中最常用的时钟电路是石英晶体振荡器(简称晶振),通常被整合到主板芯片中。晶振可以为CPU提供固定时间间隔且连续的脉冲信号,这个时间间隔就是CPU的时钟周期,以纳秒为单位。

CPU在脉冲信号驱动下工作,所谓“闻鸡起舞”正是此意。每个时钟周期,可接受2个信号即“上升沿、下降沿”。上升沿是通电时刻,从低电压转高电压的瞬间,下降沿与之相反是断电时刻。数字电路是在边沿信号驱动下工作的。

CPU每秒钟的时钟周期数量就是CPU的时钟频率即主频。需要说明一下,由于现代CPU的工作主频远高于主板,主板上晶振提供的时钟周期对CPU来说太长,因此采用“倍频”技术将主板频率转变为CPU工作频率。因此常说“CPU主频=外频(即主板频率)*倍频”。

2. 指令周期

有了时钟周期CPU各部件在它的驱动下就可以工作了,执行一条指令的工作时间被称为指令周期,以时钟周期为单位。下面就站在时钟周期的角度,大致描述一下CPU的指令周期。

总线周期:CPU执行指令前,需要从内存读取指令。指令执行过程中还需要从内存读写数据。无论读取或写入都需要访问一次总线,所需时间就是一个总线周期,以时钟周期为单位。一个指令周期将包含若干总线周期。

一个总线周期至少需要4个时钟周期(T1、T2、T3、T4),以读周期为例简要描述如下:

 T1:CPU把要读取的存储单元地址放到地址总线上; T2:CPU通过控制总线向内存发送读取信号 T3:存储器将数据发送到数据总线 T4:将数据从数据总线读入CPU

需要注意的是,如果内存在T3未能将数据发送到总线,CPU将在T3后等待一个时钟周期,之后如果数据还没就绪再等待一个时钟周期,直到数据就绪才进入T4。由此可见,如果内存速度过慢,CPU工作速度再快也只能等待,可见单一追求CPU高主频是不能提升性能的。

下面是CPU指令周期的主要阶段,大家了解下即可:

ac307337c47fc4c00e3c6fa087d9daee.png

指令周期阶段

取指阶段:根据指令长度及总线宽度用一个或多个总线周期读取指令

译指阶段:用一个时钟周期完成指令译码

执行阶段:按指令功能由相应运算单元执行计算,其中整数加减法=1T(T代表时钟周期);整数乘除法>=3T;浮点数加法、乘法∈[3T,5T];浮点数除法∈[3T,15T]

访存阶段:若指令操作数在内存中,需要若干总线周期从内存加载数据

写回阶段:若运算结果需保存至内存,需要总线周期写入数据

(注:关于指令流水线的原理本文暂不讲解)

指令集

1. 为什么要用指令操作计算机?

CPU作为计算核心装置应当如何使用它呢?

当然是通过指令,但人们操作计算机的最早“姿势”却不是指令而是按钮。

这个容易理解,比如咱们现在用的各种APP不都是基于按钮操作的吗,或用鼠标点击或通过触摸屏点击。

基于按钮操作APP很方便,但要操作最底层的计算核心,那可就苦不堪言了。最大的问题恐怕就是不灵活,比如扩充一种计算或控制,就得在机器物理结构上增加一个按钮太麻烦了。如果要实现一个复杂点的算法,操作人员不免对着按钮一顿猛操作,跑完一个程序真得大汗淋漓还累手,忙活半天代码有bug或者按错了,直接崩溃啊!

计算机设计的目的就是能够处理所有可计算问题,这就要求能够操作计算机实现任何可计算的、各种复杂度的算法。这将涉及到无数种计算操作的组合(想想前面讲过3种基本控制结构的任意组合),所以这绝不是用按钮能表达的。

在人类能掌握的表达信息方式中,最灵活的就是语言,自然语言、数学语言都能在各自领域进行任意表达。语言由符号构成,只要设计出可描述任何算法逻辑的符号,就能表述任何算法,这一类语言即符合图灵完备

图灵完备可简单理解为能够存储及访问数据、支持程序控制结构(至少支持3种基本结构及其嵌套组合)、支持各种数据运算(算术、比较、逻辑等)。当然前面我们也讨论过通过控制CPU访问内存能够实现任何数据结构和算法。

可见,操作计算机的完美“姿势”是使用满足图灵完备的指令。

2. 指令及指令集

  • 指令

计算机指令由操作码操作数组成,其中操作码指明指令功能,操作数是指令处理的数据。如:

ADD dest,source 等价于dest=dest+source

其中ADD就是操作码代表相加,dest、source是“加数”与“被加数”,“和”存储到dest。

计算机只能表示二进制,因此指令需要用二进制编码即指令编码。指令编码是对操作码和操作数用二进制编码,再按照一定语法规则组织。其中操作码必须具有唯一性,以便于CPU辨识指令功能、长度、操作数等信息确保其正确执行。

指令的二进制形式就是机器语言,但人编写二进制指令太费劲了,所以后来就出现了接近人类语言词汇的指令助记符,形成汇编语言。用汇编语言编写程序,再由编译器翻译成机器指令,程序才能运行。现在的高级语言也都要经过汇编这一步才能在机器上运行。

  • 指令集

操作CPU的指令构成的集合就是指令集。 “世界上本没有路,走的人多了,也便成了路”,计算机指令从诞生伊始就不断增加和扩展,逐渐形成两大指令体系,代表了不同设计思想:

CISC即“复杂指令集计算机”,为了获得更高执行性能,将软件实现的常用功能用硬件指令实现,指令集开始变得庞大。Intel x86系列一直按此方向发展,增加新指令兼容旧指令,指令集越来越大。但每个指令类型都需要额外电路元件,指令集越大处理器越复杂、执行将变慢(因为结构复杂指令执行涉及的环节多了),且很多高级指令不常用。在RISC提出后,其被称为CISC。

RISC即“精简指令集计算机”,简化指令功能,把复杂功能交给程序实现,但会增加程序使用指令的数量。由于指令功能单一,相当于大任务拆成一堆小任务,可安排更多人来做,速度就会提升。因此通过提高指令并行能力及提供更多寄存器(减少内存访问)可提升计算性能,这就是RISC指令体系。

使用CISC的程序简单,但处理器结构复杂。使用RISC的程序复杂,但处理器结构简单。两者各有利弊,后来出现融合:RISC机器发展中,引入更多指令封装硬件细节,为程序提供形式简单功能复杂的指令,早已不再“精简”。CISC机器能够将CISC指令动态翻译成类RISC的操作序列(即功能单一的微指令),再通过提高指令并行性加快执行速度。

今天,在桌面、便携计算机和服务器计算领域,x86占据了完全统治地位。RISC在高性能服务器和嵌入式处理器市场表现更为出色。ARM、Power、MIPS是RISC指令集,x86是CISC指令集。

架构复盘

1. 计算机实现信息处理的要素

本文从人计算的场景出发,讲解了计算核心结构,以及CPU的内存访问机制。

在计算核心的体系结构中接触了两类电路,一类是记忆单元构成的存储,一类是逻辑门构成的计算。计算与存储是分离的,比如:运算器与寄存器、运算器与内存。数据需要在两者之间传输就需要数据通道,比如:运算器与寄存器之间的内部总线、运算器与内存之间的系统总线。同时,需要对存储、传输、计算进行控制才能实现数据处理。

这就构成了计算机实现信息处理的5个要素:数据、计算、存储、通道、控制。如下图:

c41d7ae824b0815d8e0d88378455a9bc.png

计算机实现的5要素

今后的文章,我们将会利用这个5个要素来理解计算机体系结构。这里大家先有个印象即可。

2. 任务模型的3要素

本文通过人处理任务的场景,讲解了CPU执行指令任务的内部结构。任务处理模型有3个基本要素:任务、任务控制、任务执行。把计算机系统看成一个任务模型,对理解计算机体系的功能逻辑有很大帮助。

3. 操作信息处理系统的正确“姿势”

计算核心作为一个可实现任何算法的计算装置,对外提供了最灵活的使用方式,即满足图灵完备的指令集。这里给我们一个启示,一个信息系统会根据所支持操作逻辑的复杂性,提供不同的使用方式。

对于易用性高的系统,方便的UI就是最好的操作方式。随着操作逻辑的复杂,渐渐向图灵完备靠近。这在信息系统中非常常见,比如,数据库提供了SQL类语言已经很灵活了,但仍提供了存储过程用来处理更复杂逻辑。大家明白这一点将更容易理解不同信息系统使用方式的区别。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、 设计目标 设计目的: 设计一个含有36条指令的MIPS单周期处理器,并能将指令准确的执行并烧写到试验箱上来验证 设计初衷 1、理解MIPS指令结构,理解MIPS指令集中常用指令的功能和编码,学会对这些指令进行归纳分类。 2、了解熟悉MIPS体系中的处理器结构 3、熟悉并掌握单周期处理器CPU的原理和设计 4、进一步加强Verilog语言进行电路设计的能力 、实验设备 1、装有xilinx ISE的计算机一台 2、LS-CPU-EXB-002教学系统实验箱一台 三、实验任务 1.、学习 MIPS 指令集,深入理解常用指令的功能和编码,并进行归纳确定处理器部件的控制码,比如使用何种 ALU 运算,是否写寄存器堆等。 2、单周期 CPU 是指一条指令的所有操作在一个时钟周期内执行完。设计中所有寄存器和存储器都是异步读同步写的,即读出数据不需要时钟控制,但写入数据需时钟控制。 故单周期 CPU 的运作即:在一个时钟周期内,根据 PC 值从指令 ROM 中读出相应的指令,将指令译码后从寄存器堆中读出需要的操作数,送往 ALU 模块,ALU 模块运算得到结果。 如果是 store 指令,则 ALU 运算结果为数据存储的地址,就向数据 RAM 发出写请求,在下一个时钟上升沿真正写入到数据存储器。 如果是 load 指令,则 ALU 运算结果为数据存储的地址,根据该值从数据存 RAM 中读出数据,送往寄存器堆根据目的寄存器发出写请求,在下一个时钟上升沿真正写入到寄存器堆中。 如果非 load/store 操作,若有写寄存器堆的操作,则直接将 ALU 运算结果送往寄存器堆根据目的寄存器发出写请求,在下一个时钟上升沿真正写入到寄存器堆中。 如果是分支跳转指令,则是需要将结果写入到 pc 寄存器中的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值