CPU模型机设计课程设计报告.docx

上传人:b****1 文档编号:15160225 上传时间:2023-07-01 格式:DOCX 页数:27 大小:532.08KB
下载 相关 举报
CPU模型机设计课程设计报告.docx_第1页
第1页 / 共27页
CPU模型机设计课程设计报告.docx_第2页
第2页 / 共27页
CPU模型机设计课程设计报告.docx_第3页
第3页 / 共27页
CPU模型机设计课程设计报告.docx_第4页
第4页 / 共27页
CPU模型机设计课程设计报告.docx_第5页
第5页 / 共27页
CPU模型机设计课程设计报告.docx_第6页
第6页 / 共27页
CPU模型机设计课程设计报告.docx_第7页
第7页 / 共27页
CPU模型机设计课程设计报告.docx_第8页
第8页 / 共27页
CPU模型机设计课程设计报告.docx_第9页
第9页 / 共27页
CPU模型机设计课程设计报告.docx_第10页
第10页 / 共27页
CPU模型机设计课程设计报告.docx_第11页
第11页 / 共27页
CPU模型机设计课程设计报告.docx_第12页
第12页 / 共27页
CPU模型机设计课程设计报告.docx_第13页
第13页 / 共27页
CPU模型机设计课程设计报告.docx_第14页
第14页 / 共27页
CPU模型机设计课程设计报告.docx_第15页
第15页 / 共27页
CPU模型机设计课程设计报告.docx_第16页
第16页 / 共27页
CPU模型机设计课程设计报告.docx_第17页
第17页 / 共27页
CPU模型机设计课程设计报告.docx_第18页
第18页 / 共27页
CPU模型机设计课程设计报告.docx_第19页
第19页 / 共27页
CPU模型机设计课程设计报告.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

CPU模型机设计课程设计报告.docx

《CPU模型机设计课程设计报告.docx》由会员分享,可在线阅读,更多相关《CPU模型机设计课程设计报告.docx(27页珍藏版)》请在冰点文库上搜索。

CPU模型机设计课程设计报告.docx

CPU模型机设计课程设计报告

CPU模型机设计

CPU与存储器连接

课程设计报告

 

索引:

1.课程设计的目的及要求………………………………………3

2.处理器的设计思想和设计内容………………………………3

3.设计处理器的结构和实现方法………………………………3

4.模型机的指令系统……………………………………………4

5.处理器的状态跳转操作过程…………………………………4

6.CPU的VHDL代码……………………………………………7

7.模型机在QuartusII环境下的应用…………………………14

8.仿真波形………………………………………………………15

9.课程设计的总结………………………………………………17

一.课程设计的目的及要求:

1.目的:

了解QuartusII软件的应用,学习QuartusII环境下设计CPU的基本过程;掌握CPU设计代码的含义以及CPU的工作原理;了解CPU与内存RAM间的连接数据的传输过程;学习在QuartusII环境下建立模型机的具体过程。

融会贯通本课程各章节的内容,通过知识的综合运用,加深对计算机系统各模块的工作原理及相互联系的认识。

学习设计和调试计算机的基本步骤和方法,提高使用软件仿真工具和集成电路的基本技能。

培养科学研究的独立工作能力,取得工程设计与组装调试的实践和经验。

2.要求:

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

二.处理器的设计思想和设计内容:

处理器的字长为16b;包括四种指令格式,格式1、格式2、格式3的指令字长度为8b,格式4的指令字长度为16b;处理器内部的状态机包括6个五个状态。

关于CPU:

操作码4位,一共设计16条指令,主要包括空操作指令、中断指令、加法指令、减法指令、三种逻辑运算指令、循环移位操作指令,数据传输指令,转移类指令,特权指令等等。

关于RAM:

地址线设置成16bits,主存空间为64words。

书中原CPU的主要修改:

(1)模型机CPU指令集中的逻辑左移与逻辑右移改成逻辑循环右移与逻辑循环左移。

(2)模型机CPU指令集中的or改成not。

(3)模型机CPU指令的执行流程及状态跳转。

三.设计处理器的结构和实现方法:

(指令格式)

格式1:

寄存器寻址方式

1514131211109876543210

OP

Rx

Ry

空白

格式2:

立即数寻址方式

1514131211109876543210

OP

I

空白

格式3:

无操作数寻址方式

1514131211109876543210

OP

空白

空白

格式4:

直接寻址方式

1514131211109876543210

OP

Addr

四.模型机的指令系统

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

SHRLRx

逻辑右移PC=PC+1

00111

1

SHLLRx

逻辑左移PC=PC+1

01000

1

SHRCRx

循环右移PC=PC+1

01001

1

SHLCRx

循环左移PC=PC+1

01010

1

SwapRxRy

A(Ry)Ry(Rx)Rx(A)PC=PC+1

01011

4

JmpAddr

PCAddrPC=PC+1

01100

4

JzAddr

If(R0)=0thenPCAddr

elsePC=PC+1

01101

4

ReadAddr

R0(Addr)PC=PC+1

01110

4

WriteAddr

Addr(R0)PC=PC+1

01111

3

Stop

无操作PC保持不变

10000

1

XNORRxRy

Rxnot((Rx)OR(Ry))PC=PC+1

10001

1

ORRxRy

Rx(Rx)OR(Ry)PC=PC+1

10010

1

XORRxRy

Rx(Rx)XOR(Ry)PC=PC+1

10011

1

NOTRxRy

Rx(Rx)PC=PC+1

10100

1

NANDRxRy

Rxnot((Rx)AND(Ry))PC=PC+1

 

五.处理器的状态跳转操作过程:

(1)、模型机每一状态下的操作及状态跳转

当前状态

执行操作

次态与读下一条指令的有关的操作

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

ELSESt_2

ENDIF

IFOP=MoveTHENRx(Ry)

IFOP=shrcTHENRx(Rx)循环右移

IFOP=shrlTHENRx(Rx)循环左移

IFOP=shrcTHENRx(Rx)逻辑右移

IFOP=shlcTHENRx(Rx)逻辑左移

IFOP=AddTHENA(Ry)

IFOP=SUBTHENA(Ry)

IFOP=NOTTHENA(Rx)

IFOP=ANDTHENA(Ry)

IFOP=NANDTHENA(Ry)

IFOP=ORTHENA(Ry)

IFOP=XORTHENA(Ry)

IFOP=NXORTHENA(Ry)

IFOP=SwapTHENA(Ry)

IFOP=StopTHENNULL

IFOP=IdleTHENNULL

IFOP=JmpTHENNULL

IFOP=JzTHENNULL

IFOP=ReadTHENNULL

IFOP=WriteTHENNULL

St_2

IFOP=LoadOROP=MoveOROP=SHRLOROP=SHLLOROP=IdleOROP=SHRCOROP=SHLC

THENNULL

St_0

Write-Read’0’

IFOP=AddTHENRx(Rx)+A

IFOP=SubTHENRx(Rx)-A

IFOP=ANDTHENRx(Rx)ANDA

IFOP=NANDTHENRx(Rx)NANDA

IFOP=ORTHENRx(Rx)ORA

IFOP=NOTTHENRxNOTA

IFOP=XORTHENRx(Rx)XORA

IFOP=NXORTHENRx(Rx)NXORA

IFOP=SwapTHENRy(Rx)

St_3

Write-Read’0’

IFOP=JmpTHEN

(PCIR(1..0)MARIR(10..0))

IFOP=JzTHEN

IF(R0)=0THEN

(PCIR(1..0)MARIR(10..0))

ELSEMARPC

IFOP=ReadTHENMARIR(10..0)

IFOP=WriteTHEN

MARIR(11..0)MDAR0

St_3

IFOP=SwapTHENRx(A)

St_0

Write-Read’0’

IFOP=JmpNOTOP=Jz

St_0

MARPC

Write-Read’0’

IFOP=Write

St_4

MARPC

Write-Read’0’

IFOP=Read

St_4

MARPC

Write-Read’0’

St_4

IFOP=ReadTHEN

R0M_data_in

St_0

Write-Read’0’

(2)、简单指令执行状态描述

读内存指令:

(1)St_0:

取指令执行以下操作;

1)M_address(MAR)把指令地址送到地址总线

2)令Write-Read’0’向内存发出读命令(取指令)

3)IR(15..0)M_data_in(15..0)将读出的指令加载于IR(15..0)

4)PC=PC+1至此指令已经全部取出,存在于IR(15..0),为取下一条指令准备地址

(2)St_1:

NULL直接跳转到下一状态

(3)St_2:

MARIR(10..0)将数据地址加载于MAR

(4)St_3:

1)M_address(MAR)把数据地址送到地址总线

2)令Write-Read’0’向内存发出读命令(取数据)

3)MARPC把下一条指令地址加载于MAR

(5)St_4:

1)R0M_data_in将来自内存的数据加载于R0,本指令执行完毕

2)M_address(MAR)把下一条指令地址送到地址总线

3)令Write-Read’0’向内存发出读命令(取下一条指令)

4)下一状态跳转到St_0

无条件转移指令

(1)St_0:

取指令执行以下操作;

1)M_address(MAR)把指令地址送到地址总线

2)令Write-Read’0’向内存发出读命令(取指令)

3)IR(15..0)M_data_in(15..0)将读出的指令加载于IR(15..0)

4)PC=PC+1(此语句无用,因为程序计数器后续重新复制达到无条件转移目的)

(2)St_1:

NULL直接跳转到下一状态

(3)St_2:

1)MARIR(10..0)将转移目标地址加载于MAR

2)PCIR(10..0)将转移目标地址加载于PC

(4)St_3:

1)M_address(MAR)把下一条指令地址送到地址总线

2)令Write-Read’0’向内存发出读命令(取下一条指令)

3)下一状态跳转到St_0

六.CPU的VHDL代码:

libraryieee;

useIEEE.std_logic_arith.all;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

packagenamespackis

constantidle:

std_logic_vector(4downto0):

="00000";

constantload:

std_logic_vector(4downto0):

="00001";

constantmove:

std_logic_vector(4downto0):

="00010";

constantaddp:

std_logic_vector(4downto0):

="00011";

constantsubp:

std_logic_vector(4downto0):

="00100";

constantandp:

std_logic_vector(4downto0):

="00101";

constantshrl:

std_logic_vector(4downto0):

="00110";

constantshll:

std_logic_vector(4downto0):

="00111";

constantshrc:

std_logic_vector(4downto0):

="01000";

constantshlc:

std_logic_vector(4downto0):

="01001";

constantswap:

std_logic_vector(4downto0):

="01010";

constantjmp:

std_logic_vector(4downto0):

="01011";

constantjz:

std_logic_vector(4downto0):

="01100";

constantread:

std_logic_vector(4downto0):

="01101";

constantwrite:

std_logic_vector(4downto0):

="01110";

constantstop:

std_logic_vector(4downto0):

="01111";

constantxnorp:

std_logic_vector(4downto0):

="10000";

constantorp:

std_logic_vector(4downto0):

="10001";

constantxorp:

std_logic_vector(4downto0):

="10010";

constantnotp:

std_logic_vector(4downto0):

="10011";

constantnandp:

std_logic_vector(4downto0):

="10100";

endnamespack;

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

usework.namespack.all;

entitycpuis

port(

reset:

instd_logic;

clock:

instd_logic;

Write_Read:

outstd_logic;

M_address:

outstd_logic_vector(10downto0);

M_data_in:

instd_logic_vector(15downto0);

M_data_out:

outstd_logic_vector(15downto0);

overflow:

outstd_logic);

endcpu;

architectureRTLofcpuis

signalIR:

std_logic_vector(15downto0);

signalMDR:

std_logic_vector(15downto0);

signalMAR:

std_logic_vector(10downto0);

signalstate:

integerrange0to4;

begin

state_change:

process(reset,clock,state)

begin

ifreset='0'thenstate<=0;

elsifclock'eventandclock='0'then

casestateis

when0=>

state<=1;

when1=>

ifIR(15downto11)=Stopthen

state<=1;

else

state<=2;

endif;

when2=>

caseIR(15downto11)is

whenSwap|Jmp|Jz|Read|Write=>

state<=3;

whenothers=>

state<=0;

endcase;

when3=>

caseIR(15downto11)is

whenSwap|Jmp|Jz=>

state<=0;

whenothers=>

state<=4;

endcase;

whenothers=>

state<=0;

endcase;

else

NULL;

endif;

endprocessstate_change;

seq:

process(reset,clock)

variablePC:

std_logic_vector(10downto0);

variableR0,R1,R2,R3:

std_logic_vector(15downto0);

variableA:

std_logic_vector(15downto0);

variabletemp:

std_logic_vector(16downto0);

begin

if(reset='0')then

IR<=(others=>'0');

PC:

=(others=>'0');

R0:

=(others=>'0');

R1:

=(others=>'0');

R2:

=(others=>'0');

R3:

=(others=>'0');

A:

=(others=>'0');

MAR<=(others=>'0');

MDR<=(others=>'0');

elsif(clock'eventandclock='1')thenoverflow<='0';

casestateis

when0=>

IR<=M_data_in;

PC:

=PC+1;

when1=>

if(IR(15downto11)/=Stop)then

MAR<=PC;

endif;

caseIR(15downto11)is

whenLoad=>

R0:

="000000000000"&IR(10downto7);

whenMove=>--MoveRx,Ry;

caseIR(10downto7)is

when"0001"=>R0:

=R1;

when"0010"=>R0:

=R2;

when"0011"=>R0:

=R3;

when"0100"=>R1:

=R0;

when"0110"=>R1:

=R2;

when"0111"=>R1:

=R3;

when"1000"=>R2:

=R0;

when"1001"=>R2:

=R1;

when"1011"=>R2:

=R3;

when"1100"=>R3:

=R0;

when"1101"=>R3:

=R1;

when"1110"=>R3:

=R2;

whenothers=>NULL;

endcase;

whenShrc=>--cyclerightshift

caseIR(10downto9)is

when"00"=>

R0:

=R0(0)&R0(15downto1);

when"01"=>

R1:

=R1(0)&R1(15downto1);

when"10"=>

R2:

=R2(0)&R2(15downto1);

whenothers=>

R3:

=R3(0)&R3(15downto1);

endcase;

whenShlc=>--cycleleftshift

caseIR(10downto9)is

when"00"=>

R0:

=R0(14downto0)&R0(15);

when"01"=>

R1:

=R1(14downto0)&R1(15);

when"10"=>

R2:

=R2(14downto0)&R2(15);

whenothers=>

R3:

=R3(14downto0)&R3(15);

endcase;

whenShrl=>--logicrightshift

caseIR(10downto9)is

when"00"=>

R0:

='0'&R0(15downto1);

when"01"=>

R1:

='0'&R1(15downto1);

when"10"=>

R2:

='0'&R2(15downto1);

whenothers=>

R3:

='0'&R3(15downto1);

endcase;

whenShll=>--logicleftshift

caseIR(11downto10)is

when"00"=>

R0:

=R0(14downto0)&'0';

when"01"=>

R1:

=R1(14downto0)&'0';

when"10"=>

R2:

=R2(14downto0)&'0';

whenothers=>

R3:

=R3(14downto0)&'0';

endcase;

whenAddp|Subp|Andp|Swap|orp|xorp|xnorp|nandp|notp=>

caseIR(8downto7)is

when"00"=>A:

=R0;

when"01"=>A:

=R1;

when"10"=>A:

=R2;

whenothers=>A:

=R3;

endcase;

whenothers=>NULL;

endcase;

when2=>--state2

caseIR(15downto11)is

whenAddp=>--Rx:

=Rx+A;

caseIR(10downto9)is

when"00"=>

temp:

=(R0(15)&R0(15downto0))+(A(15)&A(15downto0));

R0:

=temp(15downto0);

overflow<=temp(16)XORtemp(15);

when"01"=>

temp:

=(R1(15)&R1(15downto0))+(A(15)&A(15downto0));

R1:

=temp(

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

当前位置:首页 > 表格模板 > 调查报告

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2