微处理器系统设计讲义.docx

上传人:b****6 文档编号:8091152 上传时间:2023-01-28 格式:DOCX 页数:16 大小:417.52KB
下载 相关 举报
微处理器系统设计讲义.docx_第1页
第1页 / 共16页
微处理器系统设计讲义.docx_第2页
第2页 / 共16页
微处理器系统设计讲义.docx_第3页
第3页 / 共16页
微处理器系统设计讲义.docx_第4页
第4页 / 共16页
微处理器系统设计讲义.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

微处理器系统设计讲义.docx

《微处理器系统设计讲义.docx》由会员分享,可在线阅读,更多相关《微处理器系统设计讲义.docx(16页珍藏版)》请在冰豆网上搜索。

微处理器系统设计讲义.docx

微处理器系统设计讲义

功能描述:

设计一个带简单I/O接口电路的多周期RISC处理器设计方案,并在FPGA上进行验证。

验证题目为设计流水灯的样式为:

00000000->00000001->00000011->00000111->00001111->0011111->01111111->11111111->00000000,切换间隔为1秒。

RISC处理器简介

中央处理器(CPU,CentralProcessingUnit)是计算机的核心部件。

计算机进行信息处理可分为两个步骤:

(1)将数据和程序(即指令序列)输入到计算机的存储器中;

(2)从第一条指令的地址起开始执行该程序,得到所需结果,结束运行。

CPU的作用是协调并控制计算机的各个部件并执行程序的指令序列,使其有条不紊地进行。

因此它必须具有以下基本功能:

◆取指令——当程序已在存储器中时,首先根据程序入口地址取出一条程序,为此要发出指令地址和控制信号。

◆分析指令——即指令译码,这是对当前取得的指令进行分析,指出它要求什么操作,并产生相应的操作控制命令。

◆执行指令——根据分析指令时产生的“操作命令”形成相应的操作控制信号序列,通过运算器、存储器及输入/输出设备的执行,实现每条指令的功能,其中包括对运算结果的处理及下条指令地址的形成。

将CPU的功能进一步细化,可概括如下:

(1)能对指令进行译码并执行规定的动作;

(2)可以进行算术和逻辑运算;

(3)能与存储器和外设交换数据;

(4)提供整个系统所需要的控制。

尽管各种CPU的性能指标和结构细节各不相同,但它们所能完成的基本功能相同。

由功能分析可知,任何一种CPU内部结构至少应包含下面这些部件:

(1)算术逻辑运算部件(ALU);

(2)累加器或寄存器;

(3)程序计数器;

(4)指令寄存器和译码器;

(5)时序和控制部件。

从实现的途径看,RISC处理器与一般的CPU的不同之处在于:

它的时序控制信号形成部件是用硬布线逻辑实现的而不是采用微程序控制的方式。

所谓硬布线逻辑也就是用触发器和逻辑门直接连线所构成的状态机和相应的组合逻辑,故产生控制序列的速度比用微程序控制方式快得多,因为这样做省去了读取微程序指令的时间。

RISC处理器结构介绍

一、处理器结构

RISC处理器内核结构

从图中可以看出,RISC处理器内核包括以下功能单元:

控制器、程序计数器、通用寄存器、算术逻辑单元(ALU)和总线接口单元(BIU)。

以下的内容将依次讨论这些模块。

二、处理器内部子模块

1、控制器

控制器用于进行指令译码、产生ALU运算控制信号、产生通用寄存器读写控制信号以及协调处理器工作时序工作。

2、程序计数器

程序计数器用于指向下一条将要执行的指令的地址,它可以自动增值或是通过分支指令来设置其内容。

3、寄存器堆

处理器内部有32个32位寄存器,ALU运算的源操作数、目的操作数大都来自这个寄存器堆。

4、算术逻辑单元

算术逻辑单元用于进行算术运算、移位操作、比较设置操作以及逻辑运算。

对于其他未能实现的运算,例如乘法、浮点运算等,可以使用软件来实现。

5、总线接口单元

总线接口单元用于SimpleRISC处理器与外部存储器和I/O口的连接,为了简单起见,SimpleRISC系统的存储器和I/O采用统一编址的方式进行组织,并且采用程序存储器和数据存储器分开的哈佛结构。

多周期CPU设计原理

在单周期CPU中,每条指令的运行周期都是相同的。

然而,不同的指令,其实际的运行时间各不相同,有的甚至相差很大。

单周期处理器时钟周期远远大于许多指令实际所需执行时间,例如,R-型指令和立即数运算指令都不需要读内存;Store指令不需要写寄存器;分支指令不需要访问内存和写寄存器;Jump指令不需要ALU运算,不需要读内存,也不需要读写寄存器。

受时钟周期宽度的影响,单周期处理器的效率地下、性能极差,这样就造成了运行时间的浪费,降低了运行的速度。

为了解决这个问题,引入多时钟周期CPU的设计方式。

如下图所示,在多时钟周期CPU中,每条CPU指令并不是在一个时钟周期内运行,而是需要占用多个时钟周期,每一个执行步骤占用一个时钟周期。

不同的指令,占用的时钟周期的个数也不相同。

指令可以根据自身特点来决定使用几个时钟周期。

这样,既保证了指令的正确运行,又使得指令根据自身的特点来占用运行时间,避免了运行时间的浪费。

多周期处理器的基本思想为:

把每条指令的执行分为多个大致相等的阶段,每个阶段在一个时钟周期内完成;各个阶段最多完成一次访存或一次寄存器读/写或一次ALU操作;各个阶段的执行结果在下个时钟到来时保存到相应的存储单元或稳定的保持在组合电路中;时钟周期的宽度以最复杂的阶段所花的时间为准,通常取一次存储器读或写的时间。

第一步自然是分析指令执行的状态。

在多周期处理器中,每条指令分多个阶段执行,每个阶段占一个时钟周期,称为一个状态。

指令在被取出、译码之前,每条指令的操作是一样的,指令译码之后不同的指令有不同的执行过程。

子模块设计

控制器模块方案设计

控制器需要根据不同的指令,产生不同的控制信号,以控制数据通路中的部件能同步工作,并且使得数据通路中相应的数据选择器作出正确的选择。

这里的控制器比较复杂,使用一个有限状态机来实现,下图给出了控制器的状态转移图。

控制器状态转移图

从图中可以看出,RISC处理器的控制器具有5个状态。

起始状态是取指状态Fetch,Fetch状态使得指令存储器的读控制信号有效,从而取到要执行的指令。

取到指令之后,要对其进行译码,所以进入了第二个指令译码状态Decode,Decode根据前一状态取到的指令进行译码操作,产生相应的数据选择器选择信号等控制信号。

指令译码之后,进入指令执行状态Execute,这一步大多数指令使用ALU进行运算,然后根据指令类型选择是进行存储器操作还是直接将运算结果写回寄存器堆。

对于存储器访问指令,执行状态之后计算出进行存储器访问的地址,之后进入存储器访问状态Memory进行相应的存储器操作。

对于其他不需要进行存储器访问的指令,直接进入寄存器回写状态Write,将计算结果写回寄存器。

接口定义

信号名称

方向

含义

op

IN

操作码

regdst

OUT

写寄存器地址

regwr

OUT

写寄存器控制信号

alusrc

OUT

立即数和寄存器数据读选择信号

extop

OUT

立即数扩展信号

memwr

OUT

存储器写信号

memtoreg

OUT

存储器写寄存器信号

寄存器堆模块设计

模块方案设计

MIPS指令格式中的寄存器号是5bits,指令可以访问25=32个32位的寄存器。

这样的一堆寄存器“堆在一起”构成一个寄存器堆。

每一个寄存器都是32位,寄存器用来存放指令执行所需的数据。

根据指令执行需要,该寄存器堆需要一个写数据端口和两个读数据端口,即同时要求有两个读地址和一个写地址。

每次当写信号有效和时钟上升沿来临时,会将要写入的数据写入到寄存器给定的地址中,寄存器读端口会在持续的读出寄存器中相应地址中的数据。

电路结构

接口定义及时序图

寄存器共有9个端口,具体见下表

序号

接口信号名称

方向

说明

1.

clk

I

处理器工作时钟,频率为

2.

rst_n

I

复位信号,低有效

3.

raddr1

I

读寄存器堆时的第1个寄存器地址

4.

raddr2

I

读寄存器堆时的第2个寄存器地址

5.

waddr

I

写寄存器堆时的寄存器地址

6.

we

I

寄存器堆写使能

7.

wdata

I

待写入寄存器堆的数据

8.

rdata1

O

读寄存器堆时第1个寄存器的输出

9.

rdata2

O

读寄存器堆时第2个寄存器的输出

ALU模块方案设计

算术逻辑运算器(ALU)是数字计算机中执行加、减等算术运算,执行与、或等逻辑运算,以及执行比较、移位、传送等操作的功能部件,本模块实现32位的ALU。

本文描述MIPS单周期处理器的ALU模块的功能、接口、时序及其实现。

aluclt

运算类型

SUBctr

SIGctr

OPctr

OP含义

0000

Addu

0

0

00

加法器

0001

Add

0

1

00

加法器

0011

Or

0

1

01

与或器

0010

And

0

0

01

与或器

0100

Subu

1

0

00

加法器

0101

Sub

1

1

00

加法器

0110

Situ

1

0

11

置位器

0111

Sit

1

1

11

置位器

1000

Sll

0

0

10

移位器

1001

Srl

0

1

10

移位器

1100

sra

1

0

10

移位器

SUBctr=ALUctr[2](作为加减控制信号)

ANDctr=ALUctr[0](作为与或控制信号)

OVctr=~ALUctr[1]&ALUctr[0](溢出控制信号)

SIGctr=ALUctr[0](置位控制信号)

Opctr[1]=Aluctr[2]&ALUctr[1]|ALUctr[3]

OPctr[0]=ALUctr[1](输出选择信号)

电路结构

接口定义及时序图

信号名称

方向

含义

alu_da[31:

0]

IN

ALU第一个输入数据端口,32位宽度

alu_db[31:

0]

IN

ALU第二个输入数据端口,32位宽度

alu_clt[3:

0]

IN

ALU运算功能编码,12种指令需要4位编码

alu_shift[4:

0]

IN

ALU移位次数

alu_zero

OUT

运算结果全零标志

alu_overflow

OUT

有符号运算溢出标志

alu_dc[31:

0]

OUT

ALU运算结果

算术逻辑单元控制模块

模块方案设计

算数逻辑单元控制模块用来控制ALU的运算类型,当进行R型指令操作时,ALU的运算类型受控于指令中的func_seg字段,当进行I型指令时,ALU的运算类型受控于指令中的op_seg字段。

因此,要设计算术逻辑单元控制模块,需要根据不同的指令类型对func_seg和op_seg字段进行译码操作,从而实现指令对ALU运算类型的控制。

电路结构

接口定义

信号名称

方向

含义

op

IN

操作码

func_seg

IN

R型指令操作类型

alu_ctr

OUT

alu运算类型

程序计数器

 

 

输入端口说明:

Clk,rst_n,bus2与上面的说明一致。

Inc_pc:

有效时,程序计数器自动加一,用于取出下条指令进行相应的动作。

Load_pc:

有效时,可以将bus2上的数据加载到程序计数器上

输出端口说明:

Pc_out:

用于输出相应的地址以便在存储器中取出指令。

总线接口单元

总线接口单元只是一些三态缓冲器,所以直接在RISC处理器的顶层设计中实现,而这里就不专门进行设计。

逻辑原理图:

多时钟周期CPU设计逻辑原理如下图1:

多时钟周期CPU设计逻辑原理图

第二步,就是进行CPU控制器的设计了。

由于多周期数据通路每个指令的执行有多个周期,每个周期的控制信号取之不同,所以,不能用简单的真值表描述的设计方式。

多周期控制器通常采用基于有限状态机和微程序描述两种方式实现。

在本设计中,采用有限状态机的描述方式实现。

其基本思想为:

用一个有限状态机描述指令执行过程,由当前状态和操作码确定下一状态,每来一个时钟发生一次状态改变,不同的状态输出不同的控制信号值。

有限状态机图已在图二中给出,通过第一步中对六类指令的分析,确定使用12个状态对指令的执行过程进行描述和控制。

R型指令

取指令状态

译码/取数状态

送数据运算状态

运算结果写回状态

I型指令

取指令状态

译码/取数状态

送数据运算状态

运算结果写回状态

lw型指令

取指令状态

译码/取数状态

访存地址计算状态

存储器取数状态

结果写回寄存器状态

sw型指令

取指令状态

译码/取数状态

访存地址计算状态

存储器写回状态

分支指令

取指令状态

译码/取数状态

分支结束状态

无条件跳转指令

取指令状态

译码/取数状态

跳转结束状态

多时钟周期CPU设计指令状态表

 

指令编码

1、加法

这里实现的是有符号数的加法,不考虑溢出。

(1)寄存器操作数相加

汇编语言表示形式:

addrt,rs1,rs2

操作说明:

rt=rs1+rs2

编码:

(2)寄存器操作数与立即数相加

汇编语言表示形式:

addirt,rs,imm16

操作说明:

rt=rs+imm16,对imm16进行符号扩展

编码:

2、减法

这里实现的是有符号数的减法,不考虑溢出。

(1)寄存器操作数相减

汇编语言表示形式:

subrt,rs1,rs2

操作说明:

rt=rs1-rs2

编码:

(2)寄存器操作数与立即数相减

汇编语言表示形式:

subirt,rs,imm16

操作说明:

rt=rs–imm16,对imm16进行符号扩展

编码:

3、小于则置一

这里实现的是无符号数的比较。

(1)寄存器操作数比较

汇编语言表示形式:

sltrt,rs1,rs2

操作说明:

rt=(rs1

编码:

(2)寄存器操作数与立即数比较

汇编语言表示形式:

sltirt,rs,imm16

操作说明:

rt=(rs

编码:

4、左移

汇编语言表示形式:

slrt,rs,imm5

操作说明:

rt=rs<

编码:

5、右移

汇编语言表示形式:

rlrt,rs,imm5

操作说明:

rt=rs>>imm5

编码:

6、逻辑与

这里实现的是无符号数的逻辑与。

(1)寄存器操作数的逻辑与

汇编语言表示形式:

andlrt,rs1,rs2

操作说明:

rt=rs1&rs2

编码:

(2)寄存器操作数与立即数的逻辑与

汇编语言表示形式:

andlirt,rs,imm16

操作说明:

rt=rs&imm16,对imm16进行零扩展

编码:

7、逻辑或

这里实现的是无符号数的逻辑或。

(1)寄存器操作数的逻辑或

汇编语言表示形式:

orlrt,rs1,rs2

操作说明:

rt=rs1|rs2

编码:

(2)寄存器操作数与立即数的逻辑或

汇编语言表示形式:

orlirt,rs,imm16

操作说明:

rt=rs|imm16,对imm16进行零扩展

编码:

8、逻辑非

这里只实现了寄存器操作数的逻辑非。

汇编语言表示形式:

notlrt,rs

操作说明:

rt=~rs

编码:

9、从存储器取数据

汇编语言表示形式:

loadrt,rs,imm16

操作说明:

rt=memory[rs+imm16],对imm16进行符号扩展

编码:

10、存储数据到存储器

汇编语言表示形式:

storers1,rs2,imm16

操作说明:

memory[rs2+imm16]=rs1,对imm16进行符号扩展

编码:

11、无条件分支

汇编语言表示形式:

branchimm26

操作说明:

PC=PC+imm26,对imm26进行符号扩展

编码:

12、相等则分支

汇编语言表示形式:

beqrs1,rs2,imm16

操作说明:

if(rs1==rs2)PC=PC+imm16;

elsePC=PC+1;

对imm16进行符号扩展

编码:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1