【FPGA】學習筆記—{Project}—{基於Quartus Prime和ModelSim}—{任務task的使用}
一、Verilog HDL中任務:
任務的關鍵字是task,利用任務可以把一個大的程序模塊分解成很多小的子模塊,方便調試,並且能使結構清晰。
###任務(task)定義與調用的格式分別如下:
task <任務名>; //注意無端口列表
端口及數據類型聲明語句;
其他語句;
endtask
任務調用的格式爲
<任務名>(端口1,端口2,······);
任務調用時和定義時的端口變量應是一一對應的
二、實例:定義一個完成兩個操作數按位與操作的任務,然後在後面的算術邏輯單元的描述中,調用該任務完成與操作。
(一) 使用Verilog HDL語言對電路進行描述
- 新建工程:File—New Project Wizard
- 設置當前工作目錄及工程保存路徑(路徑中不能有中文及空格,可使用下劃線’_’);第二欄中填寫工程名字;第三欄是頂層文件的實體名,一般與工程名相同。(工程名的命名一般得符合標識符的命名原則)
- 無相關文件需要加入,跳過即可
- 選擇目標器件:按照實際需求選擇合適的器件即可。
- 選擇綜合器和仿真器:在Simulation一行,選擇ModelSim-Altera,表示選擇該仿真器進行仿真;Format一欄選擇Verilog HDL。
- 結束設置:出現工程信息彙總窗口(Summary)。
- 在當前工程內新建Verilog HDL文件:File—New—Verilog HDL File
- 輸入程序
代碼示例:(CSDN的Markdown編輯器好像並不支持Verilog HDL語言的高亮,借用javascript)
module alutask(code,a,b,c);
input[1:0] code; input[3:0] a,b;
output reg[4:0] c;
task my_and;
input[3:0] a,b;
output[4:0] out;
integer i; begin for(i=3;i>=0;i=i-1)
out[i]=a[i]&b[i];
end
endtask
always@(code or a or b)
begin case(code)
2'b00:my_and(a,b,c);
2'b01:c=a|b;
2'b10:c=a-b;
2'b11:c=a+b;
endcase
end
endmodule
- 保存後將alutask.v文件設置爲頂層實體;設置完成後可在Settings—General中查看。
-
- 編譯:Processing—Start Compilation;修改至零錯誤即可。
- RTL級綜合及門級綜合:可在Tools—Netlist Viewers中選擇進行RTL級綜合或者門級綜合。通過綜合器,能將文本描述的轉化爲電路網表結構,並以原理圖的形式呈現出來。
(二)、使用ModelSim進行仿真
- Test Bench仿真腳本的建立:Processing—Start—Start Test Bench Template Writer
- 在底部信息欄中可以看到Test Bench仿真腳本的保存路徑;再通過File—Open打開
- 程序編寫
代碼示例:
`timescale 100 ps/ 1 ps
module alutask_vlg_tst();
parameter DELY=100;
reg eachvec;
reg [3:0] a;
reg [3:0] b;
reg [1:0] code;
wire [4:0] c;
alutask i1 (
.a(a),
.b(b),
.c(c),
.code(code)
);
initial
begin
code=4'd0;a=4'b0000;b=4'b1111;
#DELY code=4'd0;a=4'b0111;b=4'b1101;
#DELY code=4'd1;a=4'b0001;b=4'b0011;
#DELY code=4'd2;a=4'b1001;b=4'b0011;
#DELY code=4'd3;a=4'b0011;b=4'b0001;
#DELY code=4'd3;a=4'b0111;b=4'b1001;
$display("Running testbench");
end
always
begin
@eachvec;
end
endmodule
- 保存後,再對腳本做進一步設置:
上圖中的Test bench name必須與模塊名(即下圖紅框中)相同
- 仿真:Tools—Run Simulation Tool—RTL Simulation:可以通過左上角的放大與縮小的到合適的圖形。