《系统结构课程设计指导.doc》由会员分享,可在线阅读,更多相关《系统结构课程设计指导.doc(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、计算机系统结构课程设计指导一、 课程设计的任务利用已有计算机组成原理知识,VHDL语言知识、以及对计算机系统结构的初步学习,设计一个包括指令系统、寻址方式、数据表示、寄存器组、存储系统、流水线结构等的CPU。二、 设计思想利用电原理图和VHDL语言相结合的设计思想。层次结构的设计方法。三、 具体步骤步骤一:首先根据要求设计出CPU总体逻辑结构图(可以参考教材和实验指导书)步骤二:用VHDL语言分别设计步骤一中涉及的各元件,并为每个元件建立电原理图步骤三:建立一个名为“CPU”的电原理图文件,插入步骤二中设计的各元件的电原理图,并按照步骤一的设计将各电路元件的信号线正确连接。然后,完成程序的编译
2、、改错。步骤四:将编译好的文件下载到FPGA,根据自己设计的指令集编写一些测试程序进行正确性测试,测试正确后观察具有数据相关或者控制相关的指令执行情况。步骤五:写出课程设计报告(格式稍后给出)四、 示例指令集设计汇编语句操作码功能描述指令类型ADD DR,SRDR+SRDR算术逻辑指令SUB DR,SRDR-SRDRDEC DRDR-1DRINC DRDR+1DRCMP DR,SRDR-SR 比较AND DR,SRDR and SRDR 逻辑与OR DR,SRDR or SRDR 逻辑或NOT DR/DR DR 逻辑非XOR DR,SRDR xor SR DR 异或TEST DR,SRDR a
3、nd SR, 测试SHL DR逻辑左移,最低位补0,最高位移入CSHR DR 逻辑右移,最高位补0,最低位移入CSAR DR算术右移,最高位右移,同时再用自身的值填入MOV DR,SRSR DR数据传送指令LOAD DR,SRSR DRSTORE DR,SR SR DRMOVI DR,IMMIMM DR (双字指令)LOADH IMMIMM R15高8位LOADL IMMIMM R15低8位PUSH SRSR入栈POP DR出栈 DRJR ADR无条件跳转到ADR , ADR=原PC值+OFFSET控制转移指令JRC ADR当C=1时,跳转到ADR, ADR=原PC值+OFFSETJRNC A
4、DR当C=0时,跳转到ADR, ADR=原PC值+OFFSETJRZ ADR当Z=1时,跳转到ADR, ADR=原PC值+OFFSETJRNZ ADR当Z=0时,跳转到ADR, ADR=原PC值+OFFSETNOP空操作其他HALT停机 (JR 0XFFFF)概念设计指令流水的基本思路是把每条指令划分为几个执行步骤,这些步骤在执行过程中使用不同的资源从而在时间上能重叠起来,提高了整体工作负载的吞吐率。我们将每条指令划分为“取指”、“译码”、“执行”、“访存”、“写回”这五个执行步骤。图20 五级流水概念图2.4.1.3时序设计五级流水的时序设计相对两级流水要复杂。在两级流水中,由于我们对时序的
5、精巧设计,避免了相关问题的出现,但五级流水单凭时序安排是无法解决所有相关问题的,必须综合考虑各种情况。l 结构相关的处理由于我们的设计中不包含缓存,因此会有取指和访存的冲突,即结构相关(见下图)。图21 五级流水结构相关示意图当冲突发生时,必须先“访存”,将“取指”延后一个时钟周期,这样才能保证指令的正确执行。处理结构相关需要做两项工作:1)冲突检测 2)取指延后。1) 冲突检测只有执行访存指令(LOAD/STORE)时,才会出现冲突。因此,我们在译码时产生一个标志是否访存的信号wrMem。含义如下:wMem意义00写内存(STORE)01读内存(LOAD)1不占用内存 表16 wMEM控制信
6、号通过检查“访存阶段”的m_wrMem就可确定是否冲突。2)取指延后在每次取指时,若有冲突,则往IR中写入空指令(NOP),并保持PC不变,使取指延后一个节拍。l 数据相关的处理数据相关是指在执行本条指令的过程中,如果用到的操作数是前面指令的执行结果,则必须等待前面的指令执行完成,并把结果写回寄存器或主存之后,本条指令才能继续执行3。我们采用设置专用数据通路(即傍路技术)来解决数据相关问题。但旁路技术并非一劳永逸。若前一指令为LOAD,而后一指令和它数据相关,如下图所示,当下一指令的执行阶段需要数据时,上一指令尚未给出,这种情况是无法用旁路技术来解决的。图22 五级流水LOAD数据相关示意图针
7、对上述情况的一般处理方法是通过插入bubble使LOAD之后的两条指令拖后一个节拍执行4。但我们感觉这种处理过于繁琐。我们发现,如果在LOAD译码时,后面自动加一条空指令,即增加冗余,就可以避免上述情况的出现。在这种简化处理后,我们将数据相关划分为以下三种情况。1 相邻指令数据相关举例: INC R0INC R0 在此情形下,将上一指令的ALU输出经缓存后直接送回,作为ALU多路选择器的入口之一,如下图所示。 图23 五级流水相邻指令数据相关示意图2 中间隔1条指令的两指令数据相关举例: INC R0 INC R1 INC R0在此情形下,将第1条指令的回写数据送回作为ALU多路选择器的入口之
8、一供第3条指令使用,如下图所示。图24 五级流水相隔1条指令的两指令数据相关示意图3 中间隔2条指令的两指令数据相关举例: INC R0INC R1INC R2INC R0第1和第4条指令数据相关,有两种处理方法。方法1:在第4条指令的译码阶段作旁路处理,将第1条指令的回写数据作为运算器的输入送入下一级,如下图所示。方法2:考虑到读写寄存器的时间较短,因此将写寄存器的时机改在时钟下降沿。这样1、4指令就没有数据相关了。图25 五级流水相隔2条指令的两指令数据相关示意图由于方法2处理较简洁,因此我们在实现时使用了后者。以上均是在已知数据相关的前提下,讨论旁路数据通道。接下来,讨论如何检测数据相关
9、。我们知道,只有在后面的指令开始执行时,才能察觉它是否与前面的若干条指令是否相关。为此,需要在数据相关可能发生的最大时域内保留一定的信息。这就是我们将寄存器A,B口选择信号保留至“回写阶段”的原因。我们还是按照上述1、2情况进行论述,所有数据相关的检测都置于“执行阶段”。信号wRegEn是寄存器写使能,SA,SB是寄存器组A,B口选择信号。信号前缀表示信号所处的阶段。如e_SA表示处于执行阶段的SA。1相邻指令数据相关的检测 若m_wRegEn=1,则表示前一指令要回写寄存器。此时,若e_SA或e_SB等于m_SA,则必然数据相关,这是因为我们规定,若回写寄存器,则寄存器A口选择信号所指定的即
10、为目的寄存器。否则无关。2 中间隔1条指令的两指令数据相关的检测 若w_wRegEn=1,则表示第一条指令要回写寄存器。此时,若e_SA或e_SB等于w_SA,则必然数据相关。否则无关。当然,上述两种情况可能会一同出现。这时,我们就按情况1处理。因为情况2可以理解为接连出现情况1。l 控制相关的处理 控制相关是指因为程序的执行方向可能改变而引起的相关。当执行跳转指令时,就会发生这种情况。除JR外,JRZ等条件跳转需要根据当前状态位来决定是否跳转,而当前状态位是由前面最近的会影响状态位的指令(如算术指令)决定。常规的也是比较简单的做法是在碰到JRX之类的跳转指令时,延迟后边流水线的进入。但我们通
11、过分析,认为可以一点都不必延迟,通过旁路处理把控制相关转为数据相关来处理。这样处理,不必延迟,可以提高流水线的性能。按我们的方式解决控制相关需要做两项工作:1) 通过旁路,提供状态寄存器的值和临时状态位的值,为判断是否跳转作准备;2) 选择PC更新的时机1旁路处理在每条指令译码时,会产生一个信号setFlag,它决定了在执行阶段是否根据ALU计算结果改变状态位。从下面的时序图中可以发现,只要我们在JRX指令译码时提供以下3个信号就可作出是否跳转的决定:信号含义tFlagALU计算出的临时状态位,Flag状态寄存器输出,e_setFlag状态寄存器写使能表17 处理控制相关信号若e_setFla
12、g要写状态寄存器,则说明前一条指令会影响状态位,这时根据tFlag决定是否跳转;若e_setFlag要保持状态寄存器,则说明前一条指令不会影响状态位,这时根据Flag决定是否跳转。图26 五级流水处理控制相关示意图2PC更新的时机 在最初设计时,我们考虑将PC放在时钟上升沿更新。若如此,不论JRX转移与否,都会顺序取下一指令。因此,在发生跳转时要清除已读取的指令。处理方法是,在译码时判断上一条指令是否要跳转,若是则产生doNothing信号。这样就清除了已读取的指令。如果把PC更新放在下降沿(若上图所示),则不存在上述问题。但我们担心这种处理在时间上可能会比较紧张。不过,实践表明这种处理是可行
13、的。l PC控制的总结:按照我们的设计,PC是在取指之后的第一个时钟下降沿更新。但当访存和取指冲突时需要特殊处理,分两种情况讨论。1.访存指令不接连出现访存时更新PC,执行空指令时保持PC不变,见下图。图27 五级流水访存指令不接连出现时的PC更新示意图2.访存指令接连出现除第一个访存阶段外,其余访存阶段PC都保持不变。 图28 五级流水访存指令接连出现时的PC更新示意图在解决了结构相关、控制相关、数据相关后,五级流水时序图最终设计如下:图29 五级流水时序图2.4.2结构级设计2.4.2.1 总体逻辑结构计注五级流水CPU设计过程中参考了文献4。图30 五级流水整体结构图整个CPU由以下几个
14、模块组成:l 取指模块(IF):给出内存地址,读取指令并送入指令寄存器,为下一级准备数据。由于PC控制模块处于取指模块中,因此控制相关的检测也置于取指模块。l 译码模块(ID):读取寄存器值和指令译码。我们采取一次译码,逐级传递的方式,译出后几级流水所需的控制信号和数据(如立即数等),在每次时钟上升沿到来时送入下一级。实际上,结构相关、控制相关、数据相关的检测都可归入译码部分。考虑到“相关检测”涉及到的信号分属不同阶段以及整体结构的清晰性,我们将“相关检测”独立出来。l 执行模块(Ex):完成算术逻辑运算、计算有效地址和提供数据通道。l 访存模块(Ma):选择地址线的数据来源和数据线的流向。访
15、存和取指在功能上是独立的,但CPU对外只有一条地址线和数据线的事实决定了访存和取指是相互联系的。当执行LOAD/STORE指令时,地址线由ALU送入“访存段”的值提供;取指时,则由PC提供。当写内存时,CPU内部数据送数据线;当需要读内存时,CPU往数据线送高阻。l 回写模块(Wb):选择回写数据源和根据写使能信号wRegEn将数据回写到寄存器堆;l HazardDetectUnit模块:检测结构相关;l ForwardingUnit模块:检测数据相关。2.4.2.2 关键分模块结构设计l 执行模块(Ex)执行模块的主要工作是完成算术逻辑运算、计算有效地址和提供数据通道。执行模块的主体部分是运
16、算器,其总体结构和两级流水是相似的。主要不同之处在于增加了旁路模块,这是由于五级流水存在数据相关需要旁路处理。图31 五级执行模块结构图l HazardDetectUnit模块 该模块通过检查“访存阶段”的m_wrMem来确定是否发生结构相关。具体请参阅上文中处理结构相关的部分。 结构图: 图32 五级HazardDetectUnit模块结构图信号说明端口信号含义信号含义输入m_wrMemwrMem处于访存阶段的值w_wrMemwrMem处于回写阶段的值d_IR指令寄存器输出PCStall1 : 保持PC不变0: PC更新IFFlush1: NOP写入IR0: 内存输出写入IR表18 Haza
17、rdDetectUnit信号说明l 回写模块(WB)回写是一条指令执行过程中的最后一步。它的工作是选择回写数据源和根据写使能信号wRegEn将数据回写到寄存器堆。需要选择的数据源共有两项:运算器输出和内存输出。在执行算术逻辑、移位等指令时选择运算器输出;执行LOAD指令时选择内存输出。 结构图: 图33 五级回写模块结构图 信号说明:信号含义w_memToReg1: 内存数据到寄存器0: ALU输出到寄存器wRegEn1: 允许写寄存器0: 禁止写寄存器表19 五级回写模块信号说明l 2.2.4 ForwaringUnit模块 在“时序设计”部分,我们已对“如何检测数据相关”作了详细叙述。具体实现由ForwardingUnit模块完成。 结构图 图34 五级Forwarding模块结构图 信号说明端口信号含义信号含义输入e_SA寄存器A口选择信号处于执行阶段的值e_SB寄存器B口选择信号处于执行阶段的值m_SA寄存器A口选择信号处于访存阶段的值w_SA寄存器A口选择信号处于回写阶段的值m_wRegEn寄存器写使能处于访存阶段的值w_wRegEn寄存器写使能处于回写阶段的值输出forwradA选择ALU的A口数据forwradB选择ALU的B口数据表20 五级Fowarding模块信号说明控制器设计参考计算机组成原理实验的控制器设计,可以用硬布线设计(推荐),也可以用微程序设计。
限制150内