zoukankan      html  css  js  c++  java
  • Zedboard--AXI三部曲(二)---AXI协议学习及原生态USER IP搭建

    参考《AXI Refrence》&&《AXI_V2.0_Protocol》,演示摆脱IPIF core参与的USER IP搭建

    • 第一部分为翻译ARM的AXI SPEC,如果没兴趣,请直接跳到第二部分
    • 第二部分仍然利用Xilinx建立USER ip, 但是没有采用利用IPIF,而是采用纯VERILOG HDL代码书写
      • 避开了复杂的更改文档的步骤,修改VHDL和MPD
      • 便于建立大于32个寄存器的axi_lite外设
      • 瞻仰下三大总线最具完备性的总线的魅力

    AXI4 接口类型

    Interface

    Features

    Appilication

    AXI4 Memory Maped 接口,支持突发传输256个数据 适合高性能的外设,如存储器等
    AXI4_lite Memory Maped接口,单周期单数据传输,接口信号较少 适合简单的控制外设,如串口等
    AXI4_stream 单向高速突发传输,无突发长度限制,无地址周期 适合点对点的高速数据传输

    1.AXI基础知识

    注:关注AXI4及AXI4LITE特性

    AXI主机和从机通过interconnect进行互连和数据交换;

    Xilinx提供的AXI Interconnect IP包含兼容性的master port和slave port,有效的路由主机和从机间的传输

    1.1 基本结构

    Key Feature

    • 地址周期优先于数据周期
    • 支持多个未完成的传输
    • 支持乱序传输

    Transaction 是事务的含义,此处,翻译为传输也挺形象眨眼,包含地址,数据和响应所有的完整的传送;包含一个或者多个Transfer

      Transfer本文翻译为传送,指单个Clock周期通过VALID描述的有效的信息沟通)

    1.1.1传输通道---理解为物理连接逻辑时序的结合

           AXI协议是基于突发传输的;每次传输都在地址通道传输描述数据特性的地址和控制信息;通过写数据通道主机将数据传递给从机,通过读数据通道从机将数据传给主机

    和平 AXI用于独立的读写通道,因此读写行为可以同时进行

    • 读地址通道 :包含了读传输的地址信息和控制信息
    • 写地址通道 :包含了写传输的地址信息和控制信息
    • 读数据通道 :包含了读出的数据和相关的控制信息
    • 写数据通道 :
    • 写响应通道 :
    • ---由于读数据操作,数据到来意味着数据的成功的读取,因此不需要响应

     读操作的通道如下

    image

    写操作的通道如下: 包含写地址,写数据和写响应

       image

      每个通道都包含双向握手信号VALID 和READY

    •    VALID : 消息发出者用来表示数据或者控制信息有效
    •    READY: 消息接受者表示其可以接受数据
    1.1.2  接口与内部互连

    image

      AXI提供了单一的描述接口的方式:(针对下面三种情况)

    • 主机和互连之间
    • 互连和从机之间
    • 主机和从机之间

     AXI常用的Interconnect实现方式:(多样化)

    • 共享地址和数据总线
    • 共享地址总线和多数据总线
    • 多层结构,包含多个地址和数据总线
    1.1.3  基本传输
    1. 突发读传输
      • image
      • 流程解析
        • 当主机发出地址后,从机在下一个时钟捕捉地址,ready置高,完成地址通道传输
        • 主机同时传输一些控制信号表征突发长度和突发类型
        • 地址传输完后,读通道的数据传输开始;
        • 从机保持valid为低,直至数据完整的放到数据线上才拉高
        • 当最后一个数据输出时,从机将RLAST置高,表征为最后一个数据
        • 主机读取数据后,整个传输结束
        • --------------------------------------------
    2. 突发写传输
      • image
      • 流程解析:
        • 当主机发出地址后,从机在下一个时钟捕捉地址,ready置高,完成地址通道传输
        • 主机同时传输一些控制信号表征突发长度和突发类型
        • 主机继续开启写数据通道;每发完一个数据,都检测ready,若为高,发送下一个数据;否则等待
        • 主机发送最后一个数据时,WLAST置高,表征为突发的最后一个数据
        • 当从机接受完所有数据后,启动写响应通道;当从机发送OK后,主机捕捉,整个过程结束
    1.1.4  握手介绍向上指

      AXI总线的5个通道都有VALID和READY信号,从而允许主机和从机拥有控制传输速率的权力。

       1基本流程:
    • 发起端产生VALID表征数据或者控制信息有效
    • 接收端产生READY表征数据或者控制信息已经接受
    • 数据或者控制信息必须有效,直到READY为有效---此时传输真正发生

    image

       2.标准规定:

      了解学习一下三种状况,选择有效的应答方式,实现效能和稳定性的结合

    image

    • VALID before READY 传输:READY有效依据VALID判断
      • image
      • 不允许:VALID先有效,在READY有效前变无效
    • READY before READY 传输:单周期完成传输
      • image
      • 允许:READY先有效,在VALID前变无效
    • READY 和VALID同时传输: 通过约定的时序,二者同时有效,完美的配合!!!
      • image
      • 二者同时有效,单周期完成传输
       3.补充:
    • 针对数据通道:突发传输中,仅仅当数据有效时,VALID才可以有效;当VALID为低时,WRSTB可以为任何值
    • 针对地址通道:AWREADY或者ARREADY通常为高,实现单周期传输
    • 针对写相应通道:BVALID可以一直为高;当有效后,必须等待BREADY才可以拉低
    4.推荐的应答顺序
    • image------------读传输
    • image------------写传输
    --- 突发介绍及后续内容: 第三部分深入研究主机,进一步分析眨眼

    2.AXI-LITE基本接口演示

    ---未使用IPIF,纯verilog hdl 版本

    Notice: SIGIS

    2.1建立外设的步骤:

    step1:  选择导入已存在外设

    image

    step2: 选择IP有效路径--哪个都可以,随意

    image

    step3: IP的名字必须为小写,且为Verilog HDL Top Module的名字(软件的规定)

    image

    step4: IP包含文件的类型,至少选择HDL,如果完备的话,添加自己的说明文档;如果verilog HDL调用XLINX的IP,也需要添加相应的网表

    image

    step5: 注意选择最下端的选项!!!

    image

    step6: 添加verilog HDL文件,至少包含顶层文件(注意点NEXT时,修改相应的错误;支持文件同步,即采用外部的编辑器修改HDL

    image

    step7: 选择自己的接口类型;可以复选,意味着IP可以同时包含多个接口

    image

    step8: 针对接口类型,对应自己的PORT和接口标准的port进行对应;左侧为AXI接口port,右侧为HDL module的port

      image

    step9:选择HDL moduel 内parameter的设置,主要是BASEADDR和HIGHADDR,因此Verilog HDL

      内部必须定义此两个参数,便于后期实例化IP时,图形化界面里设置及自动分配地址(和平如有错误,请更正)

    image

    step10: 设置参数,优先级强于Verilog HDL内部的定义,模块化的设计(Perfect!)

    image

    step11: 设置端口的参数;CLOCK 和  RESET信号,必须在高级设置里,设定其属性,否则互连时,XPS无法识别

    image

    step12: OVER---向上指

    image

    -------------------------------------------------------------------------------

    NOTICE:

    • 从HDL文件导入后,一系列的GUI步骤,实际都是为了建立MPD文件;因此,当设置错误时,可以直接从MPD里修改,而不用再运行一遍GUI的流程
    • 建议大家有空看看psf_rm.pdf,了解下MPD的基本内容,后续很有用
    • 注意:由于14.5软件的问题,尽管STEP11选择属性,但生成的MPD文件里没有添加,后续应用会报错.其他版本需要大家自己探讨,希望其他版本有改善!下面奉上最根本的办法
      • MPD文件修改: ACLK和ARESETN部分,添加SIGIS

        ## Ports
        PORT ACLK = ACLK, DIR = I, SIGIS = CLK, BUS = S_AXI, ASSIGNMENT = REQUIRE
        PORT ARESETN = ARESETN, DIR = I, SIGIS = RST, BUS = S_AXI

      • 修改完后,image 或者重新启动XPS,从而使XPS重新读取MPD

    -------------------------------------------------------------------------------

    2.2 Verilog HDL源代码分析:

    2.2.1端口声明
    端口声明

    module axi_io

    #(parameter
       C_ADDR_WIDTH = 4,
       C_DATA_WIDTH = 32,
        C_BASEADDR = 0,
        C_HIGHADDR = 1
    )(
        // axi slave signals---lite
          // "_" is useful when using CIP to create ip
        input  wire                      ACLK,
        input  wire                      ARESETN,
        input  wire [C_ADDR_WIDTH-1:0]   AWADDR,
        input  wire                      AWVALID,
        output wire                      AWREADY,
        input  wire [C_DATA_WIDTH-1:0]   WDATA,
        input  wire [C_DATA_WIDTH/8-1:0] WSTRB,
        input  wire                      WVALID,
        output wire                      WREADY,
        output wire [1:0]                BRESP,
        output wire                      BVALID,
        input  wire                      BREADY,
        input  wire [C_ADDR_WIDTH-1:0]   ARADDR,
        input  wire                      ARVALID,
        output wire                      ARREADY,
        output wire [C_DATA_WIDTH-1:0]   RDATA,
        output wire [1:0]                RRESP,
        output wire                      RVALID,
        input  wire                      RREADY,
        // user signals
        output wire [1:0]               led_a,
        output wire [1:0]               led_b
    );

    • 参数在module声明时建立
    • 因为Verilog HDL作为顶层,方便添加用户自己的引脚

    2.2.2 写逻辑
    写逻辑

    //------------------------AXI LITE WRITE--------------------
      //---Handshake
    assign AWREADY = (wCState == PWIDLE);
    assign WREADY  = (wCState == PWDATA);
    assign BRESP   = 2'b00;  // OKAY
    assign BVALID  = (wCState == PWRESP);

    // wCState
    always @(posedge ACLK or negedge ARESETN) begin
        if (~ARESETN)
            wCState<= PWIDLE;
        else
            wCState <= wNState;
    end

    // wNState
    always @(*) begin
        case (wCState)
            PWIDLE:
                if (AWVALID)
                    wNState = PWDATA;
                else
                    wNState = PWIDLE;
            PWDATA:
                if (WVALID)
                    wNState = PWRESP;
                else
                    wNState = PWDATA;
            PWRESP:
                if (BREADY)
                    wNState = PWIDLE;
                else
                    wNState = PWRESP;
            default:
                wNState = PWIDLE;
        endcase
    end

       // latch internal addrese
    always @(posedge ACLK)
      begin
        if(AWVALID & AWREADY)
            waddr <= AWADDR;
      end

       // latch internal data
    always @(posedge ACLK )
      begin
        if (WVALID & WREADY)
           begin
              case(waddr)
                ADDR_LED_A_DATA :
                            regA <= WDATA[31:0];
                 ADDR_LED_B_DATA :
                            regB <= WDATA[31:0];
              endcase
          end       
      end


    • 写逻辑包含:握手信号的逻辑,写通道3个步骤的状态机实现,内部寄存器写操作的实现三部分

    2.2.3 读逻辑
    读逻辑

    //------------------------AXI LITE READ----------------------
    assign ARREADY = (rCState == PRIDLE);
    assign RDATA   = rdata; // output connect
    assign RRESP   = 2'b00;  // OKAY
    assign RVALID  = (rCState == PRDATA);
    assign raddr   = ARADDR;

    // rCState
    always @(posedge ACLK or negedge ARESETN) begin
        if (~ARESETN)
            rCState <= PRIDLE;
        else
            rCState <= rNState;
    end

    // rNState
    always @(*) begin
        case (rCState)
            PRIDLE:
                if (ARVALID)
                    rNState = PRDATA;
                else
                    rNState = PRIDLE;             
                        
            PRDATA:
                if (RREADY)
                    rNState = PRIDLE;
                else
                    rNState = PRDATA;
            default:
                rNState = PRIDLE;
        endcase
    end

    // RDATA
    always @(posedge ACLK) begin
        if (ARVALID & ARREADY) begin
            case (raddr)
                ADDR_LED_A_DATA: begin
                    rdata <= regA;
                end
                ADDR_LED_B_DATA: begin
                    rdata <= regB;
                end
            endcase
        end
    end


    读逻辑包含:握手信号的逻辑,读通道2个步骤的状态机实现,内部寄存器读操作的实现三部分


    --- 突发介绍及后续内容: 第三部分深入研究主机,进一步分析眨眼

    三部曲第二部到此结束,测试工程---https://files.cnblogs.com/sheldon-COD/axi_lite_user.zip: 往baseaddress+0x00和baseaddress+0x04可以进行读写,并且映射低两位,采用LED等显示

                                            

                                                                                                                                                                                      红玫瑰感谢老部长BW的支持

  • 相关阅读:
    javac 命令行使用总结
    电脑右键菜单的编辑(注册表操作)
    C++ —— 类模板的分离式编译
    命令行学习备份
    浏览器老是自动跳出广告垃圾网页
    SQL 事务
    Python中MySQL插入数据
    Python给数字前固定位数加零
    selenium+python3 鼠标事件
    mysql与mongodb命令对比
  • 原文地址:https://www.cnblogs.com/sheldon-COD/p/3269644.html
Copyright © 2011-2022 走看看