课程设计cpu.docx
《课程设计cpu.docx》由会员分享,可在线阅读,更多相关《课程设计cpu.docx(23页珍藏版)》请在冰豆网上搜索。
课程设计cpu
哈尔滨理工大学
软件学院
课程设计报告
课程片上计算机系统
题目CPU模型机设计
班级集成14-2班
专业集成电路设计与集成系统
学生宋鸿飞
学号**********
指导教师崔林海
2016年07月8日
索引:
1.课程设计的目的及要求………………………………………3
2.处理器的设计思想和设计内容………………………………3
3.设计处理器的结构和实现方法………………………………3
4.模型机的指令系统……………………………………………4
5.处理器的状态跳转操作过程…………………………………4
6.CPU的Verilog代码……………………………………………7
7.模型机在QuartusII环境下的应用…………………………16
8.仿真波形………………………………………………………16
9.课程设计的总结………………………………………………18
一.课程设计的目:
目的:
了解QuartusII软件的应用,学习QuartusII环境下设计CPU的基本过程;掌握CPU设计代码的含义以及CPU的工作原理;了解CPU与内存RAM间的连接数据的传输过程;学习在QuartusII环境下建立模型机的具体过程。
融会贯通本课程各章节的内容,通过知识的综合运用,加深对计算机系统各模块的工作原理及相互联系的认识。
学习设计和调试计算机的基本步骤和方法,提高使用软件仿真工具和集成电路的基本技能。
培养科学研究的独立工作能力,取得工程设计与组装调试的实践和经验。
二.处理器的设计思想和设计内容:
我设计的是16位cpu,5位的操作码,18条指令,其中包含了4种寻址方式。
内存容量为2k。
这个CPU是参考学姐的程序,在学姐的程序的基础上增加了一些指令得到的。
三.设计处理器的结构和实现方法:
(指令格式)
格式1:
寄存器寻址方式
1514131211109876543210
OP
Rx
Ry
空白
格式2:
立即数寻址方式
1514131211109876543210
OP
I
空白
格式3:
无操作数寻址方式
1514131211109876543210
OP
空白
空白
格式4:
直接寻址方式
1514131211109876543210
OP
Addr
内存(2的11次方)
四.模型机的指令系统
CPU的指令集:
操作码OP
IR(15..12)
指令
格式
指令的助记符
指令的内容
00000
3
Idle
无操作PC=PC+1
00001
2
LoadData
R0I立即数操作
00010
1
MoveRxRy
Rx(Ry)PC=PC+1
00011
1
AddRxRy
Rx(Rx)+(Ry)PC=PC+1
00100
1
SubRxRy
Rx(Rx)-(Ry)PC=PC+1
00101
1
ANDRxRy
Rx(Rx)AND(Ry)PC=PC+1
00110
1
ORRxRy
Rx(Rx)OR(Ry)PC=PC+1
00111
1
XORRxRy
Rx(Rx)XOR(Ry)PC=PC+1
01000
1
NANDRxRy
Rx(Rx)NAND(Ry)PC=PC+1
01001
1
NOTRx
RxNOT(Rx)PC=PC+1
01010
1
SHRRxRy
逻辑循环右移PC=PC+1
01011
1
SHLRxRy
逻辑循环左移PC=PC+1
01100
1
SWAPRxRy
A(Ry)Ry(Rx)Rx(A)PC=PC+1
01101
4
JMPAddr
PCAddrPC=PC+1
01110
4
JZAddr
If(R0)=0thenPCAddr
elsePC=PC+1
01111
4
READ
R0(Addr)PC=PC+1
10000
4
WRITE
Addr(R0)PC=PC+1
10001
3
STOP
无操作PC保持不变
五.处理器的状态跳转操作过程:
(一)、模型机每一状态下的操作及状态跳转
当前状态
执行操作
次态与读下一条指令的有关的操作
St_0
取指令
IR(15..0)M_data_in(15..0)
St_1
Write-Read’0’PC=PC+1
St_1
IFOP=LoadTHEN
R0”000000000000”||IR(10..7)
MARPC
IF(OP=Stop)THEN
St_1
ELSESt_2
ENDIF
IFOP=MoveTHENRx(Ry)
IFOP=ShrTHENRx(Ry)
逻辑循环右移
IFOP=ShlTHENRx(Ry)
逻辑循环左移
IFOP=AddTHENA(Ry)
IFOP=SubTHENA(Ry)
IFOP=NANDTHENA(Ry)
IFOP=ORTHENA(Ry)
IFOP=ANDTHENA(Ry)
IFOP=NOTTHENA(Ry)
IFOP=XORTHENA(Ry)
IFOP=SwapTHENA(Ry)
IFOP=StopTHENNULL
IFOP=IdleTHENNULL
IFOP=JmpTHENNULL
IFOP=JzTHENNULL
IFOP=ReadTHENNULL
IFOP=WriteTHENNULL
St_2
IFOP=LoadOROP=MoveOROP=ShrOROP=ShlOROP=Idle
THENNULL
St_0
Write-Read’0’
IFOP=AddTHENRx(Rx)+A
IFOP=SubTHENRx(Rx)-A
IFOP=ANDTHENRx(Rx)ANDA
IFOP=NOTTHENRx(Rx)NOTA
IFOP=NANDTHENRx(Rx)NANDA
IFOP=ORTHENRx(Rx)ORA
IFOP=XORTHENRx(Rx)XORA
IFOP=SwapTHENRy(Rx)
St_3
Write-Read’0’
IF(OP=JmpOROP=Jz)THEN
NULL
IF(OP=ReadOROP=Write)THENNULL
St_3
IFOP=SwapTHENRy(Rx)
St_0
Write-Read’0’
IFOPE=ReadOROPE=WriteOROPE=JumpOROPE=Jz)THENIRData_in
St_4
PC:
=PC+1;
Write-Read’0’
St_4
IFOP=JzTHEN
IF(R0)=0THEN
(PCIR(10..0)MARIR(10..0))
ELSEMARPC
St_5
Write-Read’0’
IFOP=JmpTHEN
(PCIR(10..0)MARIR(10..0))
IFOP=ReadTHENMARIR(10..0)
IFOP=WriteTHEN
MARIR(10..0)MDAR0
St_5
IF(OPE=Jump)OR(OPE=Jz)
St_0;MARPC;
Write-Read’0’
IF(OPE=Read)
St_6;MARPC;
Write-Read’0’
St_6;MARPC;
Write-Read’0’
St_6
IFOP=Read
THENR0=M_data_in;
St_0
Write-Read’1’
6.CPU的代码
modulecpu(reset,clock,Write_Read,M_address,M_data_in,M_data_out,overflow);
inputreset;
inputclock;
outputWrite_Read;
output[10:
0]M_address;
input[15:
0]M_data_in;
output[15:
0]M_data_out;
outputoverflow;
regoverflow;
reg[15:
0]IR;
reg[15:
0]MDR;
reg[10:
0]MAR;
reg[2:
0]status;
parameter[4:
0]Idle=5'd0,
load=5'd1,
move=5'd2,
addp=5'd3,
subp=5'd4,
andp=5'd5,
orp=5'd6,
xorp=5'd7,
nandp=5'd8,
notp=5'd9,
shrp=5'd10,
shlp=5'd11,
swap=5'd12,
jmp=5'd13,
jz=5'd14,
read=5'd15,
write=5'd16,
stop=5'd17;
always@(negedgeresetornegedgeclock)
begin:
status_change
if(reset==1'b0)
status<=0;
else
case(status)
0:
status<=1;
1:
if(IR[15:
11]==stop)
status<=1;
else
status<=2;
2:
case(IR[15:
11])
swap,jmp,jz,read,write,nandp,notp:
status<=3;
default:
status<=0;
endcase
3:
if(IR[15:
11]==swap)
status<=0;
else
status<=4;
4:
status<=5;
5:
case(IR[15:
11])
read,write:
status<=6;
default:
status<=0;
endcase
6:
status<=0;
default:
status<=0;
endcase
end
always@(negedgeresetornegedgeclock)
begin:
seq
reg[10:
0]PC;
reg[15:
0]R0;
reg[15:
0]R1;
reg[15:
0]R2;
reg[15:
0]R3;
reg[15:
0]A;
reg[16:
0]temp;
if(reset==1'b0)
begin
IR<={16{1'b0}};
PC={11{1'b0}};
R0={16{1'b0}};
R1={16{1'b0}};
R2={16{1'b0}};
R3={16{1'b0}};
A={16{1'b0}};
MAR<={11{1'b0}};
MDR<={16{1'b0}};
end
else
begin
overflow<=1'b0;
case(status)
0:
begin
IR<=M_data_in;
PC=PC+1'b1;
end
1:
begin
MAR<=PC;
case(IR[15:
11])
load:
R0={{12{1'b0}},IR[10:
7]};
move:
case(IR[10:
7])
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
shrp:
case(IR[10:
9])
2'b00:
R0={1'b0,R0[15:
1]};
2'b01:
R1={1'b0,R1[15:
1]};
2'b10:
R2={1'b0,R2[15:
1]};
default:
R3={1'b0,R3[15:
1]};
endcase
shlp:
case(IR[10:
9])
2'b00:
R0={R0[14:
0],1'b0};
2'b01:
R1={R1[14:
0],1'b0};
2'b10:
R2={R2[14:
0],1'b0};
default:
R3={R3[14:
0],1'b0};
endcase
addp,subp,andp,orp,nandp,notp,xorp,swap:
case(IR[8:
7])
2'b00:
A=R0;
2'b01:
A=R1;
2'b10:
A=R2;
default:
A=R3;
endcase
default:
;
endcase
end
2:
case(IR[15:
11])
addp:
case(IR[10:
9])
2'b00:
begin
temp=({R0[15],R0[15:
0]})+({A[15],A[15:
0]});
R0=temp[15:
0];
overflow<=temp[16]^temp[15];
end
2'b01:
begin
temp=({R1[15],R1[15:
0]})+({A[15],A[15:
0]});
R1=temp[15:
0];
overflow<=temp[16]^temp[15];
end
2'b10:
begin
temp=({R2[15],R2[15:
0]})+({A[15],A[15:
0]});
R2=temp[15:
0];
overflow<=temp[16]^temp[15];
end
default:
begin
temp=({R3[15],R3[15:
0]})+({A[15],A[15:
0]});
R3=temp[15:
0];
overflow<=temp[16]^temp[15];
end
endcase
subp:
case(IR[10:
9])
2'b00:
begin
temp=({R0[15],R0[15:
0]})+(~({A[15],A[15:
0]}))+1'b1;
R0=temp[15:
0];
overflow<=temp[16]^temp[15];
end
2'b01:
begin
temp=({R1[7],R1[15:
0]})+(~({A[15],A[15:
0]}))+1'b1;
R1=temp[15:
0];
overflow<=temp[16]^temp[15];
end
2'b10:
begin
temp=({R2[15],R2[15:
0]})+(~({A[15],A[15:
0]}))+1'b1;
R2=temp[15:
0];
overflow<=temp[16]^temp[15];
end
default:
begin
temp=({R3[15],R3[15:
0]})+(~({A[15],A[15:
0]}))+1'b1;
R3=temp[15:
0];
overflow<=temp[16]^temp[15];
end
endcase
andp:
case(IR[10:
9])
2'b00:
R0=R0&A;
2'b01:
R1=R1&A;
2'b10:
R2=R2&A;
default:
R3=R3&A;
endcase
orp:
case(IR[10:
9])
2'b00:
R0=R0|A;
2'b01:
R1=R1|A;
2'b10:
R2=R2|A;
default:
R3=R3|A;
endcase
xorp:
case(IR[10:
9])
2'b00:
R0=R0^A;
2'b01:
R1=R1^A;
2'b10:
R2=R2^A;
default:
R3=R3^A;
endcase
nandp:
case(IR[10:
9])
2'b00:
R0=~(R0&A);
2'b01:
R1=~(R1&A);
2'b10:
R2=~(R2&A);
2'b11:
R3=~(R3&A);
endcase
notp:
case(IR[10:
9])
2'b00:
R0=~A;
2'b01:
R1=~A;
2'b10:
R2=~A;
2'b11:
R3=~A;
endcase
swap:
case(IR[10:
7])
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:
;
endcase
default:
;
endcase
3:
case(IR[15:
11])
swap:
case(IR[10:
9])
2'b00:
R0=A;
2'b01:
R1=A;
2'b10:
R2=A;
default:
R3=A;
endcase
default:
;
endcase
4:
case(IR[15:
11])
jmp:
begin
PC=IR[10:
0];
MAR<=IR[10:
0];
end
jz:
if(R0==16'b0000000000000000)
begin
PC=IR[10:
0];
MAR<=IR[10:
0];
end
else
MAR<=PC;
read:
MAR<=IR[10:
0];
write:
begin
MAR<=IR[10:
0];
MDR<=R0;
end
default:
;
endcase
5:
MAR<=PC;
6:
case(IR[15:
11])
read:
R0=M_data_in;
default:
;
endcase
endcase
end
end
assignM_address=MAR;
assignM_data_out=MDR;
assignWrite_Read=(reset==1'b1&status==5&IR[15:
11]==write)?
1'b1:
1'b0;
endmodule
七模型机在QuartusII环境下的应用:
步骤:
1.建立工程:
工程名cpu。
2.编写cpu的verilog代码,将其添加到工程,仿真保存。
3.再建立computer文件,链接虚拟电路。
4.建立内存数据的mif2文件。
5.建立computer的Block1进行编译。
6.对computer进行功能模拟。
7.调出并分析仿真波形。
八仿真波形:
九课程设计的总结:
因为这次课程设计时间和期末考试有一些冲突,所以要分出一些精力复习其他科目,以至于最后不得不在学姐的程序基础上进行修改才得以完成本次课设。
总体来说对自己不是很满意吧,考试要复习虽然是原因但不能作为借口,因为有些同学还是凭借自己的能力完成了课设,可以说要成为一个合格的IC从业者我还有很长的路要走。
但是这次课设也不是完全的没有意义,虽然结果不尽人意,但是从中也学到了很多东西,看到了自己的不足,在今后的学习中我会努力完善自己,争取下次更好!