zoukankan      html  css  js  c++  java
  • 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  
  • 相关阅读:
    4种xml解析器区别
    eclipse的快捷键(常用)
    eclipse修改项目访问前缀
    oracle创建用户
    导入安全证书到jdk
    laravel 命令行输出进度条
    sql 事务的四种隔离级别
    supervisor 通过图形界面管理
    supervisor "INFO spawnerr: unknown error making dispatchers for xxx" 错误
    linux expect 的使用
  • 原文地址:https://www.cnblogs.com/luxinshuo/p/11567484.html
Copyright © 2011-2022 走看看