微程序控制器实验报告
- 格式:docx
- 大小:220.01 KB
- 文档页数:17
南京工程学院计算机工程学院计算机组成与结构实验报告书实验学生班级K网络工程121实验学生姓名王云峰学号*********实验地点信息楼A115实验四微程序控制器实验同组同学李翔240121515朱赛杰240121533 实验日期12月11日一、实验目的1.掌握微程序控制器的组成及工作过程,初步掌握TEC-XP+机的数据通路。
2.理解动态微程序设计的概念,初步掌握在TEC-XP+机上设计及实现新指令的步骤。
3.从指令的微操作序列层次上理解指令的执行过程,明确指令的格式及寻址方式,初步掌握TEC-XP+机微指令的格式及各字段的含义。
二、实验内容1.理解基本指令(ADC、LDRA、CALR)的格式、数据通路、微程序流程和微指令各字段的含义,使用手拨开关输入机器指令,在单步运行方式下,观察和记录实现各指令的微码;2.理解扩展指令(ADC、LDRA、CALR)的格式、数据通路、微程序流程和微指令各字段的含义,使用手拨开关输入机器指令,在单步运行方式下,观察和记录实现各指令的微码;3.设计验证程序,验证扩展指令(ADC、LDRA、CALR)并记录验证结果。
三、实验步骤与结果1.设计新指令步骤(1).明确指令格式及功能(2).数据通路(3).画微程序流程图(4).微程序代码化---微码(5).将微码加载到微控存中(6).验证2. 运行结果【1】选择基本指令的A 组指令中的ADD指令,观察其节拍流程<1>置拨动开关SW=00000000 00000001;(表示指令ADD R0,R1 )<2>按RESET按键;指示灯Microp亮(只要选择微程序,该灯在指令执行过程中一直亮),其它灯全灭;<3>按START按键;指示灯CI3~0、SCC3~0显示1110 0000,微址和下址的指示灯全灭;(本拍完成公共操作0→PC、DI#=0)<4>按START按键;指示灯CI3~0、SCC3~0显示 1110 0000,微址指示灯显示0000 0001,下址的指示灯全灭;(本拍完成公共操作PC→AR、PC+1→PC)<5>按START按键;指示灯CI3~0、SCC3~0显示 1110 0000,微址指示灯显示0000 0010,下址的指示灯全灭;(本拍完成公共操作MEM→IR)<6>以上三步为公共操作,其它指令同;<7>按START按键;指示灯CI3~0、SCC3~0显示 0010 0000,微址指示灯显示0000 0011,下址的指示灯显示0000 0100;(本拍完成/MAP操作功能)<8>按START按键;指示灯CI3~0、SCC3~0显示 0011 0000,微址指示灯显示0000 0100,下址的指示灯显示0011 0000 (本拍执行ADD指令,DR←DR+SR 操作)。
微程序控制器组与微程序设计实验报告实验目的:1.了解微程序控制器组的组成和工作原理;2.掌握微程序设计的基本方法;3.学习使用微程序设计语言进行微程序编写;4.验证微程序的功能和正确性。
实验仪器:1.微程序控制器组;2.计算机。
实验原理:实验步骤:1.设计微指令集:根据实验要求,设计微指令的功能,并确定每个微指令的格式和编码方式。
2.设计微程序地址译码器:根据微指令的编码方式,设计地址译码器,将微指令的编码转化为实际的地址。
3.设计微程序存储器:根据微指令的格式和编码方式,设计存储器,存储微指令。
可以选择使用只读存储器或者随机存储器。
4.设计微指令执行器:根据微指令的格式和编码方式,设计执行器,执行微指令的功能操作。
可以使用组合逻辑电路或者微控制器实现。
5.进行微程序编写:使用微程序设计语言,根据微指令集的功能要求,编写微程序,并存储到微程序存储器中。
6.连接实验仪器:将微程序控制器组和计算机连接起来,确保数据传输的正确性。
7.运行实验程序:根据实验要求,执行微程序,并通过计算机输出结果。
实验结果:经过实验,微程序控制器组成功控制了计算机的各个部件的操作和数据流。
微程序设计也能够正确的控制计算机的运行,并输出了预期的结果。
实验总结:通过本次实验,我对微程序控制器组的组成和工作原理有了更深入的了解。
微程序设计是一种灵活、可扩展的指令级程序设计方法,可以根据需求设计出各种功能强大的微程序。
通过实验,我学会了使用微程序设计语言进行微程序编写,并验证了微程序的功能和正确性。
微程序控制器组的应用范围广泛,不仅可以用于计算机中,还可以应用于其他各种控制系统中。
本次实验让我对计算机控制系统的理论和实践有了更深入的了解,提高了我在计算机控制领域的专业技能。
湖南大学HUNAN UNIVERSITY 硬件基础实验2实验报告一、实验预习1.书中的图形实现微程序控制器,中间的映射逻辑究竟是怎么实现的?答:但出现分支时,预设端信号由IR决定。
IR为1时信号有效,输出为1.通过IR的值映射为下址的低三位,从而产生下址。
2.书中设计用到了强写强读,为什么要设计这个功能?答:满足用户因为没有初始化mif文件时输入数据的需要。
二、实验目的微程序控制器实验的主要任务:生成CPU里的控制信号,并使程序按正确的顺序执行。
核心部分是ROM,存放机器指令的微程序。
1、掌握微程序控制器的组成、工作原理;2、掌握微程序控制器的基本概念和术语:微命令、微操作、微指令、微程序等;3、掌握微指令、微程序的设计及调试方法;4、通过单步运行若干条微指令,深入理解微程序控制器的工作原理;二、实验电路图1附:电路图过大,请放大观察详情三、实验原理将机器指令的操作(从取指到执行)分解为若干个更基本的微操作序列,并将有关的控制信息(微命令)以微码的形式编成微指令输入到控制存储器中。
这样,每条机器指令将与一段微程序对应,取出微指令就产生微命令,以实现机器指令要求的信息传送与加工。
四、实验步骤及概述1)设计状态机部分a、编写VHDL代码如下LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY zhuangtaiji ISPORT (reset : IN STD_LOGIC := '0';clock : IN STD_LOGIC;qd : IN STD_LOGIC := '0';dp : IN STD_LOGIC := '0';tj : IN STD_LOGIC := '0';t1 : OUT STD_LOGIC;t2 : OUT STD_LOGIC;t3 : OUT STD_LOGIC;t4 : OUT STD_LOGIC);END zhuangtaiji;ARCHITECTURE BEHAVIOR OF zhuangtaiji ISTYPE type_fstate IS (idle,st1,s_st2,st4,st2,st3,s_st4,s_st3);SIGNAL fstate : type_fstate;SIGNAL reg_fstate : type_fstate;BEGINPROCESS (clock,reset,reg_fstate)BEGINIF (reset='1') THENfstate <= idle;ELSIF (clock='1' AND clock'event) THENfstate <= reg_fstate;END IF;END PROCESS;PROCESS (fstate,qd,dp,tj)BEGINt1 <= '0';t2 <= '0';t3 <= '0';t4 <= '0';CASE fstate ISWHEN idle =>IF (NOT((qd = '1'))) THENreg_fstate <= st1;ELSEreg_fstate <= idle;END IF;t1 <= '0';t2 <= '0';t3 <= '0';t4 <= '0';WHEN st1 =>IF (((tj = '1') AND NOT((dp = '1')))) THENreg_fstate <= st1;ELSIF (((dp = '1') AND NOT((tj = '1')))) THENreg_fstate <= s_st2;ELSEreg_fstate <= st2;END IF;t1 <= '1';t2 <= '0';t3 <= '0';t4 <= '0';WHEN s_st2 =>IF ((tj = '1')) THENreg_fstate <= s_st2;ELSEreg_fstate <= s_st3;END IF;t1 <= '0';t2 <= '1';t3 <= '0';t4 <= '0';WHEN st4 =>IF (((tj = '1') AND NOT((dp = '1')))) THENreg_fstate <= st4;ELSIF (((dp = '1') AND NOT((tj = '1')))) THENreg_fstate <= idle;ELSEreg_fstate <= st1;END IF;t1 <= '0';t2 <= '0';t3 <= '0';WHEN st2 =>IF (((tj = '1') AND NOT((dp = '1')))) THENreg_fstate <= st2;ELSIF (((dp = '1') AND NOT((tj = '1')))) THEN reg_fstate <= s_st3;ELSEreg_fstate <= st3;END IF;t1 <= '0';t2 <= '1';t3 <= '0';t4 <= '0';WHEN st3 =>IF (((tj = '1') AND NOT((dp = '1')))) THENreg_fstate <= st3;ELSIF (((dp = '1') AND NOT((tj = '1')))) THEN reg_fstate <= s_st4;ELSEreg_fstate <= st4;END IF;t1 <= '0';t2 <= '0';t3 <= '1';t4 <= '0';WHEN s_st4 =>IF ((tj = '1')) THENreg_fstate <= s_st4;ELSEreg_fstate <= idle;END IF;t1 <= '0';t2 <= '0';t3 <= '0';t4 <= '1';WHEN s_st3 =>IF ((tj = '1')) THENreg_fstate <= s_st3;ELSEreg_fstate <= s_st4;END IF;t1 <= '0';t2 <= '0';t3 <= '1';WHEN OTHERS =>t1 <= 'X';t2 <= 'X';t3 <= 'X';t4 <= 'X';report "Reach undefined state";END CASE;END PROCESS;END BEHAVIOR;b、新建block file选定zhaungtaiji得到电路图2)设计rom部分a、编写VHDL代码如下LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY rom ISPORT(address : IN STD_LOGIC_VECTOR (4 DOWNTO 0);q : OUT STD_LOGIC_VECTOR (27 DOWNTO 0));END rom;ARCHITECTURE SYN OF rom ISSIGNAL sub_wire0 : STD_LOGIC_VECTOR (27 DOWNTO 0);BEGINsub_wire0<="1110100100100000010101100010" WHEN address= "00001" ELSE "1001000100100000010100101000" WHEN address= "00010" ELSE "1110100100100000010100010101" WHEN address= "01001" ELSE "1001101100100000010100010110" WHEN address= "10101" ELSE "1001001100100000011100000001" WHEN address= "10110" ELSE "1110100100100000010100010111" WHEN address= "01010" ELSE "1001101100100000010100011000" WHEN address= "10111" ELSE "1001010100100000010000000001" WHEN address= "11000" ELSE "1110100100100000010100011001" WHEN address= "01011" ELSE "1001101100100000010100011010" WHEN address= "11001" ELSE "1001001100100000010100000001" WHEN address= "11010" ELSE "1001000101100000010000011011" WHEN address= "01100" ELSE "1001000100110000001100000001" WHEN address= "11011" ELSE "1110100100100000010100011100" WHEN address= "01101" ELSE "1011001100100000010100000001" WHEN address= "11100" ELSE "1110100100100000010100000011" WHEN address= "01110" ELSE "1001101100100000010100000100" WHEN address= "00011" ELSE "1001001100100000010110000101" WHEN address= "00100" ELSE "1001000101100000010000000110" WHEN address= "00101" ELSE "1001000100101001101100000001" WHEN address= "00110" ELSE "1110100100100000010100011101" WHEN address= "01111" ELSE "1001101100100000010100011110" WHEN address= "11101" ELSE "1001001100100000010110011111" WHEN address= "11110" ELSE "1001000101100000010000000111" WHEN address= "11111" ELSE "1001000100100001111100000001" WHEN address= "00111" ELSE "1011000000100000010100010011" WHEN address= "01000" ELSE "1110100100100000010100010100" WHEN address= "10011" ELSE "1001001100100000010100010011" WHEN address= "10100" ELSE"1110100100100000010100010010" WHEN address= "10001" ELSE "1001010000100000010100010001" ;q <= sub_wire0(27 DOWNTO 0);END SYN;b、新建block file选定rom得到电路图3)、整合电路图整合电路图如图1所示。
一、实验目的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_defsLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;PACKAGE cpu_defs IS --定义程序包,包头,包体TYPE opcode IS (load, store, add, sub, bne); --这个语句适合于定义一些用std_logic 等不方便定义的类型,综合器自动实现枚举类型元素的编码,一般将第一个枚举量(最左边)编码为0 CONSTANT word_w: NATURAL :=8;CONSTANT op_w: NATURAL :=3;CONSTANT rfill: STD_LOGIC_VECTOR(op_w-1 downto 0):=(others =>'0');--FUNCTIOn slv2op(slv:IN STD_LOGIC_VECTOR) RETURN opcode;FUNCTION op2slv(op:in opcode) RETURN STD_LOGIC_VECTOR;END PACKAGE cpu_defs;PACKAGE BODY cpu_defs ISTYPE optable IS ARRAY(opcode) OF STD_LOGIC_VECTOR(op_w-1 DOWNTO 0);--数组有5个元素,其他均0CONSTANT trans_table:optable :=("000", "001", "010", "011", "100");FUNCTION op2slv(op:IN opcode) RETURN STD_LOGIC_VECTOR ISBEGINRETURN trans_table(op);END FUNCTION op2slv;END PACKAGE BODY cpu_defs;--实验7-8 微程序控制器实验LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL,IEEE.NUMERIC_STD.ALL;USE WORK.CPU_DEFS.ALL;--使用自己定义的程序包ENTITY CPU ISPORT( clock : IN STD_LOGIC;--时钟reset : IN STD_LOGIC;--复位mode : IN STD_LOGIC_VECTOR(2 DOWNTO 0); --查看用mem_addr : INUNSIGNED(word_w-op_w-1 DOWNTO 0);--地址output : OUT STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);data_r_out : OUT STD_LOGIC_VECTOR(19 DOWNTO 0);--微指令Rop_out : OUT STD_LOGIC_VECTOR(op_w-1 DOWNTO 0);--操作码add_r_out : OUT UNSIGNED(4 DOWNTO 0) --微地址R);END ENTITY;ARCHITECTURE rtl OF CPU ISTYPE mem_array IS ARRAY (0 TO 2**(word_w-op_w)-1) OF STD_LOGIC_VECTOR(word_w-1DOWNTO 0);--定义RAMSIGNAL mem : mem_array;CONSTANT prog : 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'));TYPE microcode_array IS ARRAY (0 TO 14) OF STD_LOGIC_VECTOR(19 DOWNTO 0); CONSTANT code : 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");SIGNAL count : UNSIGNED(word_w-op_w-1 DOWNTO 0);SIGNAL op : STD_LOGIC_VECTOR(op_w-1 DOWNTO 0);SIGNAL z_flag : STD_LOGIC;SIGNAL mdr_out : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);SIGNAL mar_out : UNSIGNED(word_w-op_w-1 DOWNTO 0);SIGNAL IR_out : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);SIGNAL acc_out : UNSIGNED(word_w-1 DOWNTO 0);SIGNAL sysbus_out : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);EGINPROCESS(reset,clock)VARIABLE instr_reg : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);VARIABLE acc : UNSIGNED(word_w-1 DOWNTO 0);CONSTANT zero : UNSIGNED(word_w-1 DOWNTO 0):=(OTHERS =>'0')VARIABLE mdr : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);VARIABLE mar : UNSIGNED(word_w-op_w-1 DOWNTO 0);VARIABLE sysbus : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);VARIABLE microcode : microcode_array;VARIABLE add_r : UNSIGNED(4 DOWNTO 0);VARIABLE data_r : STD_LOGIC_VECTOR(19 DOWNTO 0);VARIABLE temp : STD_LOGIC_VECTOR(4 DOWNTO 0);BEGINIF reset='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');ELSIF RISING_EDGE(clock) THEN--microprogram controllerdata_r := code(TO_INTEGER(add_r));IF data_r(4 DOWNTO 0)="01111" THEN --判断下地址temp:="01" & op(2 DOWNTO 0);add_r := UNSIGNED(temp);ELSIF data_r(4 DOWNTO 0)="10000" THENIF z_flag='1' THENadd_r:="01110";ELSEadd_r :="01101";END IF;ELSEadd_r := UNSIGNED(data_r(4 DOWNTO 0));END IF;data_r_out <=data_r;add_r_out <= add_r;--PCIF data_r(16)='1' THEN --PC_bus='1'sysbus := rfill & STD_LOGIC_VECTOR(count);END IF;IF data_r(19)='1' THEN --load_PC='1'count <= UNSIGNED(mdr(word_w-op_w-1 DOWNTO 0));ELSIF data_r(10)='1' THEN --INC_PC='1'count <= count+1;ELSEcount <= count;END IF;--IRIF data_r(15)='1' THEN --load_IRinstr_reg := mdr;END IF;IF data_r(9)='1' THEN --Addr_bus='1'sysbus := rfill & instr_reg(word_w-op_w-1 DOWNTO 0);END IF;op <= instr_reg(word_w-1 DOWNTO word_w-op_w);IR_out <= instr_reg;op_out <=op;--ALUIF data_r(17)='1' THEN --load_ACC='1'acc:=UNSIGNED(mdr);END IF;IF data_r(11)='1' THEN --ALU_ACC='1'IF data_r(6)='1' THEN --ALU_add='1'acc := acc + UNSIGNED(mdr);ELSIF data_r(5)='1' THEN --ALU_sub='1'acc := acc - UNSIGNED(mdr);END IF;END IF;IF data_r(18)='1' THEN --ACC_bus='1'sysbus := STD_LOGIC_VECTOR(acc);END IF;IF acc=zero THENz_flag <='1';ELSEz_flag <='0';END IF;acc_out<= acc;--RAMIF data_r(14)='1' THEN --load_MAR='1'mar := UNSIGNED(sysbus(word_w-op_w-1 DOWNTO 0));ELSIF data_r(12)='1' THEN --load_MDR='1'mdr := sysbus;ELSIF data_r(8)='1' THEN --CS='1'IF data_r(7)='1' THEN --R_NW='1'mdr := mem(TO_INTEGER(mar));ELSEmem(TO_INTEGER(mar))<=mdr;END IF;END IF;IF data_r(13)='1' THEN --MDR_bus='1'sysbus:=mdr;END IF;mdr_out <= mdr;mar_out <= mar;END IF;sysbus_out <=sysbus;END PROCESS;PROCESS(mode,mem_addr)BEGIN--mode=0 -> sysbus--mode=1 -> PC--mode=2 -> result of ALU--mode=3 -> IR--mode=4 -> MAR--mode=5 -> MDR--mode=6 -> memoutput <= (OTHERS =>'0');CASE mode isWHEN "000" =>output<=sysbus_out;WHEN "001" =>output(word_w-op_w-1 DOWNTO 0)<= STD_LOGIC_VECTOR(count);WHEN "010" =>output <= STD_LOGIC_VECTOR(acc_out);WHEN "011" =>output <= IR_out;WHEN "100" =>output(word_w-op_w-1 DOWNTO 0) <= STD_LOGIC_VECTOR(mar_out);WHEN "101" =>output <= mdr_out;WHEN "110" =>output <= mem(TO_INTEGER(mem_addr));WHEN others =>output <= (OTHERS =>'Z');END CASE;END PROCESS;END ARCHITECTURE;现象结果:四、实验体会原本对于控制器的设计还是一片空白,通过实验初步理解微程序控制器的组成结构。
高金山、刘万成老师班微程序控制器实验综合作业安排:(2014年5月)作业内容:1、设计一条新的机器指令,该指令的功能是把一个通用寄存器的内容传送到一个内存单元ADR中,STRA [ ADR ] ,SR即:[ADR] SR注意:《1》、操作码选用要求:按实验课分组组号选择,不同组选用不同的操作码,见后面各组分配表;《2》、微地址选用要求:也是不同组选用不同的首地址,见后面各组分配表;2、实验指导书59页思考题以及60页表格内容(空表格见后面);实验报告总体要求以及作业内容1的具体要求如下:1、对于作业内容1要求写出:(1)你实验课的分组组号;(2)你组要求使用的操作码和微程序首地址;(3)新指令的指令格式;(4)指令功能;(5)每一个执行步骤的说明;(6)完整的微程序;(7)以及每一条微指令控制信号和下地址的解释说明;2、对于作业内容1要在模拟程序上实现扩展和调试验证。
给出进行扩展指令和验证调试过程的贴图;(注意:实验课不同分组的操作码和微程序首地址不同)3、完成作业内容2即59页思考题和60页填表;4、实验体会及总结;5、每个同学要独立完成一份电子版实验报告;6、实验报告命名为:学号--姓名—高老师班—微程序控制实验7、最后一次实验课(中断实验)上课之前,将电子版实验报告交到刘万成老师的邮箱1792742986@附1:作业内容1中,新指令的操作码与实验课对应的组号:附2:实验指导书59页思考题和60页设计型实验表格,见下页。
思考题:1、在进行56页到59页的实验时,你可能已经发现不同指令在执行的过程中都会经过相同的微地址,也就是说,不同指令的微程序也有公用部分。
请你找出这些公共的微指令,说明它们所做的工作。
2、总结机器指令和微程序之间的关系。
3、总结指令的一般流程。
二、设计型实验1.设计几条指令的功能、格式和执行流程,设计每条微指令各字段的具体编码值,包括控制码的各字段、下地址字段、形成下址用到的条件码。
湖南大学HUNAN UNIVERSITY硬件基础实验2实验报告一、实验预习1.书中的图形实现微程序控制器,中间的映射逻辑究竟是怎么实现的?答:但出现分支时,预设端信号由IR决定。
IR为1时信号有效,输出为1.通过IR的值映射为下址的低三位,从而产生下址。
2.书中设计用到了强写强读,为什么要设计这个功能?答:满足用户因为没有初始化mif文件时输入数据的需要。
二、实验目的微程序控制器实验的主要任务:生成CPU里的控制信号,并使程序按正确的顺序执行。
核心部分是ROM,存放机器指令的微程序。
1、掌握微程序控制器的组成、工作原理;2、掌握微程序控制器的基本概念和术语:微命令、微操作、微指令、微程序等;3、掌握微指令、微程序的设计及调试方法;4、通过单步运行若干条微指令,深入理解微程序控制器的工作原理;二、实验电路图1附:电路图过大,请放大观察详情三、实验原理将机器指令的操作(从取指到执行)分解为若干个更基本的微操作序列,并将有关的控制信息(微命令)以微码的形式编成微指令输入到控制存储器中。
这样,每条机器指令将与一段微程序对应,取出微指令就产生微命令,以实现机器指令要求的信息传送与加工。
四、实验步骤及概述1)设计状态机部分a、编写VHDL代码如下LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY zhuangtaiji ISPORT (reset : IN STD_LOGIC := '0';clock : IN STD_LOGIC;qd : IN STD_LOGIC := '0';dp : IN STD_LOGIC := '0';tj : IN STD_LOGIC := '0';t1 : OUT STD_LOGIC;t2 : OUT STD_LOGIC;t3 : OUT STD_LOGIC;t4 : OUT STD_LOGIC);END zhuangtaiji;ARCHITECTURE BEHAVIOR OF zhuangtaiji ISTYPE type_fstate IS (idle,st1,s_st2,st4,st2,st3,s_st4,s_st3);SIGNAL fstate : type_fstate;SIGNAL reg_fstate : type_fstate;BEGINPROCESS (clock,reset,reg_fstate)BEGINIF (reset='1') THENfstate <= idle;ELSIF (clock='1' AND clock'event) THENfstate <= reg_fstate;END IF;END PROCESS;PROCESS (fstate,qd,dp,tj)BEGINt1 <= '0';t2 <= '0';t3 <= '0';t4 <= '0';CASE fstate ISWHEN idle =>IF (NOT((qd = '1'))) THENreg_fstate <= st1;ELSEreg_fstate <= idle;END IF;t1 <= '0';t2 <= '0';t3 <= '0';t4 <= '0';WHEN st1 =>IF (((tj = '1') AND NOT((dp = '1')))) THENreg_fstate <= st1;ELSIF (((dp = '1') AND NOT((tj = '1')))) THENreg_fstate <= s_st2;ELSEreg_fstate <= st2;END IF;t1 <= '1';t2 <= '0';t3 <= '0';t4 <= '0';WHEN s_st2 =>IF ((tj = '1')) THENreg_fstate <= s_st2;ELSEreg_fstate <= s_st3;END IF;t1 <= '0';t2 <= '1';t3 <= '0';t4 <= '0';WHEN st4 =>IF (((tj = '1') AND NOT((dp = '1')))) THENreg_fstate <= st4;ELSIF (((dp = '1') AND NOT((tj = '1')))) THENreg_fstate <= idle;reg_fstate <= st1;END IF;t1 <= '0';t2 <= '0';t3 <= '0';t4 <= '1';WHEN st2 =>IF (((tj = '1') AND NOT((dp = '1')))) THENreg_fstate <= st2;ELSIF (((dp = '1') AND NOT((tj = '1')))) THEN reg_fstate <= s_st3;ELSEreg_fstate <= st3;END IF;t1 <= '0';t2 <= '1';t3 <= '0';t4 <= '0';WHEN st3 =>IF (((tj = '1') AND NOT((dp = '1')))) THENreg_fstate <= st3;ELSIF (((dp = '1') AND NOT((tj = '1')))) THEN reg_fstate <= s_st4;ELSEreg_fstate <= st4;END IF;t1 <= '0';t2 <= '0';t3 <= '1';t4 <= '0';WHEN s_st4 =>IF ((tj = '1')) THENreg_fstate <= s_st4;ELSEreg_fstate <= idle;END IF;t1 <= '0';t2 <= '0';t3 <= '0';t4 <= '1';WHEN s_st3 =>IF ((tj = '1')) THENreg_fstate <= s_st3;reg_fstate <= s_st4;END IF;t1 <= '0';t2 <= '0';t3 <= '1';t4 <= '0';WHEN OTHERS =>t1 <= 'X';t2 <= 'X';t3 <= 'X';t4 <= 'X';report "Reach undefined state";END CASE;END PROCESS;END BEHAVIOR;b、新建block file选定zhaungtaiji得到电路图2)设计rom部分a、编写VHDL代码如下LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY rom ISPORT(address : IN STD_LOGIC_VECTOR (4 DOWNTO 0);q : OUT STD_LOGIC_VECTOR (27 DOWNTO 0));END rom;ARCHITECTURE SYN OF rom ISSIGNAL sub_wire0 : STD_LOGIC_VECTOR (27 DOWNTO 0);BEGINsub_wire0<="1011000000100000010100000001" WHEN address= "00000" ELSE "1110100100100000010101100010" WHEN address= "00001" ELSE "1001000100100000010100101000" WHEN address= "00010" ELSE "1110100100100000010100010101" WHEN address= "01001" ELSE "1001101100100000010100010110" WHEN address= "10101" ELSE "1001001100100000011100000001" WHEN address= "10110" ELSE "1110100100100000010100010111" WHEN address= "01010" ELSE "1001101100100000010100011000" WHEN address= "10111" ELSE "1001010100100000010000000001" WHEN address= "11000" ELSE "1110100100100000010100011001" WHEN address= "01011" ELSE "1001101100100000010100011010" WHEN address= "11001" ELSE "1001001100100000010100000001" WHEN address= "11010" ELSE "1001000101100000010000011011" WHEN address= "01100" ELSE "1001000100110000001100000001" WHEN address= "11011" ELSE "1110100100100000010100011100" WHEN address= "01101" ELSE "1011001100100000010100000001" WHEN address= "11100" ELSE "1110100100100000010100000011" WHEN address= "01110" ELSE "1001101100100000010100000100" WHEN address= "00011" ELSE "1001001100100000010110000101" WHEN address= "00100" ELSE "1001000101100000010000000110" WHEN address= "00101" ELSE "1001000100101001101100000001" WHEN address= "00110" ELSE "1110100100100000010100011101" WHEN address= "01111" ELSE "1001101100100000010100011110" WHEN address= "11101" ELSE "1001001100100000010110011111" WHEN address= "11110" ELSE "1001000101100000010000000111" WHEN address= "11111" ELSE "1001000100100001111100000001" WHEN address= "00111" ELSE "1011000000100000010100010011" WHEN address= "01000" ELSE"1110100100100000010100010100" WHEN address= "10011" ELSE "1001001100100000010100010011" WHEN address= "10100" ELSE "1011000000100000010100010001" WHEN address= "10000" ELSE "1110100100100000010100010010" WHEN address= "10001" ELSE "1001010000100000010100010001" ;q <= sub_wire0(27 DOWNTO 0);END SYN;b、新建block file选定rom得到电路图3)、整合电路图整合电路图如图1所示。
组成原理No.4实验---微程序控制器实验组员:组号:21号时间:周二5、6节【实验目的】(1)掌握时序发生器的组成原理。
(2)掌握微程序控制器的组成原理。
(3)掌握微程序的编制、写入、观察微程序的运行情况【实验设备】TDN-CM++,【实验原理】微程序控制器的基本任务是完成当前指令的翻译和执行,即将当前指令的功能转换成可以控制硬件逻辑部件工作的微命令序列,以完成数据传输和各种处理操作。
它的执行方法就是将控制各部件动作的微命令的集合进行编码,即将微命令的集合仿照机器指令一样,用数字代码的形式表示,这种表示称为微指令。
这样就可以用一个微指令序列表示一条机器指令,这种微指令序列称为微程序。
微程序存储在一种专用的存储器中,该存储器称为控制存储器。
实验所用的时序控制电路框图如图1可产生四个等间隔的时序信号TS1~TS4。
在图1中,为时钟信号,由实验台左上方的方波信号源提供,可产生频率及脉宽可调额方波信号;STEP是来自实验板上方中部的一个二进制开关STEP的模拟信号;START键是来自实验板上方左部的一个微动开关START的按键信号。
当STEP开关为EXEC(0TS1~TS4将周而复始地发送出去。
当STEP为STEP(1)时,按下START启动键,机器便处于单步运行状态,即此时只发送一个CPU周期的时序信号就停机了。
利用单步方式,每次只读一条微指令,可以观察微指令的代码与当前微指令的执行结果。
另外,如果STEP开关置“STEP”,会使机器停机,CLR开关执行1→0→1操作可以使时序清零。
时序状态图如下图所示。
由于时序电路的内部线路已经连好,因此只需将时序电路与方波信号源连接,即将时序电路的时钟脉冲输入端接至方波信号发生器输入端H23上,按动启动键START后,就可产生时序信号TS1~TS4.时序电路的CLR已接至CLR模拟开关上。
编程开关具有三种状态:PROM(编程)、READ(校验)和RUN(运行)。
微程序控制器实验报告北京交通大学一、实验目的通过看懂教学计算机中已经设计好并正常运行的数条基本指令(例如:ADD、MVRR、RET等指令)的功能、格式和执行流程,然后自己设计几条指令的功能、格式和执行流程,并在教学计算机上实现、调试正确。
其最终要达到:1.深入理解计算机微程序控制器的组成和运行原理;2.深入地学习计算机各类典型指令的执行流程;3.对指令格式、寻址方式、指令系统、指令分类等建立具体的总体概念;4.学习微程序控制器的设计过程和相关技术。
二、实验内容综合型实验思考题1:在进行56页到59页的实验时,你可能已经发现不同指令在执行的过程中都会经过相同的微地址,也就是说,不同指令的微程序也有公用部分。
请你找出这些公共的微指令,说明它们所做的工作。
答:公共指令如下:(1)微址为00下址为00的指令,所做工作为:给出微程序的首地址并在启动时执行;(2)微址为30下址为3A的指令,所做工作为:完成检查中断请求。
思考题2:总结机器指令和微程序之间的关系。
答:机器指令和微程序之间的关系总结如下:(1)一条机器指令对应一个微程序,这个微程序是由若干条微指令构成的。
即,一条机器指令所完成的操作划分成若干条微指令来完成,由微指令编成的微程序进行解释和执行;(2)从指令与微指令,程序与微程序,地址与微地址的一一对应关系上看,前者与内存储器有关,而后者与控制存储器有关,与此相关也有相对应的硬设备;(3)机器指令是把程序员编写的程序经编译以后成为机器能执行的以二进制码形式表示的指令;在微程序控制的计算机中通过执行一串微指令完成一条指令的功能;思考题3:总结指令的一般流程。
答:流程如下图:设计型实验1设计几条指令的功能、格式和执行流程,设计每条微指令各字段的具体编码值,包括控制码的各字段、下地址字段、形成下址用到的条件码。
写出指令格式、指令功能、执行流程及对应的微程序,确定各步的控制信号。
设计一条新的机器指令,该指令的功能是把一个通用寄存器的内容与一个内存单元ADR中的内容相加,结果保存到另外一个通用寄存器中,即:DR <- [ADR] + SR1.实验课的分组组号:第1组;2.小组要求使用的操作码和微程序首地址:操作码71H,微程序首地址51H;3.新指令的指令格式:双字长指令:1-8位操作码:01110001;9-12位DR:0000;13-16位SR:0000;17-32位ADR:0000 0000 0000 0000。
实验报告专业:计算机科学与技术班级:计算机科学与技术(1)班学号:201024131147姓名:赵倩倩课程名称:计算机组成原理学年:2010—2011 学期1课程类别:专业必修试验时间:2011年11月28日实验名称:微程序控制实验实验目的和要求:实验目的:1.掌握微程序控制器的组成原理2.为模型机定义五条机器指令,并编写相应的微程序3.掌握微程序的编制,写入,观察微程序的运行实验要求:按实验目的完成相应的操作,将实验结果记下并分析实验总结。
实验软硬件要求:TDN-CM++计算机组成原理教学实验系统一台,排线若干。
实验内容,方法和步骤(可附页)实验原理:1.时序控制电路:控制器的功能是产生执行指令所需的控制信号,但执行指令时所需的控制信号是依赖于具体计算机的数据通路的,电路框图如下数据通路结构图Ø:始终脉冲输入端,接到方波发生器的输出(H23),W1调节频率,W2调脉宽。
START键是实验板上一个微动开关START的按键信号。
STEP(单步开关)STEP开关为0时(EXEC),一旦按下启动键,时序信号TS0—TS3将周而复始地发送出去。
STOP:拨动开关,STOP停机;RUN,运行。
CLR:拨动开关,时序清零。
TS0—TS3等间隔的时序信号输出。
实验模型机有五条指令:IN(输入)ADD(加法)STA(存数)OUT(输出)JMP(无条件转移)指令对应的参考微程序流程2.微程序控制电路微程序控制电路组成:控制存储器,微命令寄存器,微地址寄存器。
编程开关:PROM(编程),根据微地址和微指令格式将微指令二进制代码写入到控制存储器中。
READ(校验):可以对写入控制存储器中的二进制代码进行验证。
RUN(运行):只要给出微地址的入口微地址,则可以根据微程序流程图自动执行微程序。
3.微指令格式微指令字长共24位,其中UA5—UA0为6位的后续微地址,A,B,C为三个译码器字段,分别由三个控制位译码出多位。
微程序控制器实验 预习报告 1. 微程序控制器的组成和工作原理。 微程序控制器主要由控制存储器、
微指令寄存器和地址转移逻辑三大部分组成。 其工作原理分为:一、将程序和数据通过输入设备送入存储器; 二、启动运行 后,从存储器中取出程序指令送到控制器去识别, 分析该指令要求什么事; 三、 控制器根据指令的含义发出相应的命令(如加法、减法),将存储单元中存放的 操作数据取出送往运算器进行运算, 再把运算结果送回存储器指定的单元中; 四、 运算任务完成后,就可以根据指令将结果通过输出设备输出 2.微程序、微指令、微命令之间的关系。 一系列微指令的有序集合称
为微程序。 在微程序控制方式之下, 从控制存储器中取出, 完成一个或几个微操作的命令称 为微指令。 控制部件通过控制线向执行部件发出各种控制命令 , 通常把这种控制命令叫做微 命令。 所以总的来说:微程序包含微指令,而每条微指令包含的微命令控制。 3. 微指令、微程序的设计及调试。
在微程序流程图中, 根据每个状态的微指令, 将其进行编码, 设计出所需硬件及 执行效率较高的微程序控制电路,然后进行调试。
思考题: 1. 举例说明实验中出现的基本概念:微命令、微操作、微指令、微程序?
微命令:控制器发出的每个控制信号,如对运算单元的控制 m cn s3 s2 s1 s0 发出的 010101 等。 微操作:由微命令控制实现的最基本的操作称为微操作。如发出运算器加 运算的微命令后,运算器进行加法计算,就称为微操作。 微指令:完成一个或几个微操作的指令。如控制器进行存数据的命令后, 需要有 we信号有效, pc 保持,来控制这些的指令即为微指令。 微程序:微程序包含微指令。如微
程序流程中包括很多微指令控制,进行 一些加减运算,存储数据,地址自加一等等。 2. 解释并比较微程序控制器的几种设计方法? 微序列控制器通过吧控制
信号存储在一个查找 Rom,(1) 用水平编码生成微操 作 (2) 用垂直编码生成微操作 (3) 从微代码直接产生控制信号。 3. 微程序控制器的控制对象、手段及方法?控制器如何取指令? 微程序
控制器控制对象分为硬件方面和软件方面,硬件方面为数据通路的 控制信号,软件方面为测试程序的控制信号。 控制器根据状态机的不同状态进行指令读取,在不同状态下取得的指令也 不同。 4. 控制器的功能?如何取指令、分析指令、执行指令? 通过下址取得指
令,根据控制信号进行不同信号的开启或关闭也就是分析 指令,然后再在控制信号的作用下执行指令。 5. 下址的产生方法?常用的有哪些,实验中用到了哪些? A:计数器方
式――在顺序执行微指令时,后续微指令地址由现行微指令 加上一个增量来产生;在非顺序执行微指令时,必须在执行现行微指令后, 转去执行指定后续微指令地址的下一条微指令。 B:增量方式与断定方式的结合――微指令的顺序控制字段分成两部分: 条件选择字段与转移地址字段 . 由这两个字段结合,当转移条件满足时, 将转移地址字段作下一个微地址;若无转移要求,则直接从微程序计数器 中取得下一条微指令 . 一般用于微指令执行时,需要外部判断条件的场 合。 C:多路转移方式――当微程序不产生分支时,后续微地址直接由微指令 的顺序控制字段给出;否则有若干个后续地址可以选择,此时必须由顺序 控制字段的"判别测试"和"状态条件"信息来选择其中一个微地址 一般用于有多个转移且可以使用组合逻辑设计转移地址逻辑的场合。 实验中用到了多路转移方式。 6. 每条机器指令的指令码如何与其入口微地址对应?微程序分支如何处
理? 通过编码方式,将指令码的状态分成不同的几个,再运用微地址进行编码, 对不同的指令码编程不同的地质,一一对应。 在不同分支出现时利用临时寄存器 IR 对几个分支进行编码,映射为不同状 态。 7. 如何简化微程序流程图,使其 ADD、AND指令在部分微指令中合并?
(如 AR→RAM、RAM→DR2、R5→DR1) 只对 ALU 部分的下址进行区分,其他部分用同样的下址即可,这样可以省 去一个 IR 的编码状态。 8. 电路设计过程中如果出现多个状态机怎么办? 将不同状态机的控制信
号进行区分, 在不同控制信号作用下进行多个状态机的控 制。
实验日志 11月 10日
对微指令的复习和理解,明白了下址的控制方法但是对电路中 P1 的意义不太理 解。 经过看微程序流程图,发现 P1 在 ldir 需要进行下载时有效,所以 P1即为控制 临时存储器 IR 的控制信号,该控制信号由流程图中第四步中有效,来控制 IR 的下址是否有效。 11月 12日
编写 ROM时发现 P1 具体为 1 的状态不同会出现不能强读强写,所以将 P1 为 1 改为当 RAM数据传到 IR 时令其有效,得到正确波形。 11月 18日
仿真时发现 ar 的第一个地址不正确,应该为 00H 但是却是个不是个确定的值。 经分析发现第一个 ar 值应该为 sw输入到总线上, 而总线的值没有 k 输入,所以 将 k 的输入设定为 00H,得到的仿真结果正确。
实验报告 ROM部分代码(只显示编码部分) : Sw r4b r5b alu pcbus dr1 dr2 r4l r5l m cn s3 s2 s1 s0 we rd pclr pcld pcen
ldar ldir p1 下址五位 "0111100000000000010100000001" when address="00000" ELSE--SW-->PC "1111000000000000011110000010" when address="00001" ELSE--PC-->AR PC=PC+1 "1111100000000000110001101000" when address="00010" ELSE--RAM-->IR "1111000000000000011110010101" when address="01001" ELSE--LDA1:PC-->AR PC=PC+1 "1111100000000000110010010110" when address="10101" ELSE--LDA2: RAM--> AR "1111100010000000110000000001" when address="10110" ELSE--LDA3:RAM-->R5 "1111000000000000011110010111" when address="01010" ELSE--STA1: PC-->AR PC=PC+1 "1111100000000000110010011000" when address="10111" ELSE--STA2:RAM --> AR "1101100000000001010000000001" when address="11000" ELSE--STA3:R5-->RAM "1111000000000000011110011001" when address="01011" ELSE--OUT1: PC-->AR PC=PC+1 "1111100000000000110010011010" when address="11001" ELSE--OUT2: RAM --> AR "1111100000000000110000000001" when address="11010" ELSE--OUT3:RAM-->BUS "1101110000000000010000011011" when address="01100" ELSE--COM1 :R5-->DR1 "1110100011000000010000000001" when address="11011" ELSE--COM2:/ALU-->R5 "1111000000000000011110011100" when address="01101" ELSE--JMP1:PC-->AR PC=PC+1 "1111100000000000110100000001" when address="11100" ELSE--JMP2:RAM-->PC "1111000000000000011110000011" when address="01110" ELSE--ADD1:PC-->AR PC=PC+1 "1111100000000000110010000100" when address="00011" ELSE--ADD2:RAM-->AR "1111101000000000110000000101" when address="00100" ELSE--ADD3:RAM-->DR2 "1101110000000000010000000110" when address="00101" ELSE--ADD4:R5-->DR1 "1110100010110010010000000001" when address="00110" ELSE--ADD5:ALU--R5 加 "1111000000000000011110011101" when address="01111" ELSE--AND1:PC-->AR PC=PC+1 "1111100000000000110010011110" when address="11101" ELSE--AND2:RAM-->AR "1111101000000000110000011111" when address="11110" ELSE--AND3:RAM-->DR2 "1101110000000000010000000111" when address="11111" ELSE--AND4:R5-->DR1 "1110100011010110010000000001" when address="00111" ELSE--AND5:ALU--R5 101011and "0111100000000000010100010001" when address="10000" ELSE--KWE1:SW-->PC "1111000000000000011110010010" when address="10001" ELSE--KWE2:PC-->AR PC=PC+1 "0111100000000001010000010001" when address="10010" ELSE--KWE3:SW-->RAM "0111100000000000010100010011" when address="01000" ELSE--KWE1:SW-->PC "1111000000000000011110010100" when address="10011" ELSE--KWE2:PC-->AR PC=PC+1 "1111100000000000110000010011" when address="10100" ELSE--KWE3:RAM-->BUS "1111100000000000100010000000";