当前位置:文档之家› CPU课程设计报告

CPU课程设计报告

课程设计报告课程片上计算机系统题目 CPU模型机设计班级专业学生学号指导教师2014年7 月 3 日目录:1.课程设计的目的及要求 (3)2.处理器的设计思想和设计内容 (3)3.设计处理器的结构和实现方法 (3)4.模型机的指令系统 (4)5.处理器的状态跳转操作过程 (4)6. CPU的Verilog代码 (7)7. 模型机在Quartus II环境下的应用 (19)8. 仿真波形 (19)9. 课程设计的总结 (21)一.课程设计的目的及要求:(一)目的:1.掌握RISC CPU与内存数据交换的方法。

2.学会指令格式的设计与用汇编语言编写简易程序。

3.能够使用VHDL硬件描述语言在QuartusⅡ软件环境下完成CPU模型机的设计。

(二)要求:1.以《计算机组成与设计》书中123页的简化模型为基础更改其指令系统,形成设计者的CPU,2.在Quartus II环境下与主存连接,调试程序,观察指令的执行是否达到设计构想。

二.处理器的设计思想和设计内容:处理器的字长为16b;包括四种指令格式,格式1、格式2、格式3的指令字长度为8b,格式4的指令字长度为16b;处理器内部的状态机包括七个状态。

(一)关于修改后的CPU:一共设计25条指令,主要包括空操作指令、中断指令、加法指令、减法指令、加法指令、四种逻辑运算指令、比较、算术移位操作指令、逻辑移位操作指令、加减1指令、加减2指令、数据传输指令、转移类指令、读写指令、特权指令等等。

(二)关于RAM:地址线设置成8bits,主存空间为4096words。

三.设计处理器的结构和实现方法:(指令格式)格式1:寄存器寻址方式15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0OP Rx Ry 空白格式2:寄存器变址寻址方式OP Ry 空白格式3:立即数寻址方式15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0OP I 空白格式4:无操作数寻址方式15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0OP 空白空白格式5:直接寻址方式15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0OP Addr内存(2的12次方)四.模型机的指令系统CPU的指令集:操作码OP IR(15..1 2) 指令格式指令的助记指令的内容符0000 4 Idle 无操作 PC=PC+1 0001 3 Load Data R0←I 立即数操作PC=PC+1 0010 1 Move Rx Ry Rx ←(Ry) PC=PC+1 0011 1 Add Rx Ry Rx ←(Rx)+(Ry) PC=PC+1 0100 1 Sub Rx Ry Rx ←(Rx)-(Ry) PC=PC+1 0101 1 Mul Rx Ry Rx ←(Rx)*(Ry) PC=PC+10110 2 IR(11.10)00 AND Rx Ry01 OR Rx Ry10 XOR Rx Ry11 NOT RxRx ←(Rx) AND (Ry) PC=PC+1Rx ←(Rx) OR (Ry) PC=PC+1Rx←(Rx)XOR(Ry) PC=PC+1Rx←NOT (Rx) PC=PC+10111 1 COM Rx Ry Rx >Ry Rx< Ry Rx== Ry PC=PC+11000 2 IR(11.10)00 arr Rx Ry01 arl Rx Ry10 lgr Rx Ry11 lgl Rx Ry算术右移PC=PC+1算术左移PC=PC+1逻辑右移PC=PC+1逻辑左移PC=PC+11001 1 IR(11.10)00 Rx+101 Rx-110 Rx+211 Rx-2PC=PC+11010 1 Swap Rx Ry A←(Ry) Ry←(Rx) Rx←(A)PC=PC+11011 5 Jmp Addr PC←Addr PC=PC+11100 5 Jz Addr If (R0)=0 then PC←Addr else PC=PC+11101 5 Read Addr R0←(Addr) PC=PC+11110 5 Write Addr Addr←(R0) PC=PC+1 1111 4 Stop 无操作 PC保持不变五.处理器的状态跳转操作过程:模型机每一状态下的操作及状态跳转当前状态执行操作次态与读下一条指令的有关的操作St_0 取指令IR(15..0)←M_data_in(15..0)St_1Write-Read←’0’ PC=PC+1St_1 IF OP=Load THENR0←IR(11..8)||”000000000000”MAR←PCIF(OP=Stop)THEN St_1ELSESt_2END IFIF OP=Move THEN Rx ←(Ry) IF OP=sh THEN Rx ←(Rx)移位运算IF OP=Add THEN A←(Ry) IF OP=Sub THEN A←(Ry) IF OP=Mul THEN A←(Ry) IF OP=Log THEN A←(Ry) AND、OR、NOT、XORIF OP=Math THEN A←(Ry) +1 -1 +2 -2运算IF OP=Swap THEN A←(Ry) IF OP=Stop THEN NULLIF OP=Idle THEN NULLIF OP=Jmp THEN NULLIF OP=Jz THEN NULLIF OP=Read THEN NULLIF OP=Write THEN NULLSt_2 IF OP= Load OR OP=Move OR OP=shOR OP=IdleTHEN NULL St_0Write-Read←’0’IF OP= Add THEN Rx ←(Rx)+AIF OP= Sub THEN Rx ←(Rx)-AIF OP=AND THEN Rx ←(Rx)AND AIF OP= NOT THEN Rx ←(Rx)NOTAIF OP= XOR THEN Rx ←(Rx)XOR AIF OP= NOT THEN Rx ←not(Rx)IF OP= math THEN Rx ←(Rx)+-1.2IF OP= Swap THEN Ry←(Rx) St_3Write-Read←’0’IF OP= Jmp or Jz THENNULLIF OP=Read or Write THENMAR←IR(11..0)St_3 IF OP=Swap THEN Rx←(A) St_0Write-Read←’0’IF OP=Read or Write or Jmp or Jz THENIR(7..0)←M_data_in St_4MAR←PCWrite-Read←’0’St_4 IF OP=(Read)THENMAR←IR(11..0)St_5Write-Read←’0’IF OP=(Write) THENMAR←IR(11..0)MDR←(R0)IF OP=(Jmp) THENPC←IR(11..0) MAR←IR(11..0)IF OP= (Jz) IF (R0)= 0 THENPC←IR(11..0) MAR←IR(11..0)ELSE MAR←(PC)IF OP=(Jmp) THENPC←IR(11..0) MAR←IR(11..0)IF OP= (Jz) IF (R0)= 0 THENPC←IR(11..0) MAR←IR(11..0)ELSE MAR←(PC)St_5 IF OP=(Jmp)or OP= (Jz)St_0 MAR←(PC)Write-Read←’0’IF OP=(Read)St_6 MAR←(PC)Write-Read←’0’IF OP=(Write)St_6 MAR←(PC)Write-Read←’1’St_6 IF OP=(Read)THEN R0←M_data_in St_0Write-Read←’0’六.六、CPU的Verilog HDL代码:module cpu(reset, clock, Write_Read, M_address, M_data_in, M_data_out, overflow); input reset;input clock;output Write_Read;output [11:0] M_address;input [7:0] M_data_in;output [7:0] M_data_out;output overflow;reg overflow;reg [15:0] IR;reg [7:0] MDR;reg [11:0] MAR;reg [2:0] status;parameteridle =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 @(negedge reset or posedge clock ) begin: status_changeif (reset == 1'b0)status <= 0;elsecase (status)0 :status <= 1;1 :if (IR[15:12] == stop)status <= 1;elsestatus <= 2;2 :case (IR[15:12])swap, jmp, jz, read, write : status <= 3;default :status <= 0;endcase3 :if (IR[15:12] == swap)status <= 0;elsestatus <= 4;4 :status <= 5;5 :case (IR[15:12])read :status <= 6;default :status <= 0;endcasedefault :status <= 0;endcase//endalways @(negedge reset or negedge clock) begin: seqreg [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)beginIR <= {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}};endelsebeginoverflow <= 1'b0;case (status)0 :beginIR <= {M_data_in, 8'b00000000}; PC = PC + 1'b1;end1 :beginif (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 :;endcasesh :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]}; endcase2'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]}; endcase2'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]}; endcasedefault :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};endcaseendcaseaddp, 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;endcasedefault :;endcaseend2 :case (IR[15:12])addp :case (IR[11:10])2'b00 :begintemp = ({R0[7], R0[7:0]}) + ({A[7], A[7:0]}); R0 = temp[7:0];overflow <= temp[8] ^ temp[7];end2'b01 :begintemp = ({R1[7], R1[7:0]}) + ({A[7], A[7:0]}); R1 = temp[7:0];overflow <= temp[8] ^ temp[7];end2'b10 :begintemp = ({R2[7], R2[7:0]}) + ({A[7], A[7:0]}); R2 = temp[7:0];overflow <= temp[8] ^ temp[7];enddefault :begintemp = ({R3[7], R3[7:0]}) + ({A[7], A[7:0]});R3 = temp[7:0];overflow <= temp[8] ^ temp[7];endendcasesubp :case (IR[11:10])2'b00 :begintemp = ({R0[7], R0[7:0]}) + (~({A[7], A[7:0]})) + 1'b1;R0 = temp[7:0];overflow <= temp[8] ^ temp[7];end2'b01 :begintemp = ({R1[7], R1[7:0]}) + (~({A[7], A[7:0]})) + 1'b1;R1 = temp[7:0];overflow <= temp[8] ^ temp[7];end2'b10 :begintemp = ({R2[7], R2[7:0]}) + (~({A[7], A[7:0]})) + 1'b1;R2 = temp[7:0];overflow <= temp[8] ^ temp[7];enddefault :begintemp = ({R3[7], R3[7:0]}) + (~({A[7], A[7:0]})) + 1'b1;R3 = temp[7:0];overflow <= temp[8] ^ temp[7];endendcasemeth1 :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; endcase2'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; endcase2'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; endcasedefault :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; endcaseendcasemulp :case (IR[11:10])2'b00 :begintemp2 = R0 * A; R0 = temp2[7:0]; R1 = temp2[15:8]; end2'b01 :begintemp2 = R1 * A; R0 = temp2[7:0]; R1 = temp2[15:8]; end2'b10 :begintemp2 = R2 * A; R2 = temp2[7:0]; R3 = temp2[15:8]; enddefault :begintemp2 = R3 * A; R2 = temp2[7:0]; R3 = temp2[15:8]; endendcaselogp :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; endcase2'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; endcase2'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; endcasedefault :case (IR[9:8])2'b00 :R0 = (~A);2'b01 :R0 = (~A);2'b10 :R1 = (~R0);2'b11 :R1 = (~R1);endcaseendcasecomp :case (IR[11:10])2'b00 :if (R0 > A)R0 = 8'b00000001; else if (R0 < A)R0 = 8'b10000001; elseR0 = 8'b00000000; 2'b01 :if (R1 > A)R1 = 8'b00000001; else if (R1 < A)R1 = 8'b10000001; elseR1 = 8'b00000000; 2'b10 :if (R2 > A)R2 = 8'b00000001; else if (R2 < A)R2 = 8'b10000001; elseR2 = 8'b00000000; 2'b11 :if (R3 > A)R3 = 8'b00000001; else if (R3 < A)R3 = 8'b10000001; elseR3 = 8'b00000000; endcaseswap :case (IR[11:8])4'b0100 :R0 = R1;4'b1000 :R0 = R2;4'b1100 :R0 = R3;4'b0001 :R1 = R0;4'b1001 :R1 = R2;4'b1101 :R1 = R3;4'b0010 :R2 = R0;4'b0110 :R2 = R1;4'b1110 :R2 = R3;4'b0111 :R3 = R1;4'b1011 :R3 = R2;4'b0011 :R3 = R0;default :;endcasedefault :;endcase3 :case (IR[15:12])swap :case (IR[11:10])2'b00 :R0 = A;2'b01 :R1 = A;2'b10 :R2 = A;default :R3 = A;endcasejmp, jz, read, write :beginIR[7:0] <= M_data_in; PC = PC + 1'b1;enddefault :;endcase4 :case (IR[15:12])jmp :beginPC = IR[11:0];MAR <= IR[11:0];endjz :if (R0 == 8'b00000000) beginPC = IR[11:0];MAR <= IR[11:0];endelseMAR <= PC;read :MAR <= IR[11:0];write :beginMAR <= IR[11:0];MDR <= R0;enddefault :;endcase5 :MAR <= PC;6 :case (IR[15:12])read :R0 = M_data_in;default :;endcaseendcaseendendassign M_address = MAR;assign M_data_out = MDR;assign Write_Read = (reset == 1'b1 & status == 5 & IR[15:12] == write) ? 1'b1 : 1'b0;endmodule七、模型机在Quartus II环境下的应用:步骤:4.建立工程:工程名cpu5.编写cpu的Verilog HDL代码,将其添加到工程6.生成cpu的符号图7.建立内存数据的mif文件8.生成16bits的ram9.建立computer的block进行编译10.对computer进行功能模拟11.分析仿真波形七.仿真波形:1)cpu的编译报告2)mif文件3)computer(由cpu和ram组成)的连接图:4)功能模拟的波段(有的是实验室的9.0). .。

相关主题