简单计算机系统的数据通路和控制器设计.docx_第1页
简单计算机系统的数据通路和控制器设计.docx_第2页
简单计算机系统的数据通路和控制器设计.docx_第3页
简单计算机系统的数据通路和控制器设计.docx_第4页
简单计算机系统的数据通路和控制器设计.docx_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

实验二 简单计算机系统的数据通路和控制器设计一、实验目的1掌握执行R型、I型、J型指令的数据通路;2. 掌握控制器模块的设计方法;3. 掌握简单计算机系统的集成和仿真。二、实验任务1. 电路模块的设计与仿真A设计控制器单元控制器模块的封装结构图如下所示:该模块的输入端口中OP3.0是程序代码中的操作码,zero为ALU运算的零标志位;输出端口是控制器单元用来控制集成电路中其他模块的信号,这些控制信号的产生条件在实验指导书上详细写明,这里不再赘述。对该模块的波形仿真截图如下:【仿真分析】在上图所示的仿真结果中,当输入OP=0000时,此刻运行程序的名称是“与”运算,在ALU中“与”的代码是000,所以输出端ALUC的值也是“000”,其他的输出端口经过与实验指导书上输出说明对照之后发现都是正确的;对于输入端OP取其他值的情况也都是正确的,即仿真正确。B程序指针计数器PC模块PC模块的封装结构图如下所示:该模块的作用是用于控制程序指针,即ROM中程序的读取地址。其输入端中有时钟信号CLK,异步清零信号RESET,其中输入信号BRANCH和JUMP从控制单元模块输出端引出,作用是控制输出PC在下一个时钟有效信号来临的时候下一个PC是PC+1还是PC+imm+1。这其实也是对于不同的指令的一个数据通路的选择。编写仿真文件,对于该模块进行波形仿真,得到的结果如下:【仿真分析】如上图所示,在仿真过程中设置立即数端imm为10,在波形的最开始BRANCH为低电平,JUMP为高电平,此时为无条件跳转指令,即在时钟信号的上升沿将立即数imm的值直接作为输出端的值,从结果中看出,此时PC为10;在波形的中间,BRANCH为1,JUMP为0,此时指令为BEQ或者BNE,并且此时PC=PC+imm+1,所以可以看到此时在时钟信号的上升沿PC都在原来的基础上加上11;在波形图的右边,BRANCH 和JUMP都是0,PC=PC+1,从结果中可以看出也是满足的,所以综上,仿真显示该模块的设计是正确的。2. 指令的数据通路分析(1)SUB R0,R2,R1 ; 该指令属于R型指令,其操作码OP=“0011”,其数据通路可以表示如下:【指令运行分析】该指令主要是将寄存器R2的值无进位减去寄存器R1中的值,并将结果赋值给R0寄存器。其数据通路见上图所示,在时钟信号的有效沿,PC(程序指针计数器模块)将程序指针传到ROM里面,ROM读取该条指令,该指令的二进制代码为“0011 1001 0000 0000”,其将OP传给控制单元模块,在控制单元模块中生成信号ALUC2.0和WriteReg信号。其中ALUC信号用来控制ALU进行计算的种类,writereg信号用来控制寄存器组模块reg的可被写的信号。指令代码中rs(R2),rt(R1),rd(R0)分别给到reg模块的输入端N1,N2,ND。则Q1,Q2分别调用N1,N2地址所对应的寄存器里面的值,并将其传给ALU进行无进位减运算并得到结果,在reg的有效沿时将ALU运算得到的结果赋值给ND地址对应的寄存器。(2)ADDC R2,R3,R1;【指令运行分析】这也是一条R型指令,其作用是将R3对应寄存器的值和R1对应寄存器的值进行有进位相加,将得到的结果保存到R2所对应的寄存器的值。同样作为R型指令,其数据通路和上一条指令的数据通路相同,同样在运算时,通过PC的控制,ROM给出该条程序对应的二进制代码,将OP“0110”传给控制模块单元,之后的运行流程唯一和(1)中不同的是,ALU进行运算的种类不同,即在OP的控制下,控制模块传给ALU模块的运算代码是带进位加法。(3)ORI R2,R2,0;该指令属于I型指令中的寄存器操作指令,该指令的数据通路与R型指令的数据通路存在着些许的不同,I型指令寄存器操作指令的数据通路见下图:【指令运行分析】在运行时,在PC的控制下从ROM中读取该指令,丙输出该指令的十六位的二进制代码,其代码是“1001 1010 0000 0000”所以将“1001”作为OP传给控制单元模块。与R型通路不同的是,在I指令的数据通路中,将rs的值即“10”传给寄存器组模块的N1,由于I型指令是一个寄存器的值和一个立即数进行运算,所以N2没有用到,而将rt(10)的值传给ND,作为运算结果将要存到的寄存器的地址。寄存器组模块Q1端输出N1寄存器的值给ALU模块的A,将立即数给ALU模块的B,在控制单元输出信号ALUC的控制下,进行或运算,并最终将结果给rt地址对应寄存器。(4)BEQ R3,R2,8;该指令是I型指令中条件跳转指令,该指令的数据通路和I型指令中对于寄存器操作的指令的数据通路存在着很大的不同,其数据通路如下图所示:【指令运行分析】该指令的功能是实现PC的跳转,当R3和R2相等时,将PC+8+1作为下一个PC的值实现跳转,当两者不相等时,PC=PC+1。运行过程中,首先同样是由PC给出地址,在ROM中读取地址所对应的指令,即该指令,然后由ROM的输出端输出该指令的十六位的二进制编码,即“1101 1110 0000 1000”,将OP=“1101”传递给控制器单元,使其产生相应的信号来控制之后的操作。两个寄存器地址数rs,rt分别给到寄存器组模块的N1和N2端,控制寄存器的输出Q1和Q2。寄存器组输出rs和rt对应的寄存器的值Q1,Q2,并将其放入ALU中进行运算,在OP的作用下,控制器单元模块输出的ALUC信号使ALU进行比较运算,比较Q1,Q2两个值的大小。在数据通路中,将ALU的输出端ZERO(结果零标志位)接到控制器单元的zero端口,当zero为1时,说明两个数相等,此时控制器单元模块输出的BRANCH为1,通过多路开关的选择使得下一个PC值等于PC+imm(8)+1。(5)LW R1,R3,0x20;该条指令为I型指令中的存储器读指令,与上面提到的两种I型指令的数据通路也存在不同,其数据通路见下图所示:【指令运行分析】ROM在PC控制下,输出该指令的十六位二进制代码为“1011 1101 0010 0000”,将OP=“1011”传给控制器单元模块,将rs=“11”,rt=“01”给到寄存器组N1和ND,立即数imm的值为“00100000”,寄存器组Q1输出“11”所对应的寄存器的值,将其和立即数imm在ALU中进行运算,运算的种类有控制器单元输出信号ALUC决定,这里是加法运算,将运算结果作为地址读取RAM中对应位置的值,并将该值在reg的有效沿存到rt地址对应的寄存器中,完成指令。(6)SW R3,R2,0x24;该指令是I型指令中的存储器写指令,其数据通路见下图所示:【指令运行分析】该指令的作用是向RAM中写入数据,即将R3地址的寄存器的值写入RAM中地址为R2+0x24的存储单元。指令运行过程是,ROM的q端输出该指令的十六位二进制代码“1100 1011 0010 0100”将OP=“1100”给控制器单元模块,使控制器单元产生RAM写使能信号MEMTOREG,使RAM可被写;并且产生ALUC信号控制ALU的运算,这里的运算应该是无进位加法运算。寄存器组输入端的值N1,N2分别为rs=“10”,rt=“11”,Q1输出N1对应寄存器的值并和立即数送到ALU中进行加法运算,运算得到的结果作为RAM的存储单元的地址,将Q2的值即rt对应寄存器的值存入该存储单元,完成整个指令。(7)JMP 0;该指令则属于J型指令,即无条件跳转指令,该指令的数据通路见下图所示:【指令运行分析】该指令的功能是控制PC的跳转,使得PC直接回到程序的初始值0。如上图所示的数据通路的示意图,相比于R型和I型指令,J型指令的数据通路更加简单,应为其中只是通过控制器单元控制PC的跳转,并没有用到寄存器组模块和ALU模块。其工作过程是,当在PC的控制下从ROM中读取到了该指令,输出该指令的十六位二进制代码,将OP=“0111”传给控制器单元,imm也从代码中得到。控制器单元在OP控制下产生JUMP信号,JUMP控制多路开关使得下一个PC的值是imm(该指令中imm为0),完成该指令。3. 简单计算机系统A的设计及仿真所设计系统的顶层原理图见下图所示:【部分模块说明】该设计中大多数模块为实验指导书中所给定的模块,但是有一些是在搭建数据通路时所设计的,所以对自主设计的模块进行说明:(1)ND_select模块该模块的封装结构图如下所示:该模块实际上是一个多路开关,由于在R型和I型数据通路中连接寄存器组输入端口ND的数据不同,所以需要使用多路开关在信号regdes下进行选择。(2)toflag模块模块的封装结构图如下所示:在设计时,曾经设计过Flag标志寄存器模块,用来存储carry_out,zero等标志,有此模块的输入是8位的二进制数Flagin,所以需要该模块将carry_in和zero编成八位的位二进制数再存储在Flag模块中。(3)ALUSRCB模块模块的封装结构图如下:该模块也属于多路开关,在alusrcb信号的控制下对立即数imm和寄存器组输出Q2对应的数进行选择,也是由于R型和I型指令数据通路的不同导致需要多路开关进行选择。(4)MEMTOREG模块模块的封装结构图如下:该模块同样也是多路开关,由于LW指令和R型指令向寄存器组中存入的数据种类不同,所以需要利用多路开关进行选择。当指令为LW时,在MEMTOREG信号作用下选择q7.0写入寄存器组相应的寄存器中;当指令为R指令和寄存器操作的I型指令时,选择S7.0写入寄存器组中。【指令动作仿真】在对任务4给出的7条指令进行仿真时,由于最初寄存器和RAM中都没有值,所以为使可以方便验证仿真结果的正确与否,在对某条指令仿真之前应该对该指令所用到的资源进行赋初值,下面对七条指令逐一进行波形仿真验证。(1)SUB R0,R2,R1该指令的作用将R2地址对应寄存器的值减去R1地址对应寄存器的值并将结果赋给R0地址对应的寄存器的值,所以在仿真之前我们应该对R2和R1对应的两个寄存器进行赋值,这里我们采用指令“ADDI R2,R0,0x20”和“ADDI R1,R0,0x10”对两个寄存器进行赋值,分别为十进制的32和16,所以在ROM中所存的指令如下(其中指令以十六进制显示):据此对该系统运行指令“SUB R0,R2,R1”的仿真结果如下:【仿真分析】仿真中时钟clk2是ROM的时钟信号,在上升沿给出指令信息,clk1为系统中其他模块的时钟信号,其中PC模块在上升沿给出地址信息。如仿真结果中所示, clk1第一个上升沿时,PC跳转为1,之后第一个clk2上升沿时,ROM中给出对应的指令的代码,可以看到是A220,与写入ROM中的是一致的,此时N1,N2,ND分别是0,2,2,DI是32,在clk1的下降沿时,将DI的值写入ND对应的寄存器中,即将2号寄存器的值写为32。可以看见之后Q2输出为32,是正确的。当运行第二条指令时,与第一条相同,此时将寄存器1写为16。第三条指令是我们要验证的指令,从仿真结果中看出在clk2的上升沿输出十六进制代码为“3900”,是正确的。控制单元给出的ALUOP为001,在设计的ALU中,该ALUOP对应的运算时无借位减法,也是正确的。此时N1,N2,ND分别是2,1,0,即对2号和1号两个寄存器进行无借位加法运算,将结果存到0寄存器中,并且可见DI是16,即运算结果是16,也是正确的。所以该指令的仿真正确。(2)ADDC R2,R3,R1这里我们采用指令“ADDI R3,R0,0x96”和“ADDI R1,R0,0x20”将R3和R1对应寄存器的初值分别赋为150和32。之后我们先进行“ADDC R0,R3,R3”产生一个进位信号,然后在进行“ADDC R2,R3,R1”运算,如果运算正确的话,最后一条指令的运算结果应该是183。所以在ROM中的程序应该是:据此对系统运行指令ADDC R2,R3,R1的仿真结果如下:【仿真分析】首先对照各条指令,发现从ROM中输出的指令无误。前两条指令为赋值指令,与第一条指令仿真中相同,这里不再说明。第三条指令的目的是为了产生进位信号,由于R3寄存器的赋值为150,所以两个150相加会产生进位信号,如图PC=3时,N1,N2都是3,ND=0,由于150+150-256=44,所以运算结果应该是44,如图DI=44,(紧接着DI还出现了45,但是由于在clk1的下降沿将DI的值写入寄存器,所以45是一个没用的值,可以忽略),并且进位信号carry_out变为了1,所以正确。之后进行指令“ADDC R2,R3,R1”的验证,N1和N2分别是3,1,aluop=“100”,在ALU模块中,对应于带进位加,所以是正确的,并且结果DI=183,ND=2,所以在clk1的下降沿将183存入ND对应的寄存器中,所以验证是正确的。(3)ORI R2,R2,0同样的,首先利用指令“ADDI R2,R0,0x20”将R2寄存器的值定义为32,然后再执行该指令,将指令转换为十六进制保存在ROM中,如下所示:据此对系统运行指令“ORI R2,R2,0”的仿真结果如下:【仿真分析】如上图所示,当PC=2时,运行“ORI R2,R2,0”该指令,此时N1=2,Q1=32,可将已经把2寄存器赋值成了32。此时代码的十六进制为“9A00”,与写入ROM中的相同,此时aluop为“110”,在ALU模块中对应的计算为或运算,这是正确的。此时立即数为IMM=0,结果DI=32,ND=2,所以在clk1的下降沿会将寄存器2的值写为32,计算正确。(4)BEQ R3,R2,8在进行该指令的仿真时,先将R3和R2均赋值为15,若指令正确则PC会跳转到8,为了证明该指令在两个数不相等时不会跳转,则首先仿真另一条指令:BEQ R0,R2,8。所以存入ROM中的几条程序为:“ADDI R3,R0,15”,“ADDI R2,R0,15”,“BEQ R0,R2,8”,“BEQ R3,R2,8”,ROM中指令如下:据此对该指令进行波形仿真得到的结果如下所示:【仿真分析】如上图所示,第一条为空指令,第二和第三两条指令是用来给两个寄存器赋值的指令,可将第二条指令(A30F)之后寄存器3被赋值为15,第三条指令(A20F)之后将寄存器2赋值成15,。第四条指令的代码是“BEQ R0,R2,8”,可见此时N1和N2分别是0和2,Q1,Q2输出这两个寄存器的值分别为0和15,由于这两个数不相等,所以zero=0,branch=0,立即数为8,可见此时的PC=PC+1,没有跳转,是正确的。最后验证指令“BEQ R3,R2,8”,其中R3和R2对应的两个寄存器的值均已被赋值成了15,如图此时N1和N2的值分别是3,2,对应的Q1和Q2的值都是15,并且此时zero=1,表示ALU运算的得到这两个数相等,在zero和OP的作用下控制器单元输出的branch信号变为1,控制多路开关使PC=PC+imm+1,可见PC=4,之后直接跳转到13,所以是正确的。(5)LW R1,R3,0x20 (6)SW R3,R2,0x24这两条指令均是对RAM进行操作的,将这两条指令放在一起进行仿真,为便于仿真将指令(6)改为“SW R0,R2,0x24”,仿真时先给R0寄存器进行赋值,然后进行“SW R0,R2,0x24”,然后为便于(5)指令的仿真,通过指令“SW R0,R2,0x20”将编号为32的RAM单元进行赋值,最后仿真(5)指令。所以添加到ROM中的指令如下:据此对这两条指令仿真的结果如下所示:【仿真分析】PC=1时读取的指令将编号为0的寄存器的值赋值成了15;PC=2时指令“C824”

温馨提示

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

评论

0/150

提交评论