CPU课程设计报告.docx
- 文档编号:8530603
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:23
- 大小:118.82KB
CPU课程设计报告.docx
《CPU课程设计报告.docx》由会员分享,可在线阅读,更多相关《CPU课程设计报告.docx(23页珍藏版)》请在冰豆网上搜索。
CPU课程设计报告
课程设计报告
课程片上计算机系统
题目cpu的设计
班级4班
专业集成
学生学号**********
指导教师
2015年7月9日
索引:
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指令集中的add实现减法,sub实现加法。
(3)模型机CPU指令集中的Jmp,Jz改为skp,not指令。
(4)模型机CPU指令的执行流程及状态跳转。
二.计处理器的结构和实现方法
(指令格式)
格式1:
寄存器寻址方式
1514131211109876543210
OP
Rx
Ry
空白
格式2:
立即数寻址方式
1514131211109876543210
OP
I
空白
格式3:
无操作数寻址方式
1514131211109876543210
OP
空白
空白
格式4:
直接寻址方式
1514131211109876543210
OP
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
1
AddRxRy
Rx←(Rx)+(Ry)PC=PC+1
0100
1
ANDRxRy
Rx←(Rx)AND(Ry)PC=PC+1
0101
1
NANDRxRy
Rx←(Rx)NAND(Ry)PC=PC+1
0110
1
ORRxRy
Rx←(Rx)OR(Ry)PC=PC+1
0111
1
XNORRxRy
Rx←(Rx)XNOR(Ry)PC=PC+1
1000
1
ShrpRxRy
Rx←(Ry)算术右移PC=PC+1
1001
1
ShlpRxRy
Rx←(Ry)算术左移PC=PC+1
1010
1
SwapRxRy
A←(Ry);Ry←(Rx);Rx←(A);PC=PC+1
1011
1
JampAdder
PC←AdderPC=PC+1
1100
3
JzAdder
If(R0)=0
thenPC←Adder
ElsePC=PC+1
1101
4
ReadAddr
PC=PC+1
R0←(Addr)
PC=PC+1
1110
4
WriteAddr
PC=PC+1
(Addr)←R0
PC=PC+1
1111
3
Stop
无操作,PC不变
处理器的状态跳转操作过程:
(一)、模型机每一状态下的操作及状态跳转
当前状态
执行操作
次态与读下一条指令的有关的操作
St_0
取指令
IR(15..0)M_data_in&‘00000000’
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=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
St_0
Write-Read’0’
IFOP=AddTHENRx(Rx)+A
IFOP=ANDTHENRx(Rx)ANDA
IFOP=NANDTHENRx(Rx)NANDA
IFOP=ANDTHENRx(Rx)ANDA
IFOP=ORTHENRx(Rx)ORA
IFOP=XNORTHENRx(Rx)XNORA
IFOP=SwapTHENRy(Rx)
St_3
Write-Read’0’
IFOP=SkpTHEN
(PCIR(1..0)
IFOP=ReadTHENMARIR(11..0)
IFOP=WriteTHEN
MARIR(11..0)MDAR0
St_3
IFOP=SwapTHENRx(A)
St_0
Write-Read’0’
IFOP=Skp
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’
IFOP=WriteTHEN
R0M_data_in
St_0
Write-Read’0’
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
无条件转移指令
(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(11..0)将转移目标地址加载于MAR
2)PCIR(11..0)将转移目标地址加载于PC
(4)St_3:
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:
std_logic_vector(3DOWNTO0):
="0001";
CONSTANTmove:
std_logic_vector(3DOWNTO0):
="0010";
CONSTANTaddP:
std_logic_vector(3DOWNTO0):
="0011";
CONSTANTandp:
std_logic_vector(3DOWNTO0):
="0100";
CONSTANTnandp:
std_logic_vector(3DOWNTO0):
="0101";
CONSTANTorp:
std_logic_vector(3DOWNTO0):
="0110";
CONSTANTxnorp:
std_logic_vector(3DOWNTO0):
="0111";
CONSTANTshrp:
std_logic_vector(3DOWNTO0):
="1000";
CONSTANTshlp:
std_logic_vector(3DOWNTO0):
="1001";
CONSTANTswap:
std_logic_vector(3DOWNTO0):
="1010";
CONSTANTjmp:
std_logic_vector(3DOWNTO0):
="1011";
CONSTANTjz:
std_logic_vector(3DOWNTO0):
="1100";
CONSTANTread:
std_logic_vector(3DOWNTO0):
="1101";
CONSTANTwrite:
std_logic_vector(3DOWNTO0):
="1110";
CONSTANTstop:
std_logic_vector(3DOWNTO0):
="1111";
ENDnamespack;
LIBRARYieee;
USEieee.std_logic_1164.ALL;
USEieee.std_logic_unsigned.ALL;
USEWORK.namespack.ALL;
------------------------cpu实体声明---------------------------------
ENTITYcpuIS
PORT(
reset:
INstd_logic;--清零信号低有效
clock:
INstd_logic;--时钟信号
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='0'THEN
CASEstatusIS
WHEN0=>
status<=1;
WHEN1=>
IFIR(15DOWNTO12)=StopTHEN
status<=1;
ELSE
status<=2;
ENDIF;
WHEN2=>
CASEIR(15DOWNTO12)IS
WHENSwap|Jmp|Jz|Read|Write=>
status<=3;
WHENOTHERS=>
status<=0;
ENDCASE;
WHEN3=>
IFIR(15DOWNTO12)=SwapTHEN
status<=0;
ELSE
status<=4;
ENDIF;
WHEN4=>
status<=5;
WHEN5=>
CASEIR(15DOWNTO12)IS
WHENRead|Write=>
status<=6;
WHENOTHERS=>
status<=0;
ENDCASE;
WHENOTHERS=>
status<=0;
ENDCASE;
ELSE
NULL;
ENDIF;
ENDPROCESSstatus_change;
seq:
PROCESS(reset,clock)
VARIABLEPC:
std_logic_vector(11DOWNTO0);--程序计数器
VARIABLER0,R1,R2,R3:
std_logic_vector(7DOWNTO0);--通用寄存器
VARIABLEA:
std_logic_vector(7DOWNTO0);--临时寄存器
VARIABLEtemp:
std_logic_vector(8DOWNTO0);--临时变量
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')THEN
overflow<='0';
CASEstatusIS
WHEN0=>--状态0
IR<=M_data_in&"00000000";--取指令
PC:
=PC+1;--程序计数器加1
WHEN1=>--状态1
IF(IR(15DOWNTO12)/=Stop)THEN
MAR<=PC;
ENDIF;
CASEIR(15DOWNTO12)IS
WHENLoad=>
R0:
="0000"&IR(11DOWNTO8);
WHENMove=>--MoveRx,Ry;
CASEIR(11DOWNTO8)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;
WHENShrp=>--算术右移;
CASEIR(11DOWNTO10)IS
WHEN"00"=>
R0:
="000"&R0(5DOWNTO1);
WHEN"01"=>
R1:
="000"&R1(5DOWNTO1);
WHEN"10"=>
R2:
="000"&R2(5DOWNTO1);
WHENOTHERS=>
R3:
="000"&R3(5DOWNTO1);
ENDCASE;
WHENShlp=>--算术左移;
CASEIR(11DOWNTO10)IS
WHEN"00"=>
R0:
=R0(4DOWNTO0)&"000";
WHEN"01"=>
R1:
=R1(4DOWNTO0)&"000";
WHEN"10"=>
R2:
=R2(4DOWNTO0)&"000";
WHENOTHERS=>
R3:
=R3(4DOWNTO0)&"000";
ENDCASE;
WHENAddp|Andp|Nandp|Orp|Xnorp|Swap=>
CASEIR(9DOWNTO8)IS
WHEN"00"=>A:
=R0;
WHEN"01"=>A:
=R1;
WHEN"10"=>A:
=R2;
WHENOTHERS=>A:
=R3;
ENDCASE;
WHENOTHERS=>NULL;
ENDCASE;
WHEN2=>--状态2
CASEIR(15DOWNTO12)IS
WHENAddp=>--Rx:
=Rx+A;
CASEIR(11DOWNTO10)IS
WHEN"00"=>
temp:
=(R0(7)&R0(7DOWNTO0))+NOT(A(7)&A(7DOWNTO0))+1;
R0:
=temp(7DOWNTO0);
overflow<=temp(8)XORtemp(7);
WHEN"01"=>
temp:
=(R1(7)&R1(7DOWNTO0))+NOT(A(7)&A(7DOWNTO0))+1;
R1:
=temp(7DOWNTO0);
overflow<=temp(8)XORtemp(7);
WHEN"10"=>
temp:
=(R2(7)&R2(7DOWNTO0))+NOT(A(7)&A(7DOWNTO0))+1;
R2:
=temp(7DOWNTO0);
overflow<=temp(8)XORtemp(7);
WHENOTHERS=>
temp:
=(R3(7)&R3(7DOWNTO0))+NOT(A(7)&A(7DOWNTO0))+1;
R3:
=temp(7DOWNTO0);
overflow<=temp(8)XORtemp(7);
ENDCASE;
WHENAndp=>--Rx:
=RxANDA;
CASEIR(11DOWNTO10)IS
WHEN"00"=>
R0:
=R0andA;
WHEN"01"=>
R1:
=R1andA;
WHEN"10"=>
R2:
=R2andA;
WHENOTHERS=>
R3:
=R3andA;
ENDCASE;
WHENNandp=>--Rx:
=RxNANDA;
CASEIR(11DOWNTO10)IS
WHEN"00"=>
R0:
=R0nandA;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CPU 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)