CPU课程设计报告.docx
- 文档编号:13632670
- 上传时间:2023-06-15
- 格式:DOCX
- 页数:30
- 大小:250.84KB
CPU课程设计报告.docx
《CPU课程设计报告.docx》由会员分享,可在线阅读,更多相关《CPU课程设计报告.docx(30页珍藏版)》请在冰点文库上搜索。
CPU课程设计报告
课程设计报告
课程片上计算机系统
题目CPU模型机设计
班级
专业
学生
学号
指导教师
2014年7月3日
目录:
1.课程设计的目的及要求………………………………………3
2.处理器的设计思想和设计内容………………………………3
3.设计处理器的结构和实现方法………………………………3
4.模型机的指令系统……………………………………………4
5.处理器的状态跳转操作过程…………………………………4
6.CPU的Verilog代码……………………………………………7
7.模型机在QuartusII环境下的应用…………………………19
8.仿真波形………………………………………………………19
9.课程设计的总结………………………………………………21
一.课程设计的目的及要求:
(一)目的:
1.掌握RISCCPU与内存数据交换的方法。
2.学会指令格式的设计与用汇编语言编写简易程序。
3.能够使用VHDL硬件描述语言在QuartusⅡ软件环境下完成CPU模型机的设计。
(二)要求:
1.以《计算机组成与设计》书中123页的简化模型为基础更改其指令系统,形成设计者的CPU,
2.在QuartusII环境下与主存连接,调试程序,观察指令的执行是否达到设计构想。
二.处理器的设计思想和设计内容:
处理器的字长为16b;包括四种指令格式,格式1、格式2、格式3的指令字长度为8b,格式4的指令字长度为16b;处理器内部的状态机包括七个状态。
(一)关于修改后的CPU:
一共设计25条指令,主要包括空操作指令、中断指令、加法指令、减法指令、加法指令、四种逻辑运算指令、比较、算术移位操作指令、逻辑移位操作指令、加减1指令、加减2指令、数据传输指令、转移类指令、读写指令、特权指令等等。
(二)关于RAM:
地址线设置成8bits,主存空间为4096words。
三.设计处理器的结构和实现方法:
(指令格式)
格式1:
寄存器寻址方式
1514131211109876543210
OP
Rx
Ry
空白
格式2:
寄存器变址寻址方式
OP
Ry
空白
格式3:
立即数寻址方式
1514131211109876543210
OP
I
空白
格式4:
无操作数寻址方式
1514131211109876543210
OP
空白
空白
格式5:
直接寻址方式
1514131211109876543210
OP
Addr
内存(2的12次方)
四.模型机的指令系统
CPU的指令集:
操作码OP
IR(15..12)
指令
格式
指令的助记符
指令的内容
0000
4
Idle
无操作PC=PC+1
0001
3
LoadData
R0I立即数操作PC=PC+1
0010
1
MoveRxRy
Rx(Ry)PC=PC+1
0011
1
AddRxRy
Rx(Rx)+(Ry)PC=PC+1
0100
1
SubRxRy
Rx(Rx)-(Ry)PC=PC+1
0101
1
MulRxRy
Rx(Rx)*(Ry)PC=PC+1
0110
2
IR(11.10)
00ANDRxRy
01ORRxRy
10XORRxRy
11NOTRx
Rx(Rx)AND(Ry)PC=PC+1
Rx(Rx)OR(Ry)PC=PC+1
Rx(Rx)XOR(Ry)PC=PC+1RxNOT(Rx)PC=PC+1
0111
1
COMRxRy
Rx>RyRx 1000 2 IR(11.10) 00arrRxRy 01arlRxRy 10lgrRxRy 11lglRxRy 算术右移PC=PC+1 算术左移PC=PC+1 逻辑右移PC=PC+1 逻辑左移PC=PC+1 1001 1 IR(11.10) 00Rx+1 01Rx-1 10Rx+2 11Rx-2 PC=PC+1 1010 1 SwapRxRy A(Ry)Ry(Rx)Rx(A)PC=PC+1 1011 5 JmpAddr PCAddrPC=PC+1 1100 5 JzAddr If(R0)=0thenPCAddr elsePC=PC+1 1101 5 ReadAddr R0(Addr)PC=PC+1 1110 5 WriteAddr Addr(R0)PC=PC+1 1111 4 Stop 无操作PC保持不变 五.处理器的状态跳转操作过程: 模型机每一状态下的操作及状态跳转 当前状态 执行操作 次态与读下一条指令的有关的操作 St_0 取指令 IR(15..0)M_data_in(15..0) St_1 Write-Read’0’PC=PC+1 St_1 IFOP=LoadTHEN R0IR(11..8)||”000000000000” MARPC IF(OP=Stop)THEN St_1 ELSE St_2 ENDIF IFOP=MoveTHENRx(Ry) IFOP=shTHENRx(Rx) 移位运算 IFOP=AddTHENA(Ry) IFOP=SubTHENA(Ry) IFOP=MulTHENA(Ry) IFOP=LogTHENA(Ry) AND、OR、NOT、XOR IFOP=MathTHENA(Ry) +1-1+2-2运算 IFOP=SwapTHENA(Ry) IFOP=StopTHENNULL IFOP=IdleTHENNULL IFOP=JmpTHENNULL IFOP=JzTHENNULL IFOP=ReadTHENNULL IFOP=WriteTHENNULL St_2 IFOP=LoadOROP=MoveOROP=shOROP=Idle THENNULL St_0 Write-Read’0’ IFOP=AddTHENRx(Rx)+A IFOP=SubTHENRx(Rx)-A IFOP=ANDTHENRx(Rx)ANDA IFOP=NOTTHENRx(Rx)NOTA IFOP=XORTHENRx(Rx)XORA IFOP=NOTTHENRxnot(Rx) IFOP=mathTHENRx(Rx)+-1.2 IFOP=SwapTHENRy(Rx) St_3 Write-Read’0’ IFOP=JmporJzTHEN NULL IFOP=ReadorWriteTHENMARIR(11..0) St_3 IFOP=SwapTHENRx(A) St_0 Write-Read’0’ IFOP=ReadorWriteorJmporJzTHEN IR(7..0)M_data_in St_4 MARPC Write-Read’0’ St_4 IFOP=(Read)THENMARIR(11..0) St_5 Write-Read’0’ IFOP=(Write)THENMARIR(11..0) MDR(R0) IFOP=(Jmp)THENPCIR(11..0)MARIR(11..0) IFOP=(Jz)IF(R0)=0THENPCIR(11..0)MARIR(11..0) ELSEMAR(PC) IFOP=(Jmp)THENPCIR(11..0)MARIR(11..0) IFOP=(Jz)IF(R0)=0THENPCIR(11..0)MARIR(11..0) ELSEMAR(PC) St_5 IFOP=(Jmp)orOP=(Jz) St_0MAR(PC) Write-Read’0’ IFOP=(Read) St_6MAR(PC) Write-Read’0’ IFOP=(Write) St_6MAR(PC) Write-Read’1’ St_6 IFOP=(Read)THENR0M_data_in St_0 Write-Read’0’ 六. 六、 CPU的VerilogHDL代码: modulecpu(reset,clock,Write_Read,M_address,M_data_in,M_data_out,overflow); inputreset; inputclock; outputWrite_Read; output[11: 0]M_address; input[7: 0]M_data_in; output[7: 0]M_data_out; outputoverflow; regoverflow; reg[15: 0]IR; reg[7: 0]MDR; reg[11: 0]MAR; reg[2: 0]status; parameter idle=4'b0000, load=4'b0001, move=4'b0010, addp=4'b0011, subp=4'b0100, mulp=4'b0101, logp=4'b0110, comp=4'b0111, sh=4'b1000, meth1=4'b1001, swap=4'b1010, jmp=4'b1011, jz=4'b1100, read=4'b1101, write=4'b1110, stop=4'b1111; always@(negedgeresetorposedgeclock) begin: status_change if(reset==1'b0) status<=0; else case(status) 0: status<=1; 1: if(IR[15: 12]==stop) status<=1; else status<=2; 2: case(IR[15: 12]) swap,jmp,jz,read,write: status<=3; default: status<=0; endcase 3: if(IR[15: 12]==swap) status<=0; else status<=4; 4: status<=5; 5: case(IR[15: 12]) read: status<=6; default: status<=0; endcase default: status<=0; endcase // end always@(negedgeresetornegedgeclock) begin: seq reg[11: 0]PC; reg[7: 0]R0; reg[7: 0]R1; reg[7: 0]R2; reg[7: 0]R3; reg[7: 0]A; reg[8: 0]temp; reg[15: 0]temp2; if(reset==1'b0) begin IR<={16{1'b0}}; PC={12{1'b0}}; R0={8{1'b0}}; R1={8{1'b0}}; R2={8{1'b0}}; R3={8{1'b0}}; A={8{1'b0}}; MAR<={12{1'b0}}; MDR<={8{1'b0}}; end else begin overflow<=1'b0; case(status) 0: begin IR<={M_data_in,8'b00000000}; PC=PC+1'b1; end 1: begin if(IR[15: 12]! =stop) MAR<=PC; case(IR[15: 12]) load: R0={4'b0000,IR[11: 8]}; move: case(IR[11: 8]) 4'b0001: R0=R1; 4'b0010: R0=R2; 4'b0011: R0=R3; 4'b0100: R1=R0; 4'b0110: R1=R2; 4'b0111: R1=R3; 4'b1000: R2=R0; 4'b1001: R2=R1; 4'b1011: R2=R3; 4'b1100: R3=R0; 4'b1101: R3=R1; 4'b1110: R3=R2; default: ; endcase sh: case(IR[11: 10]) 2'b00: case(IR[9: 8]) 2'b00: R0={R0[7],R0[7: 1]}; 2'b01: R1={R1[7],R1[7: 1]}; 2'b10: R2={R2[7],R2[7: 1]}; default: R3={R3[7],R3[7: 1]}; endcase 2'b01: case(IR[9: 8]) 2'b00: R0={R0[6: 0],R0[0]}; 2'b01: R1={R0[6: 0],R1[0]}; 2'b10: R2={R0[6: 0],R2[0]}; default: R3={R0[6: 0],R3[0]}; endcase 2'b10: case(IR[9: 8]) 2'b00: R0={1'b0,R0[7: 1]}; 2'b01: R1={1'b0,R1[7: 1]}; 2'b10: R2={1'b0,R2[7: 1]}; default: R3={1'b0,R3[7: 1]}; endcase default: case(IR[9: 8]) 2'b00: R0={R0[6: 0],1'b0}; 2'b01: R1={R1[6: 0],1'b0}; 2'b10: R2={R2[6: 0],1'b0}; default: R3={R3[6: 0],1'b0}; endcase endcase addp,subp,meth1,mulp,logp,comp,swap: case(IR[9: 8]) 2'b00: A=R0; 2'b01: A=R1; 2'b10: A=R2; default: A=R3; endcase default: ; endcase end 2: case(IR[15: 12]) addp: case(IR[11: 10]) 2'b00: begin temp=({R0[7],R0[7: 0]})+({A[7],A[7: 0]}); R0=temp[7: 0]; overflow<=temp[8]^temp[7]; end 2'b01: begin temp=({R1[7],R1[7: 0]})+({A[7],A[7: 0]}); R1=temp[7: 0]; overflow<=temp[8]^temp[7]; end 2'b10: begin temp=({R2[7],R2[7: 0]})+({A[7],A[7: 0]}); R2=temp[7: 0]; overflow<=temp[8]^temp[7]; end default: begin temp=({R3[7],R3[7: 0]})+({A[7],A[7: 0]}); R3=temp[7: 0]; overflow<=temp[8]^temp[7]; end endcase subp: case(IR[11: 10]) 2'b00: begin temp=({R0[7],R0[7: 0]})+(~({A[7],A[7: 0]}))+1'b1; R0=temp[7: 0]; overflow<=temp[8]^temp[7]; end 2'b01: begin temp=({R1[7],R1[7: 0]})+(~({A[7],A[7: 0]}))+1'b1; R1=temp[7: 0]; overflow<=temp[8]^temp[7]; end 2'b10: begin temp=({R2[7],R2[7: 0]})+(~({A[7],A[7: 0]}))+1'b1; R2=temp[7: 0]; overflow<=temp[8]^temp[7]; end default: begin temp=({R3[7],R3[7: 0]})+(~({A[7],A[7: 0]}))+1'b1; R3=temp[7: 0]; overflow<=temp[8]^temp[7]; end endcase meth1: case(IR[11: 10]) 2'b00: case(IR[9: 8]) 2'b00: R0=R0+1'b1; 2'b01: R1=R1+1'b1; 2'b10: R2=R2+1'b1; default: R3=R3+1'b1; endcase 2'b01: case(IR[9: 8]) 2'b00: R0=R0-1'b1; 2'b01: R1=R1-1'b1; 2'b10: R2=R2-1'b1; default: R3=R3-1'b1; endcase 2'b10: case(IR[9: 8]) 2'b00: R0=R0+2'b10; 2'b01: R1=R1+2'b10; 2'b10: R2=R2+2'b10; default: R3=R3+2'b10; endcase default: case(IR[9: 8]) 2'b00: R0=R0-2'b10; 2'b01: R1=R1-2'b10; 2'b10: R2=R2-2'b10; default: R3=R3-2'b10; endcase endcase mulp: case(IR[11: 10]) 2'b00: begin temp2=R0*A; R0=temp2[7: 0]; R1=temp2[15: 8]; end 2'b01: begin temp2=R1*A; R0=temp2[7: 0]; R1=temp2[15: 8]; end 2'b10: begin temp2=R2*A; R2=temp2[7: 0]; R3=temp2[15: 8]; end default: begin temp2=R3*A; R2=temp2[7: 0]; R3=temp2[15: 8]; end endcase logp: case(IR[11: 10]) 2'b00: case(IR[9: 8]) 2'b00: R0=R0&A; 2'b01: R0=R0&A; 2'b10: R1=R1&R0; 2'b11: R1=R1&R1; endcase 2'b01: case(IR[9: 8]) 2'b00: R0=R0|A; 2'b01: R0=R0|A; 2'b10: R1=R1|R0; 2'b11: R1=R1|R1; endcase 2'b10: case(IR[9: 8]) 2'b00: R0=R0^A; 2'b01: R0=R0^A; 2'b10: R1=R1^R0; 2'b11: R1=R1^R1; endcase default: case(IR[9: 8]) 2'b00: R0=(~A); 2'b01: R0=(~A); 2'b10: R1=(~R0); 2'b11: R1=(~R1); endcase endcase comp: case(IR[11: 10]) 2'b00: if(R0>A) R0=8'b00000001; elseif(R0 R0=8'b10000001; else R0=8'b00000000; 2'b01: if(R1>A) R1=8'b00000001;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CPU 课程设计 报告