您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 计算机系统结构实验 3.3 流水线版CPU 赖晓铮
计算机系统结构实验系列一、微程序版CPU二、硬布线版CPU三、流水线版CPU四、嵌套中断CPU赖晓铮博士华南理工大学laixz@scut.edu.cnQQ:68046508(三)流水线版CPU实验实验内容:●设计一个流水线架构CPU:采用四级流水线,在流水线满载情况下,一个时钟周期完成一条机器指令;机器指令集及指令功能完全兼容微程序/硬布线版CPU。在流水线版CPU上验证微程序/硬布线版CPU的机器语言程序,考察指令相关性对流水线CPU程序的影响。实验目的:●理解流水线技术的基本原理。●掌握基于流水线技术的CPU设计方法。流水线版CPU电路图CPU指令集(OP码表)OP码(I7I6I5I4)指令助记符OP码(I7I6I5I4)指令助记符0111IRET1111OR/ORI0110MOV1110AND/ANDI0101OUT/OUTA1101ADD/ADDI0100IN1100SUB/SUBI0011SET1011XOR/XORI0010SOP(INC/DEC/NOT/THR)1010SHT(RLC/LLC/RRC/LRC)0001JMP/JMPR/Jx/JxR1001STO/PUSH0000NOP/HLT1000LAD/POP一、系统指令:汇编语言功能I7I6I5I4I3I2I1I0NOP;无操作(延时4个T)00000/0x/0HLT;停机(断点)00000/0x/1IRET;中断返回BP_PCPC;BP_PSWPSW01110/0x/x汇编语言注释I7I6I5I4I3I2I1I0MOVRA,RB;(RB)RA0110RARBSETRA,IMM;IMMRA0011RAx/xIMM二、寄存器及I/O操作指令:汇编语言功能I7I6I5I4I3I2I1I0INRA,PORTx;(PORTx)RA0100RAPORTxOUTRA,PORTx;(RA)PORTx0101RA0/PORTxOUTARA,PORTx;(RA)PORTx0101RA1/PORTx汇编语言功能I7I6I5I4I3I2I1I0LADRA,[ADDR];[ADDR]RA1000RA0/0ADDRPOPRA,[RB];[RB]RA1000RARBSTORA,[ADDR];(RA)[ADDR]1001RA0/0ADDRPUSHRA,[RB];(RA)[RB]1001RARB三、存储器及堆栈操作指令:汇编语言功能I7I6I5I4I3I2I1I0JMPADDR;ADDRPC00010/00/0ADDRJMPRRB;(RB)PC00010/0RBJCADDR;IFCF=1,ADDRPC00010/10/0ADDRJCRRB;IFCF=1,(RB)PC00010/1RBJZADDR;IFZF=1,ADDRPC00011/00/0ADDRJZRRB;IFZF=1,(RB)PC00011/0RBJSADDR;IFSF=1,ADDRPC00011/10/0ADDRJSRRB;IFSF=1,(RB)PC00011/1RB四、跳转系列指令:五、算术逻辑运算指令:汇编语言功能I7I6I5I4I3I2I1I0RLCRA;(RA)右逻辑移位1010RA0/0LLCRA;(RA)左逻辑移位1010RA1/0RRCRA;(RA)右循环移位1010RA0/1LRCRA;(RA)左循环移位1010RA1/1汇编语言功能I7I6I5I4I3I2I1I0INCRA;(RA)+1RA0010RA0/0DECRA;(RA)-1RA0010RA0/1NOTRA;#(RA)RA0010RA1/0THRRA;(RA)RA0010RA1/1五、算术逻辑运算指令:汇编语言格式功能I7I6I5I4I3I2I1I0ADDRA,RB;(RA)+(RB)RA1101RARBADDIRA,IMM;(RA)+IMMRA1101RA0/0IMMSUBRA,RB;(RA)-(RB)RA1100RARBSUBIRA,IMM;(RA)-IMMRA1100RA0/0IMMANDRA,RB;(RA)∧(RB)RA1110RARBANDIRA,IMM;(RA)∧IMMRA1110RA0/0IMMORRA.RB;(RA)∨(RB)RA1111RARBORIRA,IMM;(RA)∨IMMRA1111RA0/0IMMXORRA,RB;(RA)⊕(RB)RA1011RARBXORIRA,IMM;(RA)⊕IMMRA1011RA0/0IMM初始化过程:1)启动仿真前,时钟信号CLK一定要接在手动开关MANUAL的地端(即CLK=0)!否则,启动后程序计数器PC会出错。2)启动仿真,手动按钮令信号#RESET=1状态“101”变化,使得初始化信号ON=1,时钟信号可以送到基准时钟TCLK端。注:初始化完成后,若时钟信号CLK继续接开关MANUAL,则CPU进入手动模式,手动MANUAL开关,生成时钟信号CLK,程序单步执行;若时钟信号CLK接信号源AUTO-CLK(主频10Hz),则CPU进入自动模式,程序自动运行,直到HLT指令的“断点”处暂停。重启过程(跳出“断点”)1)时钟信号CLK接开关MANUAL,手动令复位信号端#RESET的状态“101”变化,令停机信号#HLT=1,时钟信号继续送到基准时钟TCLK端,即重启完成,跳出“断点”继续执行。注:跳出“断点”后,CPU进入HLT指令的后续下一条指令的取指周期。实验步骤(一致性验证):1)流水线版CPU项目的子文件夹PROGRAMS,与微程序版CPU的子文件夹PROGRAMS完全一致。请逐个编译所有的asm源程序,生成HEX文件后,逐一烧写到程序存储器PROGRAM执行验证。注意:流水线版本CPU的程序和数据存储器是分开的,切记不要把hex文件错误写入数据存储器ROM!(编译和烧写asm文件的方法参见“2.6存储器实验”)2)若手动执行程序,则直接手动MANUAL开关“010”,信号CLK的上升沿和下降沿跳变都令程序单步执行。仔细观察每次手动MANUAL开关(上升沿/下降沿)后,在指令流水线F_IRD_IRE_IRW_IR上的指令状态;对照数据流水线示意图和指令流程表,记录在译码(D)、执行(E)、写回(W)各段上的寄存器及总线的数据。实验步骤(一致性验证):3)若自动运行程序,可以通过HLT指令在程序需要调试的位置设置“断点”,观察“断点”暂停时刻,在指令流水线F_IRD_IRE_IRW_IR上的指令状态;在译码(D)、执行(E)、写回(W)各段上的寄存器及总线的数据变化,然后再跳出“断点”返回主程序(注意:增加HLT指令“断点”会出现跳转指令的目标地址偏移问题)。4)修改中断程序INT_IRET,在主程序不同位置,设置HLT“断点”模拟中断。在“断点”暂停时刻,信号CLK改用手动单步执行,触发INTERRUPT按钮(模拟外部中断)。观察和记录进入中断时,INT、INTR等中断信号变化,PC/BP_PC和PSW/BP_PSW的数据变化,以及指令流水线F_IRD_IRE_IRW_IR的状态。5)部分程序的验证结果会出现跟微程序版本不一致的情况,例如后页所示的程序NOP_MOV和JS。NOP_MOV问题:请问这些不一致的程序是由于流水线相关的原因么?在哪个位置的两条指令之间发生了流水线相关?是什么类型的相关?汇编助记符(M地址:机器指令)SETR0,04H00H:0011000001H:00000100SETR1,03H02H:0011010003H:00000011HLT04H:00000001SUBR0,R105H:11000001JS0CH06H:0001110007H:00001100ADDR0,R108H:11010001OUTR0,PORT009H:01010000JMP0DH0AH:000100000BH:00001101OUTR1,PORT00CH:01010100HLT0DH:00000001汇编助记符(M地址:机器指令)SETR0,03H00H:0011000001H:00000011OUTR0,PORT002H:01010000MOVR1,R003H:01100100OUTR1,PORT004H:01010100HLT05H:00000001JS实验步骤(数据结构):1)堆栈指令程序PUSH_POP是典型的数据结构程序,其功能是把一个数组从存储区的源区域批量转移到另一个目标区域,具体代码如后页所示。2)编译、烧写、自动运行PUSH_POP源程序。观察“断点”暂停时刻,在译码D)、执行(E)、写回(W)各段上的指令状态及寄存器数据的变化。3)请问程序执行后,存储器目标区域(地址[80-85H])存储的数据是什么?为何与存储器源区域中的数组不一致?这些数据是从哪里来的?出现不一致是流水线相关问题么?4)流水线版CPU项目工程的子文件夹test存放的SUB_PROG.asm,与硬布线版CPU项目工程的程序SUB_PROG.asm完全一致。编译、烧写、自动运行SUB_PROG源程序,请问会出现流水线相关么?在程序的哪些位置出现?解决相关性(插入NOP指令)会对跳转指令模拟的子程序调用及返回产生什么影响?汇编助记符(M地址:机器指令)HLT0EH:00000001DECR10FH:00100101POPR0,[R3]10H:10000011INCR311H:00101100PUSHR0,[R2]12H:10010010INCR213H:00101000OUTR0,PORT014H:01010000THRR115H:00100111JZ1AH16H:0001100017H:00011010JMP0FH18H:0001000019H:00001111HLT1AH:00000001汇编助记符(M地址:机器指令)JMP08H00H:0001000001H:0000100048H;`H`02H:0100100045H;`E`03H:010001014CH;`L`04H:010011004CH;`L`05H:010011004FH;`O`06H:0100111121H;`!`07H:00100001SETR3,02;main08H:0011110009H:00000010SETR2,80H0AH:001110000BH:10000000SETR1,06H0CH:001101000DH:00000110PUSH_POP实验步骤(经典算法):1)“冒泡排序”算法是经典的数据排列算法,其主要原理:将数组中的一个数与后一个数相比较,如果其比后面相邻的数大,则交换彼此。将数组的所有数比较一遍后,最大的数就会在数组的最后面。再进行下一轮比较,找出第二大数据放在数组的倒数第二位置。如此反复循环,直到全部数据由小到大排列完成。2)请参考数据结构程序PUSH_POP和子程序示例SUB_PROG,参照后页的流程图编写一个“冒泡排序”算法程序,对存储器中的某个数组进行排序处理(注:如果通用寄存器R0~R3不够用,又要尽量避免改动硬件,有什么软件解决方案?)。“冒泡排序”算法流程图思考题:●如流水线版指令流程表所示,在堆栈指令PUSH/POP和跳转指令JMPR/JxR的执行过程中,可否把寄存器STACK_P和JMP_REG换成74LS244缓冲器,把打入地址寄存器AR和程序计数器PC的动作从执行(E)段提前到译码(D)段完成,从而提升指令执行效率?(提示:堆栈指令PUSH/POP需要考虑结构相关问题::在译码(D)段,地址寄存器AR从通用寄存器Rx获取地址后,需要保持到写回(W)段存储器操作完成,AR才能再输入新的地址,否则指令会出错;而跳转指令则是有条件跳转系列指令JxR只有在指令到达执行(E)段才能决定是否跳转。)(三)流水线版CPU实验思考题:●本实验中,SHT、PUSH及ALU2_R系列指令(即“D2指令”)采用了“暂停(stalling)”机制来解决D段需要两个不同路径的问题。假设改变“暂停”机制的时序
本文标题:计算机系统结构实验 3.3 流水线版CPU 赖晓铮
链接地址:https://www.777doc.com/doc-3897815 .html