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>RyRx1000
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(R0R0=8'b10000001;
else
R0=8'b00000000;
2'b01:
if(R1>A)
R1=8'b00000001;