一、協議介紹
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