(2)I型指令:
指令
指令格式
功能
op
rs
rt
Immediate
addiu
101011
sj1
Sj2
Imm
Sj2=sj1+imm
andi
001100
sj1
Sj2
Imm
Sj2=sj1&imm
Lw
100011
base
rt
offset
offsetMemory[base+imm]
sw
001001
base
rt
offset
Memory[base+imm]offset
(3)J型指令:
指令
指令格式
功能
op
rs
rt
offset
Beq
000100
sj1
Sj2
offset
Ifsj1=sj2thenbranch
Bnq
000101
sj1
Sj2
offset
Ifsj1≠sj2thenbranch
j
101000
2)总体结构设计
注:
将一个外来时钟信号clk_out生成一系列时钟信号clk1、clk送往CPU内部的其他部件。
clk1信号用作状态控制器的时钟信号。
clk则用于触发每一个状态的进行。
3)该MIPSCPU的顶层原理图
2.子模块详细设计
该多周期CPU内部主要包括九个基本模块,即时钟发生器,指令寄存器,累加器,算术逻辑单元,数据控制器,状态控制器,取指模块,地址多路器和立即数扩展等模块。
各模块具体功能及相关主要端口说明如下:
1)时钟发生器
根据功能单元所需进行的操作,将一条指令执行分解为一系列步骤,指令的每一个步骤占用一个时钟周期。
因此利用时钟发生器模块将一个外来时钟信号Clk_out生成一系列不同的时钟信号clk1、clk送往CPU内部的其他部件。
利用clk的上升沿来触发CPU控制器开始执行一条指令。
clk1信号用作状态控制器的时钟信号。
端口定义:
序号
接口信号名称
方向(I/O)
说明
1
Clk_out
I
外部输入时钟
2
rst
I
复位信号,低有效
3
clk1
O
状态控制器的时钟信号
4
clk
O
ALU的时钟信号
2)指令寄存器
指令存储器用于存放CPU运算的程序指令和数据等,采用单端口存储器设计,设计最大为64个存储单元,每个存储单元数据宽度为32bit。
指令寄存器的触发时钟是clk,在clk的正沿触发下,寄存器将数据总线送来的指令寄存器中。
但并不是每个clk的上升沿都寄存数据总线的数据,因为数据总线上有时传输指令,有时传输数据。
什么时候寄存,什么时候不寄存由CPU状态控制器的load_ir信号控制。
load_ir信号通过ena口输入到指令寄存器。
复位后,指令寄存器被清为零。
序号
接口信号名称
方向(I/O)
说明
5
clk
I
存储器工作时钟,频率为50Mhz
6
rst
I
存储器片选信号,低有效
7
ExtMem_Adr[5:
0]
I
存储器地址线
8
ExtMem_WR
I
存储器读写信号,1为写反之读
9
ExtMem_Din[31:
0]
I
存储器输入数据线
10
ExtMem32[31:
0]
O
存储器输出数据线
11
ena
I
加载指令寄存器
3)累加器
累加器用于存放当前的结果。
复位后,累加器的值是零。
当累加器通过ena使能端口收到来自CPU状态控制器load_acc信号时,在clk时钟正跳沿时就收到来自于数据总线的数据。
序号
接口信号名称
方向(I/O)
说明
1
clk
I
时钟信号
2
ena
I
使能信号
3
Data[31:
0]
I
来自数据总线的数据
4
rst
I
复位信号,低有效
5
accum[31:
0]
O
输出总线上的数据
4)RISCCPU算术逻辑运算单元
算术逻辑运算单元根据输入的8种不同操作码分别实现相应的加、减、与、异或、跳转等多种基本操作运算。
利用这几种基本运算可以实现很多种其它运算以及逻辑判断等操作。
同时利用该算术逻辑部件的部分功能实现下载之后的流水灯简单变化功能,用以验证设计结果。
(1).端口说明
序号
接口信号名称
方向(I/O)
说明
1
ALU_DA[31:
0]
I
参与运算的第一个输入数据
2
ALU_DB[31:
0]
I
参与运算的第二个输入数据
3
alu_clt[3:
0]
I
运算功能编码
4
alu_shift[4:
0]
I
偏移量
5
ALU_Zero
O
零标志位
6
Alu_Overflow
O
溢出标志位
7
ALU_Dout[31:
0]
O
运算结果输出位
(2).具体ALU实现如下图所示
5)数据控制器
数据控制器的作用是控制累加器数据输出,由于数据总线是各种操作时传送数据的公共通道,不同的情况下传送不同的内容。
有时要传输指令,有时要传送RAM区或接口的数据。
计算单元的数据只有在需要往RAM区或端口写时才允许输出,否则应呈现高阻态,以允许其它部件使用数据总线。
所以任何部件往总线上输出数据时,都需要一控制信号。
而此控制信号的启、停,则由CPU状态控制器输出的各信号控制决定。
数据控制器何时输出ALU的数据则由状态控制器输出的控制信号Data_ena决定。
序号
接口信号名称
方向(I/O)
说明
1
In
I
ALU的数据输入口
2
Data_ena
I
是否输出ALU的数据的控制信号
3
Data[31:
0]
O
来自数据总线的数据
6)状态控制器
状态控制器由两部分组成:
1.状态机
2.状态机控制器
状态机控制器接受复位信号RST,当RST有效时通过信号ena使其为0,输入到状态机中停止状态机的工作。
状态机是CPU的控制核心,用于产生一系列的控制信号,启动或停止某些部件。
CPU对指令和数据的读写都是由状态机来控制的。
状态机的当前状态,由变量state记录,state的值就是当前这个指令周期中已经过的时钟数。
4类指令的有限状态机图
一条指令的执行分为若干个周期,包括取指令周期,指令译码周期,指令执行周期,存储器访问周期以及结果回写周期。
本次实验利用有限状态机实现多周期CPU的控制。
在执行指令过程中:
(1).LW等指令的执行包括5个周期:
a)根据程序计数器取指令,并且PC+1;
b)指令译码,读出rs寄存器的内容;
c)计算存储器地址;
d)访问存储器,读出数据;
e)将结果写入寄存器堆中的rt寄存器。
(2).跳转指令的执行需要3个周期:
a)根据PC取指令;
b)指令译码,选择要跳转的目标地址;
c)把跳转地址写入PC中。
(3).R型指令执行需要4个周期:
a)根据程序计数器取指令,并且PC+1;
b)读出rs和rt寄存器的内容;
c)由ALU完成两个输入数据的计算;
d)将结果写入寄存器堆中。
(4).转移指令执行需要3个周期:
a)根据程序计数器取指令;
b)读出rs和rt寄存器的内容,ALU计算转移地址;
c)由ALU比较两个寄存器内的数据,决定是否要把转移地址写入PC中。
7)取指模块
由程序计数器,取出指令以及译码三个子模块构成总的取指模块。
程序计数器用于提供指令地址。
以便读取指令,指令按地址顺序存放在存储器中。
当指令顺序执行时,pc_addr每次自动加1,如果遇到要改变顺序执行程序的情况,即分支或跳转指令时,需要形成新的指令地址,这时CPU状态控制器将会输出load_pc信号,通过load口进入程序计数器。
程序计数器(pc_addr)将装入目标地址(ir_addr),而不是增1。
如果执行复位,则复位后,指令指针为零,即每次CPU重新启动将从存储器的零地址开始读取指令并执行。
(1).端口说明:
序号
信号名
方向(I/O)
端口说明
1
clk
I
2
rst
I
3
ALU_DA
I
算术逻辑单元数据A
4
Branch
I
分支信号使能端
5
Jump
I
跳转信号使能端
6
op
O
指令操作码
7
rs
O
8
rt
O
9
rd
O
10
func
O
R指令的功能操作码
11
shamt
O
偏移量
12
imm16
O
立即数
13
ALU_DB
O
算术逻辑单元数据B
14
Pc_out
O
程序计数器输出
(2).电路内部基本构成如下图所示:
8)地址多路器
地址多路器用于选择输出的地址是PC(程序计数)地址还是数据/端口地址。
每个指令周期的前4个时钟周期用于从ROM中读取指令,输出的应是PC地址。
后4个时钟周期用于对RAM或端口的读写,该地址由指令中给出。
地址的选择输出信号由时钟信号的fetch提供。
端口定义:
序号
接口信号名称
方向(I/O)
说明
1
PC_addr
I
PC地址
2
IR_addr
I
指令地址
3
Fetch
I
时钟信号
4
addr
O
选择地址的输出
9)立即数扩展
设计一个32位MIPS符号扩展单元SE,用于将16位的数据转换为32位数据。
端口说明:
序号
信号名
方向(I/O)
说明
1
Imm16[15:
0]
I
来自指令寄存器的16位立即数
2
Extop
I
立即数扩展信号的使能端
3
bus[31:
0]
I
4
ExtImm32[31:
0]
O
符号扩展后的32位立即数
3.设计过程中部分重要代码
1)利用状态机实现CPU内部信号控制,主要控制信号:
ALUSrcA,ALUSrcB,Load_Mem,MemtoReg,
RegDst,ExtOp,MemWr,PcWrite,RegWr;
状态机分为10个状态,
State_IR=4'b0000,取指
State_decode=4'b0001,译码
State_MemCalc=4'b0010,计算寄存器地址
State_MemRD=4'b0011,I型指令访存(lw)
State_MemRDend=4'b0100,I型数据写入寄存器
State_MemWr=4'b0101,I型指令访存(sw)
State_R=4'b0110,R型执行
State_Rend=4'b0111,R型执行完成//
State_B=4'b1000,分支执行及计算PC地址//
State_J=4'b1001;跳转执行及计算PC地址//
2)在外部设置独立小模块生成跳转和分支控制信号:
Branch,Jump。