MYIR-ZYNQ7000系列-zturn教程(22):對axi_stream核進行模擬以及axi_stream匯流排的初步講解
阿新 • • 發佈:2018-12-13
我這裡一共呼叫了兩個自定義的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位
已經傳輸完成了