一、实验目的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_defsLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEcpu_defsIS--定义程序包,包头,包体TYPEopcodeIS(load,store,add,sub,bne);--这个语句适合于定义一些用std_logic等不方便定义的类型,综合器自动实现枚举类型元素的编码,一般将第一个枚举量(最左边)编码为0CONSTANTword_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_defsISTYPEoptableISARRAY(opcode)OFSTD_LOGIC_VECTOR(op_w-1DOWNTO0);--数组有5个元素,其他均0CONSTANTtrans_table:optable:=(000,001,010,011,100);FUNCTIONop2slv(op:INopcode)RETURNSTD_LOGIC_VECTORISBEGINRETURNtrans_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);--微指令Rop_out:OUTSTD_LOGIC_VECTOR(op_w-1DOWNTO0);--操作码add_r_out:OUTUNSIGNED(4DOWNTO0)--微地址R);ENDENTITY;ARCHITECTURErtlOFCPUISTYPEmem_arrayISARRAY(0TO2**(word_w-op_w)-1)OFSTD_LOGIC_VECTOR(word_w-1DOWNTO0);--定义RAMSIGNALmem: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);EGINPROCESS(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);BEGINIFreset='0'THENadd_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--microprogramcontrollerdata_r:=code(TO_INTEGER(add_r));IFdata_r(4DOWNTO0)=01111THEN--判断下地址temp:=01&op(2DOWNTO0);add_r:=UNSIGNED(temp);ELSIFdata_r(4DOWNTO0)=10000THENIFz_flag='1'THENadd_r:=01110;ELSEadd_r:=01101;ENDIF;ELSEadd_r:=UNSIGNED(data_r(4DOWNTO0));ENDIF;data_r_out=data_r;add_r_out=add_r;--PCIFdata_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;ELSEcount=count;ENDIF;--IRIFdata_r(15)='1'THEN--load_IRinstr_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;--ALUIFdata_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=zeroTHENz_flag=