空(110:nop)。
(4)微命令的设置(各标识的含义)
6. 指令流程图
指令的流程图如图 3所示,共有 8 条指令,每条指令都要经过取指令、分析指令和执行指令3个步骤。
在取指令阶段,8 条指令是一样的,首先程序计数器PC的内容通过总线送入地址寄存器MAR,存储信息,PC+1传送给PC,把读出的内容传送给指令寄存器IR 。再接下来的操作中,根据不同的指令,执行顺序也不同。 stM—>IR,PC+1—>PC add sub and jmp shl nop PC—>MAR 开始 PC→MAR PC→MAR PC→MAR PC→MAR M→PC PC→MAR 无 PC+1→PC PC+1→PC PC+1→PC PC+1→PC PC+1→PC R→ACC M→R→D M→D R→D M→D R→D M→D R→ACC M→ACC ACC ACC+D→ACC ACC-D→ACC ACC AND ACC左移→ACC D→ACC 结束 图3 指令流程图
7.微指令格式(微程序控制器)设计 微指令格式设计如表1:
控 制 信 号 ACC_bus load_ACC PC_bus load_IR load_MAR MDR_bus ALU_ACC INC_PC Addr_bus CS R_NW Reg_bus load_Reg ALU_ADD ALU_SUB ALU_AND ALU_SHL
用ACC的内容驱动总线 将总线上的数据载入ACC 用PC的内容驱动总线 将总线上的数据装载至IR 将总线上的数据装载至MAR 用MDR的内容驱动总线 用ALU的结果装载ACC PC+1并将结果存至PC中 用IR指令中的地址部分驱动总线 片选。用MAR的内容设置存储器地址 读取,不可写。当R_NW无效且CS有效时,MBR的内容存储于存储器中 用寄存器R的内容驱动总线 将总线上的数据装载至R 在ALU中执行逻辑加操作 在ALU中执行减操作 在ALU中执行与操作 在ALU中执行左移操作 表2 微指令格式 描 述 8. 微程序(微程序控制器)设计
根据微处理器的数据通路和指令系统,可得出微程序的流程图如图4所示。微程序的编码采用直接编码方法,每一个控制信号对应一位,共有17个控制信号,根据微指令格式把相关的控制信号整合到一起进行编码。
微程序流程图的下地址,可知共有25条微指令,表2给出了该模拟机微程序的编码。地址3的下地址,应该根据指令操作码来和寻址方式形成,所以将其下地址设为11111,表示如果下地址为11111时,且寻址方式标志位为0(即立即寻址),则下地址应为01 & 指令的操作码,若寻址方式
标志位为1(即寄存器寻址),则下地址应为10 & 指令的操作码。 8 sta PC_bus load_MAR INC_PC 0 CS R_NW 1 MDR_bus load_IR 2 addr_bus load_MAR 3 op 9 add 10 sub 11 an12 jmp 13 sh nop 18 5 15 CS R_NW 7 CS R_NW 16 MDR_bus ALU_ACC ALU_ADD IR_out(20 CS R_NW 21 MDR_bus ALU_ACC ALU_AND 22 CS R_NW 25 l 4 CS R_NW 6 MDR_bus load_acc IR_out( 0) 17 Reg_bus ALU_ACC ALU_ADD CS R_NW 19 MDR_bus ALU_ACC ALU_SUB ALU_ACC ALU_SRL MDR_bus load_re g
z_fla23 MDR_bus Load_PC 24 无 图4 微程序流程图
该模拟机微程序的编码如下
0=> 000000001
1=> 00000000000000 2=> 000000011 3=> 000000011
4=> 00000000000000 5=> 00000000000001 6=> 000000000 7=> 000000000
8=> 0000000000000000011011 9=> 0000000000000000011100 10=> 0000000000000000010010 11=> 0000000000000000010100 12=> 0000000000000000010110 13=> 0000000000000000011001 14=> 00000000000000 15=> 00000000000001 16=> 000000000 17=> 001000000
18=> 00000000000001 19=> 000000000
20=> 00000000000001 21=> 000000000
22=> 00000000000001 23=> 000000000
24=> 0000000000000000000000
25=> 000000000
9. VHDL实现 头文件如下: LIBRARY IEEE; USE cpu_defs IS
TYPE opcode IS (sta, add, sub, and1, jmp, shl, nop); 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 IS
TYPE optable IS ARRAY(opcode) OF STD_LOGIC_VECTOR(op_w-1 DOWNTO 0);
CONSTANT trans_table:optable :=(\ FUNCTION op2slv(op:IN opcode) RETURN STD_LOGIC_VECTOR IS BEGIN
RETURN trans_table(op); END FUNCTION op2slv;
--function slv2op(slv:in std_logic_vector) return opcode is -- variable transop:opcode; -- begin
-- for i in opcode loop
-- if slv=trans_table(i) then -- transop:=i; -- end if; -- end loop;
-- return transop; --end function slv2op; END PACKAGE BODY cpu_defs; 源程序如下:
LIBRARY IEEE; USE CPU IS
PORT( clock : IN STD_LOGIC; reset : IN STD_LOGIC;
mode : IN STD_LOGIC_VECTOR(2 DOWNTO 0); mem_addr : IN UNSIGNED(word_w-op_w-1 DOWNTO 0); output : OUT STD_LOGIC_VECTOR(word_w-1 DOWNTO 0); data_r_out : OUT STD_LOGIC_VECTOR(21 DOWNTO 0); op_out : OUT STD_LOGIC_VECTOR(op_w-1 DOWNTO 0); add_r_out : OUT UNSIGNED(4 DOWNTO 0) ); END ENTITY;
ARCHITECTURE rtl OF CPU IS
TYPE mem_array IS ARRAY (0 TO 2**(word_w-op_w)-1) OF STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);
SIGNAL mem : mem_array;
组成原理位模型机的设计
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)