计算机组成原理实验报告硬设Word文档格式.docx
《计算机组成原理实验报告硬设Word文档格式.docx》由会员分享,可在线阅读,更多相关《计算机组成原理实验报告硬设Word文档格式.docx(45页珍藏版)》请在冰豆网上搜索。
2.额外设计要求
时间允许的情况下,进行一些额外的、探索性的改造,可用于加分。
例如,
(1)利用TEC-CA平台上的16位RAM来存放8位的指令和数据;
(2)实现一条JRS指令,以便在符号标志位S=1时跳转。
需要改写ID段的控制信息,并改写IF段;
(3)实现一条CMPJDR,SR,offset指令,当比较的两个数相等时,跳转到目标地址PC+1+offset;
(4)可以探索从外部输入指令,而不是初始化时将指令“写死”在RAM中;
(5)此5段流水模块之间,并没有明显地加上流水寄存器,可以考虑在不同模块间加上流水寄存器;
(6)探索5段流水带cache的CPU的设计。
各组亦可根据实际情况来做一些创新性的探索,酌情加分。
1.3实验设备
本课程综合设计中,需要用到的实验设备如下:
1.PC两台;
2.TEC-CA硬件实验箱一个;
3.QuartusII软件平台一个;
4.DebugController软件一个;
5.JTAG连接线。
1.4主要成果
实现5级流水无cache的8位实验CPU,16条简单的命令执行,输出确认无误。
2.8位无Cache的5段流水CPU总体设计
2.1指令系统的设计(注:
要给出指令功能、指令格式、指令列表)
constantADD:
std_logic_vector(3downto0):
="
0000"
;
//加法
constantSUBB:
0001"
//减法
constantANDins:
0011"
//与
constantMOV:
0010"
//赋值
constantLOAD:
1000"
//load指令
constantSTORE:
1010"
//store指令
constantLOADH:
1011"
//高位load指令
constantLOADL:
1001"
//低位load指令
constantJR:
0100"
//跳转
constantJRZ:
0111"
//Z==1跳转
constantNOP:
1100"
//空操作
constantMOVI:
1101"
//
constantNOPIns:
std_logic_vector(7downto0):
11000000"
2.2数据通路的设计(注:
可参考16位CPU,然后指出变为8位时,作了哪些修改)
一、数据通路图
图1无cache五级流水线数据通路示意图
整个CPU由下边几个模块组成:
控制器:
在每个时钟周期给出cpu其它部件的控制信号。
运算器:
本运算器包括寄存器堆。
BusMUX:
通过控制信号BusSel数据的来源,通过Wr来控制送往外部数据总线上的数据内容。
AR(地址寄存器):
驱动地址总线。
IR(指令寄存器):
存放根据当前PC值取得的指令。
2.3控制信号的设计(注:
要分析控制信号有哪些,最后总结一个控制信号列表,可参考上个学期综合实验参考文档中控制信号的列表方法)
wrMem
信号
含义
w_memToReg
‘1’:
内存数据到寄存器
‘0’:
ALU输出到寄存器
wRegEn
允许写寄存器
禁止写寄存器
wRegEn&
MemToReg
ALUSrc
R
S
000
A
001
B
010
1
011
100
FFFF
101
立即数
ALUOpr
功能
0000
R+S
0001
S–R
0010
RANDS
0011
RORS
0100
RXORS
0101
SHLS
0110
SHRS
0111
SARS
1000
LOADHR
1001
LOADLR
1010
MOVIR
setFlag(3位:
###)
Flag_hold
Flag_update
Flag_innerDB
Flag_C0
Flag_C1
Flag_clear
其它
未定义
2.4结构相关的处理
由于我们的设计中不包含缓存,因此会有取指和访存的冲突,即结构相关(见下图)。
当冲突发生时,必须先“访存”,将“取指”延后一个时钟周期,这样才能保证指令的正确执行。
处理结构相关需要做两项工作:
1)冲突检测2)取指延后。
1)冲突检测
只有执行访存指令(LOAD/STORE)时,才会出现冲突。
因此,我们在译码时产生一个标志是否访存的信号wrMem。
含义如下:
wMem
意义
00
写内存(STORE)
01
读内存(LOAD)
1×
不占用内存
通过检查“访存阶段”的m_wrMem就可确定是否冲突。
2)取指延后
在每次取指时,若有冲突,则往IR中写入空指令(NOP),并保持PC不变,使取指延后一个节拍。
2.5数据相关的处理
数据相关是指在执行本条指令的过程中,如果用到的操作数是前面指令的执行结果,则必须等待前面的指令执行完成,并把结果写回寄存器或主存之后,本条指令才能继续执行[3]。
我们采用设置专用数据通路(即傍路技术)来解决数据相关问题。
但旁路技术并非一劳永逸。
若前一指令为LOAD,而后一指令和它数据相关,如下图所示,当下一指令的执行阶段需要数据时,上一指令尚未给出,这种情况是无法用旁路技术来解决的。
图五级流水LOAD数据相关示意图
针对上述情况的一般处理方法是通过插入bubble使LOAD之后的两条指令拖后一个节拍执行[4]。
但我们感觉这种处理过于繁琐。
我们发现,如果在LOAD译码时,后面自动加一条空指令,即增加冗余,就可以避免上述情况的出现。
在这种简化处理后,我们将数据相关划分为以下三种情况。
1.相邻指令数据相关
举例:
INCR0
INCR0
在此情形下,将上一指令的ALU输出经缓存后直接送回,作为ALU多路选择器的入口
之一,如下图所示。
图五级流水相邻指令数据相关示意图
具体代码片段为(forwardingentity.vhd):
ifm_wRegEn='
1'
andm_SA=e_SAthen
forwardA<
="
10"
其中m_SA为当前处于访问内存(MEM)中寄存器输出结果的索引,e_SA为处于当前执行阶段中ALU的输入寄存器A的索引,倘若两个索引值相等,则产生相邻指令数据相关
2.中间隔1条指令的两指令数据相关
INCR0
INCR1
在此情形下,将第1条指令的回写数据送回作为ALU多路选择器的入口之一供第3条指令使用,如下图所示。
图五级流水相隔1条指令的两指令数据相关示意图
具体代码片段如下(forwardingentity.vhd):
elsifw_wRegEn='
andw_SA=e_SAthen
01"
其中w_SA为当前处于回写阶段(WB)中寄存器输出结果的索引,e_SA为处于当前执行阶段中ALU的输入寄存器A的索引,倘若两个索引值相等,则产生中间隔1条指令的两指令数据相关
3.中间隔2条指令的两指令数据相关
INCR1
INCR2
第1和第4条指令数据相关,有两种处理方法。
方法1:
在第4条指令的译码阶段作旁路处理,将第1条指令的回写数据作为运算器的输入送入下一级,如下图所示。
方法2:
考虑到读写寄存器的时间较短,因此将写寄存器的时机改在时钟下降沿。
这样1、4指令就没有数据相关了。
图五级流水相隔2条指令的两指令数据相关示意图
由于方法2处理较简洁,因此我们在实现时使用了后者。
具体部分代码如下(ifentity.vhd):
process(reset,clk,PCStall)
begin
ifreset='
0'
then
PC<
=x"
00"
elsifFALLING_EDGE(clk)and(PCStall='
)then
PC<
=PCnext;
endif;
endprocess;
可以看到更新PC的时机为FALLING_EDGE。
2.6控制相关的处理
控制相关是指因为程序的执行方向可能改变而引起的相关。
当执行跳转指令时,就会发生这种情况。
除JR外,JRZ等条件跳转需要根据当前状态位来决定是否跳转,而当前状态位是由前面最近的会影响状态位的指令(如算术指令)决定。
常规的也是比较简单的做法是在碰到JRX之类的跳转指令时,延迟后边流水线的进入。
但我们通过分析,认为可以一点都不必延迟,通过旁路处理把控制相关转为数据相关来处理。
这样处理,不必延迟,可以提高流水线的性能。
按我们的方式解决控制相关需要做两项工作:
1)通过旁路,提供状态寄存器的值和临时状态位的值,为判断是否跳转