我這裏一共調用了兩個自定義的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位
已經傳輸完成了