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  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM