CPU课程设计报告Word文件下载.docx
《CPU课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《CPU课程设计报告Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。
二.计处理器的结构和实现方法
(指令格式)
格式1:
寄存器寻址方式
1514131211109876543210
OP
Rx
Ry
空白
格式2:
立即数寻址方式
I
格式3:
无操作数寻址方式
格式4:
直接寻址方式
Addr
模型机的指令系统
操作码OP
(15~~12)
指令格式
指令
操作
0000
3
Idle
PC=PC+1
0001
2
Loaddata
R0←IPC=PC+1
0010
1
MoveRxRy
Rx←(Ry)PC=PC+1
0011
AddRxRy
Rx←(Rx)+(Ry)PC=PC+1
0100
ANDRxRy
Rx←(Rx)AND(Ry)PC=PC+1
0101
NANDRxRy
Rx←(Rx)NAND(Ry)PC=PC+1
0110
ORRxRy
Rx←(Rx)OR(Ry)PC=PC+1
0111
XNORRxRy
Rx←(Rx)XNOR(Ry)PC=PC+1
1000
ShrpRxRy
Rx←(Ry)算术右移PC=PC+1
1001
ShlpRxRy
Rx←(Ry)算术左移PC=PC+1
1010
SwapRxRy
A←(Ry);
Ry←(Rx);
Rx←(A);
1011
JampAdder
PC←AdderPC=PC+1
1100
JzAdder
If(R0)=0
thenPC←Adder
ElsePC=PC+1
1101
4
ReadAddr
R0←(Addr)
1110
WriteAddr
(Addr)←R0
PC=PC+1
1111
Stop
无操作,PC不变
处理器的状态跳转操作过程:
(一)、模型机每一状态下的操作及状态跳转
当前状态
执行操作
次态与读下一条指令的有关的操作
St_0
取指令
IR(15..0)M_data_in&
‘00000000’
St_1
Write-Read’0’PC=PC+1
IFOP=LoadTHEN
R0IR(11..8)||”000000000000”
MARPC
IF(OP=Stop)THEN
ELSESt_2
ENDIF
IFOP=MoveTHENRx(Ry)
IFOP=SraTHENRy(Ry)
算术右移
IFOP=SlaTHENRy(Ry)
算术左移
IFOP=AddTHENA(Ry)
IFOP=AndTHENA(Ry)
IFOP=NandTHENA(Ry)
IFOP=OrTHENA(Ry)
IFOP=XnorTHENA(Ry)
IFOP=SwapTHENA(Ry)
IFOP=StopTHENNULL
IFOP=IdleTHENNULL
IFOP=JmpTHENNULL
IFOP=JzTHENNULL
IFOP=ReadTHENNULL
IFOP=WriteTHENNULL
St_2
IFOP=LoadOROP=MoveOROP=SraOROP=SlaOROP=Idle
THENNULL
Write-Read’0’
IFOP=AddTHENRx(Rx)+A
IFOP=ANDTHENRx(Rx)ANDA
IFOP=NANDTHENRx(Rx)NANDA
IFOP=ORTHENRx(Rx)ORA
IFOP=XNORTHENRx(Rx)XNORA
IFOP=SwapTHENRy(Rx)
St_3
IFOP=SkpTHEN
(PCIR(1..0)
IFOP=ReadTHENMARIR(11..0)
IFOP=WriteTHEN
MARIR(11..0)MDAR0
IFOP=SwapTHENRx(A)
IFOP=Skp
IFOP=Write
St_4
IFOP=Read
IFOP=ReadTHEN
R0M_data_in
IFOP=WriteTHEN
St_5
MAR<
=PC;
St_6
IfReadR0:
=M_data_in;
(二)、简单指令执行状态描述
读内存指令:
(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(11..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
无条件转移指令
4)PC=PC+1(此语句无用,因为程序计数器后续重新复制达到无条件转移目的)
1)MARIR(11..0)将转移目标地址加载于MAR
2)PCIR(11..0)将转移目标地址加载于PC
1)M_address(MAR)把下一条指令地址送到地址总线
2)令Write-Read’0’向内存发出读命令(取下一条指令)
3)下一状态跳转到St_0
三.CPU的VHDL代码
LIBRARYieee;
USEieee.std_logic_1164.ALL;
PACKAGEnamespackIS
CONSTANTidle:
std_logic_vector(3DOWNTO0):
="
0000"
;
CONSTANTload:
0001"
CONSTANTmove:
0010"
CONSTANTaddP:
0011"
CONSTANTandp:
0100"
CONSTANTnandp:
0101"
CONSTANTorp:
0110"
CONSTANTxnorp:
0111"
CONSTANTshrp:
1000"
CONSTANTshlp:
1001"
CONSTANTswap:
1010"
CONSTANTjmp:
1011"
CONSTANTjz:
1100"
CONSTANTread:
1101"
CONSTANTwrite:
1110"
CONSTANTstop:
1111"
ENDnamespack;
USEieee.std_logic_unsigned.ALL;
USEWORK.namespack.ALL;
------------------------cpu实体声明---------------------------------
ENTITYcpuIS
PORT(
reset:
INstd_logic;
--清零信号低有效
clock:
--时钟信号
Write_Read:
OUTstd_logic;
--读写信号,'
1'
为写
M_address:
OUTstd_logic_vector(11DOWNTO0);
--地址线
M_data_in:
INstd_logic_vector(7DOWNTO0);
--数据输入线
M_data_out:
OUTstd_logic_vector(7DOWNTO0);
--数据输出线
overflow:
OUTstd_logic);
--溢出标志
ENDcpu;
------------------------cpu寄存器传输级行为描述--------------------------------
ARCHITECTURERTLOFcpuIS
SIGNALIR:
std_logic_vector(15DOWNTO0);
--指令寄存器
SIGNALMDR:
std_logic_vector(7DOWNTO0);
--数据寄存器
SIGNALMAR:
std_logic_vector(11DOWNTO0);
--地址寄存器
SIGNALstatus:
integerRANGE0TO6;
--状态寄存器
BEGIN
status_change:
PROCESS(reset,clock,status)
BEGIN
IFreset='
0'
THENstatus<
=0;
--进入初始状态
ELSIFclock'
EVENTANDclock='
THEN
CASEstatusIS
WHEN0=>
status<
=1;
WHEN1=>
IFIR(15DOWNTO12)=StopTHEN
ELSE
=2;
ENDIF;
WHEN2=>
CASEIR(15DOWNTO12)IS
WHENSwap|Jmp|Jz|Read|Write=>
status<
=3;
WHENOTHERS=>
status<
=0;
ENDCASE;
WHEN3=>
IFIR(15DOWNTO12)=SwapTHEN
=4;
WHEN4=>
status<
=5;
WHEN5=>
WHENRead|Write=>
=6;
WHENOTHERS=>
ENDCASE;
ELSE
NULL;
ENDIF;
ENDPROCESSstatus_change;
seq:
PROCESS(reset,clock)
VARIABLEPC:
std_logic_vector(11DOWNTO0);
--程序计数器
VARIABLER0,R1,R2,R3:
--通用寄存器
VARIABLEA:
--临时寄存器
VARIABLEtemp:
std_logic_vector(8DOWNTO0);
--临时变量
IF(reset='
)THEN--进入初始状态
IR<
=(OTHERS=>
'
);
PC:
R0:
R1:
R2:
R3:
A:
MAR<
MDR<
ELSIF(clock'
eventANDclock='
)THEN
overflow<
='
CASEstatusIS
WHEN0=>
--状态0
=M_data_in&
"
00000000"
--取指令
PC:
=PC+1;
--程序计数器加1
WHEN1=>
--状态1
IF(IR(15DOWNTO12)/=Stop)THEN
ENDIF;
CASEIR(15DOWNTO12)IS
WHENLoad=>
R0:
&
IR(11DOWNTO8);
WHENMove=>
--MoveRx,Ry;
CASEIR(11DOWNTO8)IS
WHEN"
=>
=R1;
=R2;
=R3;
R1:
=R0;
R2:
WHEN"
R3:
WHENOTHERS=>
NULL;
ENDCASE;
WHENShrp=>
--算术右移;
CASEIR(11DOWNTO10)IS
00"
000"
&
R0(5DOWNTO1);
01"
R1(5DOWNTO1);
10"
R2(5DOWNTO1);
R3(5DOWNTO1);
WHENShlp=>
--算术左移;
=R0(4DOWNTO0)&
"
=R1(4DOWNTO0)&
=R2(4DOWNTO0)&
=R3(4DOWNTO0)&
WHENAddp|Andp|Nandp|Orp|Xnorp|Swap=>
CASEIR(9DOWNTO8)IS
A:
WHENOTHERS=>
WHEN2=>
--状态2
WHENAddp=>
--Rx:
=Rx+A;
temp:
=(R0(7)&
R0(7DOWNTO0))+NOT(A(7)&
A(7DOWNTO0))+1;
R0:
=temp(7DOWNTO0);
overflow<
=temp(8)XORtemp(7);
=(R1(7)&
R1(7DOWNTO0))+NOT(A(7)&
R1:
=(R2(7)&
R2(7DOWNTO0))+NOT(A(7)&
R2:
=(R3(7)&
R3(7DOWNTO0))+NOT(A(7)&
R3:
WHENAndp=>
--Rx:
=RxANDA;
=R0andA;
=R1andA;
=R2andA;
=R3andA;
WHENNandp=>
=RxNANDA;
=R0nandA;