计算机组成原理实验实验报告-多周期CPU设计.doc_第1页
计算机组成原理实验实验报告-多周期CPU设计.doc_第2页
计算机组成原理实验实验报告-多周期CPU设计.doc_第3页
计算机组成原理实验实验报告-多周期CPU设计.doc_第4页
计算机组成原理实验实验报告-多周期CPU设计.doc_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机组成原理实验 计算机组成原理实验实验报告(实验三)学院名称:学生姓名:学号:专业(班级):时间:2017年6月1日成绩:实验三: 多周期CPU设计 一. 实验目的(1) 认识和掌握多周期数据通路原理及其设计方法;(2) 掌握多周期CPU的实现方法,代码实现方法;(3) 编写一个编译器,将MIPS汇编程序编译为二进制机器码;(4) 掌握多周期CPU的测试方法。二. 实验内容 设计一个多周期CPU,该CPU至少能实现以下指令功能操作。需设计的指令与格式如下:(说明:操作码按照以下规定使用,都给每类指令预留扩展空间,后续实验相同。)=算术运算指令(1)add rd, rs, rt000000rs(5位)rt(5位)rd(5位)reserved功能:rdrs + rt (2)sub rd, rs, rt000001rs(5位)rt(5位)rd(5位)reserved完成功能:rdrs rt(3)addi rt, rs, immediate000010rs(5位)rt(5位)immediate(16位)功能:rt逻辑运算指令(4)or rd, rs, rt010000rs(5位)rt(5位)rd(5位)reserved功能:rdrs | rt(5)and rd, rs, rt010001rs(5位)rt(5位)rd(5位)reserved功能:rdrs & rt(6)ori rt, rs, immediate 010010rs(5位)rt(5位)immediate功能:rt移位指令(7)sll rd, rt,sa 011000未用rt(5位)rd(5位)sareserved功能:rdrt比较指令(8) slt rd, rs, rt 带符号数100110rs(5位)rt(5位)rd(5位)reserved功能:if (rsrt) rd =1 else rd=0, 具体请看表2 ALU运算功能表,带符号(9) sltu rd, rs, rt 不带符号数100111rs(5位)rt(5位)rd(5位)reserved功能:if (rs存储器读写指令(10)sw rt, immediate(rs)110000rs(5位)rt(5位)immediate(16位)功能:memoryrs+ (sign-extend)immediatert。即将rt寄存器的内容保存到rs寄存器内容和立即数符号扩展后的数相加作为地址的内存单元中。(11)lw rt, immediate(rs)110001rs(5位)rt(5位)immediate(16位)功能:rt 分支指令 (12)beq rs,rt, immediate (说明:immediate从pc+4开始和转移到的指令之间间隔条数) 110100rs(5位)rt(5位)immediate(16位)功能:if(rs=rt) pc pc + 4 + (sign-extend)immediate 2 else pc pc + 4 (13)bne rs,rt, immediate (说明:immediate从pc+4开始和转移到的指令之间间隔条数) 110101rs(5位)rt(5位)immediate(16位)功能:if(rs!=rt) pc pc + 4 + (sign-extend)immediate 2 else pc 跳转指令(14)j addr 111000addr27.2功能:pc (pc+4)31.28,addr27.2,0,0,跳转。说明:由于MIPS32的指令代码长度占4个字节,所以指令地址二进制数最低2位均为0,将指令地址放进指令代码中时,可省掉!这样,除了最高6位操作码外,还有26位可用于存放地址,事实上,可存放28位地址,剩下最高4位由pc+4最高4位拼接上。(15)jr rs 111001rs(5位)未用未用reserved功能:pc 调用子程序指令(16)jal addr 111010addr27.2功能:调用子程序,pc (pc+4)31.28,addr27.2,0,0;$31停机指令(17)halt (停机指令)11111100000000000000000000000000(26位)不改变pc的值,pc保持不变。三. 实验原理 多周期CPU指的是将整个CPU的执行过程分成几个阶段,每个阶段用一个时钟去完成,然后开始下一条指令的执行,而每种指令执行时所用的时钟数不尽相同,这就是所谓的多周期CPU。CPU在处理指令时,一般需要经过以下几个阶段: (1) 取指令(IF):根据程序计数器pc中的指令地址,从存储器中取出一条指令,同时,pc根据指令字长度自动递增产生下一条指令所需要的指令地址,但遇到“地址转移”指令时,则控制器把“转移地址”送入pc,当然得到的“地址”需要做些变换才送入pc。 (2) 指令译码(ID):对取指令操作中得到的指令进行分析并译码,确定这条指令需要完成的操作,从而产生相应的操作控制信号,用于驱动执行状态中的各种操作。 (3) 指令执行(EXE):根据指令译码得到的操作控制信号,具体地执行指令动作,然后转移到结果写回状态。 (4) 存储器访问(MEM):所有需要访问存储器的操作都将在这个步骤中执行,该步骤给出存储器的数据地址,把数据写入到存储器中数据地址所指定的存储单元或者从存储器中得到数据地址单元中的数据。 (5) 结果写回(WB):指令执行的结果或者访问存储器中得到的数据写回相应的目的寄存器中。 实验中就按照这五个阶段进行设计,这样一条指令的执行最长需要五个(小)时钟周期才能完成,但具体情况怎样?要根据该条指令的情况而定,有些指令不需要五个时钟周期的,这就是多周期的CPU。取指令IF指令译码ID指令执行EXE存储器访问MEM结果写回WB图1 多周期CPU指令处理过程MIPS指令的三种格式:其中,op:为操作码;rs:为第1个源操作数寄存器,寄存器地址(编号)是0000011111,001F;rt:为第2个源操作数寄存器,或目的操作数寄存器,寄存器地址(同上);rd:为目的操作数寄存器,寄存器地址(同上);sa:为位移量(shift amt),移位指令用于指定移多少位;funct:为功能码,在寄存器类型指令中(R类型)用来指定指令的功能;immediate:为16位立即数,用作无符号的逻辑操作数、有符号的算术操作数、数据加载(Laod)/数据保存(Store)指令的数据地址字节偏移量和分支指令中相对程序计数器(PC)的有符号偏移量; address:为地址。图2 多周期CPU状态转移图状态的转移有的是无条件的,例如从IF状态转移到ID就是无条件的;有些是有条件的,例如ID 或 EXE状态之后不止一个状态,到底转向哪个状态由该指令功能,即指令操作码决定。每个状态代表一个时钟周期。图3 多周期CPU控制部件的原理结构图图3是多周期CPU控制部件的电路结构,三个D触发器用于保存当前状态,是时序逻辑电路,RST用于初始化状态“000“,另外两个部分都是组合逻辑电路,一个用于产生下一个阶段的状态,另一个用于产生每个阶段的控制信号。从图上可看出,下个状态取决于指令操作码和当前状态;而每个阶段的控制信号取决于指令操作码、当前状态和反映运算结果的状态zero标志等。图4 多周期CPU数据通路和控制线路图图4是一个简单的基本上能够在多周期CPU上完成所要求设计的指令功能的数据通路和必要的控制线路图。其中指令和数据各存储在不同存储器中,即有指令存储器和数据存储器。访问存储器时,先给出地址,然后由读或写信号控制操作。对于寄存器组,读操作时,给出寄存器地址(编号),输出端就直接输出相应数据;而在写操作时,在 WE使能信号为1时,在时钟边沿触发写入。图中控制信号功能如表1所示,表2是ALU运算功能表。特别提示,图上增加IR指令寄存器,目的是使指令代码保持稳定,pc写使能控制信号PCWre,是确保pc适时修改,原因都是和多周期工作的CPU有关。ADR、BDR、ALUoutDR、DBDR四个寄存器不需要写使能信号,其作用是切分数据通路,将大组合逻辑切分为若干个小组合逻辑,大延迟变为多个分段小延迟。表1 控制信号作用控制信号名状态“0”状态“1”RST对于PC,初始化PC为程序首地址对于PC,PC接收下一条指令地址PCWrePC不更改,相关指令:halt,另外,除000状态之外,其余状态慎改PC的值。PC更改,相关指令:除指令halt外,另外,在000状态时,修改PC的值合适。ALUSrcA来自寄存器堆data1输出,相关指令:add、sub、addi、or、and、ori、beq、bne、slt、sltu、sw、lw来自移位数sa,同时,进行(zero-extend)sa,即 27(0),sa,相关指令:sllALUSrcB来自寄存器堆data2输出,相关指令:add、sub、addi、or、and、ori、beq、bne、slt、sltu、sll来自sign或zero扩展的立即数,相关指令:addi、ori、lw、swDBDataSrc来自ALU运算结果的输出,相关指令:add、sub、addi、or、and、ori、slt、sltu、sll、move来自数据存储器(Data MEM)的输出,相关指令:lwRegWre无写寄存器组寄存器,相关指令:beq、bne、j、sw、jr、halt寄存器组寄存器写使能,相关指令:add、sub、addi、or、and、ori、slt、sltu、sll、lw、jalWrRegData写入寄存器组寄存器的数据来自pc+4(pc4),相关指令:jal,写$31写入寄存器组寄存器的数据来自存储器、寄存器组寄存器和ALU运算结果,相关指令:add、addi、sub、or、and、ori、slt、sltu、sll、lwInsMemRW写指令存储器读指令存储器(Ins. Data)/RD读数据存储器,相关指令:lw输出高阻态/WR写数据存储器,相关指令:sw无操作IRWreIR(指令寄存器)不更改IR寄存器写使能。向指令存储器发出读指令代码后,这个信号也接着发出,在时钟上升沿,IR接收从指令存储器送来的指令代码。与每条指令都相关。ExtSel(zero-extend)immediate,相关指令:ori;(sign-extend)immediate,相关指令:addi、lw、sw、beq、bne;PCSrc1.000:pcpc+4,相关指令:add、addi、sub、or、ori、and、 slt、sltu、sll、sw、lw、beq(zero=0)、bne(zero=1);01:pcpc+4+(sign-extend)immediate,相关指令:beq(zero=1)、 bne(zero=0);10:pcrs,相关指令:jr; 11:pcpc(31.28,addr27.2,0,0,相关指令:j、jal;RegDst1.0写寄存器组寄存器的地址,来自:00:0x1F($31),相关指令:jal,用于保存返回地址($31-pc+4);01:rt字段,相关指令:addi、ori、lw;10:rd字段,相关指令:add、sub、or、and、slt、sltu、sll;11:未用;ALUOp2.0ALU 8种运算功能选择(000-111),看功能表相关部件及引脚说明: Instruction Memory:指令存储器 Iaddr,指令地址输入端口 DataIn,存储器数据输入端口 DataOut,存储器数据输出端口 RW,指令存储器读写控制信号,为0写,为1读Data Memory:数据存储器 Daddr,数据地址输入端口 DataIn,存储器数据输入端口 DataOut,存储器数据输出端口 /RD,数据存储器读控制信号,为0读 /WR,数据存储器写控制信号,为0写Register File:寄存器组 Read Reg1,rs寄存器地址输入端口 Read Reg2,rt寄存器地址输入端口 Write Reg,将数据写入的寄存器,其地址输入端口(rt、rd) Write Data,写入寄存器的数据输入端口 Read Data1,rs寄存器数据输出端口 Read Data2,rt寄存器数据输出端口 WE,写使能信号,为1时,在时钟上升沿写入IR: 指令寄存器,用于存放正在执行的指令代码ALU: 算术逻辑单元 result,ALU运算结果 zero,运算结果标志,结果为0输出1,否则输出0 表2 ALU运算功能表 ALUOp2.0功能描述000Y = A + B加001Y = A B减010Y=(AB)?1: 0比较A与B不带符号011if (regaregb &( rega31 = 0 & regb31=0) | (rega31 = 1 & regb31=1) result = 1;else if (rega31 = 0 & regb31=1) result = 0;else if ( rega31 = 1 & regb31=0) result = 1;else result = 0; 比较A与B带符号100Y = BAB左移A位101Y = A B或110Y = A B与111Y = A B异或四. 实验器材电脑一台、Xilinx Vivado 软件一套。五. 实验分析与设计(一) 代码分析:首先是各模块文件之间的关系:MCPU为顶层模块,其余均为其子模块。子模块间的逻辑关系与上文图4完全一致。其中模块之间所用到的加法器以及选择器全部在顶层模块实现,之后通过wire变量分到相关子模块中去。另外,图4中以IR为代表的用来切分数据数据通路的寄存器模块,也全部在顶层模块中以一个always语句实现。以下为在顶层模块中实现加法器以及选择器的相关语句。与单周期CPU不同,多周期CPU中,选择器不仅仅是二路选择器了,而是有三路和四路选择器。虽然多了,但实现的形式还是一样的,就不停的判断,直到最后。图中的变量名可参考图4,变量名基本相同。对变量A的赋值,实现了图中ALUSrcA控制的选择器,该选择器决定进入ALU模块中A的值是来自寄存器,还是来自sll移位语句中的移位量sa。对于变量B的赋值,实现了ALUSrcB控制的选择器,该选择器决定进入ALU模块中的B的值是立即数还是寄存器中的数。变量pc4是当前指令地址加4,也就是在无跳转的情况下,CPU需要执行的下一条指令。对变量pc的赋值实现了图中PCSrc控制的选择器,该选择器是四路选择器,所以语句较长。这条语句还包括了图中对于pc的一些移位以及组合赋值。该选择器有四种:00是一般情况,也就是pc加4作为下一条指令地址传入,也包括beq和bnq不发生跳转时的情况。01是为beq和bnq发生跳转时,对指令地址pc做出改变。10是为jr跳转语句所用,主要是将31号寄存器中预留的指令地址作为下一条指令地址传入。11是为jr和j无条件跳转时使用,将其指令中跳转的地址作为下一条指令地址传入。对WriteReg变量的赋值实现了由RegDst控制的选择器。这个选择器是3路选择器。控制信号为0时,要写入的寄存器改为31号,主要是用于jal语句发生跳转时,对本应下一条执行的指令地址进行存储。而控制信号为1和2时,是区别要写rt寄存器还是rd寄存器,主要是用于那些会用到三个寄存器的汇编语句。对变量DB的赋值实现了由DataSrc控制的选择器,主要决定重新写会寄存器的是ALU模块的计算结果还是内存RAM中的值,主要用于lw读取内存这个指令。对变量WriteData的赋值实现了由WrRegDSrc控制的选择器,这个选择器主要决定写入寄存器的值是下一条指令地址,还是从ALU或者是RAM传过来的值。这个选择其也是用于jal跳转语句,将本应下一条执行的指令地址存储到31号寄存器时使用。除了以上选择器的实现之外,顶层模块还实现了图中用于切割数据通路的寄存器。首先是使用寄存器类型声明变量。然后在一个always语句进行实现,所有寄存器都以时钟的上升沿作为触发。其中对于IR寄存器,需要由控制模块的使能端进行控制,其他的均不需要使能端,直接赋值即可。这里对IR寄存器进行使能端的控制,是实现多周期CPU的基础,只有这样才能保证一条指令在其执行结束之前的周期内不会被改变。PC模块:这个模块接收了外部变量clk时钟和reset复位。pcwire是来自控制模块的控制信号,pc是接收的指令集地址,iaddr是输出的指令集地址。这个模块的实现比较简单,就是两步判断。首先判断是否复位,是则将地址置0,否则就向下进行。然后根据pcwire信号,判断是否将接收的地址赋值给送出地址的变量。这把信号是在控制模块的控制之下,只有在IF(000)状态下的时钟上升沿才会将地址送出,以次确保多周期执行指令时,在一条指令执行结束之前,指令不会被更改。InMem模块(指令集存储模块):指令集模块就是接收到刚刚PC模块传出的指令集地址后,在自己的指令集存储中寻找该条32位的指令并然后将其送出。指令集存储的初始化用到了$readmemb指令。注意,指令集的存储单位为1个字节8个位,所以我们在根据地址查找指令的时候,是以该地址的存储为首的连续四块存储单位依次赋值给送出指令的变量IOut。这里也要受控制模块使能信号的控制,但实际上,由于PC模块以及IR寄存器的使能端控制,这里的就显得没什么必要,所以在控制模块送出信号是,RW全部为1的。RegFile模块:这个模块是寄存器的读写以及存储的模块。输入输出端口较多,就不在此列举了。这个模块中首先要将所有寄存器初始化为0,然后就是根据输入的的寄存器地址,送出寄存器。这里在输出寄存器的内容是毫无选择的,每一次调用这个模块,都会根据地址输出寄存器内容,而不管是否有效和是否需要。但是这样并不影响整个CPU的运行。主要是这两个寄存器的输出,都经过了Ctrl模块的选择,所以这里的无选择并不影响CPU的运行。而写入寄存器则要根据ctrl模块传入的写使能端信号WE来判断,写入就根据输入的寄存器地址和要写入的数据,将相应地寄存器赋值。EXT模块(立即数扩展):这个模块根据ctrl模块传来的控制信号,判断是有符号扩展还是无符号扩展。有符号直接在立即数前边补0再送出。有符号的话,因为计算机中数字的表示是补码,对于补码的补全,要根据正负,正数也是在前边补0,负数则要在前边补1。由于是多周期CPU,所以控制信号EctSel不一定能够在立即数immediate改变时就送到,这就要求我们在设置触发条件时,需要将立即数和控制信号全部考虑到ALU模块:ALU模块就是 ctrl模块传来的信息,用case语句分别进行处理,然后将结果输出。多周期和单周期的ALU还是有很大差别的,增加了无符号数和有符号数的大小判断。其中无符号 数的直接判断即可。对于有符号数的大小判断,声明一个变量C存储A和B的差值,由于数字是用补码表示的,所以根据C的符号位即可判断A和B的大小关系,从而省略了诸多判断语句。另外zero变量仍然保留了下来。这一部分主要是为了给bne和beq语句中,给两个寄存器比较用的,寄存器相减若为0,则说明两个寄存器的值相等。于是zero就可作为ctrl模块处理bne的依据。RAM模块(数据存储器):RAM模块和RegFile模块是有 一些相似之处的,都是根据ctrl的信息,按照地址,存储或读取信息。不同的地方也有很多,RAM的存储单位是一个字节,而存储器是一个字。RAM可以无限扩展,这里只取到128,而存储器是有32个的。回到代码,首先也是进行了初始化,虽然这个并不是很必要。然后读取的时候,就根据CTRL模块的RD信号,按照地址输出。也是因为这里是以字节为单位,所以要将连续的四块存储合到一起再输出。写入和取值的过程是一样的。另外多周期CPU和单周期CPU的RAM模块有一点不同,就是多周期CPU中取消了clk触发,而是直接由数据变化进行触发。Ctrl模块:和单周期的控制模块相比,多周期的控制模块要增加很多东西,其中最大的变化是需要增加有限状态机,用以指令执行的不同阶段的状态转移。另外,如果同时考虑状态和指令,将两者组合起来的话,那控制模块传出的控制信号组合有超过40种,但实际上,不需要考虑了如此多的情况,很多指令下,不同状态的控制信号基本是一样的,我们只需要灵活处理那些同一条指令下,在不同状态需要改变控制信号的情况即可。首先,还是声明了一个18位的寄存器,统一存储所有的控制信号。然后将其再拆分到各个控制信号中去,如下图所示。接下来先讲一下相对简单的状态转移。由前文的图2可知,一共有8中状态,我们按照图2的表示进行编码。当然这8个状态,在CPU执行时,有一些状态执行的部位是相同的,但是执行内容不同,所以被划分为不同状态。从代码中看,复位时将状态初始化为000,也就是IF状态。然后根据图2的状态转移图,对于每一个状态,结合当前的指令操作码,判断下一状态并进行赋值。每一条指令执行完成后,状态都要回到000状态。状态转移是以时钟的下降沿作为触发的,而控制信号的改变是以状态的改变作为触发的。对于控制信号的赋值,相对而言比较难以理解。代码尽量是以表格的形式进行展现的。图中有一些IF、WB1、WB0、ID等变量,代表的是是否处于其所指的状态。在对控制信号赋值中,绝大多数的控制信号并没有与状态相结合,主要是因为,这些控制信号,与状态转移的关系不大,不会影响CPU的运行。另外,注意控制信号一定要进行初始化,否则如果开始控制信号是为X的,那这样在IR寄存器处,就无法得到有效的使能信号,就无法将有效的操作码传给控制信号。所以这里一定要进行初始化,并处理话PC使能端和IR使能端的关系。这里是用了case语句中的default语句进行的初始化。对于赋值中,刚刚提到过的那些代表状态的信号,具体如下。可以看到,就是当处于某一种状态时,将其变量设为1,否则设为0。这样我们再回到控制信号的赋值,可以看到,对于控制信号PCWre的赋值,运用到了状态变量IF,这其实就是要求只在IF状态下,才去更新指令集地址。那在其他状态时,指令还没有执行结束,所以不能进行更新。IR寄存器的使能端信号IRWre的赋值也是这个道理,只能在ID状态时,才去更新要执行的指令。另外还有WB1和WB0信号,那是因为这些语句需要用到读写寄存器的操作,而读写寄存器是在WB状态下进行的,所以要进行这样赋值,zero就是ALU返回的用于处理beq和bnq语句的。另外可能还有一些特殊的赋值,是在debug的过程中锁调整出来的,这里不做过多解释。(二)实验结果与测试以下为本次实验测试的汇编语言代码段:地址汇编程序指令代码op(6)rs(5)rt(5)rd(5)/immediate (16)16进制数代码0x00000000addi $1,$0,800001000000000010000 0000 0000 1000080100080x00000004ori $2,$0,201001000000000100000 0000 0000 0010480200020x00000008or $3,$2,$1010000000100000100011 000 0000 0000404118000x0000000Csub $4,$3,$1000001000110000100100 000 0000 000004612000x00000010and $5,$4,$2010001001000001000101 000 0000 0000448228000x00000014sll $5,$5,2011000000000010100101 00010 000000600528800x00000018beq $5,$1,-2(=,转14)11010000101000011111 1111 1111 1110D0A1FFFE0x0000001Cjal 0x000004011101000000000000000 0000 0001 0000E80000100x00000020slt $8,$12,$1100110011000000101000 000 0000 0000998140000x00000024addi $14,$0,-100001000000011101111 1111 1111 1111080EFFFF0x00000028slt $9,$8,$14100110010000111001001 000 0000 0000990E48000x0000002Csltu $10,$9,$2100111010010001001010 000 0000 00009D2250000x00000030sltu $11,$10,$0100111010100000001011 000 0000 00009D4058000x00000034add $11,$11,$8000000010110100001011 000 0000 0000016858000x00000038bne $11,$2,-2 (,转34)11010101011000101111 1111 1111 1110D562FFFE0x0000003Cj 0x000004C11100000000000000000 0000 0001 0011E00000130x00000040sw $2,4($1)11000000001000100000 0000 0000 0100C02200040x00000044lw $12,4($1)11000100001011000000 0000 0000 0100C42C00040x00000048jr $3111100111111000000000 0000 0000 0000E7E000000x0000004Chalt11111100000000000000 0000 0000 0000FC000000先解释一下这段代码,方便待会理解波形图。将寄存器0和立即数8相加,将结果存到寄存器1,所以寄存器1的值为8;将寄存器1与立即数2取或,将结果存到寄存器2,所以寄存器2的值为2;将寄存器1和寄存器2中的数取或,结果存到寄存器3,所以寄存器3的值为10;将寄存器3与寄存器1相减,结果存到寄存器4,所以寄存器4的值为2;将寄存器4和寄存器2取与,结果存到寄存器5,所以寄存器5的值为2;将寄存器5左移两位,结果存到寄存器5,所以寄存器5的值为8;判断寄存器1和寄存器5的值是否相等,相等,又跳回到14语句处;将寄存器5左移两位,结果存到寄存器5,所以寄存器5的值为32;判断寄存器1和寄存器5的值是否相等,不相等,继续向下执行;无条件跳转至40语句,并将下一语句地址存入寄存器31,所以寄存器31值为0x00000020;将寄存器2的内容写入内存,起始地址为寄存器1的值增加4个字节,也就是12,第15个内存会被更改为2;读取刚刚写入的内存到寄存器12,寄存器12的值被更改为2;跳转回寄存器31存的指令地址,也就是0x00000020。比较寄存器12和寄存器1的大小,结果存入寄存器8,所以寄存器8的值为1;将寄存器0的值和立即数-1相加,将结果存入寄存器14,所以寄存器14的值为-1(补码);比较寄存器8和寄存器14的大小,将结果写入寄存器9,所以寄存器9的值还是为0;无符号比较寄存器9和寄存器2的大小,将结果写入寄存器10,所以寄存器10的值为1;无符号比较寄存器10和寄存器0的大小,将结果写入寄存器11,所以寄存器11的值为0;将寄存器11和寄存器8相加,结果存入寄存器11,所以寄存器11的值为1;判断寄存器11和寄存器2的值是否不相等,不相等,跳转至34;将寄存器11和寄存器8相加,结果存入寄存器11,所以寄存器11的值为2;判断寄存器11和寄存器2的值是否不相等,相等,继续执行;无条件跳转至4C指令处;停机。接下来将结合仿真波形,按照刚刚所写的对汇编指令的解释,逐条分析波形。每次只截图一条指令的运行情况,并只查看相关的寄存器、内存、指令、状态等。首先是在第3个时钟周期时,进行了reset操作,可以看到,状态进入了IF(000)。而pc,指令地址,指令集输出的指令也开始由X状态进行了更新。IF(000)状态时,更新指令集地址,ID(001)状态时,对指令进行译码。WB(111、100、011)状态结束时,寄存器的值会被更改。这些数据更新在每一条语句均是如此,之后就不再赘述。pc为下一条命令地址,iaddr为PC模块输出指令地址,IOut为指令集输出的指令。Inew为IR模块接收了控制模块的使能端后的指令输出。将寄存器0和立即数8相加,将结果存到寄存器1,所以寄存器1的值为8;这条语句经过了4个周期, 可以看到寄存器1的值在语句结束时更新为8;将寄存器1与立即数2取或,将结果存到寄存器2,所以寄存器2的值为2;这条语句经过四个周期,语句结束时,寄存器2的值被更改为2。将寄存器1和寄存器2中的数取或,结果存到寄存器3,所以寄存器3的值为10;这条语句经过了四个周期,语句结束时,寄存器3的值被修改为10.图中是以16进制表示的。将寄存器3与寄存器1相减,结果存到寄存器4,所以寄存器4的值为2;这条语句也是四个周期,语句结束时,寄存器4的值被修改为2.将寄存器4和寄存器2取与,结果存到寄存器5,所以寄存器5的值为2;这条语句需要4个周期,语句结束时,寄存器5的值被修改为2.将寄存器5左移两位,结果存到寄存器5,所以寄存器5的值为8;这条语句

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论