1. 程式人生 > >Xilinx Vivado的使用詳細介紹(3):使用IP核

Xilinx Vivado的使用詳細介紹(3):使用IP核

ilinx Vivado的使用詳細介紹(3):使用IP核

Author:zhangxianhe

IP核(IP Core

Vivado中有很多IP核可以直接使用,例如數學運算(乘法器、除法器、浮點運算器等)、訊號處理(FFT、DFT、DDS等)。IP核類似程式設計中的函式庫(例如C語言中的printf()函式),可以直接呼叫,非常方便,大大加快了開發速度。

方式一:使用Verilog呼叫IP

這裡簡單舉一個乘法器的IP核使用例項,使用Verilog呼叫。首先新建工程,新建demo.v頂層模組。(過程參考上篇文件)

新增IP核

點選Flow Navigator中的IP Catalog。

選擇Math Functions下的Multiplier,即乘法器,並雙擊。

 

將彈出IP核的引數設定對話方塊。點選左上角的Documentation,可以開啟這個IP核的使用手冊查閱。這裡直接設定輸入訊號A和B均為4位無符號型資料,其他均為預設值,點選OK。

 

稍後彈出的視窗,點選Generate。生成的對話方塊直接點Ok。

綜合選項中的Global表示只生成RTL程式碼,然後與整個工程一起參與綜合,Out of context per IP表示生成後立即綜合。

呼叫IP核

選擇IP Sources,展開並選擇mult_gen_0 - Instantiation Template - mult_gen_0.veo,可以開啟例項化模板檔案。如圖,這段程式碼就是使用Verilog呼叫這個IP核的示例程式碼。

 

將示例程式碼複製到demo.v檔案中,並進行修改,最終如下。程式碼中聲明瞭無符號型的4位變數a和b,分別賦初值7、8,作為乘數使用;無符號型的8位變數p,用於儲存計算結果。clk為Testbench編寫的週期20ns的時鐘訊號;mult_gen_0 Mymult_gen_0 (...)語句例項化了mult_gen_0型別的模組物件Mymult_gen_0,並將clk、a、b、p作為引數傳入。

 1 module demo(
 2 );
 3 reg clk = 0;
 4 always #10 clk = ~clk;
 5 wire [3:0] a = 7;
 6 wire [3:0] b = 8;
7 wire [7:0] p; 8 mult_gen_0 Mymult_gen_0 ( 9 .CLK(clk), // input wire CLK 10 .A(a), // input wire [3 : 0] A 11 .B(b), // input wire [3 : 0] B 12 .P(p) // output wire [7 : 0] P 13 ); 14 endmodule

行為模擬驗證

以demo為頂層模組,啟動行為模擬,即可輸出波形。設定a、b、p顯示為無符號十進位制(右擊選擇Radix - Unsigned Decimal)。如圖,可以看到a=7, b=8,第一個時鐘上升沿後p = a * b = 56。

方式二:框圖(Block Design)中呼叫IP核

這裡舉一個簡單的例子,通過呼叫乘法器IP核,產生一個能計算平方的新模組。

建立框圖設計檔案

選擇Flow Navigator中的Create Block Design,建立一個框圖設計檔案。

輸入檔名並點選OK。

 新增IP核

通過啟動Add IP 嚮導來完成,或者可以在程式框圖空白處右擊選擇Add IP..,IP目錄視窗將會出現,顯示在這個設計中新增所有可能的IP。

IP核即可被新增進來,可以用導線將其與其他器件連線。

雙擊這個IP核符號,可以開啟引數設定對話方塊。點選左上方的Documentation可以檢視IP核的手冊。這裡將輸入的A、B均設定為4為無符號型,其他為預設值,點選OK確認。

 

繪製電路

右擊Diagram視窗空白處,選擇Create Port。

彈出視窗中,設定埠a為4位輸入訊號,並點選OK。

 

將a與A、B都連線起來。

同樣的方法,新增一個8位輸出埠p,與P連線。

 

再新增一個clk時鐘輸入埠,與CLK連線。

 

最終結果如圖。

單擊Tools,選擇單擊Validate Design,檢查程式框圖是否有誤,結果直接點選Ok。

模擬測試

在源窗格中,選擇系統框圖“system.bd”,右擊並選擇Generate Output Products,預設設定,直接點generate,執行結束後,點選OK。

在源窗格中,選擇系統框圖“system.bd”,右擊並選擇Create HDL Wrapper,選擇第二項 Let Vivado manage Wrapper and auto-update,選擇第一項和第二項的區別是選擇第一項表示生成的wrapper允許使用者編輯,選擇第二項表示讓Vivado管理wrapper,並自動更新,使用者對wrapper的修改會在重新建立的HDL Wrapper覆蓋。根據自己設計的情況選擇,如果生成的wrapper需要修改則選擇第一項。點選OK。

開啟生成的system_1_wrapper.v檔案如圖,紅框中的程式碼用來呼叫前面畫好的Block Design模組。

在system_1_wrapper.v檔案中,新增Testbench程式碼即可進行行為模擬。修改程式碼如下,給輸入訊號a賦初值為8,clk連線到Testbench生成的時鐘訊號c上。

 1 module system_wrapper
 2    (a,
 3     clk,
 4     p);
 5   input [3:0]a=8;
 6   input clk;
 7   output [7:0]p;
 8   wire [3:0]a;
 9   wire clk;
10   wire [7:0]p;
11   reg c = 0;
12   always #10 c <= ~c;
13   assign clk = c;
14   system system_i
15        (.a(a),
16         .clk(clk),
17         .p(p));
18 endmodule

啟動行為模擬,最終輸出的波形如下。可以看到,在clk的第一個上升沿後,就有 p = a*a = 64,即實現了平方運算。

 

呼叫官方其它IP核,方法一致,有什麼問題歡迎指導交流。