CPU课程设计报告.docx

上传人:b****9 文档编号:26205886 上传时间:2023-06-17 格式:DOCX 页数:30 大小:250.84KB
下载 相关 举报
CPU课程设计报告.docx_第1页
第1页 / 共30页
CPU课程设计报告.docx_第2页
第2页 / 共30页
CPU课程设计报告.docx_第3页
第3页 / 共30页
CPU课程设计报告.docx_第4页
第4页 / 共30页
CPU课程设计报告.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

CPU课程设计报告.docx

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

CPU课程设计报告.docx

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;

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

当前位置:首页 > 总结汇报 > 其它

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

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