组成原理课设12位cpu设计Word下载.docx
《组成原理课设12位cpu设计Word下载.docx》由会员分享,可在线阅读,更多相关《组成原理课设12位cpu设计Word下载.docx(24页珍藏版)》请在冰点文库上搜索。
├──────目的─────┤
2、寻址方式
01
11
寄存器寻址
寄存器间址
3、寄存器号
R0
R1
00
4、指令对应的操作码和寻址方式
Ri代表寄存器寻址(Ri)代表寄存器间址
操作码
代表指令
寻址方式
000
DEC
001
MOV
R1,(R0)
010
ADD
(R1),(R0)
011
SUB
R1,R0
100
OR
(R1),R0
101
AND
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
10
9
8
7
6
5
4~0
微
地
址
Load_
PC
CvD
_ACC
C^D
D-C_
C+D_
INC_
DEC_
D_
ACC_
bus
MDR_
C_
R1_
R0_
PC_
Load
_D
_C
MDR
MAR
_IR
_R1
R_
NW
下地址
1
00001
00010
2
00011
3
11010
4
11110
5
11111
00101
01000
01001
00100
01110
01100
01101
11101
11000
10111
11011
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:
=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"
INopcode)RETURNSTD_LOGIC_VECTORIS
BEGIN
RETURNtrans_table(op);
ENDFUNCTIONop2slv;
ENDPACKAGEBODYcpu_defs;
--微程序控制器实验
USEIEEE.STD_LOGIC_1164.ALL,IEEE.NUMERIC_STD.ALL;
USEWORK.CPU_DEFS.ALL;
--使用自己定义的程序包
ENTITYCPUIS
PORT(clock:
INSTD_LOGIC;
--时钟
reset:
--复位
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"
00"
1=>
op2slv(mov)&
1"
11"
2=>
op2slv(add)&
3=>
op2slv(sub)&
4=>
op2slv(orr)&
5=>
op2slv(andd)&
6=>
op2slv(inc)&
7=>
STD_LOGIC_VECTOR(TO_UNSIGNED(8,word_w)),
8=>
STD_LOGIC_VECTOR(TO_UNSIGNED(7,word_w)),
OTHERS=>
(OTHERS=>
));
TYPEmicrocode_arrayISARRAY(0TO25)OFSTD_LOGIC_VECTOR(27DOWNTO0);
CONSTANTcode:
microcode_array:
=(--控制存储器
0=>
0000000000000100010000100001"
1=>
0000000000000000000011000010"
2=>
0000000001000000001000000011"
3=>
0000000000000000000000011010"
4=>
0000000000000000000000011110"
5=>
0000000000000000000000011111"
6=>
0000000000001001000011000100"
0000000000001000010000001000"
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:
SIGNALIR_out:
SIGNALacc_out:
UNSIGNED(word_w-1DOWNTO0);
SIGNALC_out:
SIGNALD_out:
SIGNALsysbus_out:
BEGIN
PROCESS(reset,clock)
VARIABLEinstr_reg:
VARIABLEacc:
CONSTANTzero:
UNSIGNED(word_w-1DOWNTO0):
=(OTHERS=>
VARIABLEmdr:
VARIABLEmar:
VARIABLEsysbus:
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:
BEGIN
IFreset='
THEN
add_r:
count<
=(OTHERS=>
instr_reg:
acc:
mdr:
mar:
mem<
=prog;
sysbus:
R0:
="
000000001000"
;
R1:
000000001001"
C:
D:
z_flag<
='
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"
0011"
instr_reg(0);
add_r:
11110"
0101"
instr_reg(3);
11101"
10"
op(2DOWNTO0);
11011"
1100"
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='
sysbus:
=rfill&
STD