您好,欢迎访问三七文档
数字逻辑与处理器基础大作业单周期处理器一、处理器结构阅读处理器的结构图,理解其中各控制信号的含义。注意与教材(第三版)204页图5-24的异同。1.试回答以下问题:a)由RegDst信号控制的多路选择器,输入2对应常数31。这里的31代表什么?在执行哪些指令时需要RegDst信号为2?为什么?答:该项输入对应的是寄存器编号,31即对应了$ra寄存器,而$ra寄存器的作用是用来返回地址的,只有在执行跳转指令jal时,需要对$ra寄存器写入,这,时候应该有Writeregister=31,亦即RegDst=2。b)由ALUSrc1信号控制的多路选择器,输入1对应的指令[10-6]是什么?在执行哪些指令时需要ALUSrc1信号为1?为什么?答:ALUSrc1信号控制的是ALU的第一个输入,在ALUSrc1=0时ALU的第一个输入是从由rs字段所确定的寄存器中读取出来的值,而ALUSrc1=1时,ALU的第一个输入则会变为Instruction[10:6],这段所对应的是shamt[4:0]字段,它的意义在于确定逻辑左移sll,逻辑右移srl,算术右移sra,所需要移动的二进制位数。c)由MemtoReg信号控制的多路选择器,输入2对应的是什么?在执行哪些指令时需要MemtoReg信号为2?为什么?答:MentoReg=2时,从所给的数据通路来看的结果是对应输入为PC+4。在执行jal指令的时候,会跳转到一个地址的同时将下一条指令的地址保存在寄存器堆(寄存器$ra)中。这时便需要MemtoReg=2。没有其他的指令需要将程序的地址写会寄存器堆中。d)图中的处理器结构并没有Jump控制信号,取而代之的是PCSrc信号。PCSrc信号控制的多路选择器,输入2对应的是什么?在执行哪些指令时需要PCSrc信号为2?为什么?答:PCSrc=2时对应输入为从Instruction[25:21]段(rs段)确定的寄存器序号中读取的数据ReadData1传输到PC,作为下一条指令的地址。由此可以知道,仅有在jr和jalr指令执行的过程中需要使PCSrc=2,因为只有这两条指令需要将寄存器的输出值作为下一条指令的地址。e)为什么需要ExtOp控制信号?什么情况下ExtOp信号为1?什么情况下ExtOp信号为0?答:ExtOp这是一条控制立即数符号的指令,当I型指令的立即数为无符号型时,ExtOp=0,符号扩展即直接在[31:16]补上16个0;而当I型指令为有符号数时,ExtOp=1,表明是根据该立即数的符号位决定是在[31:16]上补16个1(负数最高位为1)还是16个0(正数最高位为0)。f)若想再多实现一条指令nop(空指令),指令格式为全0,需要如何修改处理器结构?答:空指令并无其他特殊功能,因此不需要增加新的功能单元,只需要将控制单元的译码电路做修正即可。全0的指令格式上与sll$0,$0,0相同,但这条指令正常情况下不会出现(不会对$0做写入操作),因此只需要修改RegWrite的逻辑,使得当指令为全0时RegWrite无效即可。2.根据对各控制信号功能的理解,填写如下真值表(填0,1,2,x等)。PCSrc[1:0]BranchRegWriteRegDst[1:0]MemReadMemWriteMemtoReg[1:0]ALUSrc1ALUSrc2ExtOpLuOplw00101010100sw000x01x0100lui001000001x1add001100000xxaddu001100000xxsub001100000xxsubu001100000xxaddi00100000110addiu00100000110and001100000xxor001100000xxxor001100000xxnor001100000xxandi00100000110sll001100010xxsrl001100010xxsra001100010xxslt001100000xxsltu001100000xxslti00100000110sltiu00100000100beq010x00x0010j1x0x00xxxxxjal1x12002xxxxjr2x0x00xxxxxjalr2x11002xxxx二、完成控制器code文件夹中是处理器的Verilog文件。1.CPU.v实现了处理器的整体结构。阅读CPU.v,理解其实现方式。2.Control.v是控制器模块的代码。完成Control.v。3.阅读InstructionMemory.v,根据注释理解指令存储器中的程序。MIPSAssembly01234567891011addi$a0,$zero,12345addiu$a1,$zero,54321sll$a2,$a1,16sra$a3,$a2,16beq$a3,$a1,L1lui$a0,-11111L1:add$t0,$a2,$a0sra$t1,$t0,8addi$t2,$zero,-12345slt$v0,$a0,$t2sltu$v1,$a0,$t2Loop:jLoop4.使用ModelSim等仿真软件进行仿真。仿真顶层模块为test_cpu,这是一个testbench,用于向CPU提供复位和时钟信号。观察仿真结果中各寄存器和控制信号的变化。回答以下问题:a)PC如何变化?答:每个时钟周期加4,从0到44;20(第五条指令)被跳过,因为第四条指令跳转条件为真。b)Branch信号在何时为1?它引起了PC怎样的变化?答:Branch信号在第五个时钟周期(400-500ns)为1,导致PC下一周期为24,而非20。c)100~200ns期间,PC是多少?对应的指令是哪条?此时$a1的值是多少?200~300ns期间$a1的值是多少?为什么会这样?下一条指令立即使用到了$a1的值,会出现错误吗?为什么?答:100-200ns期间,PC为4。对应指令:addiu$a1,$zero,54321(第1条指令)。此时$a1的值为0。200-300ns期间$a1值为0xffffd431,即54321。原因是ALU计算完结果后,要到下一个周期的上升沿寄存器值才能发生变化。下一指令使用到了$a1的值但并不会出错,原因是一旦到了下一个周期,$a1的值就会被更新为计算结果,从寄存器读取的值是正确的。d)运行时间足够长之后(如1100ns时)寄存器$a0~$a3,$t0~$t2,$v0~$v1中的值是多少?与你的预期是否一致?答:最后一条指令是一个死循环,会使得CPU一直在一条并无任何实际计算的跳转指令上循环。因此一旦执行到这条指令,CPU状态将会一直保持不变。$v0=32’b00000000000000000000000000000000=0x00000000$v1=32’b00000000000000000000000000000001=0x00000001$a0=32’b00000000000000000011000000111001=0x00003039$a1=32’b11111111111111111101010000110001=0xffffd431$a2=32’b11010100001100010000000000000000=0xd4310000$a3=32’b00000000000000001101010000110001=0x0000d431$t0=32’b11010100001100010011000000111001=0xd4313039$t1=32’b11111111110101000011000100110000=0xffd43130$t2=32’b11111111111111111100111111000111=0xffffcfc7与预期一致三、执行汇编程序MIPSAssemblyHEX01234567891011121314151617addi$a0,$zero,3#令a0=3jalsum#跳转至sumLoop:beq$zero,$zero,Loop#死循环语句sum:addi$sp,$sp,-8#栈顶上升2个wordsw$ra,4($sp)#返回地址$ra压栈sw$a0,0($sp)#参数$a0压栈slti$t0,$a0,1#若$a01则令$t0=1beq$t0,$zero,L1#上一条的条件不满足时,跳转到L1.xor$v0,$zero,$zero#令$v0=0.addi$sp,$sp,8#栈顶下降2个wordjr$ra#返回保存的返回地址$raL1:addi$a0,$a0,-1#$a0=$a0-1jalsum#跳转至sum,并保存返回地址到$ralw$a0,0($sp)#弹栈,取出已保存的$a0lw$ra,4($sp)#弹栈,取出保存的$raaddi$sp,$sp,8#栈顶下降2个wordadd$v0,$a0,$v0#$v0=$v0+$a0jr$ra#返回保存的返回地址$ra200400030c0000031000ffff23bdfff8afbf0004afa4000028880001110000030000102623bd000803e000082084ffff0c0000038fa400008fbf000423bd00080082102003e000081.如果第一行的3是任意正整数n,这段程序能实现什么功能?Loop,sum,L1各有什么作用?为每一句代码添加注释。答:这段程序计算1+2+...+n的值并保存到$v0中。Loop的功能是在程序执行完毕之后进入死循环,sum初始化$v0=0,并递归调用L1,L1将$a0减一并回调sum,sum再将每个$a0(依次减一后)压栈,然后L1再将所有的$a0依次加起来,得到结果。最终程序返回到死循环指令Loop。注释见表格。2.将这段汇编程序翻译成机器码。对于beq和jal语句中的Loop,sum,L1,你是怎么翻译的?立即数-1、-8被翻译成了什么(用16进制或2进制表示)?答:翻译的16进制机器码见表格。beq指令中标签被翻译为相对于当前指令下一条指令的偏移量,而jal指令中标签被翻译为相对于第0条指令的偏移量(第0条指令的低28位为0)。因此jal指令中的sum表示为0x0000003,第2条beq指令中的L1表示为0xffff,第7条beq指令中的L1表示为0x0003。立即数在指令中占16bits,用补码表示。-1表示为0xffff,-8表示为0xfff8。8'd0:Instruction={6'h08,5'd0,5'd4,16'd3};8'd1:Instruction={6'h03,26'd3};8'd2:Instruction={6'h04,5'd0,5'd0,16'b1111111111111111};8'd3:Instruction={6'h08,5'd29,5'd29,16'b1111111111111000};8'd4:Instruction={6'h2b,5'd29,5'd31,16'b0000000000000100};8'd5:Instruction={6'h2b,5'd29,5'd4,16'b0000000000000000};8'd6:Instruction={6'h0a,5'd4,5'd8,16'b0000000000000001};8'd7:Instruction={6'h04,5'd8,5'd0,16'd3};8'd8:Instruction={6'h0,5'd0,5'd0,5'd2,5'd0,6'h26};8'd9:Instruction={6'h08,5'd29,5'd29,16'b0000000000001000};8'd10:Instruction={6'h0,5'd31,15'd0,6'h08};8'd11:Instruction={6'h08,5'd4,5'd4,16'b1111111111111111};8'd12:Instruction={6'h03,26'd3};8'd13:Instruc
本文标题:单周期处理器
链接地址:https://www.777doc.com/doc-5488775 .html