1. 程式人生 > >MYIR-ZYNQ7000系列-zturn教程(22):對axi_stream核進行模擬以及axi_stream匯流排的初步講解

MYIR-ZYNQ7000系列-zturn教程(22):對axi_stream核進行模擬以及axi_stream匯流排的初步講解

我這裡一共呼叫了兩個自定義的IP都是基於axi_stream的IP核,一個是主機master一個是從機slave,然後

將這兩個呼叫的IP例化到一個新建立的fpga工程,最後寫一個模擬指令碼讓這個master主機對這個從機

slave進行寫。

主機:

從機:

將stream介面的master和slave都例化到fpga工程的頂層檔案如下圖所示

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2018/09/06 16:16:05
// Design Name: 
// Module Name: stream_test
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module stream_test(
    input   axis_aclk,
    input   axis_aresetn
    );
    
    parameter integer C_M00_AXIS_TDATA_WIDTH	= 32;
    parameter integer C_M00_AXIS_START_COUNT    = 32;
    
    wire    [C_M00_AXIS_TDATA_WIDTH-1 : 0]      axis_tdata;
    wire    [(C_M00_AXIS_TDATA_WIDTH/8)-1 : 0]  axis_tstrb;
    wire                                        axis_tlast;
    wire                                        axis_tvalid;
    wire                                        axis_tready;
  
    
 stream_master_0 u1 (
      .m00_axis_tdata(axis_tdata),      // output wire [31 : 0] m00_axis_tdata
      .m00_axis_tstrb(axis_tstrb),      // output wire [3 : 0] m00_axis_tstrb
      .m00_axis_tlast(axis_tlast),      // output wire m00_axis_tlast
      .m00_axis_tvalid(axis_tvalid),    // output wire m00_axis_tvalid
      .m00_axis_tready(axis_tready),    // input wire m00_axis_tready
      .m00_axis_aclk(axis_aclk),        // input wire m00_axis_aclk
      .m00_axis_aresetn(axis_aresetn)  // input wire m00_axis_aresetn
    );
    
stream_slave_0 u2 (
      .s00_axis_tdata(axis_tdata),      // input wire [31 : 0] s00_axis_tdata
      .s00_axis_tstrb(axis_tstrb),      // input wire [3 : 0] s00_axis_tstrb
      .s00_axis_tlast(axis_tlast),      // input wire s00_axis_tlast
      .s00_axis_tvalid(axis_tvalid),    // input wire s00_axis_tvalid
      .s00_axis_tready(axis_tready),    // output wire s00_axis_tready
      .s00_axis_aclk(axis_aclk),        // input wire s00_axis_aclk
      .s00_axis_aresetn(axis_aresetn)  // input wire s00_axis_aresetn
    );       
    
endmodule

下面這個這個fpga工程的模擬指令碼

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2018/09/06 17:25:36
// Design Name: 
// Module Name: test_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module test_tb();
    

          reg axi_aclk;    // AXI匯流排時鐘
          reg axi_aresetn;   // 系統復位訊號
         

         
        stream_test u1(
              .axis_aclk(axi_aclk),
              .axis_aresetn(axi_aresetn)
              );
         
     
         always begin
            #10;
            axi_aclk = ~axi_aclk;
          end
         
          initial begin
            axi_aclk    = 1'b0;
            axi_aresetn = 1'b1;

         
            #10;
            axi_aresetn = 1'b0;
            #5;
            axi_aresetn = 1'b1;
            #5;
          end    
        

endmodule

這個是執行模擬指令碼後的master主機對從機進行寫

下面主要對這個stream協議的基本訊號的介紹

因這個stream協議去掉了axi_lite的很多的地址項之間的互動所以這個stream傳輸速度比較快,但因為沒有地址所以這個

master主機無法對這個從機進行讀,這裡討論的只是stream的主機對從機的寫

只有當這個axis_tvalid為高的時候傳輸的的資料才有效,也就是說這個訊號為高時才能進行資料傳輸

再來看這個axis_tready訊號,當這個axis_tready為高時說明從機已經準備好了可以接收資料了

再來看這個axis_tlast訊號,這個訊號為高時表示這個資料位本次傳輸的最後一個數據,也就這個00000008為

傳輸的最後一個數據

這個axis_tstrb為傳輸的資料位,每一位代表一個位元組,這裡為f也就是1111,四個位都為1也就是傳輸4個位元組32位資料

這個是主機對從機操作的一個簡單示意圖,因互動訊號比較少所以傳輸資料比較快,所以操作起來比較簡單

大家可以仔細比較一下axi_lite和axi_stream兩個傳輸效率,axi_lite兩個32位資料還沒有傳輸完成axi_stream的8個32位

已經傳輸完成了