黃峻杰
(重慶郵電大學 電子信息工程(中美),重慶 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 代碼邏輯清晰,電路結構十分嚴謹,對于最后集成電路的焊接、光刻、對照也十分清晰。