【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:可以通過左上角的放大與縮小的到合適的圖形。在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章