1、 《计算机组成原理实验》 实验报告 (实验二) 学院名称 : 专业(班级) : 学生姓名 : 学号 : 时间 : 2017 年 11 月 25 日 成绩 : 实验二 : 单周期CPU设计与实现 一. 实验目得 (1) 掌握单周期CPU数据通路图得构成、原理及其设计方法; (2) 掌握单周期CPU得实现方法,代码实现方法; (3) 认识与掌握指令与CPU得关系; (4) 掌握测试单周期CPU得方法; (5) 掌握单周期CPU得实现方法。 二. 实验内容 设计一个单周
2、期得MIPSCPU,使其能实现下列指令: ==> 算术运算指令 (1)add rd , rs, rt (说明:以助记符表示,就是汇编指令;以代码表示,就是机器指令) 000000 rs(5位) rt(5位) rd(5位) reserved 功能:rd←rs + rt。reserved为预留部分,即未用,一般填“0”。 (2)addi rt , rs ,immediate 000001 rs(5位) rt(5位) immediate(16位) 功能:rt←rs + (signextend)immediate;immediate符号扩展再参加“加”运算。
3、 (3)sub rd , rs , rt 000010 rs(5位) rt(5位) rd(5位) reserved 功能:rd←rs rt ==> 逻辑运算指令 (4)ori rt , rs ,immediate 010000 rs(5位) rt(5位) immediate(16位) 功能:rt←rs | (zeroextend)immediate;immediate做“0”扩展再参加“或”运算。 (5)and rd , rs , rt 010001 rs(5位) rt(5位) rd(5位) reserved 功能:rd←rs & rt;
4、逻辑与运算。 (6)or rd , rs , rt 010010 rs(5位) rt(5位) rd(5位) reserved 功能:rd←rs | rt;逻辑或运算。 ==>移位指令 (7)sll rd, rt,sa 011000 未用 rt(5位) rd(5位) sa reserved 功能:rd<-rt<<(zeroextend)sa,左移sa位 ,(zeroextend)sa ==>比较指令 (8) slt rd, rs, rt 带符号数 011100 rs(5位) rt(5位) rd(5位) reserved 功能:i
5、f (rs
6、diate(16位) 功能:rt ← memory[rs + (signextend)immediate];immediate符号扩展再相加。 即读取rs寄存器内容与立即数符号扩展后得数相加作为地址得内存单元中得数,然后保存到rt寄存器中。 ==> 分支指令 (11)beq rs,rt,immediate 110000 rs(5位) rt(5位) immediate(16位) 功能:if(rs=rt) pc←pc + 4 + (signextend)immediate <<2 else pc ←pc + 4 特别说明:immediate就是从PC+4地
7、址开始与转移到得指令之间指令条数。immediate符号扩展之后左移2位再相加。为什么要左移2位?由于跳转到得指令地址肯定就是4得倍数(每条指令占4个字节),最低两位就是“00”,因此将immediate放进指令码中得时候,就是右移了2位得,也就就是以上说得“指令之间指令条数”。 12)bne rs,rt,immediate 110001 rs(5位) rt(5位) immediate 功能:if(rs!=rt) pc←pc + 4 + (signextend)immediate <<2 else pc ←pc + 4 特别说明:与beq不同点就是,不等时转移,相
8、等时顺序执行。 (13)bgtz rs,immediate 110010 rs(5位) 00000 immediate 功能:if(rs>0) pc←pc + 4 + (signextend)immediate <<2 else pc ←pc + 4 ==>跳转指令 (14)j addr 111000 addr[27、、2] ==> 停机指令 (15)halt 111111 0000(26位) 功能:停机;不改变PC得值,PC保持不变。 三. 实验原理 1、时间周期: 单周期CPU指得就是一条指令得执行在一个时钟周期内完成
9、然后开始下一条指令得执行,即一条指令用一个时钟周期完成。电平从低到高变化得瞬间称为时钟上升沿,两个相邻时钟上升沿之间得时间间隔称为一个时钟周期。时钟周期一般也称振荡周期(如果晶振得输出没有经过分频就直接作为CPU得工作时钟,则时钟周期就等于振荡周期。若振荡周期经二分频后形成时钟脉冲信号作为CPU得工作时钟,这样,时钟周期就就是振荡周期得两倍。) CPU在处理指令时,一般需要经过以下几个步骤: (1) 取指令(IF):根据程序计数器PC中得指令地址,从存储器中取出一条指令,同时,PC根据指令字长度自动递增产生下一条指令所需要得指令地址,但遇到“地址转移”指令时,则控制器把“转移地址
10、送入PC,当然得到得“地址”需要做些变换才送入PC。 (2) 指令译码(ID):对取指令操作中得到得指令进行分析并译码,确定这条指令需要完成得操作,从而产生相应得操作控制信号,用于驱动执行状态中得各种操作。 (3) 指令执行(EXE):根据指令译码得到得操作控制信号,具体地执行指令动作,然后转移到结果写回状态。 (4) 存储器访问(MEM):所有需要访问存储器得操作都将在这个步骤中执行,该步骤给出存储器得数据地址,把数据写入到存储器中数据地址所指定得存储单元或者从存储器中得到数据地址单元中得数据。 (5) 结果写回(WB):指令执行得结果或者访问存储器
11、中得到得数据写回相应得目得寄存器中。 单周期CPU,就是在一个时钟周期内完成这五个阶段得处理。 对于不同得指令,需要执行得步骤就是不同得,其中取字指令(lw)需要执行全部五个步骤。因此,CPU得时间周期由取字指令决定。 2、指令类型: MIPS得三种指令类型: 其中, op:为操作码; rs:只读。为第1个源操作数寄存器,寄存器地址(编号)就是00000~11111,00~1F; rt:可读可写。为第2个源操作数寄存器,或目得操作数寄存器,寄存器地址(同上); rd:只写。为目得操作数寄存器,寄存器地址(同上); sa:为位移量(shift amt),移
12、位指令用于指定移多少位; funct:为功能码,在寄存器类型指令中(R类型)用来指定指令得功能与操作码配合使用; immediate:为16位立即数,用作无符号得逻辑操作数、有符号得算术操作数、数据加载(Load)/数据保存(Store)指令得数据地址字节偏移量与分支指令中相对程序计数器(PC)得有符号偏移量; address:为地址。 在本CPU设计中,由于指令得类型较少,所以所有指令均由操作码(op)确定。在R型指令中,功能码(funct)为000000。 3、控制线路图与数据通路: 上图为CPU得数据通路与必要得控制线路图,其中Ins、Mem为指令存储器,Data、Mem
13、为数据存储器。访问存储器时,先给出内存地址,然后由读或写信号控制操作。对于寄存器组,先给出寄存器地址,读操作时,输出端就直接输出相应数据;而在写操作时,在 WE使能信号为1,在时钟边沿触发将数据写入寄存器。 4、控制信号: 控制信号得作用 控制信号名 状态“0” 状态“1” Reset 初始化PC为0 PC接收新地址 PCWre PC不更改,相关指令:halt PC更改,相关指令:除指令halt外 ALUSrcA 来自寄存器堆data1输出,相关指令:add、sub、addi、or、and、ori、beq、bne、bgtz、slt、sw、lw 来自移位数sa,同时,
14、进行(zeroextend)sa,即 {{27{0}},sa},相关指令:sll ALUSrcB 来自寄存器堆data2输出,相关指令:add、sub、or、and、sll、slt、beq、bne、bgtz 来自sign或zero扩展得立即数,相关指令:addi、ori、sw、lw DBDataSrc 来自ALU运算结果得输出,相关指令:add、addi、sub、ori、or、and、slt、sll 来自数据存储器(Data MEM)得输出,相关指令:lw RegWre 无写寄存器组寄存器,相关指令: beq、bne、bgtz、sw、halt、j 寄存器组写使能,相关指令:
15、add、addi、sub、ori、or、and、slt、sll、lw InsMemRW 写指令存储器 读指令存储器(Ins、 Data) /RD 读数据存储器,相关指令:lw 输出高阻态 /WR 写数据存储器,相关指令:sw 无操作 RegDst 写寄存器组寄存器得地址,来自rt字段,相关指令:addi、ori、lw 写寄存器组寄存器得地址,来自rd字段,相关指令:add、sub、and、or、slt、sll ExtSel (zeroextend)immediate(0扩展),相关指令:ori (signextend)immediate(符号扩展) ,相关指令:
16、addi、sw、lw、bne、bne、bgtz PCSrc[1、、0] 00:pc<-pc+4,相关指令:add、addi、sub、or、ori、and、slt、 sll、sw、lw、beq(zero=0)、bne(zero=1)、bgtz(sign=1,或zero=1); 01:pc<-pc+4+(signextend)immediate,相关指令:beq(zero=1)、 bne(zero=0)、bgtz(sign=0,zero=0); 10:pc<-{(pc+4)[31、、28],addr[27、、2],0,0},相关指令:j; 11:未用 ALUOp[2、、0]






