微程序控制器实验报告.docx

上传人:b****8 文档编号:30126196 上传时间:2023-08-05 格式:DOCX 页数:10 大小:17.44KB
下载 相关 举报
微程序控制器实验报告.docx_第1页
第1页 / 共10页
微程序控制器实验报告.docx_第2页
第2页 / 共10页
微程序控制器实验报告.docx_第3页
第3页 / 共10页
微程序控制器实验报告.docx_第4页
第4页 / 共10页
微程序控制器实验报告.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

微程序控制器实验报告.docx

《微程序控制器实验报告.docx》由会员分享,可在线阅读,更多相关《微程序控制器实验报告.docx(10页珍藏版)》请在冰豆网上搜索。

微程序控制器实验报告.docx

微程序控制器实验报告

一、实验目的

1、通过实验,进一步理解微程序控制器的组成结构。

理解微程序控制器的控制原理

2、加深理解微程序控制器的工作原理。

掌握指令流程与功能

3、理解掌握微程序控制器的设计思路与方法

二、实验内容与步骤

1、微程序控制器的组成原理

控制存储器:

实现整个指令系统的所有微程序,一般指令系统是规定的由高速半导体存储器构成,容量视机器指令系统而定,取决于微程序的个数,其长度就是微指令字的长度。

微指令寄存器:

存放从控存读出的当前微指令。

微操作控制字段将操作控制信号送到控制信号线上,微地址字段指出下一条微地址的形成。

微地址寄存器:

存放将要访问的下一条微指令地址

地址转移逻辑:

形成将要执行的微指令地址,形成方式:

取指令公操作所对应的微程序一般从控存的0地址开始,所以微程序的人口地址0是由硬件控制的。

当出现分支时,通过判别测试字段、微地址字段、和执行部件的反馈信息形成后即微地址。

Cpu设计步骤:

1.拟定指令系统

2.确定总体结构(数据通路)

3.安排时序

4.拟定指令流程。

根据指令系统,写出对应所有机器指令的全部微操作机器节拍安排,然后列出操作时间表

5.确定微指令的控制方式、下地址形成方式、微指令格式及微指令字长,编写全部的微指令的代码,最后将编写的微指令放入控制存储器中。

微程序控制器的设计步骤

(1)设计微程序

确定微程序流程图,也就是控制算法流程图。

(2)确定微指令格式

微指令格式中的操作控制字段取决于执行部件的子系统需要多少微指令。

假定采用直接控制方式,执行部件需要10个微命令,则操作控制字段需要10位。

?

?

?

测试判别字段取决于微程序流程图中有多少处分支转移。

假定有3处分支,则测试判别字段需要3位。

下址字段取决于微程序流程图的规模。

假定微程序共用50条微指令,则下址字段至少需要6位。

这是因为ROM地址译码时,26=64,6位地址可容纳64条微指令。

(3)将微程序编译成二进制代码

(4)微程序写入控制存储器

(5)设计硬件电路

三、实验现象

--CPU头文件cpu_defs

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

PACKAGEcpu_defsIS--定义程序包,包头,包体

TYPEopcodeIS(load,store,add,sub,bne);--这个语句适合于定义一些用std_logic等不方便定义的类型,综合器自动实现枚举类型元素的编码,一般将第一个枚举量(最左边)编码为0

CONSTANTword_w:

NATURAL:

=8;

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");

FUNCTIONop2slv(op:

INopcode)RETURNSTD_LOGIC_VECTORIS

BEGIN

RETURNtrans_table(op);

ENDFUNCTIONop2slv;

ENDPACKAGEBODYcpu_defs;

--实验7-8微程序控制器实验

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(19DOWNTO0);--微指令R

op_out:

OUTSTD_LOGIC_VECTOR(op_w-1DOWNTO0);--操作码

add_r_out:

OUTUNSIGNED(4DOWNTO0)--微地址R

);

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(load)&STD_LOGIC_VECTOR(TO_UNSIGNED(4,word_w-op_w)),

1=>op2slv(add)&STD_LOGIC_VECTOR(TO_UNSIGNED(5,word_w-op_w)),

2=>op2slv(store)&STD_LOGIC_VECTOR(TO_UNSIGNED(6,word_w-op_w)),

3=>op2slv(bne)&STD_LOGIC_VECTOR(TO_UNSIGNED(7,word_w-op_w)),--TO_UNSIGNED转换函数将4转换为5位“00100”

4=>STD_LOGIC_VECTOR(TO_UNSIGNED(2,word_w)),

5=>STD_LOGIC_VECTOR(TO_UNSIGNED(3,word_w)),

OTHERS=>(OTHERS=>'0'));

TYPEmicrocode_arrayISARRAY(0TO14)OFSTD_LOGIC_VECTOR(19DOWNTO0);

CONSTANTcode:

microcode_array:

=(--控制存储器

14=>"00000000000000000000");

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);

SIGNALsysbus_out:

STD_LOGIC_VECTOR(word_w-1DOWNTO0);

EGIN

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(19DOWNTO0);

VARIABLEtemp:

STD_LOGIC_VECTOR(4DOWNTO0);

BEGIN

IFreset='0'THEN

add_r:

=(OTHERS=>'0');

count<=(OTHERS=>'0');

instr_reg:

=(OTHERS=>'0');

acc:

=(OTHERS=>'0');

mdr:

=(OTHERS=>'0');

mar:

=(OTHERS=>'0');

z_flag<='0';

mem<=prog;

sysbus:

=(OTHERS=>'0');

ELSIFRISING_EDGE(clock)THEN

--microprogramcontroller

data_r:

=code(TO_INTEGER(add_r));

IFdata_r(4DOWNTO0)="01111"THEN--判断下地址

temp:

="01"&op(2DOWNTO0);

add_r:

=UNSIGNED(temp);

ELSIFdata_r(4DOWNTO0)="10000"THEN

IFz_flag='1'THEN

add_r:

="01110";

ELSE

add_r:

="01101";

ENDIF;

ELSE

add_r:

=UNSIGNED(data_r(4DOWNTO0));

ENDIF;

data_r_out<=data_r;

add_r_out<=add_r;

--PC

IFdata_r(16)='1'THEN--PC_bus='1'

sysbus:

=rfill&STD_LOGIC_VECTOR(count);

ENDIF;

IFdata_r(19)='1'THEN--load_PC='1'

count<=UNSIGNED(mdr(word_w-op_w-1DOWNTO0));

ELSIFdata_r(10)='1'THEN--INC_PC='1'

count<=count+1;

ELSE

count<=count;

ENDIF;

--IR

IFdata_r(15)='1'THEN--load_IR

instr_reg:

=mdr;

ENDIF;

IFdata_r(9)='1'THEN--Addr_bus='1'

sysbus:

=rfill&instr_reg(word_w-op_w-1DOWNTO0);

ENDIF;

op<=instr_reg(word_w-1DOWNTOword_w-op_w);

IR_out<=instr_reg;

op_out<=op;

--ALU

IFdata_r(17)='1'THEN--load_ACC='1'

acc:

=UNSIGNED(mdr);

ENDIF;

IFdata_r(11)='1'THEN--ALU_ACC='1'

IFdata_r(6)='1'THEN--ALU_add='1'

acc:

=acc+UNSIGNED(mdr);

ELSIFdata_r(5)='1'THEN--ALU_sub='1'

acc:

=acc-UNSIGNED(mdr);

ENDIF;

ENDIF;

IFdata_r(18)='1'THEN--ACC_bus='1'

sysbus:

=STD_LOGIC_VECTOR(acc);

ENDIF;

IFacc=zeroTHEN

z_flag<='1';

ELSE

z_flag<='0';

ENDIF;

acc_out<=acc;

--RAM

IFdata_r(14)='1'THEN--load_MAR='1'

mar:

=UNSIGNED(sysbus(word_w-op_w-1DOWNTO0));

ELSIFdata_r(12)='1'THEN--load_MDR='1'

mdr:

=sysbus;

ELSIFdata_r(8)='1'THEN--CS='1'

IFdata_r(7)='1'THEN--R_NW='1'

mdr:

=mem(TO_INTEGER(mar));

ELSE

mem(TO_INTEGER(mar))<=mdr;

ENDIF;

ENDIF;

IFdata_r(13)='1'THEN--MDR_bus='1'

sysbus:

=mdr;

ENDIF;

mdr_out<=mdr;

mar_out<=mar;

ENDIF;

sysbus_out<=sysbus;

ENDPROCESS;

PROCESS(mode,mem_addr)

BEGIN

--mode=0->sysbus

--mode=1->PC

--mode=2->resultofALU

--mode=3->IR

--mode=4->MAR

--mode=5->MDR

--mode=6->mem

output<=(OTHERS=>'0');

CASEmodeis

WHEN"000"=>

output<=sysbus_out;

WHEN"001"=>

output(word_w-op_w-1DOWNTO0)<=STD_LOGIC_VECTOR(count);

WHEN"010"=>

output<=STD_LOGIC_VECTOR(acc_out);

WHEN"011"=>

output<=IR_out;

WHEN"100"=>

output(word_w-op_w-1DOWNTO0)<=STD_LOGIC_VECTOR(mar_out);

WHEN"101"=>

output<=mdr_out;

WHEN"110"=>

output<=mem(TO_INTEGER(mem_addr));

WHENothers=>

output<=(OTHERS=>'Z');

ENDCASE;

ENDPROCESS;

ENDARCHITECTURE;

现象结果:

四、实验体会

原本对于控制器的设计还是一片空白,通过实验初步理解微程序控制器的组成结构。

理解微程序控制器的控制原理,加深了理解微程序控制器的工作原理。

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

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

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

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