组成原理课设12位cpu设计.docx
- 文档编号:11520697
- 上传时间:2023-03-02
- 格式:DOCX
- 页数:24
- 大小:179.39KB
组成原理课设12位cpu设计.docx
《组成原理课设12位cpu设计.docx》由会员分享,可在线阅读,更多相关《组成原理课设12位cpu设计.docx(24页珍藏版)》请在冰豆网上搜索。
组成原理课设12位cpu设计
石家庄经济学院
信息工程学院
计算机组成原理课程设计报告
题目12位模型计算机的设计
姓名
学号
班号
指导老师
成绩
2012年1月
目录
1.课程设计目的03
2.开发工具选择03
3.方案选择03
4.指令系统设计03
5.模型机框图设计04
6.微指令流程图04
7.指令操作时间表(组合逻辑控制器)或者微指令格式(微程序控制器)设计06
8.微操作信号综合与优化(组合逻辑控制器)或者微程序(微程序控制器)设计07
9.VHDL实现07
10.调试仿真17
11.课程设计回顾总结19
参考文献20
1、课程设计的目的
1.计算机组成原理课程设计的主要任务是让学生通过动脑和动手解决计算机设计中的实际问题。
综合运用所学计算机组成原理知识,在掌握部件单元电路实验的基础上,进一步将其组成系统构造一台基本的模型计算机,掌握整机概念,并设计机器指令系统,编写程序,在所设计的模型计算机上调试运行。
2.通过一台模型机的设计过程,明确计算机的控制原理与控制过程,巩固和灵活应用所学的理论知识,掌握计算机组成的一般设计方法,提高学生设计能力和实践操作技能,为从事计算机研制与设计打下基础。
2、开发工具选择
quartusII5.1,VHDL语言.
3、方案选择
采用微程序控制器设计12位的模型机。
4、指令系统设计
1、指令格式
每条指令是12位,操作码(11--8)4位,包含操作数类型和操作类型,如下:
双操作数指令:
118
76
54
32
10
Op操作码(4)
寄存器
(2)
寻址方式
(2)
寄存器
(2)
寻址方式
(2)
├────目的────────├────源────────┤
单操作数指令:
118
76
54
30
Op操作码(4)
寄存器
(2)
寻址方式
(2)
4位
├──────目的─────┤
2、寻址方式
01
11
寄存器寻址
寄存器间址
3、寄存器号
R0
R1
00
01
4、指令对应的操作码和寻址方式
Ri代表寄存器寻址(Ri)代表寄存器间址
操作码
代表指令
寻址方式
000
DEC
R1
001
MOV
R1,(R0)
010
ADD
(R1),(R0)
011
SUB
R1,R0
100
OR
(R1),R0
101
AND
R1,R0
110
INC
(R1)
5模型机框图设计
数据通路的设计如下:
图1数据通路的设计
6、微指令流程图
流程如图:
图2微指令流程图
7、微指令格式设计
需要用到的微信号的设置:
控制信号
描述
D_ACC
把暂存器D中的操作数,送至ACC
C+D_ACC
把暂存器C和D中的操作数相加之后,结果送至ACC
C^D_ACC
把暂存器C和D中的操作数相与之后,结果送至ACC
D-C->ACC
把暂存器D和C中的操作数相减之后,结果送至ACC
Dec_ACC
ACC内容减1
Inc_ACC
ACC内容加1
Load_MAR
将总线上数据装载至MAR
Load_MDR
将总线上数据装载至MDR
Load_C
将总线上数据装载至暂存器C
Load_D
将总线上数据装载至暂存器D
Load_R0
将总线上数据装载至寄存器R0
Load_R1
将总线上数据装载至寄存器R1
Load_PC
将总线上数据装载至程序计数器PC
Load_IR
将总线上数据装载至IR
R_NW
读取,不可写。
当R_NW无效且CS有效时,MDR内容存储于存储器
CS
片选。
用MAR的内容设置存储器地址
INC_PC
PC+1并将结果存至PC中
PC_bus
用PC内容驱动总线
ACC_bus
用ACC内容驱动总线
R0_bus
用R0内容驱动总线
R1_bus
用R1内容驱动总线
MDR_bus
用MDR内容驱动总线
CvD_ACC
把暂存器D和C中的操作数相或之后,结果送至ACC
8、微程序控制器设计
如图:
共25条微指令,28个微信号控制,该信号为1时执行对应的微操作。
低五位为下地址。
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4~0
微
地
址
Load_
PC
CvD
_ACC
C^D
_ACC
D-C_
ACC
C+D_
ACC
INC_
ACC
DEC_
ACC
D_
ACC
ACC_
bus
MDR_
bus
C_
bus
R1_
bus
R0_
bus
PC_
bus
Load
_D
Load
_C
Load_
MDR
Load_
MAR
Load
_IR
Load
_R1
CS
R_
NW
INC_
PC
下地址
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
0
0
1
00001
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
00010
2
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
00011
3
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
11010
4
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
11110
5
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
11111
6
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
1
1
0
00101
7
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
1
0
0
0
0
0
01000
8
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
01001
9
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
0
0
00100
10
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
0
01110
11
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
01100
12
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
01101
13
0
0
0
0
0
0
0
0
0
1
0
0
0
0
1
0
0
0
0
0
0
0
0
01110
14
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
11101
15
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
11000
16
0
0
0
0
0
0
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
10111
17
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
10111
18
0
0
0
0
1
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
10111
19
0
0
0
1
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
10111
20
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
10111
21
0
0
1
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
10111
22
0
0
0
0
0
1
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
10111
23
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
11011
24
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
00000
25
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
00000
9、VHDL实现
--CPU头文件cpu_defs
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
PACKAGEcpu_defsIS--定义程序包,包头,包体
TYPEopcodeIS(dec,mov,add,sub,orr,andd,inc);--这个语句适合于定义一些用std_logic等不方便定义的类型,综合器自动实现枚举类型元素的编码,一般将第一个枚举量(最左边)编码为0
CONSTANTword_w:
NATURAL:
=12;
CONSTANTop_w:
NATURAL:
=3;
CONSTANTrfill:
STD_LOGIC_VECTOR(op_w-1downto0):
=(others=>'0');
--FUNCTIOnslv2op(slv:
INSTD_LOGIC_VECTOR)RETURNopcode;
FUNCTIONop2slv(op:
inopcode)RETURNSTD_LOGIC_VECTOR;
ENDPACKAGEcpu_defs;
PACKAGEBODYcpu_defsIS
TYPEoptableISARRAY(opcode)OFSTD_LOGIC_VECTOR(op_w-1DOWNTO0);--数组有5个元素,其他均0
CONSTANTtrans_table:
optable:
=("000","001","010","011","100","101","110");
FUNCTIONop2slv(op:
INopcode)RETURNSTD_LOGIC_VECTORIS
BEGIN
RETURNtrans_table(op);
ENDFUNCTIONop2slv;
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(2DOWNTO0);--查看用
mem_addr:
INUNSIGNED(word_w-op_w-1DOWNTO0);--地址
output:
OUTSTD_LOGIC_VECTOR(word_w-1DOWNTO0);
data_r_out:
OUTSTD_LOGIC_VECTOR(27DOWNTO0);--微指令R
op_out:
OUTSTD_LOGIC_VECTOR(op_w-1DOWNTO0);--操作码
add_r_out:
OUTUNSIGNED(4DOWNTO0);--微地址R
R1_OUT,R0_OUT:
OUTSTD_LOGIC_VECTOR(word_w-1DOWNTO0)
);
ENDENTITY;
ARCHITECTURErtlOFCPUIS
TYPEmem_arrayISARRAY(0TO2**(word_w-op_w)-1)OFSTD_LOGIC_VECTOR(word_w-1DOWNTO0);--定义RAM
SIGNALmem:
mem_array;
CONSTANTprog:
mem_array:
=(
--操作码&操作数个数&目的操作数寄存器号&寻址方式&源操作数寄存器号&寻址方式
0=>op2slv(dec)&"0"&"01"&"01"&"00"&"01",
1=>op2slv(mov)&"1"&"01"&"01"&"00"&"11",
2=>op2slv(add)&"1"&"01"&"11"&"00"&"11",
3=>op2slv(sub)&"1"&"01"&"01"&"00"&"01",
4=>op2slv(orr)&"1"&"01"&"11"&"00"&"01",
5=>op2slv(andd)&"1"&"01"&"01"&"00"&"01",
6=>op2slv(inc)&"0"&"01"&"11"&"00"&"01",
7=>STD_LOGIC_VECTOR(TO_UNSIGNED(8,word_w)),
8=>STD_LOGIC_VECTOR(TO_UNSIGNED(7,word_w)),
OTHERS=>(OTHERS=>'0'));
TYPEmicrocode_arrayISARRAY(0TO25)OFSTD_LOGIC_VECTOR(27DOWNTO0);
CONSTANTcode:
microcode_array:
=(--控制存储器
0=>"0000000000000100010000100001",
1=>"0000000000000000000011000010",
2=>"0000000001000000001000000011",
3=>"0000000000000000000000011010",
4=>"0000000000000000000000011110",
5=>"0000000000000000000000011111",
6=>"0000000000001001000011000100",
7=>"0000000000001000010000001000",
8=>"0000000000000000000011001001",
9=>"0000000001000001000000000100",
10=>"0000000000010010000000001110",
11=>"0000000000010000010000001100",
12=>"0000000000000000000011001101",
13=>"0000000001000010000000001110",
14=>"0000000000000000000000011101",
15=>"0000000000000000000000011000",
16=>"0000001110000000000000010111",--DEC
17=>"0000000000100000000000010111",--MOV
18=>"0000100010000000000000010111",--ADD
19=>"0001000010000000000000010111",--SUB
20=>"0100000010000000000000010111",--OR
21=>"0010000110000000000000010111",--AND
22=>"0000010110000000000000010111",--INC
23=>"0000000000000000000000011011",
24=>"0000000000000000000100000000",
25=>"0000000000000000100010000000");
SIGNALcount:
UNSIGNED(word_w-op_w-1DOWNTO0);
SIGNALop:
STD_LOGIC_VECTOR(op_w-1DOWNTO0);
SIGNALz_flag:
STD_LOGIC;
SIGNALmdr_out:
STD_LOGIC_VECTOR(word_w-1DOWNTO0);
SIGNALmar_out:
UNSIGNED(word_w-op_w-1DOWNTO0);
SIGNALIR_out:
STD_LOGIC_VECTOR(word_w-1DOWNTO0);
SIGNALacc_out:
UNSIGNED(word_w-1DOWNTO0);
SIGNALC_out:
STD_LOGIC_VECTOR(word_w-1DOWNTO0);
SIGNALD_out:
STD_LOGIC_VECTOR(word_w-1DOWNTO0);
SIGNALsysbus_out:
STD_LOGIC_VECTOR(word_w-1DOWNTO0);
BEGIN
PROCESS(reset,clock)
VARIABLEinstr_reg:
STD_LOGIC_VECTOR(word_w-1DOWNTO0);
VARIABLEacc:
UNSIGNED(word_w-1DOWNTO0);
CONSTANTzero:
UNSIGNED(word_w-1DOWNTO0):
=(OTHERS=>'0');
VARIABLEmdr:
STD_LOGIC_VECTOR(word_w-1DOWNTO0);
VARIABLEmar:
UNSIGNED(word_w-op_w-1DOWNTO0);
VARIABLEsysbus:
STD_LOGIC_VECTOR(word_w-1DOWNTO0);
VARIABLEmicrocode:
microcode_array;
VARIABLEadd_r:
UNSIGNED(4DOWNTO0);
VARIABLEdata_r:
STD_LOGIC_VECTOR(27DOWNTO0);
VARIABLEtemp:
STD_LOGIC_VECTOR(4DOWNTO0);
VARIABLER0,R1:
STD_LOGIC_VECTOR(11DOWNTO0);
VARIABLEC,D:
STD_LOGIC_VECTOR(11DOWNTO0);
BEGIN
IFreset='0'THEN
add_r:
=(OTHERS=>'0');
count<=(OTHERS=>'0');
instr_reg:
=(OTHERS=>'0');
acc:
=(OTHERS=>'0');
mdr:
=(OTHERS=>'0');
mar:
=(OTHERS=>'0');
mem<=prog;
sysbus:
=(OTHERS=>'0');
R0:
="000000001000";
R1:
="000000001001";
C:
=(OTHERS=>'0');
D:
=(OTHERS=>'0');
z_flag<='0';
ELSIFRISING_EDGE(clock)THEN
--microprogramcontroller
data_r:
=code(TO_INTEGER(add_r));
IFdata_r(4DOWNTO0)="11010"THEN--判断下地址
temp:
="0010"&instr_reg(6);
add_r:
=UNSIGNED(temp);
ELSIFdata_r(4DOWNTO0)="11111"THEN
temp:
="0011"&instr_reg(0);
add_r:
=UNSIGNED(temp);
ELSIFdata_r(4DOWNTO0)="11110"THEN
temp:
="0101"&instr_reg(3);
add_r:
=UNSIGNED(temp);
ELSIFdata_r(4DOWNTO0)="11101"THEN
temp:
="10"&op(2DOWNTO0);
add_r:
=UNSIGNED(temp);
ELSIFdata_r(4DOWNTO0)="11011"THEN
temp:
="1100"&instr_reg(3);
add_r:
=UNSIGNED(temp);
ELSE
add_r:
=UNSIGNED(data_r(4DOWNTO0));
ENDIF;
data_r_out<=data_r;
add_r_out<=add_r;
--PC
IFdata_r(14)='1'THEN--PC_bus='1'
sysbus:
=rfill&STD
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 组成 原理 12 cpu 设计