实验任务
在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会在完成剩余传输任务后触发中断。