简单计算机系统的数据通路和控制器设计.docx
- 文档编号:17473883
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:17
- 大小:2.01MB
简单计算机系统的数据通路和控制器设计.docx
《简单计算机系统的数据通路和控制器设计.docx》由会员分享,可在线阅读,更多相关《简单计算机系统的数据通路和控制器设计.docx(17页珍藏版)》请在冰点文库上搜索。
简单计算机系统的数据通路和控制器设计
实验二简单计算机系统的数据通路和控制器设计
一、实验目的
1.掌握执行R型、I型、J型指令的数据通路;
2.掌握控制器模块的设计方法;
3.掌握简单计算机系统的集成和仿真。
二、实验任务
1.电路模块的设计与仿真
A.设计控制器单元
控制器模块的封装结构图如下所示:
该模块的输入端口中OP[3..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)SUBR0,R2,R1;
该指令属于R型指令,其操作码OP=“0011”,其数据通路可以表示如下:
【指令运行分析】该指令主要是将寄存器R2的值无进位减去寄存器R1中的值,并将结果赋值给R0寄存器。
其数据通路见上图所示,在时钟信号的有效沿,PC(程序指针计数器模块)将程序指针传到ROM里面,ROM读取该条指令,该指令的二进制代码为“0011100100000000”,其将OP传给控制单元模块,在控制单元模块中生成信号ALUC[2..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)ADDCR2,R3,R1;
【指令运行分析】这也是一条R型指令,其作用是将R3对应寄存器的值和R1对应寄存器的值进行有进位相加,将得到的结果保存到R2所对应的寄存器的值。
同样作为R型指令,其数据通路和上一条指令的数据通路相同,同样在运算时,通过PC的控制,ROM给出该条程序对应的二进制代码,将OP“0110”传给控制模块单元,之后的运行流程唯一和
(1)中不同的是,ALU进行运算的种类不同,即在OP的控制下,控制模块传给ALU模块的运算代码是带进位加法。
(3)ORIR2,R2,0;
该指令属于I型指令中的寄存器操作指令,该指令的数据通路与R型指令的数据通路存在着些许的不同,I型指令寄存器操作指令的数据通路见下图:
【指令运行分析】在运行时,在PC的控制下从ROM中读取该指令,丙输出该指令的十六位的二进制代码,其代码是“1001101000000000”所以将“1001”作为OP传给控制单元模块。
与R型通路不同的是,在I指令的数据通路中,将rs的值即“10”传给寄存器组模块的N1,由于I型指令是一个寄存器的值和一个立即数进行运算,所以N2没有用到,而将rt(10)的值传给ND,作为运算结果将要存到的寄存器的地址。
寄存器组模块Q1端输出N1寄存器的值给ALU模块的A,将立即数给ALU模块的B,在控制单元输出信号ALUC的控制下,进行或运算,并最终将结果给rt地址对应寄存器。
(4)BEQR3,R2,8;
该指令是I型指令中条件跳转指令,该指令的数据通路和I型指令中对于寄存器操作的指令的数据通路存在着很大的不同,其数据通路如下图所示:
【指令运行分析】该指令的功能是实现PC的跳转,当R3和R2相等时,将PC+8+1作为下一个PC的值实现跳转,当两者不相等时,PC=PC+1。
运行过程中,首先同样是由PC给出地址,在ROM中读取地址所对应的指令,即该指令,然后由ROM的输出端输出该指令的十六位的二进制编码,即“1101111000001000”,将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)LWR1,R3,0x20;
该条指令为I型指令中的存储器读指令,与上面提到的两种I型指令的数据通路也存在不同,其数据通路见下图所示:
【指令运行分析】ROM在PC控制下,输出该指令的十六位二进制代码为“1011110100100000”,将OP=“1011”传给控制器单元模块,将rs=“11”,rt=“01”给到寄存器组N1和ND,立即数imm的值为“00100000”,寄存器组Q1输出“11”所对应的寄存器的值,将其和立即数imm在ALU中进行运算,运算的种类有控制器单元输出信号ALUC决定,这里是加法运算,将运算结果作为地址读取RAM中对应位置的值,并将该值在reg的有效沿存到rt地址对应的寄存器中,完成指令。
(6)SWR3,R2,0x24;
该指令是I型指令中的存储器写指令,其数据通路见下图所示:
【指令运行分析】该指令的作用是向RAM中写入数据,即将R3地址的寄存器的值写入RAM中地址为R2+0x24的存储单元。
指令运行过程是,ROM的q端输出该指令的十六位二进制代码“1100101100100100”将OP=“1100”给控制器单元模块,使控制器单元产生RAM写使能信号MEMTOREG,使RAM可被写;并且产生ALUC信号控制ALU的运算,这里的运算应该是无进位加法运算。
寄存器组输入端的值N1,N2分别为rs=“10”,rt=“11”,Q1输出N1对应寄存器的值并和立即数送到ALU中进行加法运算,运算得到的结果作为RAM的存储单元的地址,将Q2的值即rt对应寄存器的值存入该存储单元,完成整个指令。
(7)JMP0;
该指令则属于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信号作用下选择q[7..0]写入寄存器组相应的寄存器中;当指令为R指令和寄存器操作的I型指令时,选择S[7..0]写入寄存器组中。
【指令动作仿真】
在对任务4给出的7条指令进行仿真时,由于最初寄存器和RAM中都没有值,所以为使可以方便验证仿真结果的正确与否,在对某条指令仿真之前应该对该指令所用到的资源进行赋初值,下面对七条指令逐一进行波形仿真验证。
(1)SUBR0,R2,R1
该指令的作用将R2地址对应寄存器的值减去R1地址对应寄存器的值并将结果赋给R0地址对应的寄存器的值,所以在仿真之前我们应该对R2和R1对应的两个寄存器进行赋值,这里我们采用指令“ADDIR2,R0,0x20”和“ADDIR1,R0,0x10”对两个寄存器进行赋值,分别为十进制的32和16,所以在ROM中所存的指令如下(其中指令以十六进制显示):
据此对该系统运行指令“SUBR0,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)ADDCR2,R3,R1
这里我们采用指令“ADDIR3,R0,0x96”和“ADDIR1,R0,0x20”将R3和R1对应寄存器的初值分别赋为150和32。
之后我们先进行“ADDCR0,R3,R3”产生一个进位信号,然后在进行“ADDCR2,R3,R1”运算,如果运算正确的话,最后一条指令的运算结果应该是183。
所以在ROM中的程序应该是:
据此对系统运行指令ADDCR2,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,所以正确。
之后进行指令“ADDCR2,R3,R1”的验证,N1和N2分别是3,1,aluop=“100”,在ALU模块中,对应于带进位加,所以是正确的,并且结果DI=183,ND=2,所以在clk1的下降沿将183存入ND对应的寄存器中,所以验证是正确的。
(3)ORIR2,R2,0
同样的,首先利用指令“ADDIR2,R0,0x20”将R2寄存器的值定义为32,然后再执行该指令,将指令转换为十六进制保存在ROM中,如下所示:
据此对系统运行指令“ORIR2,R2,0”的仿真结果如下:
【仿真分析】如上图所示,当PC=2时,运行“ORIR2,R2,0”该指令,此时N1=2,Q1=32,可将已经把2寄存器赋值成了32。
此时代码的十六进制为“9A00”,与写入ROM中的相同,此时aluop为“110”,在ALU模块中对应的计算为或运算,这是正确的。
此时立即数为IMM=0,结果DI=32,ND=2,所以在clk1的下降沿会将寄存器2的值写为32,计算正确。
(4)BEQR3,R2,8
在进行该指令的仿真时,先将R3和R2均赋值为15,若指令正确则PC会跳转到8,为了证明该指令在两个数不相等时不会跳转,则首先仿真另一条指令:
BEQR0,R2,8。
所以存入ROM中的几条程序为:
“ADDIR3,R0,15”,“ADDIR2,R0,15”,“BEQR0,R2,8”,“BEQR3,R2,8”,ROM中指令如下:
据此对该指令进行波形仿真得到的结果如下所示:
【仿真分析】如上图所示,第一条为空指令,第二和第三两条指令是用来给两个寄存器赋值的指令,可将第二条指令(A30F)之后寄存器3被赋值为15,第三条指令(A20F)之后将寄存器2赋值成15,。
第四条指令的代码是“BEQR0,R2,8”,可见此时N1和N2分别是0和2,Q1,Q2输出这两个寄存器的值分别为0和15,由于这两个数不相等,所以zero=0,branch=0,立即数为8,可见此时的PC=PC+1,没有跳转,是正确的。
最后验证指令“BEQR3,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)LWR1,R3,0x20
(6)SWR3,R2,0x24
这两条指令均是对RAM进行操作的,将这两条指令放在一起进行仿真,为便于仿真将指令(6)改为“SWR0,R2,0x24”,仿真时先给R0寄存器进行赋值,然后进行“SWR0,R2,0x24”,然后为便于(5)指令的仿真,通过指令“SWR0,R2,0x20”将编号为32的RAM单元进行赋值,最后仿真(5)指令。
所以添加到ROM中的指令如下:
据此对这两条指令仿真的结果如下所示:
【仿真分析】PC=1时读取的指令将编号为0的寄存器的值赋值成了15;PC=2时指令“C824”作用是向RAM中的编号为36的单元(由于R2=0)写入R0寄存器存的值,可见RAM中数据输入端data(即Q2)的值为15,并且此时RAM写允许信号writemem为1,所以想RAM中写入数据;PC=3的指令将RAM中编号为32的单元的数据赋值成了15;PC=4时,是验证第五条指令,此时用于控制多路开关的信号memtoreg为1,将寄存器中输出数据端连接到DI端,可见数值为15,此时ND=1,所以在clk1的下降沿将15写入1对应的寄存器中,仿真正确。
(7)JMP0
J型指令由于只对PC进行操作,所以仿真很容易,ROM中的数据如下所示:
仿真波形图结果如下:
【仿真分析】如图所示,当运行到该条指令时,jump变为了1,接下来PC直接跳转到0,之后又从0开始,所以仿真是正确的。
4.指令设计
操作名称
操作码
汇编语言格式指令
编码
立即数减
1111
SUBIRt,Rs,imm
1111RsRtimm
该指令由于属于I型指令,并且和指令ADDI的唯一差别就是运算种类的不同,所以该指令和I型指令中的寄存器操作指令的数据通路是相同的。
若要在系统中加入该指令则需要适当地修改控制器单元模块。
为了验证修改后该指令可以正确运行,我们仿真指令“SUBIR2,R1,0x20”,在这条命令之前需要添加一条“ADDIR1,R0,0x24”,所以得到的仿真结果如下所示:
【仿真分析】PC=2时是对该条指令的仿真,如图此时aluop=001,在ALU中进行无借位减法N1=1,imm=32,所以是1号寄存器中的值减去立即数32,由于1号寄存器已经被赋值成36,所以结果应该是4,如图ND=2,DI=4,所以在clk1的下降沿将2号寄存器的值写成4,仿真正确。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 计算机系统 数据 通路 控制器 设计