我这里一共调用了两个自定义的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位
已经传输完成了