MYIR-ZYNQ7000系列-zturn教程(19):對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位

已經傳輸完成了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章