CPU模型机设计课程设计报告.docx
- 文档编号:15160225
- 上传时间:2023-07-01
- 格式:DOCX
- 页数:27
- 大小:532.08KB
CPU模型机设计课程设计报告.docx
《CPU模型机设计课程设计报告.docx》由会员分享,可在线阅读,更多相关《CPU模型机设计课程设计报告.docx(27页珍藏版)》请在冰点文库上搜索。
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(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CPU 模型 设计 课程设计 报告