sheldon_COD

回归本源--自然科学

导航

参考《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的支持