2014版计算机系统综合设计报告_第1页
2014版计算机系统综合设计报告_第2页
2014版计算机系统综合设计报告_第3页
2014版计算机系统综合设计报告_第4页
2014版计算机系统综合设计报告_第5页
已阅读5页,还剩56页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

姓 的 浩CPU实现、UART、VGA、4*4运216位定时/计数器、4×4键盘控制器、16716位LED输出、16位拨码开关输入 编址,中断的仲裁采用菊花链固定优先级(不允许抢占和嵌套,能够进行精确中断,进入中断,BIOS的字库、UART串口发送、定时器/计数器、4*4键盘等。mcc,mcc另外,为了更好地适应文法的扩充,mcc屏显示、支持注释、式多文档等功能完整、界面友好IDE。(包括体系结构框图和对结构图的简要解释,重点解释有自己创新点的部分汇编器同时生成器RAM的初始化中断处理程序的.coe文件。816(只完成基础部分的同学只说明完成的设计,无需贴代码, 中缺的代码可以贴1、CPU(IF(ID(EXE (IF(ID执行阶段(EXEALU(MEM(WB1,、2、3同时也起到的作用。如图所示。图3:流水线CPURAM5EXE阶段。如果我们能判断就能有效解决问题。以上只是一般寄存器指令的情况。如果是读器指令Lw,由于正确的的结果须进行延时一周期(IRPC写使能关掉。同时,将下一指令废掉(所有写使能和跳转信号全部归0),这样就不会多执行一条指令。处理器的寄存器主要有4个,分别是EPC,Status,Cause,和Base。用途如下: MIPSbeqID2(NOP递增1。这些指令跳转都是PC<-PC+4+offset,实际上为PC<-PC+1+offset。跳转偏移量的计算方法(offsetCPUALUinputwire[31:0]inA,inB;//输入两个操作数inputwire[2:0]selc;//根据运算的类型选择对应的运算结果用来输出outputreg[31:0]outC;//outputreg[31:0]outH,outL;//和除法相关的输出outputwireoverflow;//当运算发生溢出的时候产生的信号wire[31:0]resultA;ads(.operandA(inA), mul_div(.in0(inA),.in1(inB),.outH(resultH),;logical_operationcompare32lui_operationregisterfinputwire[31:0]outputwire[31:0]qa,qb;//ra,rbreg[31:0]register[31:0];//3232iptwiren,l;/wn为写使能,dclkiptire4:0]ra,bd;/ra,rb为双端口的读出的选择端,rdipwire[31:0]outputwire[31:0]a,qb;//ra,rbreg[31:0]register[1][f:gr] qa=rgitera qb=register[rb];1.3中断的设计MMMstate=0erec执行期间立即响应新的中断,之前地址保存情况(1。假设A是中断固定的地址,是唯一且是固定的,进入执行后,首先”保护现场”,然后读协处务程序的地址,即中断向量表,找到相应的中断服务程序后,其结束的指令是eret指令,他跳于是几号中断,是有这段BIOS的中断程序获取得知的。RAM里的中断服务程序的地址(中断向量表)要有编译器生成(通过.coe进行初始化always@(resetorrst_intorrst_stateorin0orin1orin2orin3reg_int=reg_state=elseif(rst_int==1)begin中断开始响应reg_int<=0;=elseif(rst_state==1)begin中断结束响应reg_state<=0;base<=32’d1;//记录中断源reg_int<=1’b1;//中断信号INT[0]=1’b0;//中断记录位base<=32’d2;//记录中断源reg_int<=1’b1;//中断信号INT[1]=1’b0;//中断记录位base<=32’d3;//记录中断源reg_int<=1’b1;//中断信号INT[2]=1’b0;//中断记录位base=32’d4;//记录中断源reg_int=1’b1;//中断信号INT[3]=1’b0;//中断记录位elseelseif(in0==1’b1&&IE==1’b1&&IM[0]==1’b0)beginINT[0]=base=32’d1;//记录中断源reg_int=1’b1;//中断信号rst_intIO4’b0001;//elseif(in1==1’b1&&IE==1’b1&&IM[1]==1’b0)beginINT[1]=regint=1’b1;//中断信号=rst_intIO4’b0010;//elseif(in2==1’b1&&IE==1’b1&&IM[2]==1’b0)beginINT[2]=base=32’d3;//记录中断源reg_int=1’b1;//中断信号rst_intIO4’b0100;//elseif(in3==1’b1&&IE==1’b1&&IM[3]==1’b0)beginINT[3]=base=32’d4;//记录中断源reg_int=1’b1;//中断信号rst_intIO4’b1000;//一样的是,外设只有16位的数据处理能力。1Mem MemIipt[15:0]address;outputregMemOrIO;outputreg[31:0]cs;wre[31:0]out; iaalways@(addressorout)beginif(adre[5]==8'hff)beginMemOrIO<=1'b0;cs<=ouelseMemOrIO<=1'b1;cs<=20;1.4.2应位,并在相应的COUT脚输出一个时钟的中断(高电平。在相应的COUT脚输出一个时钟的中断(高电平。状态寄存器在 后 (后两位方式寄存器(只写)addr[2:0]:状态寄存器(只读)addr[2:0]:初始值寄存器(只写)addr[2:0]:当前值寄存器(只读)addr[2:0]: 7LED,从到低位排列。由于Minisys键值定义:0~123A456B789C0FED指的就是第1行第一列,为1。UARTalways@(posedgeclk)if(TxD_start)state<=if(BaudTick)state<=01234567//stop4'b0010:if(BaudTick)state<=4'b0000; default:if(BaudTick)state<=4'b0000;//Outputmuxregmuxbit;always@(*)3'd0:muxbit<=TxD_dataD[0];3'd1:muxbit<=TxD_dataD[1];3'd2:muxbit<=TxD_dataD[2];3'd3:muxbit<=TxD_dataD[3];3'd4:muxbit<=TxD_dataD[4];3'd5:muxbit<=TxD_dataD[5];3'd6:muxbit<=TxD_dataD[6];3'd7:muxbit<=//Puttogetherthestart,dataandstopbitsregTxD;always@(posedgeclk)TxD<=(state<4)|(state[3]&VGAreg always@(posedgeclk_25mornegedgerst_n)if(!rst_n)hsync_r<=1'b1;else t10'd0)hsync_r1'b0;//产生hsyncelse t==10'd96)hsync_r<=always@(posedgeclk_25mornegedgeif(!rst_n)vsync_r<=1'b1;elseif( t==10'd0)vsync_r<=1'b0;//产生vsync信号elseif( t==10'd2)vsync_r<=1'b1;assignhsync=hsync_r;assignvsync=mccC++VisualStudio2013CommunityEditionBIOSBIOS能。为此,mccMiniCComplierAssembler(mcca,mccaMIPS并且它负责处理用户程序和系统调用的。mccparser.ytoken,tokenenumtokens.l<unistd.h>为#include<stdio.h>和#include<io.h>mcc/main.cpptoken,并停止进一步的解析。关于语法树的描述,见第2小节。相关的文件见工程mcc/parser 句。而一个MiniC文件由一系列的 收集起来,增加了一个MccRobot类,并使用单例模式提供了一个全局的唯一

目前设计的UML图如图X。图8:语义检查模块UML图2CheckerError变量的类型在语法void,但语义inti;//voidi;//定义的参数名是否确intmain(int);//okintmain(int){..}//语法上允许breakwhile所在行号以及语句的类型(breakcontinue。制,(1)变量名作用域唯一,MiniC存在两种域,全以及的ID的名字MiniClabel+数字的组合,需方法generate_code。通过MccRobot对象的generate_code方法,依次遍历语法树结点(调用代码生成需要考虑运行时的内存分配,活动记录等一系列操作的问题,为简化问题,mcc采用都在运行时当前方法调用的活动记录(栈)中,通过与活动记录指针($t0)的偏移量来进行。程序栈指针被初始化为3999,全局变量集中放在栈底。图

图录的移除而释放掉,而全局变量是集中放在栈底的,是不会被释放掉的(OSinti;intk; --器32bits编 -- i即$fp- j即$fp-4j[i]$fp- k即$fp---上图为局部变量的例子,全局变量类似,唯一的区别在于,全局变量的$fp4000,而不是//计算出数组$v0//结果的地址lw$v0//计算出值addiu$v0$zero$v0(2)数组变量addiu$v0$zeroaddress//查找出数组的址存至$v0//目标地址(3)端口addiu$v0$zero//赋值//position由编译器生成代码时保存起来,为相对$fp1.全局变量1.1.数组变量addiu$v0$zero addiu$v1$zero1.2.普通变量addiu$v0$zero4000lw$v0(-2.局部变量2.1.数组变量addiu$v1$zeropositionsubu$v0$fp$v12.2.普通变量lw$v0(-j//break_labelj//continue_label//条件beq$v0$zero//false_branch_labelj //false_branch_label //如果有的话 //条件beq$v0$zero //break_label //While //跳出whileMccIntLi, ori$v0$zero //$v0=lui$v1 //$v1 //$v0=,addi$v0$zero addiu$sp$sp //poplocal_var_sizelw$ra //取出返回地址addiu$sp$spargs_fp_size //pop,args_fp_size由lw$fp jr //保存 //计算并保存参数 //计算并保存参数jal addiu$v1$zero //size//如果包含定义(即非方法往 addu$fp$zero //设置 //保存 //局部变量… //局部变量 //语句… //语句(包含在条件语句体里的不算addiu$sp$sp //poplocal_var_sizelw$ra //取出返回地址addiu$sp$spargs_fp_size //pop,args_fp_size由lw$fp0($sp) $fpjr$ra//回调方法(无参数sw$v00($sp) //Push($v0)addiu$v0$zero1sw$v10($sp) //Push($v1)addiu$v1$zero1sw$fp0($sp) //Push($fp)andset$fpaddu$fp$zero$spaddiu$v1$zero1subu$sp$sp //局部变量… //局部变量 //语句… //语句addiu$sp$sp lw$fp //恢复寄存器lw$v12($sp)lw$v03($sp)addiu$sp$sp3 //计算值nor$v0$v0(2)subu$v0$zero(3)//不需要(4)sltu$v0$zero(5)lw$v0 //左操作数(3) //保存左操作数 //右操作数sltu$v0$zero(2)addiu$v0$zero0jbranch_endaddiu$v0$zero1(3)addiu$v0$zero0jbranch_endaddiu$v0$zero1(4)slt$v0$v0$v1sltu$v0$zero$v0(5)slt$v0$v1(6)slt$v0$v0(7)slt$v0$v1$v0sltu$v0$zero$v0(8)and$v0$v1$v0sltu$v0$zero$v0(9)(10)sub$v0$v1(11)mflo$v0(12)div$v1mflo(13)div$v1mfhi(14)and$v0$v1(15)xor$v0$v1(16)sllv$v0$v1(17)srlv$v0$v1(18)or$v0$v1mccaMiniCCompilermccaBIOS的目标代码。Mcca在启动时会一个bios-init文件,该文件由四部分构成,以%%符号进行分隔。各部分含义如下:如果用户程序没有定义main函数,将出现错误。通过合理的解析bios-init文件,可以让mcca正确的系统调用及用户程序。在到第二部分时,mccamainmain到第为了让用户自己编写中断处理程序,我们在mcc中特殊处理了interrupt0、interrupt1label,ram.coe的开头,以供中断处理查询中断处理向量表时获取到相应的中断处理程序的rom.coe提供了默认的中断处理方法,比以该地址正确的生成ram.coe。3mcc 扫描器(Scanner)Syntacticysis中)可以依据语言语法,组词成句;机器码(对应于把读入的字符串同“ORG_CODE”进行匹配,如果一样确,否则就是出错。出错后,调用相应的错误处理程序(同样在Syntacticysis中),一旦有错,程序终止退出。操作,一旦语法分析得出一句完成的结论,就将*CMD汇编器的关键是语则的定义,语法分析和词法分析都是严格按照语

找 Next 18: 19: 20: 21: 22: 23: 24:25:26:27:28:29:<N_CODE30: 31:32: 33:34:35:36:37:38:39:则40:41:42: 44: 45: 46: 4、IE我组IDE使用Qt开发完成。语法 foreach(constHighlightRule&rule,{QRegExpintindex=expression.indexIn(text);while(index>=0){intlength=expression.matchedLength();setFormat(index,length,rule.format);index=expression.indexIn(text,index+}} QRegExpcommentStartExpression=QRegExp("/\\*");QRegExpcommentEndExpression=QRegExp("\\*/"); intcommentStartIndex=if(previousBlockState()!={commentStartIndex=}while(commentStartIndex>={intcommentEndIndex=commentEndExpression.indexIn(text,intcommentLength=if(commentEndIndex==-{commentLength=text.length()-}{commentLength=commentEndIndex-commentStartIndex+}setFormat(commentStartIndex,commentLength, commentStartIndex=commentStartExpression.indexIn(text,commentStartIndex+}{HighlightRuleQTextCharFormatfunctionFormat;rule.pattern=QRegExp("\\b[A-Za-z_]+[A-Za-z0-9_]*(?=\\s*\\()");rule.format=functionFormat;}{if(this-{}{}}{"C/C++file(*.h*.c*.cpp);;Allfile(*.*)");if{}{QTextEdit*edit=newCodeEdit(fileName);connect(edit,SIGNAL(textChanged()),}}CodeEdit*edit=(CodeEdit*)m_tabManager->currentWidget();if(edit!=NULL){if(edit->m_file!={QStringfileName=edit->m_file-}}piler=new { 5、BIOSBIOSDATAORG_DATA0DFCH LEDDATADW DATAENDSCODE $SP,$ZERO,4000 $T0,$ZERO,0 $T1,$ZERO,0014H $T2,55AAH $T2,$T2,55AAH $T3,0AA55H $T3,$T3, $S0,$ZERO, ;RAM $T8, $T2, $T4, $T4,$T2,0014H $T3,0($T0) $T4, $T4,$T3, ;跳到 $T8,0($T0) $T0,$T1,0001H $T0,$T0,1H $T5,FF18H($0) $T0,$T5,1H $T0,$ZERO,000aH;没按键的时候有按键信息,出错CHKLED:ANDI$T0,$ZERO,0 $T1,$ZERO,02b66H $T0,FF00H($ZERO) $T2,$T2,-1 $T2,$ZERO,-3 $T0,$T0, $T0,$T1,-7 ZO,$ZERO,0H ZO,$ZERO,0H RR:SW $S,FF00H($ZERO);在数码管上输出错误码 $T0,$T0,0H $V0, $0,$ZERO, 24 ;lw2425 ;jr CODEENDSBIOSCintsystem(intm,intn,int//m:systemcall//1.numled:show//3.lightled:show//4.switchbutton:read//5.keyboard:readinti;int$0xFF00=n;//1.numled:shownumberi=n;}elseif(m==2){t=$0xFF20=t;//2.VGA:shownumberi=t;}elseif(m==3)$0xFF08=n;//3.lightled:shownumberi=n;}elseif(m==4)i=$0xFF10;//4.switchbutton:read}elsei=$0xFF18;//5.keyboard:read}}本组设计的MiniSys(地操作intmain(voidvoidintd所有变量需在最开始统一intf;intx;inty;intr;{d=$0xFF10;//外f=d&if(f==x=d&0x3FFF;y=$0xFF18;$0xFF00xy$0xFF08=x+}elseif(f0x4000){x=d&0x3FFF;yr=x-if(r>=0$0xFF00=}$0xFF00=-}}elseifx=d&0x3FFF;y=$0xFF18;r=x*$0xFF00=$0xFF20=r%}x=d&0x3FFF;y=$0xFF18;r=x/$0xFF40=$0xFF00=}}return} intintx;inty;intx=0;y=z=count=$0xFF382;$0xFF3C=$0xFF2860000;$0xFF2A=$0xFF2C=x=if((x>=1)&&(x<count=count+1; }elseif((x>=10000)&&(x<20000)){y=system(4,0,0);z=}}return}%mcc.exe%mcc.exe%mcc.exetest#relative%mcc.exeC:\Users\XXX\Desktop\test#absolutecodeseg和codeends。org_data416hH进制数,最后同样需要加h(H),16进制数之间需用“,”分隔。续定义org_code,但要保证不能和之前 $v(0~1)|$a(0~3)|$t(0~9)|$s(0~9)|$i(0~1)|$sp|$ra|$zero|$(0~31) 过65535)。二进制需以b(B)结尾,十六进制必须以h(H)结尾,十进制无字母结尾。 b,100,-200,0ffeH 过31。lw$V0,1234h($zero)sw$at,buf($28)sw$a1,buf+4($28)DATAORG_DATA0DFCH DATAENDSCODEORG_CODE0000H P$ZERO,4000;初始化$SP $0,$ZERO,0 $1,$ZERO,0014H $2,55AAH 2,2,55AAH $3,0AA55H $3,$3, $0,$ZERO, ;A $80($T0) ,0($T0) , ,$2,0014H ;跳到ERROR ,0($T0) , ,$3, ;跳到 ,0($T0) ,$1,0001H ,$0,1H $5FF18H($0) $0,$5,1H $0,$ZERO,000aH;没按键的时候有按键信息,出错 $0,$ZERO,0 $1,$ZERO,02b66H $2,$ZERO, $0,FF00H($ZERO) $2,$2,-1 $2,$ZERO,-3 $0,$0,0457H $0,$1,-7 ;跳到DIPS $ZERO,$ZERO,0H;O $ZERO,$ZERO,0H;OERROR:SW $S0,FF00H($ZERO);在数码管上输出错误码 $0,$0,0H $0, $V0,$ZERO,0 0000024 读;w2425 ;jr CODE3、IE 2 (贴关键的能说明问题的时序图,可以竖贴图15:仿真图1outInst:当前ID阶段的指令(16进制)currentPCDout:当前ID阶段指令的PC值0条指令:luioutPC的值(ALU输出)为-2147483648。1(310)。1条指令:mtc0指令,初始化status协处理器的中断控制位。第3条指令:sll空指令第14条指令:addi指令,初始化$1寄存器=115条指令:sllv1第17条指令:延迟槽指令,空指令sll14条指令:延迟槽指令,初始化$118条指令:srl第20条指令:延迟槽指令,空指令sll22条指令:J第6条指令:mfc0base协处理器,得到中断向量号8条指令:根据中断向量表取出的值进行跳转,jrlw指令有数据相关,所以该指令第23条指令:中断处理程序的第一条指令,LW4*4键盘的值第24条指令:乘法指令,计算键盘输入值的平方26条指令:将乘法的结果写入数码管第28条指令:延迟槽指令,空指令sll(资源使用情况、主频、功耗数据和自我分析,可参考验收表的项目测试2

图上板安全时钟频率(00(01(10示在数码管上,模16后结果显示在VGA屏幕上;除法的结果显示在数码管和低8位发送串口上。MiniC{intd;intf;intx;inty;intr;{d=f=d&if(f==x=d&0x3FFF;y=$0xFF18;$0xFF00=x+$0xFF08=x+}elseif(f0x4000){x=d0x3FFF;yr=x-ifif(r>=0$0xFF00=}$0xFF00=-}}else(f==0x8000){=d&0x3FFF;=r=x*$0xFF00=$0xFF20=r%}x=d&0x3FFF;y=$0xFF18;r=x/$0xFF40=$0xFF00=}}} 、系统调用综合测主要功能是设置和开启定时器和后,会驱

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论