ZYNQ 、AXI协议、PS与PL内部通信

 ZYNQ 、AXI协议、PS与PL内部通信 
三种AXI总线分别为:
AXI4:(For high-performance memory-mapped requirements.)主要面向高性能地址映射通信的需求,是面向地址映射的接口,允许最大256轮的数据突发传输;
AXI4-Lite:(For simple, low-throughput memory-mapped communication )是一个轻量级的地址映射单次传输接口,占用很少的逻辑单元。
AXI4-Stream:(For high-speed streaming data.)面向高速流数据传输;去掉了地址项,允许无限制的数据突发传输规模。
AXI4总线和AXI4-Lite总线具有相同的组成部分:
(1)读地址通道,包含ARVALID, ARADDR, ARREADY信号;
(2)读数据通道,包含RVALID, RDATA, RREADY, RRESP信号;
(3)写地址通道,包含AWVALID,AWADDR, AWREADY信号;
(4)写数据通道,包含WVALID, WDATA,WSTRB, WREADY信号;
(5)写应答通道,包含BVALID, BRESP, BREADY信号;
(6)系统通道,包含:ACLK,ARESETN信号。
AXI4-Stream总线的组成:
(1)ACLK信号:总线时钟,上升沿有效;
(2)ARESETN信号:总线复位,低电平有效
(3)TREADY信号:从机告诉主机做好传输准备;
(4)TDATA信号:数据,可选宽度32,64,128,256bit
(5)TSTRB信号:每一bit对应TDATA的一个有效字节,宽度为TDATA/8
(6)TLAST信号:主机告诉从机该次传输为突发传输的结尾;
(7)TVALID信号:主机告诉从机数据本次传输有效;
(8)TUSER信号 :用户定义信号,宽度为128bit。
三种AXI接口分别是:
AXI-GP接口(4个):是通用的AXI接口,包括两个32位主设备接口和两个32位从设备接口,用过改接口可以访问PS中的片内外设。
AXI-HP接口(4个):是高性能/带宽的标准的接口,PL模块作为主设备连接(从下图中箭头可以看出)。主要用于PL访问PS上的存储器(DDR和On-Chip RAM)
AXI-ACP接口(1个):是ARM多核架构下定义的一种接口,中文翻译为加速器一致性端口,用来管理DMA之类的不带缓存的AXI外设,PS端是Slave接口。
我们可以双击查看ZYNQ的IP核的内部配置,就能发现上述的三种接口,图中已用红色方框标记出来,我们可以清楚的看出接口连接与总线的走向:
AXI协议之握手协议
AXI4所采用的是一种READY,VALID握手通信机制,简单来说主从双方进行数据通信前,有一个握手的过程。传输源产生VLAID信号来指明何时数据或控制信息有效。而目地源产生READY信号来指明已经准备好接受数据或控制信息。传输发生在VALID和READY信号同时为高的时候。VALID和READY信号的出现有三种关系:VALID先变高READY后变高,READY先变高VALID后变高,VALID和READY信号同时变高。无论什么情况信息传输立马发生在VALID和READY信号同时为高且ACLK上升沿,时序图如下:
需要强调的是,AXI的五个通道,每个通道都有握手机制,接下来我们就来分析一下AXI-Lite的源码来更深入的了解AXI机制。
突发式读
当地址出现在地址总线后,传输的数据将出现在读数据通道上。设备保持VALID为低直到读数据有效。为了表明一次突发式读写的完成,设备用RLAST信号来表示最后一个被传输的数据。
突发式写
这一过程的开始时,主机发送地址和控制信息到写地址通道中,然后主机发送每一个写数据到写数据通道中。当主机发送最后一个数据时,WLAST信号就变为高。当设备接收完所有数据之后他将一个写响应发送回主机来表明写事务完成。

PS与PL内部通信(用户自定义IP)
  先要自定义一个AXI-Lite的IP,新建工程之后,选择,菜单栏->Tools->Creat and Package IP:
选择Next>>选择Create AXI4 Peripheral>>然后Next默认,选择Next>>注意这里接口类型选择Lite,选择Next>>选择Edit IP,点击Finish:
此后,Vivado会新建一个工程,专门编辑该IP,通过该工程,我们就可以看到Vivado为我们生成的AXI-Lite的操作源码:
AXI-Lite 源码分析
当打开顶层文件的时,是一堆AXI的信号。
  1. input wire  s00_axi_aclk,

  2. input wire  s00_axi_aresetn,

  3. input wire [C_S00_AXI_ADDR_WIDTH-1 : 0] s00_axi_awaddr,

  4. input wire [2 : 0] s00_axi_awprot,

  5. input wire  s00_axi_awvalid,

  6. output wire  s00_axi_awready,

  7. input wire [C_S00_AXI_DATA_WIDTH-1 : 0] s00_axi_wdata,

  8. input wire [(C_S00_AXI_DATA_WIDTH/8)-1 : 0] s00_axi_wstrb,

  9. input wire  s00_axi_wvalid,

  10. output wire  s00_axi_wready,

  11. output wire [1 : 0] s00_axi_bresp,

  12. output wire  s00_axi_bvalid,

  13. input wire  s00_axi_bready,

  14. input wire [C_S00_AXI_ADDR_WIDTH-1 : 0] s00_axi_araddr,

  15. input wire [2 : 0] s00_axi_arprot,

  16. input wire  s00_axi_arvalid,

  17. output wire  s00_axi_arready,

  18. output wire [C_S00_AXI_DATA_WIDTH-1 : 0] s00_axi_rdata,

  19. output wire [1 : 0] s00_axi_rresp,

  20. output wire  s00_axi_rvalid,

  21. input wire  s00_axi_rready</font>
复制代码
PS向PL写数据(PS作为Master,PL作为Slave)
先来看一段WDATA相关的代码:
  1. always @( posedge S_AXI_ACLK )

  2. begin

  3.   if ( S_AXI_ARESETN == 1'b0 )

  4.     begin

  5.       slv_reg0 <= 0;

  6.       slv_reg1 <= 0;

  7.       slv_reg2 <= 0;

  8.       slv_reg3 <= 0;

  9.     end

  10.   else begin

  11.     if (slv_reg_wren)

  12.       begin

  13.         case ( axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )

  14.           2'h0:

  15.             for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )

  16.               if ( S_AXI_WSTRB[byte_index] == 1 ) begin

  17.                 // Respective byte enables are asserted as per write strobes

  18.                 // Slave register 0

  19.                 slv_reg0[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];

  20.               end  

  21.           2'h1:

  22.             for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )

  23.               if ( S_AXI_WSTRB[byte_index] == 1 ) begin

  24.                 // Respective byte enables are asserted as per write strobes

  25.                 // Slave register 1

  26.                 slv_reg1[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];

  27.               end  

  28.           2'h2:

  29.             for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )

  30.               if ( S_AXI_WSTRB[byte_index] == 1 ) begin

  31.                 // Respective byte enables are asserted as per write strobes

  32.                 // Slave register 2

  33.                 slv_reg2[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];

  34.               end  

  35.           2'h3:

  36.             for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )

  37.               if ( S_AXI_WSTRB[byte_index] == 1 ) begin

  38.                 // Respective byte enables are asserted as per write strobes

  39.                 // Slave register 3

  40.                 slv_reg3[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];

  41.               end  

  42.           default : begin

  43.                       slv_reg0 <= slv_reg0;

  44.                       slv_reg1 <= slv_reg1;

  45.                       slv_reg2 <= slv_reg2;

  46.                       slv_reg3 <= slv_reg3;

  47.                     end

  48.         endcase

  49.       end

  50.   end

  51. end</font>
复制代码
这段程序的作用是,当PS那边向AXI4-Lite总线写数据时,PS这边负责将数据接收到寄存器slv_reg。而slv_reg寄存器有0~3共4个。至于赋值给哪一个由axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]决定,根据宏定义其实就是由axi_awaddr[3:2] (写地址中不仅包含地址,而且包含了控制位,这里的[3:2]就是控制位)决定赋值给哪个slv_reg。
PS读取PL数据(PS作为Master,PL作为Slave)
我们继续来看有关RADTA读数据代码:
  1. // Output register or memory read data

  2. always @( posedge S_AXI_ACLK )

  3. begin

  4.   if ( S_AXI_ARESETN == 1'b0 )

  5.     begin

  6.       axi_rdata  <= 0;

  7.     end

  8.   else

  9.     begin    

  10.       // When there is a valid read address (S_AXI_ARVALID) with

  11.       // acceptance of read address by the slave (axi_arready),

  12.       // output the read dada

  13.       if (slv_reg_rden)

  14.         begin

  15.           axi_rdata <= reg_data_out;     // register read data

  16.         end   

  17.     end

  18. end

  19. //当PS读取数据时,程序会把reg_data_out复制给axi_rdata(RADTA读数据)。

  20. always @(*)

  21. begin

  22.       // Address decoding for reading registers

  23.       case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )

  24.         2'h0   : reg_data_out <= slv_reg0;

  25.         2'h1   : reg_data_out <= slv_reg1;

  26.         2'h2   : reg_data_out <= slv_reg2;

  27.         2'h3   : reg_data_out <= slv_reg3;

  28.         default : reg_data_out <= 0;

  29.       endcase

  30. end</font>
复制代码
    ZYNQ嵌入式设计时,用户在PL中自定义的IP相当于PS(ARM的外设),他们之间是通过AXI总线进行数据传输。创建好哦IP后,文件自动的生成,用户只需要做简单的修改,寄存器赋值就可以。
  • 2
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Zynq是一款Xilinx公司的片上系统(SoC),它将传统的处理系统(PS,即Processing System)和可编程逻辑(PL,即Programmable Logic)集成在一起。PSPL之间的通信是通过DMA(Direct Memory Access)实现的。 DMA是一种高效的数据传输方式,它可以在不经过处理器的情况下直接将数据从一个设备传输到另一个设备的内存中。在Zynq中,DMA控制器可以在PSPL之间进行数据传输,以实现高速的数据交换。 在使用ZynqPSPL之间进行通信时,首先需要在PL中实例化一个DMA控制器,并将其配置为与PS内存进行交互。然后,在PS中通过相应的软件驱动程序或API接口配置和控制DMA控制器。通过设置合适的寄存器和缓冲区,可以实现从PSPL的数据传输或从PLPS的数据传输,以及在传输过程中的中断处理。 PSPL之间的DMA通信可以实现快速的数据交换,因为数据可以直接在PL中进行处理,无需经过PS的干预。这对于需要高速数据处理的应用非常有用,比如图像处理、信号处理等。 需要注意的是,使用DMA进行PSPL之间的通信需要合理地配置和管理DMA控制器的缓冲区和寄存器,以及在PSPL之间的数据传输过程中进行正确的同步和互斥操作,以避免数据冲突和错误。 总之,Zynq PSPL之间的通信使用DMA可以实现高速的数据传输和处理,为嵌入式应用带来了更大的灵活性和高效性。 ### 回答2: Zynq系统中的PS(Processing System)与PL(Programmable Logic)之间的通信可以通过DMA(Direct Memory Access)实现。 DMA是一种特殊的数据传输机制,它可以在不需要CPU的干预下,在内存和外设之间直接传输数据。在Zynq系统中,PSPL之间的DMA通信可以通过AXI(Advanced eXtensible Interface)总线实现。 首先,在Zynq系统中,PS可以使用AXI DMA控制器来设置数据传输的源地址、目的地址、传输长度等参数。这些参数可以通过PS的程序来配置。 然后,在PL中,我们可以使用AXI接口来设计自定义的IP(Intellectual Property)核,该IP核可以与AXI DMA进行通信。这个IP核可以通过PL的开发工具进行开发和配置。 接下来,通过适当的设计和配置,我们可以在PL中连接AXI DMA核和其他IP核,以实现PSPL之间的数据传输。例如,我们可以将一个读取数据的IP核连接到AXI DMA的输入端口,将一个写入数据的IP核连接到AXI DMA的输出端口。这样,当AXI DMA启动数据传输时,读取数据的IP核将从PL的某个存储器中读取数据,然后通过DMA传输到PS的某个存储器中,而写入数据的IP核将从PS的某个存储器中读取数据,然后通过DMA传输到PL的某个存储器中。 总之,通过使用AXI DMA和适当的设计和配置,Zynq系统中的PSPL之间可以进行高效的数据传输和通信。这种方式可以提高系统的性能和可扩展性,并且降低了CPU的负载,提供了更好的系统整合能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值