AXI4-Stream协议总结与分析

一、协议介绍

1、AXI4_Stream适用于高速数据流,去掉了地址项,允许无限制的数据突发传输。除了总线时钟和总线复位,其他的接口信号都是以字母T开头。

2、信号接口描述:

(1)、ACLK---------时钟源-----全局时钟信号,所有信号在主时钟信号的上升沿采样。

(2)、ARESETN------复位------低电平有效。

(3)、Tvalid-------主机数据有效信号,(区别AXI4、AXI4-Lite,AXI4_Stream去掉了地址项),由主机发出,高速从机发出的数据有效。源为master。

(4)、Tdata[31:0]--主机发出的数据,数据宽度可选,32/64/1278/256 bit。源位master。

(5)、Tkeep[3:0]---字节修饰符,用于表明Tdata相关字节的内容是否为有效数据,未被Tkeep位确认的字节为空字节,视为无关字节,可以从字节流中去除。源为master。

(6)、Tlast--------主机通知从机这时最后一个数据,即为数据包的边界。源为master。

(7)、Tid---------由主机发出,Identity标识符,在存在多个stream数据传输时起作用,用于识别不同的数据流。源为master。

(8)、Tready------从机发出的接收准备好信号。

二、通信机制

  最重要的就是牢记只有 Tvalid & Tready == 1 时才能开始数据传输,Valid信号由数据传输源产生,Ready信号由目的源产生(来自米联客book,这句话总结的太经典了,因为在其他的AXI4总线进行数据读取时,主机也会产生Rready信号)。

   因为AXI4-stream去掉了地址线(依靠Tid进行数据流识别),不涉及数据的读写通信,仅涉及简单的发送与接收,减少了传输延时。

三、举例说明

 

  reg [31:0]S_AXIS_tdata;//发送数据
  reg  S_AXIS_tlast;  //突发传输的结尾
  reg S_AXIS_tvalid;  //本次传输有效
  wire FCLK_CLK0; //传输时钟
  wire s_axis_aclk;
  wire s_axis_aresetn;
  wire [3:0]S_AXIS_tkeep;//4个byte皆有效
  wire S_AXIS_tready; //接收来自从机的ready信号
  wire [0:0]gpio_rtl_tri_o;
  wire [0:0]peripheral_aresetn;
  reg [1:0] state;//状态机
  
assign S_AXIS_tkeep = 4'b1111;  
assign s_axis_aclk =  FCLK_CLK0;
assign s_axis_aresetn = peripheral_aresetn;
  
always@(posedge FCLK_CLK0)
   begin
       if(!peripheral_aresetn) begin
           S_AXIS_tvalid <= 1'b0;
           S_AXIS_tdata <= 32'd0;
           S_AXIS_tlast <= 1'b0;
           state <=0;
       end
       else begin
          case(state)
            0: begin   //等待允许发送且接收到来自从机的ready信号
                if(gpio_rtl_tri_o&& S_AXIS_tready) begin
                   S_AXIS_tvalid <= 1'b1;   //主机PL将valid位置一
                   state <= 1;
                end
                else begin
                   S_AXIS_tvalid <= 1'b0;
                   state <= 0;
                end
              end
            1:begin    //如果从机准备好,开始数据发送
                 if(S_AXIS_tready) begin
                     S_AXIS_tdata <= S_AXIS_tdata + 1'b1;
                     if(S_AXIS_tdata == 16'd510) begin  //发送完第511个数据之后置位last信号
                        S_AXIS_tlast <= 1'b1;
                        state <= 2;
                     end
                     else begin
                        S_AXIS_tlast <= 1'b0;
                        state <= 1;
                     end
                 end
                 else begin
                    S_AXIS_tdata <= S_AXIS_tdata;                   
                    state <= 1;
                 end
              end       
            2:begin  //等待从机接收完毕,准备下一次船传输
                 if(!S_AXIS_tready) begin
                    S_AXIS_tvalid <= 1'b1;
                    S_AXIS_tlast <= 1'b1;
                    S_AXIS_tdata <= S_AXIS_tdata;
                    state <= 2;
                 end
                 else begin
                    S_AXIS_tvalid <= 1'b0;
                    S_AXIS_tlast <= 1'b0;
                    S_AXIS_tdata <= 32'd0;
                    state <= 0;
                 end
              end
           default: state <=0;
           endcase
       end              
   end  

 

posted on 2019-09-22 14:47  &#128023;  阅读(4534)  评论(0编辑  收藏  举报

导航