(五)Zedboard的AXI总线协议和接口的分析

版权声明:wahahaguolinaiyou https://blog.csdn.net/wahahaguolinaiyou/article/details/84646189

参考链接:1.http://www.itkeyword.com/doc/3294023981952946377/sdk-fpga-design
2.https://blog.csdn.net/lyfwill/article/details/81152829
学习AXI是学习ZYNQ的必备知识,所以从以下几个方向了解和学习AXI总线的接口以及协议。自定义IP核是Zynq学习与开发中的难点,AXI IP核又是十分常用的自定义IP核。要搞懂AXI IP核,就必须先了解AXI接口和AXI协议。先介绍如下:
1) AXI(Advanced eXtensible Interface)协议主要描述了主设备(Master)和从设备(Slave)之间的数据传输方式,主设备和从设备之间通过握手信号建立连接。当主设备的数据准备好时,会发出和维持VALID信号,表示数据有效;当从设备准备好接收数据时,会发出READY信号。数据只有在这两个信号都有效时才开始传输。
2) AXI协议(又称AXI4.0)包括3种:AXI4、AXI-Stream、AXI-lite。
AXI4:适用于要求数据高速传输的场合。
AXI-Stream:如FIFO,数据传输不需要地址,而是主从设备间直接进行数据的读写,主要用于高速数据传输的场合,如视频、高速AD等。
AXI-lite:可用于单个数据传输,主要用于访问一些低速外设。
3) AXI接口具有5个独立通道:WriteAddress通道、Write Data通道、Write Response通道、Read Address通道、Read Address通道、Read Data通道。
4) 读/写通道并行地进行数据交互,明显提高了数据吞吐量,对写数据,从设备会返回确认信号,这样可以保证写数据通道的安全,读/写模型分别如下。
在这里插入图片描述

分析:
读模型:主设备发送读地址占用信号给从设备→从设备将数据写入主设备,实现读操作。
写模型:主设备发送写地址占用信号给从设备→主设备将数据写入从设备→从设备回复确认收到信号,实现写操作。

补充:
AXI协议严格来讲是一个点对点的主/从接口协议,当多个外设需要互相交互数据时,我们需要加入一个AXI Interconnect模块,也就是AXI互联矩阵,AXI Interconnect的作用是将一个或多个AXI主设备连接到一个或多个AXI 从设备。AXI Interconnect IP核最多支持16个主设备和16个从设备,如果需要更多的接口可以在设计中加入多个IP核。

ZYNQ中的AXI接口包含三个类型,共9个,主要用于PS与PL的互联。
(1)AXI_HP接口(PL模块作为主设备)
包括4个,主要用于PL访问PS上的存储器。每个接口都有两个FIFO缓冲器,一个是读缓冲,一个是写缓冲。
【实例:设计视频处理时,高清的图像可由FPGA直接完成采集、预处理,然后通过AXI_HP接口将数据高速传输至DDR中,供APU(加速处理器)完成进一步的图像处理】
(2)AXI_ACP接口(PS端是从设备端)
只有1个,又叫加速器一致性端口,适合做专用指令加速器模块接口。PL端可直接从PS部分的Cache中拿到CPU的计算结果,同时也可以第一时间将逻辑加速运算的结果送至Cache中,延时很小。
(3)AXI_GP接口(PS端是主设备端)
通用AXI接口,总共有4个。可用于控制电机运转,获取传感器信号等逻辑模块的连接接口。

在这里插入图片描述

2读写逻辑小结

  1. 输入信号:
    S_AXI_ACLK :全局时钟信号

S_AXI_ARESETN:全局复位信号

S_AXI_AWADDR :写地址信号,主机发送,从机接收

S_AXI_AWPROT:写通道保护信号,这个信号标志着传输的特权与安全

S_AXI_AWVALID:写地址有效信号

S_AXI_WDATA:写数据信号,主机发送,从机接收

S_AXI_WSTRB:写选通信号,这个信号表示写字节通道保持有效,在每8位的写数据总线上有1位被选通

S_AXI_WVALID:写有效信号

S_AXI_BREADY:写答复准备好信号,这个信号表示主机可以接收到写答复信号

S_AXI_ARADDR:读地址信号

S_AXI_ARPROT:读保护信号

S_AXI_ARVALID:读地址有效信号

S_AXI_RREADY:读准备好信号,表示主机可以接收从机发送的数据并且给予答复

  1. 输出信号:

S_AXI_AWREADY:写地址准备好信号,表示从机可以接受地址

S_AXI_WREADY:写准备好信号,表示从机可以接收主机发送的数据

S_AXI_BRESP:写答复信号,标志从机是否接收到主机发送的数据

S_AXI_BVALID:写答复有效信号,表示从机接收到主机发送的数据

S_AXI_ARREADY:读地址准备好信号,表示主机可以读取数据

S_AXI_RDATA:读数据信号,从机发送,主机接收,即写入主机

S_AXI_RRESP:读答复信号,表示读数据传输的状态

S_AXI_RVALID:读有效信号,表示有效的数据已传输

  1. 4个从机寄存器(在创建AXI IP时,可以自己设定个数,如图2)

slv_reg0; slv_reg1; slv_reg2; slv_reg3;
读写逻辑示意
写://写准备好信号——写准备好地址总线被占用——写地址通道有效——写地址选择——写数据传输——写应答回复

  1. 读://读地址准备好——读总线被占用——读地址有效信号产生——读数据总线有效——读数据有效——读地址有效——主机寄存器读取数据

  2. VIVADO里面有很多自带库里面的AXI IP,但是很多时候我们需要自己定制一个合适的IP。我们在VIVADO上面创建了一个AXI IP核(创建过程见其他博文)的时候,就涉及到对总线的读和写操作。如果我们想读AXI4_Lite(常用)总线上的数据时,需关注slv_reg或者S_AXI_WDATA的数据,我们可自行添加一段代码;

reg [x:0]rlcd_rgb;

    always @( posedge S_AXI_ACLK )

            begin

              if ( S_AXI_ARESETN == 1'b0 )

                begin

                    rlcd_rgb  <= x+1'b0;

                end

              else

                begin

                    rlcd_rgb <= slv_reg0[x:0];//前面自己定义的位宽是多少就写多少
     //   或者 slv_reg0[x:0] <= S_AXI_WDATA[x: 0];
      //   或者 rlcd_rgb <= S_AXI_WDATA[x: 0];

                end

            end  

    assign lcd_rgb = rlcd_rgb; //连到lcd_rgb信号上

如果我们想对AXI4_Lite信号写数据时,我们需修改对reg_data_out的赋值,如:

//写总线测试修改

        wire[31:0]wlcd_xy;// = {10'd0,lcd_xy};

        assign wlcd_xy = {10'd0,lcd_xy};

        assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid;

        always @(*)

        begin

              // Address decoding for reading registers

              case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )

                2'h0   : reg_data_out <= wlcd_xy;//slv_reg0;   

                2'h1   : reg_data_out <= slv_reg1;

                2'h2   : reg_data_out <= slv_reg2;

                2'h3   : reg_data_out <= slv_reg3;

                default : reg_data_out <= 0;

              endcase

        end
  1. 创建好IP,生成比特流之后,在SDK端,如果我们自定义的IP的地址被映射为0x43C00000,那么我们Xil_Out32(0x43C00000,Value)写的就是slv_reg0的值。如果地址偏移4位,如
    Xil_Out32(0x43C00000 + 4,Value) 写的就是slv_reg1的值,依次类推。目前这里只有4个寄存器,那是因为之前选择的是4个,其实我们可以定义的更多。(在定制IP的时候就可以改变寄存器的个数)
    并且在ps的头文件里可以看到我们自定义的IP的地址是有个范围的

#define XPAR_MYIPFREQUENCY_0_S00_AXI_BASEADDR 0x43C00000

#define XPAR_MYIPFREQUENCY_0_S00_AXI_HIGHADDR 0x43C0FFFF

理论上只要基地址 + 偏移量不要超过HIGHADDR即可。

总结:
我们首先得认识到总线和接口以及协议的区别,其次通过分析AXI4-Lite,AXI4-Stream,AXI4总线以及三个接口,对AXI协议有一定的认识。我们再理一理AXI总线和AXI接口的关系。在ZYNQ中,支持AXI4-Lite,AXI4和AXI4-Stream三种总线协议,这前面已经说过了,要注意的是PS与PL之间的接口(AXI-GP接口,AXI-HP接口以及AXI-ACP接口)却只支持AXI-Lite和AXI协议这两种总线协议。也就是说PL这边的AXI-Stream的接口是不能直接与PS对接的,需要经过AXI4或者AXI4-Lite的转换。比如后面将用到的VDMA IP ,它就实现了在PL内部AXI4到AXI-Stream的转换,VDMA利用的接口就是AXI-HP接口。
其实,在具体设计中我们往往不需要在连接这个地方做太多工作,我们加入IP核以后,系统会自动使用AXI接口将我们的IP核与处理器连接起来,我们只需要再做一点补充就可以了。不过,这部分概念还是了解比较好。

猜你喜欢

转载自blog.csdn.net/wahahaguolinaiyou/article/details/84646189
今日推荐