计算机系统结构实验系列一、微程序版CPU二、硬布线版CPU三、流水线版CPU四、嵌套中断CPU赖晓铮博士华南理工大学laixz@scut.edu.cnQQ:68046508(二)硬布线版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,启动仿真,使能复位信号#RESET=0;2)手动按钮MANUAL开关“010”,然后令信号#RESET=1.注:初始化完成后,若时钟信号CLK继续接开关MANUAL,则CPU进入手动模式,手动MANUAL开关,生成时钟信号CLK,程序单步执行;若时钟信号CLK接信号源AUTO-CLK(主频10Hz),则CPU进入自动模式,程序自动运行,直到HLT指令的“断点”处暂停。重启过程(跳出“断点”)1)时钟信号CLK接开关MANUAL,手动令复位信号端#RESET的状态“101”变化,即重启完成,跳出“断点”继续执行。注:跳出“断点”后,CPU进入HLT指令的后续下一条指令的取指周期。实验步骤(一致性验证):1)硬布线版CPU项目工程的子文件夹PROGRAMS,与微程序版CPU项目工程的子文件夹PROGRAMS完全一致。请逐个编译、烧写、手动单步执行或自动运行所有机器指令asm文件。(编译和烧写asm文件的方法参见“2.6存储器实验”)2)在手动单步执行过程中,对照相应的指令流程图,观察时序电路的M状态机以及M信号输出的变化,记录每个M周期中AR、IR、PC、通用寄存器Rx及总线BUS的数据。3)在程序自动运行过程中,通过HLT指令在程序需要调试的位置设置“断点”。观察“断点”暂停时刻,观察和记录AR、IR、PC、通用寄存器Rx及总线BUS的数据(注意:增加HLT指令“断点”会出现跳转指令的目标地址偏移问题)。4)修改中断程序INT_IRET,在主程序不同位置设置HLT“断点”模拟中断。在“断点”暂停时刻,信号CLK改用手动单步执行,触发INTERRUPT按钮(模拟外部中断),观察和记录进入中断时,PC/BP_PC、PSW/BP_PSW以及总线BUS的数据变化。实验步骤(子程序调用):1)在实际应用中,经常需要多次用到某一段程序。为了避免重复编写,节约内存空间,可以把该程序独立出来,供主程序在需要的时候反复调用,这种程序称为“子程序”。在本书的CPU指令集中缺少专门的子程序调用及返回指令。但是,因为子程序调用的位置是固定和可以预见的(与中断的随机出现不同);所以,可以采用跳转系列指令来实现跳转到子程序和从子程序返回的功能。2)在硬布线版CPU项目工程的子文件夹test里,存放着子程序示例SUB_PROG。其功能类似于汇编语言的“CALL”和“RET”语句,实现的功能是统计存储器中一个数组包含了多少个正数、零和负数(所有数都用补码形式表示),并把统计结果分别存放在寄存器R1(正数)、R2(零)和R3(负数)中。具体代码如后页所示。3)编译、烧写、自动运行SUB_PROG源程序,观察自动运行过程中的“断点”暂停时刻,寄存器R0、R1、R2和R3的数据变化。实验步骤(子程序调用):4)修改SUB_PROG源程序中的数组(存储器地址[02-07H]存放的数据),改变正数、零和负数的比例,记录程序末尾,寄存器R1、R2和R3最终结果的变化。5)与“3.1.微程序版CPU实验”的“实验3循环结构程序”相比较,请问本程序可否从数组开始顺序读出数据,再调用子程序做统计?如果通用寄存器不够用,有什么解决办法?6)修改SUB_PROG源程序,例如把POP指令放入子程序中,或是把OUT指令放在在主程序的循环中。如果仅仅添加或删除某些指令,子程序调用会出现什么问题?(提示:跳转地址出问题)采用跳转系列指令来模拟子程序调用有什么缺点?7)与“3.1.微程序版CPU实验”的“实验4中断程序”相比较,请问子程序是否要保护主程序使用的所有通用寄存器?子程序调用和中断发生的区别是什么?汇编助记符(M地址:机器指令)JMP16H00H:0001000001H:0001011055H02H:01010101AAH03H:10101010FFH04H:1111111180H05H:100000000H06H:000000000FH07H:00001111OUTR0,PORT0;sub_p08H:01010000THRR009H:00100011JZ10H0AH:000110000BH:00010000SUB_PROG汇编助记符(M地址:机器指令)JS13H0CH:000111000DH:00010011JMP14H0EH:000100000FH:00010100INCR210H:00101000JMP14H11H:0001000012H:00010100INCR313H:00101100JMP21H;ret14H:0001000015H:00100001SETR3,0;main16H:0011110017H:00000000汇编助记符(M地址:机器指令)SETR2,018H:0011100019H:00000000SETR1,06H1AH:001101001BH:00000110HLT1CH:00000001INCR1;loop1DH:00100100POPR0,[R1]1EH:10000001JMP08H;callsub_p1FH:0001000020H:00001000SUBIR1,02H21H:1100010022H:00000010SUB_PROG汇编助记符(M地址:机器指令)JZ27H23H:0001100024H:00100111JMP1DH;gotoloop25H:0001000026H:00011101SETR1,06H27H:0011010028H:00000110SUBR1,R229H:11000110SUBR1,R32AH:11000111HLT2BH:00000001思考题:●在硬布线版本CPU中,可以采用软件方法,通过跳转指令JMP来实现子程序的调用及返回,也可以通过硬件电路实现类似功能。保持指令长度和OP码位数不变,请设计硬件电路,实现从立即数/寄存器获得跳转地址的CALL和RET指令。(提示:CALL指令与JMP指令可以共用OP码0001,规定JMPR/JxR指令的地址来源只能是寄存器R1。修改跳转系列指令格式,如下表所示:规定若指令I1I0=00,表示是双字节JMP/Jx指令;若指令I1I0=01,表示是单字节JMPR/JxR指令;若指令I1I0=10,表示是双字节的子程序调用指令CALL,子程序跳转处“断点”的保存地址是第二字节ADDR;若指令I1I0=11,表示是单字节的子程序调用指令CALLR,子程序跳转处“断点”的保存地址是寄存器R3。同样的,在中断子程序中,中断返回指令IRET的I1I0=00;而在主程序中,可以规定子程序返回指令RET的I1I0=01。)(二)硬布线版CPU实验汇编语言格式功能I7I6I5I4I3I2I1I0JMPADDR;ADDRPC00010/00/0ADDRJMPRR0;(R1)PC00010/00/1JxADDR;IFCF/ZF/SF=1,ADDRPC000101/10/110/0ADDRJxRR0;IFCF/ZF/SF=1,(R1)PC000101/10/110/1CALLADDR;PCBP_SUB且ADDRPC00010/01/0ADDRCALLRR0;PCBP_SUB且(R3)PC00010/01/1IRET;中断返回:BP_PCPC;BP_PSWPSW01110/00/0RET;子程序返回:BP_SUBPC01110/00/1跳转、中断返回及子程序调用系列指令注:子程序调用也需要设置一套与中断电路类似的“断点”寄存器BP_SUB,不能与中断