Bootstrap

AXI STREAM外设+AXI STRAM DATA FIFO+AXI DMA总线时序观察

实验任务

在PL端搭建了基于AXI STREAM外设+AXI STRAM DATA FIFO+AXI DMA的写PS端DDR的测试环境,用ILA抓取各个环节的信号,直观感受AXI-STREAM外设开始传输和AXI DMA完成传输两个关键节点PS与PL间的AXI交互。

逻辑框图

其中,

ILA SLOT0观测AXI STREAM外设至AXI FIFO的时序(AXI-STREAM协议)

ILA SLOT1观测AXI FIFO至AXI DMA的时序(AXI-STREAM协议)

ILA SLOT2观测AXI DMA S2MM至AXI mem intercon的时序(AXI-FULL协议)

ILA SLOT3观测AXI DMA S2MM至AXI mem intercon的时序(AXI-LITE协议)

PROBE 0观测PS发送的TRANSFER START触发信号

PROBE 0观测AXI DMA发送的s2mm_introut中断信号

AXI-STREAM外设(axi_sim_data_0)的代码

`timescale 1ns / 1ps

module axi_sim_data #(
    parameter TRANS_NUM = 32'd64
    )(
    input                   sys_clk,
    input                   sys_rst_n,
    input                   trans_start,
    
    input 		            m_axis_tready,
	output   		        m_axis_tvalid,
	output [31:0]	        m_axis_tdata,
	output [3:0]            m_axis_tkeep,
//	(* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 clk_out CLK" *)
//	output				    m_axis_aclk,
	output                  m_axis_tlast
);

reg [1:0] state;
reg [31:0] r_tdata;
reg [31:0] trans_cnt;
reg r_tlast, r_tvalid;
reg trans_start_d0, trans_start_d1;

wire trans_start_posedge;

localparam  TRANS_IDLE = 2'd0,
            TRANS_ING = 2'd1,
            TRANS_DONE = 2'd2;
            
assign trans_start_posedge = (~trans_start_d1) & trans_start_d0;

always@(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) begin
        trans_start_d0 <= 1'b0;
        trans_start_d1 <= 1'b0;
    end
    else begin
        trans_start_d0 <= trans_start;
        trans_start_d1 <= trans_start_d0;
    end
end

always@(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) begin
         state <= TRANS_IDLE;
         r_tdata <= 32'b0;
         r_tvalid <= 1'b0;
    end
    else begin
        case(state)
            TRANS_IDLE: begin
                if(trans_start_posedge && m_axis_tready) begin
                    state <= TRANS_ING;
                end
                else begin
                    state <= TRANS_IDLE;
                end
            end
            TRANS_ING: begin
                if(trans_cnt < TRANS_NUM) begin
                    state <= TRANS_ING;
                    r_tvalid <= 1'b1;
                    r_tdata <= trans_cnt;
                end
                else begin
                    state <= TRANS_DONE;
                    r_tvalid <= 1'b0;
                end
            end
            TRANS_DONE: begin
                state <= TRANS_IDLE;
            end
            default: begin
                state <= TRANS_IDLE;
            end
        endcase
    end
end

always@(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) begin
         r_tlast <= 1'b0;
    end
    else begin
        if(state == TRANS_ING && trans_cnt == TRANS_NUM - 1) begin
            r_tlast <= 1'b1;
        end
        else begin
            r_tlast <= 1'b0;
        end
    end
end

always@(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) begin
         trans_cnt <= 32'b0;
    end
    else begin
        if(state == TRANS_ING)  begin
            trans_cnt <= trans_cnt + 1'b1;
        end
        else begin
            trans_cnt <= 32'b0;
        end
    end
end

//assign m_axis_aclk = sys_clk;
assign m_axis_tdata = r_tdata;
assign m_axis_tvalid = r_tvalid;
assign m_axis_tlast = r_tlast;
assign m_axis_tkeep = 4'b1111;

endmodule

AXI DMA配置

AXI STREAM DATA FIFO配置

信号捕获

1)可以看到传输256字节,总耗时284*10ns=2840ns,时钟频率为100MHz。

2)可以看到,采样点1024~1195(100MHz,耗时1710ns),ILA SLOT3(AXI-mem-intercon至AXI-DMA,AXI-LITE协议)的AW channel和W channel,分别向0x48(S2MM_DA),0x30(S2MM_DMACR)和0x58(S2MM_LENGTH)地址写入数据,值分别为0x1400000,0x17003和0x100,其中,0x100字节为写长度,0x1400000为写起始地址,均与PS端配置一致。而AR channel和R channel,分别从0x34(S2MM _DMASR),0x34(S2MM _DMASR)和0x30(S2MM_DMACR)地址读取数据,值分别为0x2,0x2和0x17003。

寄存器释义

详见PG021_axi_dma手册

3)由于AXI-FIFO为深度为512,启动后AXI-FIFO为空,因此,AXI-FiFO至AXI-STREAM外设的TREADY一直为高(AXI-FIFO空闲,准备好接收数据了),AXl-stream外设的数据可以连续写入FIFO。而AXI-DMA 至AIX-FIFO的TREADY信号只保持了4个时钟周期,因此,AXI-FIFO至AXI-DMA的传输中断,当AXI-DMA的写配置完成后,AXI-DMA 至AIX-FIFO的TREADY信号再次被拉高,AXI-FIFO的再次启动传输,直到完成。

 4)期间,AXI-DMA的S2MM至AXI-mem-intercon(AXI-FULL协议)也开始传输,由于突发长度设置为16个datawidth(此试验设置为32bit),S2MM通过Wchannel分四次完成0x100字节的数据传输,每次突发传输前S2MM通过AWchannel写目的地址。传输完成后触发S2MM_introut中断。

5)传输完成后,AXI-LITE从AXI-DMA的0x34地址读了一次数据,值为0x1002,之后又向0x34地址写入0x1000。

溢出告警

试验过程中,当AXI-DMA S2MM至AXI-mem-intercon的AWchannel向PS端写地址的次数大于等于3次时,会出现overflow标记,未找到具体的原因,推测与AXI总线的CACHE机制有关。

AXI-DMA的S2MM_introut中断触发条件推测

进一步观察时序,AXI-DMA S2MM至PS的发送过程中,写地址时AWCNT会自增,同时BCNT会自增,当AXI-DMA 收到回复时,AWCNT自减,同时BCNT自减,推测当BCNT为0时,会触发传输完成中断。

另外,经试验,在AXI-FIFO的TLSAT信号出现,且当前已完成传输的长度仍小于设置的DMA传输长度时,AXI-DMA仍会在BCNT和AWCNT为0之后产生传输完成中断,因而推测中断的产生还与缓存数据有关,若缓存数据为空,且AXI-FIFO已经指示了最后的数据,那AXI-DMA会在完成剩余传输任务后触发中断。

;