课程设计cpu.docx

上传人:b****5 文档编号:6754383 上传时间:2023-01-10 格式:DOCX 页数:23 大小:76.75KB
下载 相关 举报
课程设计cpu.docx_第1页
第1页 / 共23页
课程设计cpu.docx_第2页
第2页 / 共23页
课程设计cpu.docx_第3页
第3页 / 共23页
课程设计cpu.docx_第4页
第4页 / 共23页
课程设计cpu.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

课程设计cpu.docx

《课程设计cpu.docx》由会员分享,可在线阅读,更多相关《课程设计cpu.docx(23页珍藏版)》请在冰豆网上搜索。

课程设计cpu.docx

课程设计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从业者我还有很长的路要走。

但是这次课设也不是完全的没有意义,虽然结果不尽人意,但是从中也学到了很多东西,看到了自己的不足,在今后的学习中我会努力完善自己,争取下次更好!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1