AXI Stream传输协议的一些研究与XPS外设模板

AXI Stream 是 AMBA AXI4协议中的一部分,主要是高效的流传输.

包含的信号有

ACLK 时钟

ARESET 复位

TDATA 数据

TVALID 

TREADY

TSTRB

TKEEP

TLAST

TID

TDEST

TUSER

在XPS中Hardware-->Create or Import Peripheral

具体设置如下三图

选择 AXI4-Stream

 

这两个数值可以任意设置,不过最好设置成相等的.具体原因,看代码就知道了.

把这三项全打上勾,因为我们要用ISE进行仿真,而且我本人对VHDL几乎算一窍不通,对于Verilog还稍微能看懂一点,所以生成的IP核的语言选择Verilog

 

创建好了这个用户IP之后

可以在ISE中对其进行仿真.

创建好的IP的/hdl/Verilog文件夹中有IP的源代码,而devl/projnav文件夹中有ise工程

打开ISE工程,

选择到Simulation,并创建测试波形输入

 

我自己写的testbench如下:(我把S_AXIS_TDATA宽度改成24bit了,读取和输出的num都改成了3)

`timescale 1ns / 1ps

////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer:
//
// Create Date:   10:00:35 04/20/2014
// Design Name:   axis_24to32
// Module Name:   G:/Atyls_hdmi_osd2/pcores/axis_24to32_v1_00_a/devl/projnav/testbench.v
// Project Name:  axis_24to32
// Target Device:  
// Tool versions:  
// Description: 
//
// Verilog Test Fixture created by ISE for module: axis_24to32
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
////////////////////////////////////////////////////////////////////////////////

module testbench;

    // Inputs
    reg ACLK;
    reg ARESETN;
    reg [23:0] S_AXIS_TDATA;
    reg S_AXIS_TLAST;
    reg S_AXIS_TVALID;
    reg M_AXIS_TREADY;

    // Outputs
    wire S_AXIS_TREADY;
    wire M_AXIS_TVALID;
    wire [31:0] M_AXIS_TDATA;
    wire M_AXIS_TLAST;

    // Instantiate the Unit Under Test (UUT)
    axis_24to32 uut (
        .ACLK(ACLK), 
        .ARESETN(ARESETN), 
        .S_AXIS_TREADY(S_AXIS_TREADY), 
        .S_AXIS_TDATA(S_AXIS_TDATA), 
        .S_AXIS_TLAST(S_AXIS_TLAST), 
        .S_AXIS_TVALID(S_AXIS_TVALID), 
        .M_AXIS_TVALID(M_AXIS_TVALID), 
        .M_AXIS_TDATA(M_AXIS_TDATA), 
        .M_AXIS_TLAST(M_AXIS_TLAST), 
        .M_AXIS_TREADY(M_AXIS_TREADY)
    );

    initial begin
        // Initialize Inputs
        ACLK = 0;
        ARESETN = 0;
        S_AXIS_TDATA = 0;
        S_AXIS_TLAST = 0;
        S_AXIS_TVALID = 0;
        M_AXIS_TREADY = 0;

        // Wait 100 ns for global reset to finish
        #94;
      ARESETN = 1;  
        // Add stimulus here

    end
    
    always #1 ACLK = ~ACLK;
    
    always begin
        begin
            S_AXIS_TDATA = 1;
            S_AXIS_TVALID = 1;
            #2
            S_AXIS_TDATA = 2;
            #2
            S_AXIS_TDATA = 3;
            #2;
        end
    end
    
    always @(posedge ACLK)begin
        if(M_AXIS_TVALID == 1)
            begin
                M_AXIS_TREADY = 1;
            end
    end
      
endmodule

最终仿真波形如下:

 

对波形分析可以看出如果每个时钟上升沿的TDATA上的数据都是有效数据,那么TVALID可以一直为高,TREADY也可以一直为高,直至一次传输结束,这样的情况效率是很高的,ACLK其实是100MHz,那么传输速度理论可达100M*位宽bit/s 通常位宽32,那么就是100M*4Bytes/s = 400Mbyte/s.

 

posted @ 2014-04-20 17:04  玩电毁一生  阅读(2254)  评论(0编辑  收藏  举报