0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PS/PL之间的数据交互办法

YCqV_FPGA_EETre 来源:FPGA开发圈 作者:FPGA开发圈 2020-09-15 09:27 次阅读

01 概述

MPSoC是Xilinx基于16nm工艺推出的异构计算平台,由于灵活、稳定,在业界得到了广泛的使用。异构计算是一个比较新的领域,需要协调硬件设计、逻辑设计、软件设计,对工程师的要求很高。实际设计过程中,很多工程师对实现PS/PL之间的数据交互感到头疼。

本文将介绍主要的PS/PL之间的数据交互办法。

02 MPSoC PS/PL之间的数据通路

在开始之前,首先简要介绍PS/PL之间的数据通路,请参考 《UG1085 Zynq UltraScale+ MPSoC Technical Reference Manual》的Figure 1-1: AXI Interconnect。

PS/PL之间的数据通路主要是通用的AXI Memory接口,其中PS作为主设备的接口有128-bit位宽的HPM0/HPM1, 64-bit位宽的LPD_PL; PL作为主设备的接口有ACP/ACE/HPC0/HPC1/HP0/HP1/HP2/HP3。所有AXI Memory接口的位宽最高都可以支持到128-bit。

PS/PL之间主要通过PS-DDR交互大块数据。从Figure 1-1可以看到,PS-DDR控制器有六个AXI Slave接口,与PL直接相关的是S3、S4、S5。HPC0/HPC1都连接到了CCI Interconnect。DP和HP0连接到了S3。HP1和HP2连接到了S4。HP3和FP DMA连接到了S5。如果需要提高带宽,要充分利用PS-DDR控制器的AXI Slave接口。如果可能,HP1和HP2最好不要同时用,因为HP1和HP2都连接到了S4,最后会彼此竞争带宽。

UG1085的Figure 1-1提供了最详细的信息, 也有点复杂。为了简单,也可以参考下面来自于《Zynq UltraScale+ MPSoC Technical Overview》的简化示意图。

在Vivado的IP 里,使能相关接口后,接口如下。

03 MPSoC PS/PL之间的简单数据通路和简单外设设计

很多时候,PS/PL之间只需要简单的数据通路。PS只需要下发有限的参数给PL,PL只需要向PS反馈有限的状态数据。串口、SPI设备、IIC等低速接口,就属于这种设备。这种情况下,PL内部只需要实现AXI Slave接口和一些寄存器就可以,PS通过AXI接口去访问寄存器,既向PL提供参数,也可以读回PL的状态。

客户可以自己设计AXI接口和寄存器,也可以使用Vivado里的工具Create and Package IP。

04 使用Vivado里的工具Create and Package IP创建IP

如果使用Vivado里的工具Create and Package IP创建IP,可以参照下列步骤。

1) 调用Vivado的Create and Package IP 模板

2) Create and Package IP 模板介绍

3)新建IP
这一步选择"Create a new AXI4 peripheral"。

4) IP命名和目录
根据自己需要,指定IP的名称和目录。

5) IP接口选择
可以看到,只为新的IP选择了AXI Lite接口,并实现了16个寄存器。工程师可以根据需要选择寄存器个数,最小4个,最多512个。对于AXI Lite接口,数据位宽是32-bit。

6) 完成IP创建
选择“Add IP to the repository”, 点击"Finish", 完成IP创建。

7) BD框图
在Block Design中,选择对应的IP。示例中是MyIP。添加后,在Block Design中,得到如下IP。可以看到,MyIP有一个AXI Slave接口,及其对应的时钟和复位信号

8) BD设计
AXI Lite的外设很简单,只有一个AXI Slave接口,及其对应的时钟和复位信号。把AXI Slave接口通过AXI Interconnect连接到某个PS的AXI Master接口,示例是M_AXI_HPM0_FPD,再提供对应的时钟和复位信号就可以。AXI连接两侧的Mater和Slave必须使用同一个时钟和复位信号。

9) 代码分析
创建IP后,在指定的目录下,得到如下的文件夹和和文件。

myip_1.0 │ component.xml │ ├─bd │ bd.tcl │ ├─example_designs │ ├─bfm_design │ │ design.tcl │ │ myip_v1_0_tb.sv │ │ │ └─debug_hw_design │ design.tcl │ myip_v1_0_hw_test.tcl │ ├─hdl │ myip_v1_0.v │ myip_v1_0_S00_AXI.v │ └─xgui myip_v1_0.tcl

myip_v1_0_S00_AXI.v里实现了寄存器及其读写逻辑。

实现寄存器的Verilog HDL代码:

//---------------------------------------------- //-- Signals for user logic register space example //------------------------------------------------ //-- Number of Slave Registers 16 reg [C_S_AXI_DATA_WIDTH-1:0]slv_reg0; reg [C_S_AXI_DATA_WIDTH-1:0]slv_reg1; reg [C_S_AXI_DATA_WIDTH-1:0]slv_reg2; reg [C_S_AXI_DATA_WIDTH-1:0]slv_reg3; reg [C_S_AXI_DATA_WIDTH-1:0]slv_reg4; reg [C_S_AXI_DATA_WIDTH-1:0]slv_reg5; reg [C_S_AXI_DATA_WIDTH-1:0]slv_reg6; reg [C_S_AXI_DATA_WIDTH-1:0]slv_reg7; reg [C_S_AXI_DATA_WIDTH-1:0]slv_reg8; reg [C_S_AXI_DATA_WIDTH-1:0]slv_reg9; reg [C_S_AXI_DATA_WIDTH-1:0]slv_reg10; reg [C_S_AXI_DATA_WIDTH-1:0]slv_reg11; reg [C_S_AXI_DATA_WIDTH-1:0]slv_reg12; reg [C_S_AXI_DATA_WIDTH-1:0]slv_reg13; reg [C_S_AXI_DATA_WIDTH-1:0]slv_reg14; reg [C_S_AXI_DATA_WIDTH-1:0]slv_reg15;

寄存器写操作的Verilog HDL代码的部分片段:

if (slv_reg_wren) begin case ( axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] ) 4'h0: for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( S_AXI_WSTRB[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 0 slv_reg0[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8]; end ... ... default : begin slv_reg0 <= slv_reg0; ... ... slv_reg15 <= slv_reg15; end endcase end

寄存器读操作的Verilog HDL代码的部分片段:

// Implement memory mapped register select and read logic generation // Slave register read enable is asserted when valid address is available // and the slave is ready to accept the read address. 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] ) 4'h0 : reg_data_out <= slv_reg0; 4'h1 : reg_data_out <= slv_reg1; 4'h2 : reg_data_out <= slv_reg2; 4'h3 : reg_data_out <= slv_reg3; 4'h4 : reg_data_out <= slv_reg4; 4'h5 : reg_data_out <= slv_reg5; 4'h6 : reg_data_out <= slv_reg6; 4'h7 : reg_data_out <= slv_reg7; 4'h8 : reg_data_out <= slv_reg8; 4'h9 : reg_data_out <= slv_reg9; 4'hA : reg_data_out <= slv_reg10; 4'hB : reg_data_out <= slv_reg11; 4'hC : reg_data_out <= slv_reg12; 4'hD : reg_data_out <= slv_reg13; 4'hE : reg_data_out <= slv_reg14; 4'hF : reg_data_out <= slv_reg15; default : reg_data_out <= 0; endcase end

根据需要,可以将寄存器的某个bit,作为控制信号,连接到应用的逻辑代码。也可以将应用逻辑代码的某些信号,作为状态信号,连接到寄存器的某个bit,做状态信号,供CPU读取。

软件

简单外设只有寄存器,软件靠读写寄存器,就能实现对硬件的控制。

05 DMA外设设计

如果外设的数据量大,速率要求高,建议使用DMA搬移数据,使PS和PL通过DDR共享数据。

Vivado的工具Create and Package IP同样可以创建支持DMA功能的IP。大部分步骤,和前述“简单数据通路”一样。在“AXI Interfaces”窗口,除了“AXI Lite”接口以外,还要增加“AXI Full Master”接口。

1) 新建AXI接口
在“AXI Interfaces”窗口,点击“+”按钮,能创建一个新的接口。

2) 添加AXI Master接口
在弹出的接口中,为“Interface Type”选择"Full",为“Interface Mode”选择"Master"。


后续操作,和简单外设的操作一样。

3)BD框图
在Block Design中,选择对应的IP。示例中是myip_dma。添加后,在Block Design中,得到如下IP。可以看到,myip_dma多了一个AXI Master接口“M00_AXI”和对应的时钟和复位信号。值得注意的是,myip_dma还多了输入信号m00_axi_init_axi_txn,输出信号m00_axi_txn_done和m00_axi_error。m00_axi_init_axi_txn用于发起写/读传输;m00_axi_txn_done和m00_axi_error由于指示传输是否完成。

4) 代码分析
带有DMA的IP的文件如下。

myip_dma_1.0 │ component.xml │ ├─bd │ bd.tcl │ ├─example_designs │ ├─bfm_design │ │ design.tcl │ │ myip_dma_v1_0_tb.sv │ │ │ └─debug_hw_design │ design.tcl │ myip_dma_v1_0_hw_test.tcl │ ├─hdl │ myip_dma_v1_0.v │ myip_dma_v1_0_M00_AXI.v │ myip_dma_v1_0_S00_AXI.v │ └─xgui myip_dma_v1_0.tcl

AXI Master的HDL代码在文件myip_dma_v1_0_M00_AXI.v中,它实现了通过AXI Master端口写数据、读数据的功能。读写的地址由参数C_M_TARGET_SLAVE_BASE_ADDR指定。

工程师需要根据自己的需要,修改相关逻辑。上述AXI Master示例中,只能向固定地址发起成对的写、读操作。在实际工程中,地址通常由软件配置,写、读操作也经常分开。

软件

DMA外设通常需要由软件配置DMA操作的目标内存。如果是standalone(baremetal,裸核)代码,缺省情况下物理地址和软件地址一样,直接向DMA的内存地址寄存器写入软件得到的地址就可以。如果是Linux下,需要先把软件地址转换成硬件地址,再写入DMA的内存地址寄存器。

06 AXI Stream外设设计

在自己IP里集成DMA,可以根据项目需求定制DMA的功能,实现最优的性能,但是也会带来设计和维护的工作量。

为了降低工作量,可以使用现成的DMA,并在IP里增加AXI Stream接口,对接AXI DMA,实现DMA功能。

大部分步骤,仍然和前述“简单数据通路”一样。在“AXI Interfaces”窗口,除了“AXI Lite”接口以外,选择要增加“AXI Stream Slave”接口, 和“AXI Stream MasterMaster”接口。

1) 新建AXI接口
在“AXI Interfaces”窗口,点击“+”按钮,能创建一个新的接口。

2) 添加AXI Streamm口
在弹出的接口中,为“Interface Type”选择"Stream",为“Interface Mode”选择"Master"或者"Slave"。示例中,既添加了AXI Streamm的Master,也添加了AXI Streamm的Master。实际工程中,工程师可以根据需要只添加其中一个,或者添加多个同样的接口。AXI Streamm的Slave,也被称为Sink;AXI Streamm的Master,也被称为Source。

后续操作,和简单外设的操作一样。

3) BD框图
在Block Design中,选择对应的IP。示例中是myip_stream。添加后,在Block Design中,得到如下IP。可以看到,myip_stream多了一个AXI Stream Master接口,也多了一个AXI Streamm Slave,及其对应的时钟和复位信号。

4) AXI-DMA接口
AXI Streamm需要和IP AXI DMA搭配使用。使用AXI DMA的简单配置就可以,比如如下配置。

AXI DMA有一个AXI Lite接口,用于PS配置;有3个 AXI Master接口,M_AXI_SG, M_AXI_MM2S, M_AXI_S2MM,用于访问DDR等存储器;另外还有两个Stream接口,M_AXIS_MM2S, M_AXIS_S2MM,用于通过AXI Streamm接口交换数据。

AXI-DMA连接

如下图所示,AXI DMA的AXI Lite接口,通过AXI Interconnect 连接到PS AXI Master接口,比如HPM0_FPD,供PS访问。

AXI DMA的3个AXI Master接口,M_AXI_SG, M_AXI_MM2S, M_AXI_S2MM,通过AXI Interconnect 连接到PS的AXI Slave接口,比如S_AXI_HP0_FPD。AXI DMA的两个Stream接口,M_AXIS_MM2S连接到用户IP的S00_AXIS, M_AXIS_S2MM连接到用户IP的M00_AXIS。

通过AXI DMA的驱动,软件可以发起MM2S传输,AXI DMA先通过M_AXI_SG从PS-DDR里读取DMA的描述符,得到数据的源地址,再通过M_AXIS_MM2S从PS-DDR里读取数据。软件也可以发起S2MM传输,AXI DMA先通过M_AXI_SG从PS-DDR里读取DMA的描述符,得到数据的目标地址,再通过M_AXIS_S2MM向PS-DDR里写数据。MM2S传输和S2MM传输既可以分开使用,也可以联合使用。如果联合使用,相当于从PS-DDR到PS-DDR的内存搬移工作。

软件

AXI-DMA的相关软件设计,请参考 MPSoC逻辑加速模块数据通道快速设计。

07 PL外设其它接口 7.1. 中断接口

用户外设还经常用到中断,用于向PS产生中断,通知某些事件。Vivado的工具Create and Package IP也可以创建支持中断功能的IP。大部分步骤,和前述“简单数据通路”一样。在“AXI Interfaces”窗口,勾选“Enable Interrupt Support”, 会得到一个S_AXI_INTR接口和一个中断输出信号irq。

通过AXI Interconnect,把S00_AXI和S_AXI_INTR接口连接连接到PS AXI Master接口,比如HPM0_FPD,供PS访问。把中断输出信号irq,通过IP Concat连接到PS的输入pl_ps_irq。

EMIO接口

PS还提供了简单的GPIO接口:EMIO。

在PS的配置界面下的GPIO里,使能EMIO,根据自己的需要选择数量。然后在BD界面下,就能看见EMIO的信号,包括输出、输入、和三态信号。工程师可以把自己的信号连接到EMIO信号上,就能使用。

软件通过访问GGPIO的Bank 3/4/5,可以控制GPIO,包括操作输出状态,和读取输入电平。

软件经常需要检查PL是否正常工作。很多时候,软件靠检查PL加载的done信号来确定。但done只能保证PL已经被加载,不能保证PL已经正常工作。比如,如果PL使用外部时钟,在外部时钟故障时,PL即使已经被加载,也没有工作。这时候,PS去访问PL的寄存器,会导致PS死机。更好的办法是,PL通过EMIO向PS反馈PL是否已经正常工作。比如PL实现计数器,把计数器的输出连接到EMIO的输入。软件读取EMIO的输入值,如果在变化,说明PL的计数器已经正常工作,那么就代表PL已经正常工作。

08 AXI Firewall

在开发过程中,可能有各种异常状况。如果 AXI传输出现异常,可能导致PS死机,影响调试。为了提高系统可靠性,可以使用Xilinx提供的IP -- AXI Firewall,把它插在正常的AXI Master和 AXI Slave接口之间。下图是AXI Firewall的连接示例。

使用软件使能 AXI Firewall后,如果AXI传输出现异常,AXI Firewall会正常结束AXI传输,保证软件继续运行,工程师可以检查AXI传输的错误。AXI Firewall输出的错误信号和中断信号,都可以连接到PS GPIO,或者ILA。工程师可以读出具体的错误信息。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    15217

    浏览量

    171154
  • 接口
    +关注

    关注

    33

    文章

    7637

    浏览量

    148461
  • 数据通路
    +关注

    关注

    0

    文章

    6

    浏览量

    7458

原文标题:【干货分享】Xilinx MPSoC PS/PL之间的数据交互和外设设计

文章出处:【微信号:FPGA-EETrend,微信公众号:FPGA开发圈】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【ZYNQ Ultrascale+ MPSOC FPGA教程】第三十二章PL读写PS端DDR数据

    PLPS的高效交互是zynq soc开发的重中之重,我们常常需要将PL端的大量数据实时送到PS
    的头像 发表于 01-30 09:54 1.3w次阅读
    【ZYNQ Ultrascale+ MPSOC FPGA教程】第三十二章<b class='flag-5'>PL</b>读写<b class='flag-5'>PS</b>端DDR<b class='flag-5'>数据</b>

    FPGA学习-如何实现PSPL间的数据交互

    交互数据将会经过Zynq子系统的内部总线(用空再考证一下是什么名称)控制器“Central Interconnect”转发给Memory Interfaces。
    发表于 09-16 10:33 6717次阅读

    Linux下如何通过UIO监控PL给到PS的中断

    xilinx mpsoc 平台中,PSPL 进行交互时,PS 需要获取 PL 发出的中断信号。从 mpsoc 技术参考手册 ug108
    发表于 08-24 16:06 669次阅读
    Linux下如何通过UIO监控<b class='flag-5'>PL</b>给到<b class='flag-5'>PS</b>的中断

    【Z-turn Board试用体验】由PSPL提供时钟信号(转载)

    输入到PL的管脚上一个时钟信号,另一种方法则是使用PS提供给PL的时钟信号。从ZYNQ的技术手册里我们得知,PS部分可以提供给PL四路相对独
    发表于 06-01 11:54

    zynq 7020 PS和zynq PL是如何通话的?

    嗨,我必须找出zynq 7020 PS和zynq PL如何通话,特别是我必须找到将在ARM中处理的SDK C代码。你能用一个明确的C代码告诉我,它解释了数据如何从PS转移到
    发表于 05-08 09:37

    请问zynq 怎么实现PSPL数据交互,然后通过UART串口打印出来?

    请问zynq 怎么实现PSPL数据交互,然后通过UART串口打印出来?前辈们做过的指导我一下。
    发表于 08-03 15:53

    【正点原子FPGA连载】第十四章基于BRAM的PSPL数据交互领航者 ZYNQ 之嵌入式开发指南

    原子公众号,获取最新资料第十四章基于BRAM的PSPL数据交互在ZYNQ SOC开发过程中,PLP
    发表于 09-04 11:08

    ZYNQ的ARM和FPGA数据交互——AXI交互最重要的细节

    。 ③EMIO :由于MIO管脚有限,PS端可以通过EMIO访问PL端引脚。 ④GP :通用AXI接口,用来实现一般主从互联、数据交互,不用于高性能。 ⑤HP :是高性能/带宽的标准接
    发表于 11-03 10:51

    实例详解:如何利用Zynq-7000的PLPS进行交互

    本文通过实例详细解析如何利用Zynq-7000的PLPS进行交互。实际上,Zynq就是两大功能块:双核Arm的SoC和FPGA。根据Xilinx提供的手册,PS: 处理系统 (Pro
    发表于 12-12 13:40 5.3w次阅读
    实例详解:如何利用Zynq-7000的<b class='flag-5'>PL</b>和<b class='flag-5'>PS</b>进行<b class='flag-5'>交互</b>?

    datamover完成ZYNQ片内PSPL间的数据传输

    分享下PSPL之间数据传输比较另类的实现方式,实现目标是: 1、传输时数据不能滞留在一端,无论是1个字节还是1K字节都能立即发送; 2、PL
    发表于 02-08 01:00 1504次阅读
    datamover完成ZYNQ片内<b class='flag-5'>PS</b>与<b class='flag-5'>PL</b>间的<b class='flag-5'>数据</b>传输

    Zynq PS / PL 第四篇:Adam Taylor MicroZed系列之 24

    了解Zynq PS / PL接口之后;到目前为止,我们已经分析了Zynq All Programmable SoC芯片中的PS (处理器系统)与PL(可编程逻辑)
    发表于 02-10 12:00 976次阅读
    Zynq <b class='flag-5'>PS</b> / <b class='flag-5'>PL</b> 第四篇:Adam Taylor MicroZed系列之 24

    构建SoC系统中PL读写DDR3

      构建SoC系统,毕竟是需要实现PSPL间的数据交互,如果PSPL端进行
    发表于 09-18 11:08 23次下载
    构建SoC系统中<b class='flag-5'>PL</b>读写DDR3

    简析Zynq芯片中PSPL之间的9个双向读写的通信端口

    Zynq芯片中,PS(ProcessorSystem)和PL(Programmable Logic)之间提供了一共9个双向读写的通信端口,他们分别是: M_GP0 M_GP1 S_GP0 S_GP1
    发表于 11-17 10:03 1.2w次阅读

    Xilinx的四个pynq类和PL接口

    Zynq在PSPL之间有9个AXI接口。
    的头像 发表于 12-30 09:45 6967次阅读

    强制开放MPSoC的PS-PL接口

    MPSoC含有PSPL;在PSPL之间有大量接口和信号线,比如AXI、时钟、GPIO等。缺省情况下,
    发表于 08-02 09:45 712次阅读