4.8 典型實例8:使用函數實現簡單的處理器
4.8.1 實例的內容及目標
1.實例內容
本實例使用Verilog HDL設計一個簡單8位處理器,可以實現兩個8位操作數的4種操作。在設計過程中,使用了函數調用的設計方法。
2.實例目標
通過本實例,讀者應達到下面的一些目的。
· 掌握使用Verilog函數設計的方法。
· 掌握Verilog設計的一般方法。
4.8.2 原理簡介
處理器發(fā)展到現在,已經變成一個功能極其強大,設計也極為復雜的單元。現在一顆小小的CPU的運算能力遠遠的超過了以前的超級計算機的能力。雖然處理器處理能力的提高和很多方面的因素有關,可是處理器最終要完成的目標還是早期CPU設計時的那個目標,那就是使用操作碼實現對操作數的控制和計算。
在本實例中,實現的處理器是一個8位處理器,只實現簡單的4種操作:相加、相減、操作數減1和操作數加1。通過這4種操作向讀者展示如何使用Verilog語言設計看似復雜的CPU單元。
當然,這個處理器只是一個算術單元,處理器還包括很多其他的功能,在此不進行介紹,感興趣的讀者可以查閱相關的書籍,按照本實例提供的設計方向補充和完善這個處理器。
4.8.3 代碼分析
下面給出這個處理器的Verilog源代碼,讀者可以將此處理器模塊實例化至自己的工程設計中。
module mpc(instr,out);
//端口說明
input[17:0] instr; //輸入指令
output[8:0] out; //輸出結果
//內部信號說明
reg[8:0] out;
reg func; //指令中提取出的操作碼的內部變量
reg[7:0] op1,op2; //從指令中提取的兩個操作數
//函數聲明
function[16:0] code_add; //函數的定義,返回一個17位的指令
input[17:0] instr; //函數的輸入,采用與模塊輸入同樣的命名,可不同
//函數內部信號說明
reg add_func; //函數內部的操作碼變量
reg[2:0] code; //操作碼
reg[7:0] opr1,opr2; //兩個操作數
begin
code=instr[17:16]; //輸入指令instr的高2位為操作碼code
opr1=instr[7:0]; //輸入指令instr的低8位為操作數opr1
//通過case語句判斷操作碼的類型,獲得操作數opr2
case(code)
2'b00: begin
add_func=1;
opr2=instr[15:8]; //從instr中取第二個操作數
end
2'b01: begin
add_func=0;
opr2=instr[15:8]; //從instr中取第二個操作數
end
2'b10: begin
add_func=1;
opr2=8'd1; //第二個操作數取為1,實現+1操作
end
2'b11: begin
add_func=0;
opr2=8'd1; //實現-1操作
end
endcase
code_add={add_func,opr2,opr1}; //函數的返回值
end
endfunction
//函數調用模塊
always @(instr) begin
{func,op2,op1}=code_add(instr); //調用函數
if(func==1)
out=op1+op2; //實現兩數相加或操作數1加1操作
else
out=op1-op2; //實現兩數相減或操作數1減1操作
end
endmodule