Logisim完成单周期处理器开发实验报告学号__________17110113__________姓名___________王禹心___________指导教师___________朱文军___________提交日期__________2019.5.28_________成绩评价表报告内容报告结构报告最终成绩□丰富正确□基本正确□有一些问题□问题很大□完全符合要求□基本符合要求□有比较多的缺陷□完全不符合要求报告与Project功能一致性报告图表总体评价□完全一致□基本一致□基本不一致□符合规范□基本符合规范□有一些错误□完全不正确教师签字:________________________目录一、总体数据通路结构设计图二、数据通路中的模块设计图1、IFU2、GPR3、ALU4、EXT5、DM6、Controller三、控制器设计四、机器指令描述五、测试程序六、运行结果七、问答八、收获体会附:Logisim模块目录一、总体数据通路结构设计图二、数据通路中的模块设计图1、IFU模块接口信号名方向描述ZeroIALU计算结果1:计算结果为00:计算结果非0ClkI时钟信号ResetI复位信号1:复位0:无效Insout[31:0]O32位MIPS指令功能定义序号功能名称描述1复位当复位信号有效时,PC被设置为0x000000002取指令根据PC从IM中取出指令3计算下一条指令地址若不是beq指令,则PC-PC+1,若是beq指令,且zero为1,则PC-PC+sign_ext2、GPR信号名方向描述Wd[31:0]I写入数据的输入RegwriteI读写控制信号1:写操作0:读操作ClkI时钟信号ResetI复位信号1:复位0:无效A1[4:0]I读存取器地址1A2[4:0]I读存取器地址2A3[4:0]I写寄存器地址Rd1[31:0]O32位数据输出1Rd2[31:0]O32位数据输出23、ALU模块接口信号名方向描述A[31:0]I32位输入数据1B[31:0]I32位输入数据22F[1:0]I控制信号01:或运算10:减法11加法C[31:0]O32位数据输出功能定义序号功能名称描述1或A|B2减A-B3加A+B4、EXT模块接口信号名方向描述Imm16[15:0]I16位数据输入Extop[1:0]I控制信号00:高位补001:低位补010:符号扩展Ext32O32位数据输出功能定义序号功能名称描述1高位补0高16位补02低位补0低16位补03符号扩展符号位扩展5、DM模块接口信号名方向描述D[31:0]I写入数据的输入MemwriteI读写控制信号1:写操作ClkI时钟信号ResetI复位信号1:复位0:无效A[4:0]I操作寄存器地址Out[31:0]032位数据输出功能定义序号功能名称描述1复位当复位信号有效时,所有数据被设置为02读根据输入的寄存器地址读出数据3写根据输入的地址把输入的数据写入6、Controller模块接口信号名方向描述Op[5:0]I六位opFunc[5:0]I六位functionRegdst0写地址控制Alusrc0cpu第二操作数选择控制Mentoreg0Dm读控制Regwrite0GPR读写控制Memwrite0DM写控制,写入GPR数据选择Npc_sel0Beq指令标志Extop0控制ext扩展方式Aluop[1:0]0控制cpu进行相应运算三、控制器设计单周期真值表Func100000100010N/AOp000000000000001101100011000100001111addsuborilwswbeqluiRegDst1100XX0ALUSrc0011101MentoReg0001XXXRegWrite1111002MemWrite0000100Npc_sel0000010ExtopXX000X1ALUctrAddsubtractoraddaddsubtractX四、机器指令描述助记符opcodefunction功能addu000000100001rd-rs+rtsubu000000100011rd-rs-rtori001101rt-rs|(zero-extend)immediatelw100011rt-memory[rs+(sign-extend)immediate]sw101011memory[rs+(sign-extend)immediate]-rtbeq000100if(rs==rt)PC-PC+4+(sign-extend)immediate2lui001111rt-immediate*65536j000010PC-(PC+4)[31..28],address,0,0五、测试程序lui$t0,0x0004#lui测试程序要实现:立即数0x0004加载至t0寄存器的高位lui$t1,0x0008#lui测试程序要实现:立即数0x0008加载至t1寄存器的高位ori$t3,$zero,0x00002000#ori测试程序要实现:zero寄存器中的内容与立即数0x00002000进行或运算,储存在t3寄存器中sw$t0,4($t3)#sw测试程序要实现:把t0寄存器中值(1Word),存储到t3的值再加上偏移量4,所指向的RAM中sw$t0,8($t3)#sw测试程序要实现:把t0寄存器中值(1Word),存储到t3的值再加上偏移量8,所指向的RAM中loop:add$t2,$t2,$t1#add测试程序要实现:t1寄存器中的值加上t2寄存器中的值后存到t2寄存器中lw$t4,4($t3)#lw测试程序要实现:把t3寄存器的值+4当作地址读取存储器中的值存入t4lui$t5,0x0004#lui测试程序要实现:立即数0x0004加载至t5寄存器的高位sub$t7,$t6,$t5#sub测试程序要实现:t6寄存器中的值减去t5寄存器中的值后存到t7寄存器中add$t0,$t0,$t5#sub测试程序要实现:t0寄存器中的值减去t5寄存器中的值后存到t0寄存器中add$t6,$t6,$t0#add测试程序要实现:t6寄存器中的值加上t0后存到t6寄存器中beq$t0,$t1,loop#beq测试程序要实现:判断t0的值和t1的值是否相等,相等转loopadd$t0,$t0,$t5#add测试程序要实现:t0寄存器中的值加上t5后存到t0寄存器中lui$v0,0x0001#lui测试程序要实现:立即数0x0001加载至v0寄存器的高位lui$v1,0x0002#lui测试程序要实现:立即数0x0002加载至v1寄存器的高位add$v0,$v0,$v1#add测试程序要实现:v0寄存器中的值加上v1后存到v0寄存器中add$v1,$v0,$v1#add测试程序要实现:v0寄存器中的值加上v1后存到v1寄存器中ori$a0,$v0,0xffff#ori测试程序要实现:v0寄存器中的内容与立即数0xffff进行或运算,储存在a0寄存器中sub$a1,$a0,0x0000ffff#sub测试程序要实现:a0寄存器中的值减去立即数0x0000ffff后存到a1寄存器中loop2:sub$a2,$v1,$v0#sub测试程序要实现:v1寄存器中的值减去v0中的值后存到a2寄存器中add$a1,$a2,$a1#add测试程序要实现:a2寄存器中的值加上a1后存到a1寄存器中beq$a1,$v1,loop2#beq测试程序要实现:判断a1的值和v1的值是否相等,相等转loop2机器码:3c0800043c090008340b2000ad680004014950208d6c00043c0d000401cd7822010d402001c870201109fff9010d40203c0200013c03000200431020004318203444ffff3c0100003421ffff008128220062302200c5282010a3fffdMARS:六、运行结果GPRDM七、问答1.请充分利用错误!未找到引用源。中的X可以将控制信号化简为最简单的表达式。RegDst=add+subALUSrc=ori+lw+swMemtoReg=lwRegWrite=add+sub+ori+lwMemWrite=swNpc_sel=beqExtop=lw+swALUctr[0]=~(subu+beq)ALUctr[1]=~ori+luiALUctr[2]=02.对于错误!未找到引用源。、错误!未找到引用源。中的与或阵列来说,1个3输入与门最终转化为2个2输入与门,1个4输入与门最终转化为3个2输入与门,依次类推。或阵列也类似计算。那么a)请给出采用错误!未找到引用源。、错误!未找到引用源。中的方法设计的每个控制信号所对应的2输入与门、2输入或门、非门的数量。2输入与门2输入或门非门RegDst17110RegWrite32410ALUsrc2035PCsrc505Memwrite502MemRead503MentoReg503Extop1524ALUctr[1]1013ALUctr[2]2129b)请与第1项对比,你更喜欢哪种设计方法。为什么第一种的每个控制信号都需要对其分配单独的与门、或门,因为它是直接对op、func的12位或6位信号的逻辑表达式,所以没有针对性并且浪费元件。而第二种是先把op、func变成相应的指令信号,再由指令信号生成控制信号。当一种指令对应多种控制信号为1时,不必再对每个信号再单独为这个指令分配与门,而可以共用这个指令的信号,再添加或门就可以了。八、收获体会第一次课设主要重新熟悉了Logisim软件,并且使用较为简单的方式做出了较为基础的几个指令。通过本次课设我更好的理解了每条指令的用途,调用指令完成一些存储功能。在连线中我遇到最大的困难是IFU的设计,其中指令的跳转对于我比较难编写,在逻辑上出现一些问题导致存储器的数据存储的不太对。经过修改后我更加理解了每个模块的运行过程,为下次课设打好基础。