组成原理课设12位cpu设计Word下载.docx

上传人:b****2 文档编号:4989331 上传时间:2023-05-04 格式:DOCX 页数:24 大小:179.39KB
下载 相关 举报
组成原理课设12位cpu设计Word下载.docx_第1页
第1页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第2页
第2页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第3页
第3页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第4页
第4页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第5页
第5页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第6页
第6页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第7页
第7页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第8页
第8页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第9页
第9页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第10页
第10页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第11页
第11页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第12页
第12页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第13页
第13页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第14页
第14页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第15页
第15页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第16页
第16页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第17页
第17页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第18页
第18页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第19页
第19页 / 共24页
组成原理课设12位cpu设计Word下载.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

组成原理课设12位cpu设计Word下载.docx

《组成原理课设12位cpu设计Word下载.docx》由会员分享,可在线阅读,更多相关《组成原理课设12位cpu设计Word下载.docx(24页珍藏版)》请在冰点文库上搜索。

组成原理课设12位cpu设计Word下载.docx

├──────目的─────┤

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2