黄峻杰
(重庆邮电大学 电子信息工程(中美),重庆 400065)
21 世纪,各式各样的技术和设备不停更新换代,微处理器也不例外。对于微处理器的设计,源于其内部的功能选择。对于不同功能的微处理器,其内部的逻辑结构也会产生多种变化。本文将完全集成、测试和演示微处理器的所有部分,完成控制单元的设计,以获取和执行所有指令。测试将在ModelSim 上进行仿真,并通过电路板进行演示。
利用quartus 软件进行制作微处理器,需要掌握微处理器的构造。微处理器由IR、AC、PC、ALU、寄存器以及集成的中央处理器组成,其中IR、AC、PC、ALU、寄存器比较简单,但是中央处理器的运用比较困难[1]。笔者采用状态转移寄存器,分阶段对中央处理器进行编辑。对中央处理器的内部组成理解,采用opcode 操作数进行仿真操作。opcode 代表ALU 执行的操作,如加减乘除,是计算机最基本的部分。
通过定义和命名其他状态完成表1 内容,以控制指令集中每个指令的执行。
IR 内部包括低位处理器和高位处理器[2]。低位主要负责向随机接入寄存器RAM 输入数据(类似于计算机构造中的键盘输入)与读取;高位主要向ALU 计算器中输入内容和操作数,而操作数决定微处理器的功能。PC 内部构造主要是地址的寻址和栈中数据的存储;AC 类寄存器主要负责数据的处理。
下面使用给定的存储器数据,在执行每条指令时找出存储在每个寄存器中的数据,结果如表2 所示。
控制单元修改后的系统Verilog 代码如下。
//Huang junjie 2017215089
module control_unit2(input logic [7:0] opcode,
input logic NFLG, ZFLG, RESET, CLK, output logic[3:0] STATE,
output logic LOAD_AC, output logic LOAD_IRU,output logic LOAD_IRL, output logic LOAD_PC, output logic INCR_PC, output logic FETCH,
output logic STORE_MEM);
typedef enum logic [0:3] {START, PREPU, FETCHU,PREPL, FETCHL, STORE,
表1 相关状态的定义和命名
表2 存储在每个寄存器中的数据情况
executive1, executive2, JUMP} statetype;
statetype state, nextstate;
always_ff@(negedge CLK, posedge RESET) if(RESET)state <= START;
else state <=nextstate;
always_comb case(state)
START: nextstate=PREPU; //first run the prepu to producethe
opcode
IRL)
PREPU: nextstate = FETCHU;
FETCHU:case(opcode) //opcode default 8’h00:nextstate =PREPU;
8’h04: nextstate = executive1; default: nextstate =PREPL;
endcase
PREPL: nextstate=FETCHL; //enter the alu operation FETCHL:case(opcode)
8’h02: nextstate = executive1; //the alu who uses value
8’h06: nextstate =executive1; 8’h08: nextstate=executive1; 8’h0E: nextstate = executive1; 8’h0F:nextstate =executive1;
8’h01: nextstate = executive2; //the alu who uses MDR(from 8’h05: nextstate =executive2;
8’h07: nextstate =executive2;
8’h09: nextstate = executive2; 8’h0A: nextstate= executive2; 8’h0B: nextstate = executive2; 8’h0C:nextstate = executive2; 8’h0D: nextstate =executive2;
8’h03: nextstate = STORE; //Store the address
8’h10: nextstate= JUMP; // choose which jump circle 8’h11: nextstate = (NFLG)?JUMP:PREPU; //if NFLG=1,jump,or
get into prepu
8’h12: nextstate = (~NFLG)?JUMP:PREPU;
8’h13: nextstate = (ZFLG)?JUMP:PREPU;
8’h14: nextstate = (~ZFLG)?JUMP:PREPU; default:nextstate = PREPU;
endcase
executive1: nextstate = PREPU;
executive2: nextstate = executive1; STORE: nextstate =PREPU;
JUMP: nextstate = PREPU; endcase
assign FETCH = (state ==PREPU || state ==PREPL ||state == FETCHU || state == FETCHL);
assign LOAD_IRU = (state == FETCHU); assign LOAD_IRL = (state == FETCHL);
assign INCR_PC = (state == FETCHU || state ==FETCHL); assign LOAD_AC = (state == executive1); //relate to value assign STORE_MEM = (state == STORE);
assign LOAD_PC = (state == JUMP); assign STATE =state;
endmodule
模式选择单元的系统Verilog 代码如下。
//Huangjunjie this is used for the PC,MAR,MDR module Muxright(input logic A, B,
input logic Mode, output logic Z);
always_comb if(Mode) Z = B; else Z = A;
Endmodule
//Huangjunjie this is used for the LOAD_AC,LOAD_PC,etc module Muxleft(input logic [7:0]A, B,
input logic Mode, output logic [7:0]Z);
always_comb if(Mode) Z = B; else Z = A;
endmodule
电路图的仿真框图,如图1 所示,涉及微处理器的内部完整构造。
图1 电路图的仿真框图
仿真波形可用于检验微处理器的功能是否正确,如图2 所示。
图2 仿真波形图
可以发现,波形与计算的波形相同。就像以clk 的第一个边缘为例,MDR 加载到02,并且复位在状态1下为低电平有效。操作码变为02,PC 添加到2,并进入ALU。
微处理器的主要作用是执行各种操作运算,对于数的操作难易程度主要看微处理器的功能是否强大。微处理器的操作主要看中央处理器的运算操作能力。本文利用软件仿真的微处理器的代码逻辑是否清晰,主要是循环利用PC 和ALU 交替进行操作,而中央处理器主要负责循环递归的进行操作者的命令。quartus软件对于这类微处理器的操作比较方便,拥有最基础的合成软件逻辑门和高阶寄存器。本文提及的system verilog 代码目前只能在quartus 上执行。这类sv 代码逻辑清晰,电路结构十分严谨,对于最后集成电路的焊接、光刻、对照也十分清晰。