计算机组成原理课程设计vhdl设计cpu.docx

上传人:b****5 文档编号:5981186 上传时间:2023-01-02 格式:DOCX 页数:20 大小:171.75KB
下载 相关 举报
计算机组成原理课程设计vhdl设计cpu.docx_第1页
第1页 / 共20页
计算机组成原理课程设计vhdl设计cpu.docx_第2页
第2页 / 共20页
计算机组成原理课程设计vhdl设计cpu.docx_第3页
第3页 / 共20页
计算机组成原理课程设计vhdl设计cpu.docx_第4页
第4页 / 共20页
计算机组成原理课程设计vhdl设计cpu.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

计算机组成原理课程设计vhdl设计cpu.docx

《计算机组成原理课程设计vhdl设计cpu.docx》由会员分享,可在线阅读,更多相关《计算机组成原理课程设计vhdl设计cpu.docx(20页珍藏版)》请在冰豆网上搜索。

计算机组成原理课程设计vhdl设计cpu.docx

计算机组成原理课程设计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

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1