版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验七、八微程序控制器设计简单CPU一、实验目的:1、通过实验,进一步理解微程序控制器的组成结构。理解微程序控制器的控制原理2、加深理解微程序控制器的工作原理。掌握指令流程与功能3、理解掌握微程序控制器的设计思路与方法二、实验原理
1、微程序控制器的组成原理控制存储器:实现整个指令系统的所有微程序,一般指令系统是规定的由高速半导体存储器构成,容量视机器指令系统而定,取决于微程序的个数,其长度就是微指令字的长度。
微指令寄存器:存放从控存读出的当前微指令。微操作控制字段将操作控制信号送到控制信号线上,微地址字段指出下一条微地址的形成。微地址寄存器:存放将要访问的下一条微指令地址
地址转移逻辑:形成将要执行的微指令地址,形成方式:取指令公操作所对应的微程序一般从控存的0地址开始,所以微程序的人口地址0是由硬件控制的。当出现分支时,通过判别测试字段、微地址字段、和执行部件的反馈信息形成后即微地址。Cpu设计步骤:拟定指令系统确定总体结构(数据通路)安排时序拟定指令流程。根据指令系统,写出对应所有机器指令的全部微操作机器节拍安排,然后列出操作时间表确定微指令的控制方式、下地址形成方式、微指令格式及微指令字长,编写全部的微指令的代码,最后将编写的微指令放入控制存储器中。指令系统是设计计算机的依据,拟定指令系统将涉及基本字长、指令格式、指令类型、寻址方式等内容根据内存的字长,可定基本字长8位,指令格式:单字长,双字长指令,在双字长指令格式中,第二个字节一般定义为操作数或操作数地址。总体结构:根据要求设计数据通路拟定指令系统。3位5位操作码地址码指令格式寻址方式直接寻址指令中给出操作数的地址指令系统load,store,add,sub,bne格式、寻址方式、指令类型设置微指令的编码操作控制字段下地址字段采用直接控制方法15个控制信号,5位下地址可根据需要扩展操作码3位,最多定义8条机器指令数据传输范围R→R,R→SS→R寻址方式
确定总体结构。寄存器、ALU、数据通路设置寄存器ACC,MDR,MAR,IR,PCALU数据通路19181716151413121110987654~0Load-PCACC-busLoad-ACCPC-busLoad-IRLoad-MARMDR-busLoad-MDRALU-ACCINC-PCAddr-busCSR-NWALU-sub下址ALU-add(1)设计微程序确定微程序流程图,也就是控制算法流程图。(2)确定微指令格式
微指令格式中的操作控制字段取决于执行部件的子系统需要多少微指令。假定采用直接控制方式,执行部件需要10个微命令,则操作控制字段需要10位。
测试判别字段取决于微程序流程图中有多少处分支转移。假定有3处分支,则测试判别字段需要3位。下址字段取决于微程序流程图的规模。假定微程序共用50条微指令,则下址字段至少需要6位。这是因为ROM地址译码时,26=64,6位地址可容纳64条微指令。(3)将微程序编译成二进制代码(4)微程序写入控制存储器(5)设计硬件电路微程序控制器的设计步骤在系统的一个基本周期(又称机器周期,一般由几个时钟周期组成)中,一组实现一定操作功能的微命令的组合,构成一条微指令。强调两点:第一,一条微指令的有效持续时间为一个系统基本周期,它表示从CM中读出微指令与执行这条微指令的时间总和。当从ROM中读出下一条微指令后,当前的这条微指令即失效。第二,一条微指令中包含若干个微命令,它们分头并行地控制执行部件进行相应的微操作。微指令除给出微命令信息外,还应给出测试判别信息。一旦出现此信息,执行这条微指令时要对系统的有关“状态标志”进行测试,从而实现控制算法流程图的条件分支。微指令中还包含一个下址字段,该字段将指明ROM中下一条微指令的地址。微程序控制器的结构与微指令的格式密切相关。上图是微程序控制器的结构框图。它由控制存储器、微地址寄存器、微命令寄存器和地址转移逻辑几部分组成。微地址寄存器和微命令寄存器两者的总长度即为一条微指令的长度,二者合在一起称为微指令寄存器。取指令PC→MAR,PC+1→PCM→MDR→IR执行addr→MAR寻址方式直接寻址指令中给出操作数的地址M→MDR→ACCLoad地址码主存中的数据读入ACC拟定指令流程和微命令序列。拟定指令流程拟定指令流程和微命令序列。微命令序列。取指令PC→MAR,PC+1→PCM→MDR→IR执行addr→MARM→MDR→ACC取指取操作数拟定指令流程和微命令序列。Load:把主存内容读入ACCStore:把ACC内容存入主存Add:主存内容与ACC相加Sub:主存内容与ACC相减Bne:转移形成控制逻辑。0001010001000000000119181716151413121110987654~0Load-PCACC-busLoad-ACCPC-busLoad-IRLoad-MARMDR-busLoad-MDRALU-ACCINC-PCAddr-busCSR-NWALU-sub下址ALU-add00000000000110000010操作码对应的编码LOAD→000,STORE→001,ADD→010,SUB→011,BNE→100内存中储存的机器指令地址指令描述0Load4从mem(4)取数到ACC1Add5从mem(5)取数到总线,与ACC中的数加2Store6结果存储在MEM(6)3Bne7结果不为0,跳到742数据253数据3其它0全为0参考设计指令编码Load400000100Add501000101Store600100110Bne701100111
机器指令的编码指令执行的基本过程取指令执行指令取操作数操作数在内存无操作数或操作数在CPU2、微程序控制器执行过程
A)从控存中逐条读出“取机器指令”用的微指令,并执行取指令公操作,执行完后,从主存读出的机器指令放入IR.B)根据IR中的操作码,经过地址形成部件得到该机器指令对应的微程序入口地址,并送入微地址寄存器。
C)从控存中逐条取出对应的微指令并执行。
D)执行完对应的的一条机器指令的一段微程序后又回到取指微程序的入口微。地址。继续A)3微指令编码法
直接控制法:就是在微指令的操作控制字段中,每一个微命令都用一位信息表示,只要将控制字段中表示该命令的相应位置1或置0就可以打开或关闭某个控制门。微命令的产生不必经过译码,【控制简单,直观、操作并行性好,缺点:微指令太长】······························上图中标明了一个基本机器周期中的控制时序信号。例如用上一周期的T4时间按微地址寄存器内容从ROM中读一条微指令,经过一段时间后被读出,用当前周期的T1时间打入到微指令寄存器。T2、T3时间用来控制执行部件进行操作。T4时间修改微地址寄存器内容并读出下一条微指令。操作码地址码地址转移逻辑IR微地址寄存器地址译码控制存储器操作控制字段顺序控制字段微命令操作信号逻辑程序入口微指令时公共操作LOADaddstoresubbneandT0PC_BLDAR,LDPCT1CE,OET2MDR_B,LDIRT3Addr_B,LDART4CE,OECE,OEACC_BLDDRCE,OECE,OECE,OET5MDR_B,LDACMDR_B,ALU_ACC,ALU_ADDCEMDR_B,ALU_ACC,ALU_SUBMDR_BLDPCDR_BALU_ACCALU_AND1安排指令时间表微程序编码00000101000100000000010100000000000110000010020000101000000000001103000001000010000011110400100010000000000000050000000000010000000006000000101000010000000700000010100000100000080000000000011000010009010000010000000001011000000000000110000110110000000000011000011112000000000001100100001310000010000000000000
19181716151413121110987654~0Load-PCACC-busLoad-ACCPC-busLoad-IRLoad-MARMDR-busLoad-MDRALU-ACCINC-PCAddr-busCSR-NWALU-sub下址ALU-add微地微地址03的下地址位01111,说明应该是根据指令操作码来形成。即下地址的低3位是指令操作码。高2位为01因此LOAD指令的开始地址是01000(也可以用其他形成方式)Load01000store01001Add01010Sub01011Bne
01100地址12的下地址,也要根据运算器的结果是否位“0”来判断,所以其下地址设为10000,以决定下地址是13还是14至于控制信号何时为“1”--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;--使用自己定义的程序包ENTITYCPUISPORT(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:=(--控制存储器 0=>"00010100010000000001", 1=>"00000000000110000010", 2=>"00001010000000000011", 3=>"00000100001000001111", 4=>"00100010000000000000", 5=>"00000000000100000000", 6=>"00000010100001000000", 7=>"00000010100000100000", 8=>"00000000000110000100", 9=>"01000001000000000101", 10=>"00000000000110000110", 11=>"00000000000110000111", 12=>"00000000000110010000", 13=>"10000010000000000000", 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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生物特征身份认证系统实现技巧课程设计
- 交互式数据新闻可视化平台设计思路课程设计
- 宠物油画手绘课程设计
- 内容运营岗位内容管理考试试卷及答案
- 背景绘画课程设计片
- 入侵检测系统课程课程设计
- 2026年幼儿园师德师风建设创新举措分享课件
- 企业成本管控培训
- 2026年危化品应急救援器材使用课件(高清可编辑课件)
- 直营门店分红方案范本
- 2026年秋苏教版新教材小学科学五年级上册教学计划及进度表
- 新教材人教版五年级上册数学教学计划及进度安排
- 制造业数字化转型:智能工厂与自动化生产
- 2026年秋季学期小学科学二年级上册教学计划附进度表
- 2026秋新版苏教版小学数学四年级上册教学计划含进度表
- 小学2026秋季学期学校工作计划
- 2026年退役军人事务员职业技能理论考试复习题库及答案
- 2026宁夏医科大学总医院自主招聘事业单位工作人员87人考试参考题库及答案详解
- 船舶电气设备的维护保养课件
- 《园林工程项目管理》课件
- 1章金融风险管理概述课件
评论
0/150
提交评论