计算机组成原理课程设计vhdl设计cpu.docx
《计算机组成原理课程设计vhdl设计cpu.docx》由会员分享,可在线阅读,更多相关《计算机组成原理课程设计vhdl设计cpu.docx(20页珍藏版)》请在冰豆网上搜索。
计算机组成原理课程设计vhdl设计cpu
1.课程设计目的3
2.开发工具选择3
3.方案选择3
4.指令系统设计4
5.模型机框图设计4
6.指令流程图5
7.微指令格式(微程序控制器)设计6
8.微程序(微程序控制器)设计7
9.VHDL程序代码9
10.调试仿真16
11.课程设计回顾总结18
参考文献18
1.课程设计目的
(1)、计算机组成原理课程设计的主要任务是让学生通过动脑和动手解决计算机设计中的实际问题。
综合运用所学计算机组成原理知识,在掌握部件单元电路实验的基础上,进一步将其组成系统构造一台基本的模型计算机,掌握整机概念,并设计机器指令系统,编写程序,在所设计的模型计算机上调试运行。
(2)、通过一台模型机的设计过程,明确计算机的控制原理与控制过程,巩固和灵活应用所学的理论知识,掌握计算机组成的一般设计方法,提高学生设计能力和实践操作技能,为从事计算机研制与设计打下基础。
2.开发工具选择
使用QUARTUS5.0软件编写并调试VHDL程序,然后做功能仿真。
3.方案选择
本次实习的内容为16位模型计算机的设计,单总线,采用微程序控制方式,有四种寻址方式:
直接寻址、寄存器寻址、寄存器间接寻址和变址寻址。
微程序控制方式由微指令译码产生。
微程序中一条机器指令往往分成几步执行,将每一步操作所需的若干为命令以代码编写在一条微指令中,若干条微指令组成一段微程序,对应一条机器指令。
然后根据系统的需要,事先编制各段微程序,将它存入一个专用寄存器(即控制存储器)中。
微程序执行过程:
如图1所示,为微程序控制基本框:
(1)从控存中逐条取出“取指令操作”,执行取指令公共操作。
(2)根据指令的操作码,经过微地址形成部件,得到这条指令的入口地址,并送入微地址寄存器中。
(3)从控存中逐条的取出对应的微指令并执行。
(4)执行完一条机器指令对应的微程序后又回到取指微程序的入口地址,继续第
(1)步,以完成取下一条机器指令的公共操作。
4.指令系统设计
模拟机采用了定长的指令格式,每条指令字长为16位。
采用的寻址方式为直接寻址(00)、寄存器寻址(01)、寄存器间接寻址(10)和变址寻址(11),操作码类型及编码方式如下
操作码
sta
add
sub
and1
or1
shl
编码方式
0000
0001
0010
0011
0100
0101
5.模型机框图设计
模拟机数据通路如图2所示,模型机采用单总线结构,主要包括运部件ALU,以及程序计数器PC、累加器ACC、指令寄存器IR、数据寄存器MDR、地址寄存器MAR和通用寄存器R,RAM为内存
(1)寄存器的位数:
所有的寄存器都均为16位
A通用寄存器R0,R1
该模拟机有2个通用寄存器,用于提供操作数。
B指令寄存器IR
为了提高取指令的速度,将指令从内存中读出,经数据总线直接置入IR。
C数据寄存器MDR、地址寄存器MAR
地址寄存器MAR提供访问主存的地址;
数据寄存器MDR,把从内存取出的数据暂存于MDR中,在用到该数据进行运算时,再从MDR中取出数据进行运算。
D程序计数器PC
用于存放下一条指令的内存地址。
(2)总线宽度:
该模拟机只有一条总线,且总线宽度为16位。
(3)ALU位数及运算功能
ALU可以实现16位操作数的运算,即ALU的位数为16位。
ALU运算功能为:
可以实现简单的加(0001:
add)、减(0010:
sub)、逻辑与(0011:
and1)、或(0100:
or1)操作。
(4)微命令的设置(各标识的含义)
经过认真分析各信息传送路径,对指令过程基本掌握,并为相应的微命令做了一下设置:
微地址
17
16
15
14
13
12
11
10
9
8
7
6
5-0
PC_
bus
load
_IR
load
_MAR
MDR
_bus
load-
MDR
ALU
_ACC
INC
_PC
Addr
_bus
CS
R_
NW
ALU
_add
ALU
_sub
下
地址
30
29
28
27
26
25
24
23
22
21
20
19
18
ACC_
addD
ACC_
addC
D_
bus
load
_D
C_
bus
load
_C
R1_
bus
load
_R1
R0_
bus
load
_R0
load
_PC
ACC
_bus
load
_ACC
33
32
31
ALU
_and
ALU
_or
ALU
_srl
6.指令流程图
指令的流程图如图3所示,共有6条指令,每条指令都要经过取指令、分析指令和执行指令3个步骤。
在取指令阶段,8条指令是一样的,首先程序计数器PC的内容通过总线送入地址寄存器MAR,存储信息,PC+1传送给PC,把读出的内容传送给指令寄存器IR。
再接下来的操作中,根据不同的指令,执行顺序也不同。
7.微指令格式(微程序控制器)设计
微指令格式设计如表:
控制信号
描述
load_PC
将总线上的数据装载至PC
ACC_bus
用ACC的内容驱动总线
load_ACC
将总线上的数据载入ACC
PC_bus
用PC的内容驱动总线
load_IR
将总线上的数据装载至IR
load_MAR
将总线上的数据装载至MAR
MDR_bus
用MDR的内容驱动总线
load_MDR
将总线上的数据装载至MDR
ALU_ACC
用ALU的结果装载ACC
INC_PC
PC+1并将结果存至PC中
Addr_bus
用IR指令中的地址部分驱动总线
CS
片选。
用MAR的内容设置存储器地址
R_NW
读取,不可写。
当R_NW无效且CS有效时,MBR的内容存储于存储器中
ALU_addC
在ALU中执行ACC和C的逻辑加操作
ALU_addD
在ALU中执行ACC和D的逻辑加操作
ALU_add
在ALU中执行逻辑加操作
ALU_sub
在ALU中执行减操作
ALU_and
在ALU中执行与操作
ALU_or
在ALU中执行与操作
ALU_shl
在ALU中执行左移操作
R0_bus
用寄存器R0的内容驱动总线
load_R0
将总线上的数据装载至R0
R1_bus
用寄存器R1的内容驱动总线
load_R1
将总线上的数据装载至R1
C_bus
用暂存器C的内容驱动总线
load_C
将总线上的数据装载至C
D_bus
用暂存器D的内容驱动总线
load_D
将总线上的数据装载至D
表1微指令格式
8.微程序(微程序控制器)设计
根据微处理器的数据通路和指令系统,可得出微程序的流程图如图4所示。
微程序的编码采用直接编码方法,每一个控制信号对应一位,共有28个控制信号,根据微指令格式把相关的控制信号整合到一起进行编码。
图4微程序流程图
根据图4微程序流程图的下地址,可知共有54条微指令,该模拟机微程序的编码如下
0=>0000000000000000101000100000000001
1=>0000000000000000000000001100000010
2=>0000000000000000010100000000000011
3=>0000000000000000000000000000111111
4=>0000000000000000000000001100000101
5=>0000000010000000000100000000000110
6=>0000000001000001000010000000000111
7=>0000100000000000000001000000001000
8=>0000000000000010001000000000001001
9=>0000000000000000000000001100001010
10=>0000000010001000000100000000000000
11=>0000000010000000000000000000001100
12=>0000000000000000101000100000001101
13=>0000000000000000000000001100001110
14=>0000001000000000000100000000001111
15=>0000000000010001000010000000010000
16=>0001000000000000000001000000010001
17=>0000000000000010001000000000010010
18=>0000000000000000000000001100010011
19=>0000001000000000000100000000010100
20=>0000000000000000000001000010010101
21=>0000000000000010000010000000010110
22=>0000000000000000000000001000000000
23=>0000000000000000000000001100011000
24=>0000000010000000000100000000011001
25=>0000000001000000000010000000011010
26=>0000001000000000000000000000011011
27=>0000000000000000000001000001011100
28=>0000000000000010000010000000011101
29=>0000000000100000000000000000000000
30=>0000000010000000000000000000011111
31=>0000000001000000001000000000100000
32=>0000000000000000000000001100100001
33=>0000010000000000000100000000100010
34=>1000000000000000000001000000100011
35=>0000000000000010000010000000100100
36=>0000000000000000000000001000000000
37=>0000000010000000000000000000100110
38=>0000000001000000000010000000100111
39=>0000001000000000000000000000101000
010*********
41=>0000000000000010000010000000101010
42=>0000000000100000000000000000000000
43=>0000000000000000000000001100101100
44=>0000000010000000000100000000101101
45=>0010000000000000000001000000101110
46=>0000000000000010000000000100101111
47=>0000000000001000000000000000000000
48=>0000000000000000101000100000000100
49=>0000000001000000000010000000001011
50=>0000000000010000001000000000010111
51=>0000000000010000000010000000011110
52=>0000000000010000000010000000100101
53=>0000000000000000001000010000101011
9.VHDL程序代码
--头文件
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
PACKAGEcpu_defsIS
TYPEopcodeIS(sta,add,sub,and1,or1,shl,jmp,nop);
TYPEregcodeIS(r0,r1);
TYPExzhcodeIS(zh,j,jj,bi);
CONSTANTword_w:
NATURAL:
=16;
CONSTANTop_w:
NATURAL:
=4;
CONSTANTreg_w:
NATURAL:
=4;
CONSTANTxzh_w:
NATURAL:
=2;
CONSTANTrfillop:
STD_LOGIC_VECTOR(op_w-1downto0):
=(others=>'0');
CONSTANTrfillreg:
STD_LOGIC_VECTOR(reg_w-1downto0):
=(others=>'0');
CONSTANTrfillxzh:
STD_LOGIC_VECTOR(xzh_w-1downto0):
=(others=>'0');
--FUNCTIOnslv2op(slv:
INSTD_LOGIC_VECTOR)RETURNopcode;
FUNCTIONop2slv(op:
inopcode)RETURNSTD_LOGIC_VECTOR;
FUNCTIONregslv(reg:
inregcode)RETURNSTD_LOGIC_VECTOR;
FUNCTIONxzhslv(xzh:
inxzhcode)RETURNSTD_LOGIC_VECTOR;
ENDPACKAGEcpu_defs;
PACKAGEBODYcpu_defsIS
TYPEoptableISARRAY(opcode)OFSTD_LOGIC_VECTOR(op_w-1DOWNTO0);
TYPEregtableISARRAY(regcode)OFSTD_LOGIC_VECTOR(reg_w-1DOWNTO0);
TYPExzhtableISARRAY(xzhcode)OFSTD_LOGIC_VECTOR(xzh_w-1DOWNTO0);
CONSTANTtrans_tableop:
optable:
=("0000","0001","0010","0011","0100","0101","0110","0111");
CONSTANTtrans_tabler:
regtable:
=("0000","0001");
CONSTANTtrans_tablex:
xzhtable:
=("00","01","10","11");
FUNCTIONop2slv(op:
INopcode)RETURNSTD_LOGIC_VECTORIS
BEGIN
RETURNtrans_tableop(op);
ENDFUNCTIONop2slv;
FUNCTIONregslv(reg:
inregcode)RETURNSTD_LOGIC_VECTORIS
BEGIN
RETURNtrans_tabler(reg);
ENDFUNCTIONregslv;
FUNCTIONxzhslv(xzh:
inxzhcode)RETURNSTD_LOGIC_VECTORIS
BEGIN
RETURNtrans_tablex(xzh);
ENDFUNCTIONxzhslv;
ENDPACKAGEBODYcpu_defs;LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL,IEEE.NUMERIC_STD.ALL;
USEWORK.CPU_DEFS.ALL;
ENTITYCPUIS
PORT(clock:
INSTD_LOGIC;
reset:
INSTD_LOGIC;
mode:
INSTD_LOGIC_VECTOR(3DOWNTO0);
mem_addr:
INUNSIGNED(word_w-op_w-1DOWNTO0);
output:
OUTSTD_LOGIC_VECTOR(word_w-1DOWNTO0);
data_r_out:
OUTSTD_LOGIC_VECTOR(33DOWNTO0);
op_out:
OUTSTD_LOGIC_VECTOR(op_w-1DOWNTO0);
add_r_out:
OUTUNSIGNED(5DOWNTO0)
);
ENDENTITY;
ARCHITECTURErtlOFCPUIS
TYPEmem_arrayISARRAY(0TO2**5)OFSTD_LOGIC_VECTOR(word_w-1DOWNTO0);
SIGNALmem:
mem_array;
CONSTANTprog:
mem_array:
=(
0=>op2slv(sta)&xzhslv(j)®slv(r0)&xzhslv(bi)®slv(r1),
1=>STD_LOGIC_VECTOR(TO_UNSIGNED(3,word_w)),
2=>op2slv(add)&xzhslv(bi)®slv(r0)&xzhslv(j)®slv(r1),
3=>STD_LOGIC_VECTOR(TO_UNSIGNED(0,word_w)),
4=>op2slv(sub)&xzhslv(j)®slv(r1)&xzhslv(jj)®slv(r0),
5=>op2slv(and1)&xzhslv(jj)®slv(r1)&xzhslv(j)®slv(r0),
6=>op2slv(or1)&xzhslv(j)®slv(r1)&xzhslv(j)®slv(r0),
7=>op2slv(shl)&xzhslv(j)®slv(r0)&xzhslv(zh)&STD_LOGIC
_VECTOR(TO_UNSIGNED(10,reg_w)),
8=>STD_LOGIC_VECTOR(TO_UNSIGNED(9,word_w)),
9=>STD_LOGIC_VECTOR(TO_UNSIGNED(8,word_w)),
10=>STD_LOGIC_VECTOR(TO_UNSIGNED(15,word_w)),
OTHERS=>(OTHERS=>'0'));
TYPEmicrocode_arrayISARRAY(0TO53)OFSTD_LOGIC_VECTOR(33DOWNTO0);
CONSTANTcode:
microcode_array:
=(
0=>"0000000000000000101000100000000001",
1=>"0000000000000000000000001100000010",
2=>"0000000000000000010100000000000011",
3=>"0000000000000000000000000000111111",
4=>"0000000000000000000000001100000101",
5=>"0000000010000000000100000000000110",
6=>"0000000001000001000010000000000111",
7=>"0000100000000000000001000000001000",
8=>"0000000000000010001000000000001001",
9=>"0000000000000000000000001100001010",
10=>"0000000010001000000100000000000000",
11=>"0000000010000000000000000000001100",
12=>"0000000000000000101000100000001101",
13=>"0000000000000000000000001100001110",
14=>"0000001000000000000100000000001111",
15=>"0000000000010001000010000000010000",
16=>"0001000000000000000001000000010001",
17=>"0000000000000010001000000000010010",
18=>"0000000000000000000000001100010011",
19=>"0000001000000000000100000000010100",
20=>"0000000000000000000001000010010101",
21=>"0000000000000010000010000000010110",
22=>"0000000000000000000000001000000000",
23=>"0000000000000000000000001100011000",
24=>"0000000010000000000100000000011001",
25=>"0000000001000000000010000000011010",
26=>"0000001000000000000000000000011011",
27=>"0000000000000000000001000001011100",
28=>"0000000000000010000010000000011101",
29=>"0000000000100000000000