精华内容
下载资源
问答
  • (1)block design, PL:program logic PS:processing system

    一.硬件平台
    (1)添加Zynq硬核。新建工程后打开block design,右键添加IP:Zynq Processing System,这个在选芯片型号时支持Zynq才能添加进去(Tools-Settings可更改),相当于硬核处理器。
    配置硬核如下:
    PS-PL Configuration勾选一个FCLK_RESET0_N 和M AXI GP0 interface;
    外设管脚勾选一个UART并在MIO Configuration里绑定FPGA管脚号;
    时钟勾选一50MHZ时钟即可。其他选项为默认。
    (2)改装AXI-Lite的IP。选择Tools-creat and repackage IP-Creat a new AXI4 peripheral,编辑IP名、版本等信息,并选择IP目录;选择AXI-Lite(用于寄存器的配置),Slave,4个寄存器。完成配置,自动生成接口、驱动、仿真模型;
    打开Edit IP,进入IP编辑面板(区别于工程面板)-在Design Source内打开.v接口文件(主要结构为读写寄存器函数)-在User edit区域添加自己的功能,例如

    output reg LED;
    always@(posedge clk or negedge rst)
    begin
    	if(!rst)
    		LED<=0;
    	else if(slv_reg==32'hffff_ffff)
    		LED<=1;
    end 
    

    -到.v接口文件添加LED端口-回到IP编辑版面,点击Package IP中未打勾的选项,更新IP配置-Repackage IP
    (3)联通PL-PS(PL:program logic;PS:processing system)。添加上一步封装的IP-将LED make external-Run auto-Run Connection auto(自动添加AXI-Lite总线及接口,只有基于协议的模块才有这个功能)-添加ILA(在线逻辑分析仪)检测AXI-Lite协议,一端接总时钟,一端接AXI口;

    (4)生成比特流。右键Sources工程,Generate Output Product-Generate HDL wrapper-添加管脚约束文件Constrains,并设定LED管脚,如

    set_property PACKAGE_PIN G20 [get_ports LED]
    set_property IOSTANDARD LVCMOS33 [get_ports LED]
    

    完成后Generate bit stream,开始综合Synthesis(IP如有误可右键Edit In IP Package)后生成比特流。File-Export Hardware-include bitstream

    二.联合SDK开发
    (5)创建板级支持包。Launch SDK,New一个Application Project,并加入上一步生成的硬件平台-选择Hello world.c例程,完成一个板级支持包
    (6)添加驱动。将硬件平台Source里的驱动文件复制到新建的工程,并在头文件include进去。
    保存后控制台会自动编译,这里遇到一个error,undefine Xilin_In,回去定位到驱动文件,需要再include Xin_io.h;之后又新出现一个error:conflicting types for…,原因是新添加的.h文件重复include了另一个头文件,注释掉一个即可。
    (7)测试例程。右键选择工程-Debugs AS Launch on Hardware(System Debugger)-Run Program FPGA-打开SDK Terminal-设置串口驱动-连接成功后逐步测试函数
    (8)基本读写函数分析。

    AXI_LITE_REGS_mWriteReg(u32 BaseAddress, unsigned RegOffset, u32 Data);
    #define AXI_LITE_REGS_mWriteReg(BaseAddress, RegOffset, Data) \
      	Xil_Out32((BaseAddress) + (RegOffset), (u32)(Data))
    AXI_LITE_REGS_mReadReg(u32 BaseAddress, unsigned RegOffset)
    #define AXI_LITE_REGS_mReadReg(BaseAddress, RegOffset) \
        Xil_In32((BaseAddress) + (RegOffset))
    

    只要有基地址+偏移量+数据就可以使用这两个读写函数。基地址可以在block design页面找
    例如:

    always@(posedge clk)
    begin
    	AXI_LITE_REGS_mWriteReg((u32)0x4300000,0,0xffff_ffff)
    	//对寄存器0写入数据0xffff_ffff
    		if(slave_regs_0==0xffff_ffff)
    			LED=1;
    end
    

    (9)ILA观测。使PS端进入Debug模式,使能ILA的时钟。设置触发条件,逐步调试,观察AXI总线时序。
    在这里插入图片描述

    展开全文
  • 欢迎FPGA工程师加入官方微信技术群ZYNQ7000系列中PS端与PL端的通信都是通过AXI总线进行连接的,利用好AXI协议是PSPL交互的基础,因此设计这个实验来进一步了解两者间的通信。1.实验目的PL端通过AXI协议访问PS端的...

    欢迎FPGA工程师加入官方微信技术群

    ZYNQ7000系列中PS端与PL端的通信都是通过AXI总线进行连接的,利用好AXI协议是PS与PL交互的基础,因此设计这个实验来进一步了解两者间的通信。

    1.实验目的

    PL端通过AXI协议访问PS端的DDR内存,其中包括往DDR写数据,以及读取DDR内部的数据。

    04ed5af2192da5699c56902d14f920b2.png

    图 1 实验框图

    2.如何实现

    看起来实验目的很简单,但是对于像我这样的初学者而言那还是有很多的问题的。例如:

    1.芯片内部硬件怎么连接(好比两个人打电话,总得知道电话号码才能交流)

    2.谁是主机谁是从机(好比两个人打电话,谁打给谁)

    3.什么时候发数据,什么时候读数据,总不能在别人还没存好数据的时候读吧(比如两个人打电话,一个人在睡觉,怎么都打不通吧)

    3.设计思路

    针对上述3个问题,来设计总的思路,这样能有条理的实现总体的功能。

    4.芯片内部硬件连接

    ZYNQ中有9个AXI总线(如图 1),其中包含4个General-Purpose Ports(AXI_GP),主要是一些常用的通信,位宽为32位,4个High-Performance Ports,高速的通信,位宽为64位,还有一个AXI_AXP这个我不太了解,不过位宽也是64位。

    89175b3f5024760766ddf4b5689b004d.png

    图 2 ZYNQ示意图

    从图 2中可以看出访问DDR3的接口有三条①、②、③条接口,其中PL的访问有两条,分别为①和③,为了简单我们选个③,如果有兴趣可以使用③来写,①来读的操作,这样能更好的理解两者间的交互。

    5.从机与主机

    这个简单的理解就是图 2中的箭头,箭头连接的一段为从机,没有连接的一段为主。例如AXI_HP接口,主机就是PL,而箭头连接的一段是PS,那么PS就是从机。

    6.读写时序的控制

    主要的问题集中于PL什么时候写数据;PL什么时候读数据。简单的一种控制就是PL自己控制,例如先写5个数据,在读5个数据,为了增加点难度,我们可以这样设计,用PS来通知PL什么时候写,什么时候读。那么又涉及到了两者的通信,而这种通信就比较普通,不是内存的控制,具有普适化的意义,这里使用AXI_GP来进行通信,以PS为主机。

    注:PS发数据是走红色的路还是蓝色的路是由其地址决定的

    8e1fc75a1c3a47e30f11fb1694c66fab.png
    1b555b17694044afcc312423699f0780.png
    图 3 PS发命令的端口

    7.总结

    最后我们使用AXI_GP接口来控制读写,其中PS为主机;用AXI_HP接口来进行DDR3数据的输入与输出,这时PL为主机。

    8.程序设计流程图

    流程图包含PS部分和PL部分。

    9.PS部分流程设计

    PS端的程序,我们采用轮训的方式进行读写命令完成的获取,也就是PS端不停地读取PL端是否写完,以及是否读完的命令。后续可以拓展为采用中断的方式进行读写控制。

    f85bb79ace6ae9fc9a0c782c87301c46.png
    图 4 PS端流程图

    10.PL部分流程设计

    PL端AXI_HP的流程如图 4所示,一个简单的状态机来完成数据的读写,此时PL为主机。

    b2aa116c153b97f8d23caf46c1445b32.png
    图 5 PL端AXI_HP的状态机

    PL端AXI_GP的流程图如所示,也是一个简单的状态机,但是此时PL是从机,PS是主机,PS发出读取(是否写完或者是否读取)的状态,PL将此时的状态返回给PS端,让PS来进行判断是否需要进行下一步操作。

    183acfb470122638621b91100e10ffa8.png

    图 6 PL端AXI_GP的状态机

    11.程序设计

    首先,设计FPGA端的程序。有几个注意点:

    1. PL端的逻辑一般都是先仿真,然后进行板级调试,如果仿真没过,那么下载到板子上肯定不过(仿真很重要)。

    2. ZYNQ-7000的AXI协议不是和ARM一样严格遵守的,有些端口是没有用到的如图 7,但是响应这些一定要按协议来。

    这里可以简单的想一下,PS端的DDR怎么能用PL来仿真呢?我能想到的解决方法有2个(欢迎提供更多的方法):

    1. 在PL端利用ddr的ip核选择AXI模式进行仿真,操作比较麻烦,同时仿真时间长,但是参考价值高

    2. 就在PL端用一个带AXI4总线的bram进行仿真,比较简单,但是参考价值低

    为了偷懒,我这边就用方法2来仿真。这个IP中有些端口也是没有用到的

    1c51050edfa13b42ca92f829b12cb4a1.png
    图 7 axi_bram s_axi_awlock端口

    根据4.2中的流程图,以及5中的分析,自己编写axi协议后,得到仿真图如图 8 AXI_HP的仿真,采用AXI INCR突发模式,突发大小为8个字节,突发长度为2。突发的地址是根据ZYNQ中的硬件地址来的如图 9,采用32’h0008_0000为起始地址(仿真的起始地址是0)。

    98fb3694181c96523b6bb286a58e6aa4.png
    图 8 PL端的AXI_HP仿真图

    那么往ddr3写数据的地址应该怎么确定呢?图 9中可以看到AXI_HP可以用的地址,我用的起始地址是32’h0008_0000。

    138325b24b881714eda252f8c8fa36a9.png
    图 9 PS的地址映射

    这里有个问题可以想一下,PS端的程序也是跑在DDR3里面的,那么怎么才能使得PL端访问的地址与程序跑的地址不冲突呢?(这个可以在评论中给点意见)

    我这里的解决方案有两个:

    1. 简单的就是写的地址与程序的地址不一样就好了

    2. 就是在PS端分配好内存用来写ddr,然后将这个地址的起始地址发给PL,这样肯定不会有冲突(也许xilinx dma那个ip核就是这么干的吧)

    同样为了偷懒,我采用第一个方法,那么怎么知道程序跑的地址呢?

    在SDK的工程里面有个lscript.ld里面有许多地址的信息如图 10,图 11。可以看到这边的地址是从100000开始的,所以我用的地址不在这里。

    94adafe247509d768df3e6a7f411c0e6.png
    图 10
    ba7956eb358610d35b77cc7b82fbef0f.png
    图 11

    12.程序验证结果

    因为熟悉了一点AXI协议,就自己写了个AXI通信的模块,然后实现了PL与ddr的通信,以及PL与PS的通信。

    本来用黑金zynq7020的板子验证的,结果电源模块坏了,找客服修说过保了,就不能修了,哎,好可惜。。。。。。。。。。。应该是二极管击穿导致的。

    于是接了个ZCU102的开发板来测试这个程序,不过原理都是一样,只是代码上的地址可能要改一下。

    写数据结果如图 12

    3c60ca744389c18dfcefb6d7234d9b1b.png

    图 12 写数据

    读数据结果如图 13

    7253666511eb252cb10fe54b14d1ad5c.png
    图 13 读数据

    上述读写的结果一致,完成了本次实验,这次实验中最重要的部分就是对AXI协议的理解。

    参考资料

    1. xilinx.com/support/docu ug585 zynq7000的说明书

    2. xilinx.com/support/answ 解决时钟分配报错

    3. china.xilinx.com/suppor xilinx axi协议

    4. static.docs.arm.com/ihi arm axi协议

    附录

    Block Design如图 14 这个是ZCU102的,如果是zynq-7000.只要把中间的换了就好。

    2f246f008083daed50b8d534c45d75d6.png
    图 14 Block Design

    fea05e1c62db4055b5630834b7ade251.png

    欢迎通信工程师和FPGA工程师关注公众号

    3100ae5b31a46dcdcd2997995b43211e.png

    FPGA微信技术群

    欢迎大家加入全国FPGA微信技术群,这里有一群热爱技术的工程师,在这里可以一起交流讨论技术!

    2c06b843e3b9ba1308e39d1b3aec7c92.png

    用手指按住就可以加入FPGA全国技术群哦

    FPGA IP核服务:各类优质IP核服务商,服务到位,有保障!有需求的可以直接联系群主!

    FPGA技术群平台自营:Xilinx Altera 镁光、三星、海力士、ADI TI ST NXP 等品牌的优势代理分销商,欢迎大家有需求随时发型号清单,我们将在第一时间为您提供最优竞争力的报价!价格低于您原有供应商5%以上!欢迎询价-直接把需求发给群主!

    FPGA技术群官方鸣谢品牌:Xilinx、 intel(Altera)、microsemi(,Actel)、LattIC e,Vantis,Quicklogic,Lucent等

    展开全文
  • ZYNQ作为首款将高性能ARMCortex-A系列处理器与高性能FPGA在单芯片内紧密结合的产品,...因此,如何设计高效的 PLPS 数据交互通路是 ZYNQ 芯片设计的重中之重,也是产品设计的成败关键之一。主要介绍 PSPL...
    ZYNQ作为首款将高性能ARMCortex-A系列处理器与高性能FPGA在单芯片内紧密结合的产品,为了实现ARM处理器和FPGA之间的高速通信和数据交互,发挥ARM处理器和FPGA的性能优势,需要设计高效的片内高性能处理器与 FPGA 之间的互联通路。因此,如何设计高效的 PL 和 PS 数据交互通路是 ZYNQ 芯片设计的重中之重,也是产品设计的成败关键之一。 主要介绍 PS 和 PL 的连接,了解 PS 和 PL 之间连接的技术。 其实,在具体设计中我们往往不需要在连接这个地方做太多工作,我们加入 IP 核以后,系统会自动使用 AXI 接口将我们的 IP 核与处理器连接起来,我们只需要再做一点补充就可以了。不过,这部分概念还是了解比较好。

    AXI 接口标准介绍

    AXI 是 Xilinx 从 6 系列的 FPGA 开始引入的一个接口协议,主要描述了主设备和从设备之间的数据传输方式。在 ZYNQ 中继续使用,版本是AXI4,所以我们经常会看到 AXI4.0,ZYNQ 内部设备都有AXI接口。其实AXI 就是ARM 公司提出的 AMBA(AdvancedMicrocontrollerBusArchitecture)的一个部分,是一种高性能、高带宽、低延迟的片内总线,也用来替代以前的 AHB 和 APB 总线。第一个版本的 AXI (AXI3)包含在 2003 年发布的 AMBA3.0 中,AXI 的第二个版本 AXI(AXI4)包含在 2010 年发布的AMBA4.0 之中。AXI 协议主要描述了主设备和从设备之间的数据传输方式,主设备和从设备之间通过握手信号建立连接。当从设备准备好接收数据时,会发出 READY 信号。当主设备的数据准备好时,会发出和维持 VALID 信号,表示数据有效。数据只有在 VALID 和 READY 信号都有效的时候才开始传输。当这两个信号持续保持有效,主设备会继续传输下一个数据。主设备可以撤销 VALID信号,或者从设备撤销 READY 信号终止传输。AXI 的协议如图 1,T2 时,从设备的 READY信号有效,T3 时主设备的 VILID 信号有效,数据传输开始。

    2c6881cd466fda0c642d49a62354a3fc.png

    图 1AXI 握手时序图

    在 ZYNQ 中,支持 AXI-Lite,AXI4 和 AXI-Stream 三种总线,通过表1,我们可以看到这三中 AXI 接口的特性。 表 1AXI 接口分类

    f6d14e234faaff8e25465575024f2bb9.png

    AXI-Lite:

    具有轻量级,结构简单的特点,适合小批量数据、简单控制场合。不支持批量传输,读写时一次只能读写一个字(32bit)。主要用于访问一些低速外设和外设的控制。

    AXI4:

       接口和 AXI-Lite 差不多,只是增加了一项功能就是批量传输,可以连续对一片地址进行一次性读写。也就是说具有数据读写的 burst 功能。

       上面两种均采用内存映射控制方式,即 ARM 将用户自定义 IP 编入某一地址进行访问,读写时就像在读写自己的片内 RAM,编程也很方便,开发难度较低。代价就是资源占用过多,需要额外的读地址线、写地址线、读数据线、写数据线、写应答线这些信号线。

    AXI-Stream:

    这是一种连续流接口,不需要地址线(很像 FIFO,一直读或一直写就行)。对于这类 IP,ARM 不能通过上面的内存映射方式控制(FIFO 根本没有地址的概念),必须有一个转换装置,例如 AXI-DMA 模块来实现内存映射到流式接口的转换。AXI-Stream 适用的场合有很多:视频流处理;通信协议转换;数字信号处理;无线通信等。其本质都是针对数值流构建的数据通路,从信源(例如 ARM 内存、DMA、无线接收前端等)到信宿(例如 HDMI 显示器、高速AD 音频输出,等)构建起连续的数据流。这种接口适合做实时信号处理。

    AXI4 和 AXI4-Lite 接口包含 5 个不同的通道:

    • ReadAddressChannel

    • WriteAddressChannel

    • ReadDataChannel

    • WriteDataChannel

    • WriteResponseChannel

    其中每个通道都是一个独立的 AXI 握手协议。下面两个图分别显示了读和写的模型:

    ad7d86967a8877e56a6871f801bef46d.png

    图 2AXI 读数据通道

    e24452fa16bef9c81eb2a7f7ba50127f.png

    图 3AXI 写数据通道

     ZYNQ 的 AXI 资源

    在 ZYNQ 芯片内部用硬件实现了 AXI 总线协议,包括 9 个物理接口,分别为 AXI-GP0~AXI-GP3,AXI-HP0~AXI-HP3,AXI-ACP 接口。
    • AXI_ACP 接口,是 ARM 多核架构下定义的一种接口,中文翻译为加速器一致性端口,用来管理 DMA 之类的不带缓存的 AXI 外设,PS 端是 Slave 接口。

    • AXI_HP 接口,是高性能/带宽的 AXI3.0 标准的接口,总共有四个,PL 模块作为主设备连接。主要用于 PL 访问 PS 上的存储器(DDR 和 On-ChipRAM)

    • AXI_GP 接口,是通用的 AXI 接口,总共有四个,包括两个 32 位主设备接口和两个 32 位从设备接口。

    AXI接口分布图如下图 4 所示:

    6145fb2d997df639a6bc47f4ae0328a2.png

    图4AXI接口分布图

    可以看到,只有两个 AXI-GP 是 MasterPort,即主机接口,其余 7 个口都是 SlavePort(从机接口)。主机接口具有发起读写的权限,ARM 可以利用两个 AXI-GP 主机接口主动访问PL 逻辑,其实就是把 PL 映射到某个地址,读写 PL 寄存器如同在读写自己的存储器。其余从机接口就属于被动接口,接受来自 PL 的读写,逆来顺受。

       另外这 9 个 AXI 接口性能也是不同的。GP 接口是 32 位的低性能接口,理论带宽 600MB/s,而 HP 和 ACP 接口为 64 位高性能接口,理论带宽 1200MB/s。有人会问,为什么高性能接口不做成主机接口呢?这样可以由 ARM 发起高速数据传输。答案是高性能接口根本不需要 ARMCPU 来负责数据搬移,真正的搬运工是位于 PL 中的 DMA 控制器。

    PL 端的 AXI 接口设计

    位于 PS 端的 ARM 直接有硬件支持 AXI 接口,而 PL 则需要使用逻辑实现相应的 AXI 协议。Xilinx在Vivado开发环境里提供现成IP如AXI-DMA,AXI-GPIO,AXI-Dataover,AXI-Stream都实现了相应的接口,使用时直接从 Vivado 的 IP 列表中添加即可实现相应的功能。下图为Vivado 下的各种 DMAIP:

    d57d0288b24778a58e8174ae3d27810b.png

    图 5AXIDMAIP 核

    下面为几个常用的 AXI 接口 IP 的功能介绍:

    AXI-DMA:实现从 PS 内存到 PL 高速传输高速通道 AXI-HPAXI-Stream 的转换

    AXI-FIFO-MM2S:实现从 PS 内存到 PL 通用传输通道 AXI-GPAXI-Stream 的转换

    AXI-Datamover:实现从 PS 内存到 PL 高速传输高速通道 AXI-HPAXI-Stream 的转换,只不过这次是完全由 PL 控制的,PS 是完全被动的。

    AXI-VDMA:实现从 PS 内存到 PL 高速传输高速通道 AXI-HPAXI-Stream 的转换,只不过是专门针对视频、图像等二维数据的。

    AXI-CDMA:这个是由 PL 完成的将数据从内存的一个位置搬移到另一个位置,无需 CPU 来插手。

    有时,用户需要开发自己定义的IP同PS进行通信,这时可以利用向导生成对应的IP。用户自定义IP核可以拥有AXI-Lite,AXI4,AXI-Stream,PLB 和 FSL 这些接口。后两种由于 ARM 这一端不支持,所以不用。

       有了上面的这些官方 IP 和向导生成的自定义 IP,用户其实不需要对 AXI 时序了解太多(除非确实遇到问题),因为 Xilinx 已经将和 AXI 时序有关的细节都封装起来,用户只需要关注自己的逻辑实现即可。

    AXI Interconnect

    AXI 协议严格的讲是一个点对点的主从接口协议,当多个外设需要互相交互数据时,我们需要加入一个 AXIInterconnect 模块,也就是 AXI 互联矩阵,作用是提供将一个或多个 AXI主设备连接到一个或多个 AXI 从设备的一种交换机制(有点类似于交换机里面的交换矩阵)。

      这个 AXIInterconnectIP 核最多可以支持 16 个主设备、16 个从设备,如果需要更多的接口,可以多加入几个 IP 核。

    AXIInterconnect 基本连接模式有以下几种:

    • N-to-1Interconnect

    • 1-to-NInterconnect

    • N-to-MInterconnect(CrossbarMode)

    • N-to-MInterconnect(SharedAccessMode)

      0ecf63f8433f9fbc1a374a2e611a9ca3.png

      图 6 多对一的情况

      6dcb0041eaabaa7726a01f33e5331f1e.png

      图7 一对多的情况

      15762cb071bb58497e9c79812a7502e3.png

      图8 多对多读写地址通道

      a34c31324eb4873f8a2521fbde89f2a6.png

      图9 多对多读写数据通道    

    ZYNQ 内部的 AXI 接口设备就是通过互联矩阵的的方式互联起来的,既保证了传输数据的高效性,又保证了连接的灵活性。Xilinx 在 Vivado 里我们提供了实现这种互联矩阵的 IP 核axi_interconnect,我们只要调用就可以。

    b475668ff800007e792ea155b1832166.png

    图10 AXIInterconnectIP

    END

    往期精彩回顾(?猛戳可查看)

    • 校招笔试题合集

    • 数字IC设计经典笔试题之【FPGA基础】

    • 数字IC设计经典笔试题之【verilog篇】

    • 数字IC设计经典笔试题之【IC设计基础】

    • 硬件工程师面试题【1】

    • 硬件工程师笔试题【2】

    • 有了这份面经,麻麻再也不用担心我找不到工作了!

    • FPGA合集

    • 跨时钟域处理3大方法

    • FPGA信号截位策略

    • FPGA中的亚稳态

    • FPGA芯片结构

    • FPGA FIFO深度计算

    • FPGA奇数分频

    • 竞争冒险现象及消除方法

    • “ 一网打尽 ” 二进制、格雷码、独热码编码方式

    • DDR3 IP 核配置

    • DDR3 IP核仿真

    • 行业动态合集

    • 思考】数字IC设计工程师的发展前景如何

    •  中国芯片设计企业与薪资榜单

    • 雷达信号处理合集

    • 雷达信号处理基础之【相参积累处理】

    • 雷达信号处理基础之【恒虚警处理】

    • 雷达信号处理基础之【单脉冲测角处理】

    • 雷达信号处理基础之【雷达LFM信号分析】

    • 闲聊

    • 【夜读】三十岁前,一定要坚持的几件事

    • 知识星球

    04a72b7c5437be6b75ff7f4d37947655.png

    $display("点个在看吧!")3f64db9d345703655fb9e7a300ebf196.gif

    展开全文
  • Zynq 7000 PLPS通信——使用BRAM

    千次阅读 热门讨论 2018-12-02 22:20:22
    Zynq 7000 PLPS通信——使用BRAM介绍1 准备工作2 PL搭建BRAM3 下载PL程序4 编写Linux应用程序5 问题5.1 BRAM的寻址的问题5.2 PS地址映射 介绍 Xilinx公司的Zynq 7000系列SoC除了有功能强大的FPGA,还集成了双PS...

    介绍

    Xilinx公司的Zynq 7000系列SoC除了有功能强大的FPGA,还集成了带有双核ARM Cortex A9的PS。在协同使用PS和PL时,就不免需要在PS和PL之间进行数据交互。本文主要讲述安装了linux操作系统的PS如何与PL进行数据交互。

    1 准备工作

    PC环境:win10
    vivado版本:2015.4
    开发板:ZC706(已安装从SD卡启动的Linux系统)

    系统的总体框架如下图所示。利用AXI接口实现PS和PL的通信,PS作为主机,PL作为从机,通过AXI Interconnect分别和两个BRAM的控制器相连。BRAM部分有两个端口,这两个端口都可对这块BRAM进行读写操作。AXI的通信接口由AXI Interconnect和AXI BRAM Controller IP核完成,在PS端,可以将AXI BRAM Controller当做字符设备进行读写操作,在PL端,可以直接对BRAM进行读写操作。其中AXI接口的具体通信过程由IP核完成,在进行应用开发时可以不用太关心。下图这块BRAM的两个端口都连到了PS,没有端口供PL进行操作了,在实际应用中,可以一个端口连到PS,另一个端口由PL控制,然后商量好PS和PL的读写规则即可使用BRAM实现PL和PS的数据传输。
    在这里插入图片描述

    2 PL搭建BRAM

    打开vivado,新建一个工程,在选择器件时,选择ZC706评估板(如果不是此评估板,应该根据实际芯片型号选择)。
    在这里插入图片描述
    建好工程后,新建一个bd文件。
    在这里插入图片描述
    在Block Design文件中,添加一个ZYNQ7 Processing System IP核。
    在这里插入图片描述
    双击这个IP核对其进行配置,由于本文所用是官方提供的开发板,可以直接点击Presets -> ZC706使用默认的配置。如果是其他型号,应该按照实际情况进行配置。
    在这里插入图片描述
    然后点击PS-PLConfiguration里,把GP0选择,然后点击ok保存配置。
    在这里插入图片描述
    继续添加IP核,选择AXI BRAM Controller。
    在这里插入图片描述
    添加AXI BRAM Controller后,双击并对齐进行配置,将接口选择为1个。配置完成后以同样的方法再添加一个AXI BRAM Controller。
    在这里插入图片描述
    添加BRAM,并对齐进行配置,将其配置成双端口。
    在这里插入图片描述
    在这里插入图片描述
    然后把AXI接口的时钟线连上,并选择自动连线。
    在这里插入图片描述
    最终的Block Design如下图所示。
    在这里插入图片描述
    接下来右击bd文件,选择Create HDL Wrapper,并选择Let Vivado manage wrapper and auto-update。
    在这里插入图片描述
    在这里插入图片描述
    然后点击Address Editor,可以看到两个外设的地址分别为0x40000000和0x42000000。这个地址是给PS使用的,可以按照自己的喜好进行修改(当然地址不可随心所欲的修改,有些地址是不能给它们使用的!)。BRAM的容量大小也可在此处修改,只不过修改之后需要再运行一下Create HDL Wrapper重新进行打包,本文就使用默认的8K大小。
    在这里插入图片描述
    然后直接点击Generate Bitstream,等待其一步到位。
    在这里插入图片描述

    3 下载PL程序

    给开发板上电。前期已经制作了从SD卡启动的linux操作系统,上电后,系统启动,可以从串口进入系统进行命令行操作。连接PL后,点击Program Device下载bitstream文件。
    在这里插入图片描述

    4 编写Linux应用程序

    下载完成后,在linux系统下编写一个测试读写的C语言程序,测试代码如下所示。

    #include<stdio.h>
    #include<unistd.h>
    #include<sys/mman.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    
    #define BRAM_CTRL_0	0x40000000	//AXI_bram_ctrl_0的物理地址
    #define BRAM_CTRL_1	0x42000000	//AXI_bram_ctrl_1的物理地址
    #define DATA_LEN		10			//写入和读取的数据长度
    
    int main(){
        unsigned int * map_base0;
    	unsigned int * map_base1;
     
        int fd = open("/dev/mem", O_RDWR|O_SYNC);
        if (fd == -1){	
    		printf("can't open /dev/mem !\n");
            return (-1);
        }
    	printf("/dev/mem is opened !\n");
    	
        map_base0 = mmap(NULL, DATA_LEN * 4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, BRAM_CTRL_0);
    	map_base1 = mmap(NULL, DATA_LEN * 4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, BRAM_CTRL_1);
        if (map_base0 == 0 || map_base1 == 0){
            printf("NULL pointer!\n");
        }
        else{
            printf("mmap successfull!\n");
        }
    	
        unsigned long addr;
        unsigned int content;
        int i = 0;
    	
    	//写数据到BRAM
    	printf("\nWrite data to BRAM via AXI_bram_ctrl_0\n");
        for (i= 0; i < DATA_LEN; i++){
            addr = (unsigned long)(map_base0 + i);
            content = i + 2;
    		map_base0[i] = content;
            printf("%2dth data, address: 0x%lx data_write: 0x%x\t\t\n", i, addr, content);
        }
    	
    	//从BRAM读数据
    	printf("\nRead data from BRAM via AXI_bram_ctrl_1\n");
        for (i= 0; i < DATA_LEN; i++){
            addr = (unsigned long)(map_base1 + i);
    		content = map_base1[i];
            printf("%2dth data, address: 0x%lx data_write: 0x%x\t\t\n", i, addr, content);
        }
        
        close(fd);
        munmap(map_base0, DATA_LEN);
    	munmap(map_base1, DATA_LEN);
     
        return 0;
    }
    

    在linux下使用GCC进行编译,然后运行,运行结果如下图所示。
    在这里插入图片描述
    这里对测试的C语言程序进行简单的分析。首先打开/dev/mem字符设备节点,然后将BRAM的两个控制器AXI_bram_ctrl_0和AXI_bram_ctrl_1的物理地址进行地址映射,这两个控制器在linux看来就相当于两个外设。先向AXI_bram_ctrl_0写入10个数据,然后从AXI_bram_ctrl_1读出10个数据,由于这两个控制器所连接的是同一块BRAM存储空间,所以读出来的数据应该和写入的数据是一致的。如此便实现了PL和PS的数据交互。

    5 问题

    5.1 BRAM的寻址的问题

    如果将BRAM的一端交给PL来操作,如果选择BRAM的容量为8K。如果查看BRAM,会发现其深度竟然只有2048,并非8192,如下图所示。
    在这里插入图片描述
    其实这是因为BRAM的地址是以8位为单位的,BRAM容量设置成8K是指8KB,即8K×8bits。换算成32位宽时为8K×8bits = 2K×32bits,也就是说只有2048个32位地址。PL在对BRAM进行寻址时,也是使用的8位位宽寻址,也就是说地址会从0~1FFF,会有13根地址线,而并非11根地址线32位位宽。这是PL对BRAM进行操作时需要注意的。

    5.2 PS地址映射

    在PL这边搭好工程之后,会分配两个地址0x40000000和0x42000000。这两个地址是真实的物理地址,在Linux系统下不能直接访问,需要进行地址映射,然后才能对其进行操作。关于地址映射可是个麻烦的事情,还需仔细学习和谨慎使用。

    展开全文
  • ZYNQ AXI总线PL/PS通信的例程代码,需要的可以下载来看看
  • zynq ps pl进行数据交互时,对于小批量的数据,bram_ctrl是一个不错的选择,本人在vivado 2018.3使用时,出现了以下错误: ERROR: [axi_bram_cntlr-1] Port-A interface property<CONFIG.READ_WRITE_MODE> is...
  • always @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginslv_reg0 <= 0;slv_reg1 <= 0;slv_reg2 <= 0;slv_reg3 <= 0;endelse beginif (slv_reg_wren)begincase ( axi_awaddr[ADDR_LSB+OP...
  • ZYNQ 、AXI协议、PSPL内部通信

    千次阅读 2018-01-15 22:58:40
    、AXI协议、PSPL内部通信  三种AXI总线分别为: AXI4:(For high-performance memory-mapped requirements.)主要面向高性能地址映射通信的需求,是面向地址映射的接口,允许最大256轮的数据突发传输; ...
  • ZYNQ7000系列中PS端与PL端的通信都是通过AXI总线进行连接的,利用好AXI协议是PSPL交互的基础,因此设计这个实验来进一步了解两者间的通信。1.实验目的PL端通过AXI协议访问PS端的DDR内存,其中包括往DDR写数据,...
  • ZYNQ PLPS交互的最大带宽

    千次阅读 2018-12-14 21:04:16
    PLPS的交互使用AXI_HP接口可以达到最大的带宽。 在典型的150MHz的时钟速度...如果数据都存放在DDR中,PL都是通过PS去读取DDR里的数据,这样实际带宽是取决于DDR的通信带宽,HP口的带宽也发挥不出来。 PLPS的D...
  • Xilinx官方参考文档:ug994-vivado-ip-subsystems.pdf 黑金教程: cource_s1_ALINX_ZYNQ(AX7010_AX7020)开发平台基础教程V...前面介绍了PSPL通过DMA通信的基本测试,但是之前用的都是xilinx的官方的IP核,接口都是...
  • ZYNQ DMA实现PSPL间数据传输通信

    千次阅读 2020-06-23 00:55:44
    一,PSPL的数据传输流程: 1,传输过程 (1)、向PL端查询剩余数据存储长度(以byte为单位); (2)、通过写寄存器设置PL端DMA数据传输开始地址; (3)、通过写寄存器设置PL端DMA数据传输长度(以byte为单位...
  • ZYNQ7000系列中PS端与PL端的通信都是通过AXI总线进行连接的,利用好AXI协议是PSPL交互的基础,因此设计这个实验来进一步了解两者间的通信。1.实验目的PL端通过AXI协议访问PS端的DDR内存,其中包括往DDR写数据,...
  • 最近公司项目中使用到了zynq7000系列(7030)平台,产品中需要在arm(PS)与fpga(PL)之间进行大批量数据传输,还要考虑效率问题,因此使用了axi_dma模块。 驱动选择 方式一: 采用proxy-dma驱动,官方代码链接...
  • ZYNQ 、AXI协议、PSPL内部通信 三种AXI总线分别为:AXI4:(For high-performance memory-mapped requirements.)主要面向高性能地址映射通信的需求,是面向地址映射的接口,允许最大256轮的数据突发传输;...
  • Zynq PS_PL通信学习(一) AXI_DMA_LOOP测试

    万次阅读 多人点赞 2018-12-06 13:27:53
    Xilinx官方参考文档:PG021_axi_dma、UG585_zynq_7000_TRM等 AXI DMA开发 http://www.fpgadeveloper.com/2014/08/using-the-axi-dma-in-vivado.html 黑金教程 course_s2_ALINX ZYNQ开发平台SDK应用教程V2.02.pdf 米...
  •   在上一篇博客中介绍了软中断,软中断可以用于ZYNQ的两个CPU之间进行中断,一次来进行两个CPU之间的通信,在ZYNQ的架构中,PL端也能够向PS端提供中断,PL端向PS端的中断一共有16个。   可以看到PL端的中断,...
  • 添加zynq block 添加一个AXI_GPIO模块 添加点击自动布线 在弹出窗口中打勾 效果如下,我们可以看到系统会自动添加了一个AXI转换器,一端连接到了ARM核,一端连到了AXI的设备上,我们这里用的是
  • Zynq入门——PSPL接口技术详解

    千次阅读 2019-05-13 14:17:13
    ZYNQ作为首款将高性能ARM Cortex-A系列处理器不高性能FPGA在单芯片内紧密结合癿产品,为了实现ARM处理器...因此,如何设计高效癿PLPS数据交亏通路是ZYNQ芯片设计癿重中乊重,也是产品设计癿成败兰键之一。 ...
  • 文章目录一、ZYNQ的AXI资源 ALINX 黑金zynq7000开发平台配套教程 ...因此,如何设计高效的PLPS 数据交互通路是 ZYNQ 芯片设计癿重中之重,也是产品设计成败关键之一。 一、ZYNQ的AXI资源 在 ZYNQ.
  • AXI-EMC IP是一个可以可以支持各种内存型号的控制器,利用这个IP可以非常方便地模拟各种类型的内存或者FLASH接口实现数据的交互和通信。以下是AXI-EMC IP的功能特性: 1、支持AXI4 Slave Memory Map接口,数据宽度...
  • 需要在pl端设置多个串口,但要求每个串口FIFO要大于128byte,求问,用什么方式和ps通信?如何设定使用这个FIFO?用哪种类型FIFO?![图片说明]...

空空如也

空空如也

1 2 3 4 5 6
收藏数 108
精华内容 43
关键字:

pl通信pszynq