一、协议介绍
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