一、前言

本人没什么FPGA的开发经验,然而一上来就要搞zynq和PCIE通信,上手真的太难了。查阅了各种网上资料,经历了一个多月各种测试终于成功调通了。因为网上关于pcie的资料太少,翻来翻去就是那么些内容,因此想要详细总结一下这方面的要点,帮助小伙伴少走弯路。我使用的平台是VIVADO 2017.4,芯片型号XC7Z015-2CLG485I,开发板是ALINX的AC7015。好了,废话不多说,进入正题。

二、建立工程

取好工程名字,选好路径(注意:工程名称和路径都不要有中文和空格),点击下一步

选择RTL工程

选好芯片型号,点击next后选择finish即完成工程创建

三、Block Design添加IP核

接下来在PL端搭建最基础的PCIE结构

先生成空白的Block Design

2.1 xdma IP核

添加ip核(点击+号添加)

输入PCIE会发现有三个IP核,查了很多资料,其中XDMA(最后一个)是最简单的一个pcie IP核,不需要太多PCIE协议知识,作为小白当然选这个IP核。

双击生成的XDMA IP核进行配置

lane width表示pcie通信并行数据宽度,我是用的这块ZYNQ FPGA最高只支持X2的;

link speed选择最大的,顺便说一句,这里的ip核都是pcie 2.0协议的;

AXI clock是AXI总线时钟频率,选125M

DMA interface是AXI Memory Mapped即地址映射,用于访问存储类的设备,另一个AXI  Stream表示AXI数据流,没有地址,数据直接流入或流出,就像水管一样(可能说的不对,请大佬指出)

第二个标签页保持默认即可

这里是一些厂商ID、设备ID等配置

第三个标签页配置BARs(Base Address Register)

BARs往往是用来存放一些配置信息的,在主机端和板卡端都有各自相对应的BAR空间,这两个BAR空间相互关联,即一方对自己的BAR空间写入数据时,另一方也会在自己的BAR空间中收到该数据,因此也要注意避免同时读写的问题,value表示pcie端地址,pcie to axi translation就是一个从pcie地址映射到axi地址的一个偏移值,简单来说就是value+translation=axi地址,我这边概念也比较模糊,因为我没有用到BAR。

标签4和标签5不展开说了,保持默认就行

点击finish就完成配置了。

2.2 zynq IP核

添加zynq IP核

双击打开配置

我们可以看到zynq具有两个ARM Cortex-A9的处理器

再把目光聚焦到红框处的High Performance AXI 32b/64b Slave Ports(简称HP接口)和DDR2/3,LPDDR2 Controller

我们的PCIE数据就要经过XDMA转为AXI协议,然后进入通过HP接口,再由DDR控制器写入DDR3内存中

另外也可以看到HP接口有4根线,也就是说可以接四个DMA设备

单击上图红框中的HP接口,勾选使能任意一个,数据宽度使用默认的64位,然后取消选中M_AXI_GP0接口

配置 MIO, BNAK 0 电平为 LVCMOS 3.3V, Bnak1 电平为 LVCMOS 1.8V,使能 QPSI,这样才
能固化程序, PCIe 才能正常使用。然后选上UART1用于调试输出

配置DDR3,选择 MT41J256M16 RE-125,zynq的配置就完成了

2.3 差分参考时钟缓冲

添加utility buffer

配置为收发器时钟差分缓冲

连接xdma的sys_clk引脚

点击Run Connection Automation开始自动布线

全选后点击ok

再点击Run Block Automation,再弹出对话框中勾选所有,再点确定

我们可以看到生成了一个AXI Smart Connection模块,这个模块是用来连接AXI内存映射的主设备和从设备的,也就是通过这个模块,XDMA模块的M_AXI接口与Zynq的S_AXI_HP0连接在一起。我们还可以发现,这个Smart Connect的aclk时钟是由xdma提供的,这个时钟是由外部(即主板PCIE接口)提供的时钟,经buffer,提供的异步时钟(aclk的a表示ashynchronization异步)。同理aresetn异步复位信号也是由外部提供的。这是因为PCIE的读写请求是由电脑端发起的,因此时钟和复位信号也由电脑端提供。假设DMA读写操作是由zynq发起的,那么时钟信号和复位信号由zynq的FCLK_CLK0和FCLK_RESET0_n提供(这点对扩展其他DMA设备很重要,只有PCIE时可以忽略)。

最后,修改一下端口名称,ctrl+s保存

四、 添加引脚约束

先生成HDL文件

运行Generate Output Products

在 IP Sources 页搜索 xdc 文件,可以找到一个关于 PCIe 管脚约束的文件,这个文件约束的和开发板设计不符合,需要修改,但是这个文件是只读的,这里先禁用这个文件,然后自己写 xdc 文件代替这个。

编写xdc

打开pcie.xdc,加入一下TCL代码

set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
set_property CFGBVS VCCO [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]#PCIe rstn
set_property PACKAGE_PIN M6 [get_ports pcie_rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports pcie_rst_n]# PCI Express reference clock 100MHz
set_property PACKAGE_PIN U9 [get_ports {pcie_ref_clk_p[0]}]
set_property PACKAGE_PIN V9 [get_ports {pcie_ref_clk_n[0]}]# MGT locationsset_property PACKAGE_PIN W8 [get_ports {pcie_mgt_rxp[0]}]
set_property PACKAGE_PIN AA7 [get_ports {pcie_mgt_rxp[1]}]set_property PACKAGE_PIN W4 [get_ports {pcie_mgt_txp[0]}]
set_property PACKAGE_PIN AA3 [get_ports {pcie_mgt_txp[1]}]# PCIe Lane 0
#set_property LOC GTPE2_CHANNEL_X0Y1 [get_cells {inst/gt_top_i/pipe_wrapper_i/pipe_lane[0].gt_wrapper_i/gtp_channel.gtpe2_channel_i}]
# PCIe Lane 1
#set_property LOC GTPE2_CHANNEL_X0Y0 [get_cells {inst/gt_top_i/pipe_wrapper_i/pipe_lane[1].gt_wrapper_i/gtp_channel.gtpe2_channel_i}]# GTP Common Placement
set_property LOC GTPE2_COMMON_X0Y0 [get_cells -hierarchical -filter {NAME=~*/pipe_wrapper_i/pipe_lane[0].pipe_quad.gt_common_enabled.gt_common_int.gt_common_i/qpll_wrapper_i/gtp_common.gtpe2_common_i}]#
# PCI Express Block placement. This constraint selects the PCI Express
# Block to be used.
#set_property LOC PCIE_X0Y0 [get_cells -hierarchical -filter {NAME=~*/pcie_7x_i/pcie_block_i}]#
# BlockRAM placement
#
set_property LOC RAMB36_X3Y5 [get_cells -hierarchical -filter {NAME=~*/pcie_7x_i/pcie_bram_top/pcie_brams_rx/brams[3].ram/use_tdp.ramb36/genblk*.bram36_tdp_bl.bram36_tdp_bl}]
set_property LOC RAMB36_X2Y6 [get_cells -hierarchical -filter {NAME=~*/pcie_7x_i/pcie_bram_top/pcie_brams_rx/brams[2].ram/use_tdp.ramb36/genblk*.bram36_tdp_bl.bram36_tdp_bl}]
set_property LOC RAMB36_X2Y5 [get_cells -hierarchical -filter {NAME=~*/pcie_7x_i/pcie_bram_top/pcie_brams_rx/brams[1].ram/use_tdp.ramb36/genblk*.bram36_tdp_bl.bram36_tdp_bl}]
set_property LOC RAMB36_X2Y4 [get_cells -hierarchical -filter {NAME=~*/pcie_7x_i/pcie_bram_top/pcie_brams_rx/brams[0].ram/use_tdp.ramb36/genblk*.bram36_tdp_bl.bram36_tdp_bl}]
set_property LOC RAMB36_X2Y3 [get_cells -hierarchical -filter {NAME=~*/pcie_7x_i/pcie_bram_top/pcie_brams_tx/brams[0].ram/use_tdp.ramb36/genblk*.bram36_tdp_bl.bram36_tdp_bl}]
set_property LOC RAMB36_X2Y2 [get_cells -hierarchical -filter {NAME=~*/pcie_7x_i/pcie_bram_top/pcie_brams_tx/brams[1].ram/use_tdp.ramb36/genblk*.bram36_tdp_bl.bram36_tdp_bl}]
set_property LOC RAMB36_X2Y1 [get_cells -hierarchical -filter {NAME=~*/pcie_7x_i/pcie_bram_top/pcie_brams_tx/brams[2].ram/use_tdp.ramb36/genblk*.bram36_tdp_bl.bram36_tdp_bl}]
set_property LOC RAMB36_X2Y0 [get_cells -hierarchical -filter {NAME=~*/pcie_7x_i/pcie_bram_top/pcie_brams_tx/brams[3].ram/use_tdp.ramb36/genblk*.bram36_tdp_bl.bram36_tdp_bl}]###############################################################################
# Timing Constraints
###############################################################################
#
create_clock -name txoutclk_x0y0 -period 10 [get_pins -hierarchical -filter {NAME=~*/pipe_wrapper_i/pipe_lane[0].gt_wrapper_i/gtp_channel.gtpe2_channel_i/TXOUTCLK}]
#
#
set_false_path -to [get_pins -hierarchical -filter {NAME=~*/pipe_wrapper_i/pipe_clock_int.pipe_clock_i/pclk_i1_bufgctrl.pclk_i1/S0}]
set_false_path -to [get_pins -hierarchical -filter {NAME=~*/pipe_wrapper_i/pipe_clock_int.pipe_clock_i/pclk_i1_bufgctrl.pclk_i1/S1}]#
create_generated_clock -name clk_125mhz_x0y0 [get_pins -hierarchical -filter {NAME=~*/pipe_wrapper_i/pipe_clock_int.pipe_clock_i/mmcm_i/CLKOUT0}]
create_generated_clock -name clk_250mhz_x0y0 [get_pins -hierarchical -filter {NAME=~*/pipe_wrapper_i/pipe_clock_int.pipe_clock_i/mmcm_i/CLKOUT1}]
create_generated_clock -name clk_125mhz_mux_x0y0 \-source [get_pins -hierarchical -filter {NAME=~*/pipe_wrapper_i/pipe_clock_int.pipe_clock_i/pclk_i1_bufgctrl.pclk_i1/I0}] \-divide_by 1 \[get_pins -hierarchical -filter {NAME=~*/pipe_wrapper_i/pipe_clock_int.pipe_clock_i/pclk_i1_bufgctrl.pclk_i1/O}]
#
create_generated_clock -name clk_250mhz_mux_x0y0 \-source [get_pins -hierarchical -filter {NAME=~*/pipe_wrapper_i/pipe_clock_int.pipe_clock_i/pclk_i1_bufgctrl.pclk_i1/I1}] \-divide_by 1 -add -master_clock [get_clocks -of [get_pins -hierarchical -filter {NAME=~*/pipe_wrapper_i/pipe_clock_int.pipe_clock_i/pclk_i1_bufgctrl.pclk_i1/I1}]] \[get_pins -hierarchical -filter {NAME=~*/pipe_wrapper_i/pipe_clock_int.pipe_clock_i/pclk_i1_bufgctrl.pclk_i1/O}]
#
set_clock_groups -name pcieclkmux -physically_exclusive -group clk_125mhz_mux_x0y0 -group clk_250mhz_mux_x0y0
#
#
# Timing ignoring the below pins to avoid CDC analysis, but care has been taken in RTL to sync properly to other clock domain.
#
#
set_false_path -through [get_pins -hierarchical -filter {NAME=~*/pcie_block_i/PLPHYLNKUPN}]
set_false_path -through [get_pins -hierarchical -filter {NAME=~*/pcie_block_i/PLRECEIVEDHOTRST}]#------------------------------------------------------------------------------
# Asynchronous Paths
#------------------------------------------------------------------------------
set_false_path -through [get_pins -hierarchical -filter {NAME=~*/RXELECIDLE}]
set_false_path -through [get_pins -hierarchical -filter {NAME=~*/TXPHINITDONE}]
set_false_path -through [get_pins -hierarchical -filter {NAME=~*/TXPHALIGNDONE}]
set_false_path -through [get_pins -hierarchical -filter {NAME=~*/TXDLYSRESETDONE}]
set_false_path -through [get_pins -hierarchical -filter {NAME=~*/RXDLYSRESETDONE}]
set_false_path -through [get_pins -hierarchical -filter {NAME=~*/RXPHALIGNDONE}]
set_false_path -through [get_pins -hierarchical -filter {NAME=~*/RXCDRLOCK}]
set_false_path -through [get_pins -hierarchical -filter {NAME=~*/CFGMSGRECEIVEDPMETO}]
set_false_path -through [get_pins -hierarchical -filter {NAME=~*/PLL0LOCK}]
set_false_path -through [get_pins -hierarchical -filter {NAME=~*/RXPMARESETDONE}]
set_false_path -through [get_pins -hierarchical -filter {NAME=~*/RXSYNCDONE}]
set_false_path -through [get_pins -hierarchical -filter {NAME=~*/TXSYNCDONE}]###############################################################################
# End
###############################################################################

五、编译生成bit文件

一路ok就行

可在Design Runs里查看进度

至此PL端就配置结束了。

下一篇讲PS端设置。

Xilinx zynq系列pcie xdma通信(一):下位机PL端相关推荐

  1. Xilinx zynq系列pcie xdma通信(二):下位机PS端

    在上一篇博文中介绍了PL端的设置,本文继续介绍PS端的设置.PS端仅用于验证上位机读写DDR3是否正确,因此相对比较简单. 一.新建SDK项目 在生成好bit文件之后先Export Hardware ...

  2. axi dma 寄存器配置_FPGA Xilinx Zynq 系列(三十二)AXI 接口

    大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江湖,在"闯荡江湖"."行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢. ...

  3. Xilinx FPGA PCIe XDMA性能测试报告(一)

    1 测试内容 本报告对Xilinx FPGA的PCIe XDMA的性能进行了测试,同时,给出了具体的测试框图.测试平台.测试步骤.测试记录等内容. 2 测试框图 3 测试平台 硬件平台:Dell R3 ...

  4. FPGA Xilinx 7系列高速收发器GTX通信

    Xilinx 7系列高速收发器GTX 说明: FPGA: TX端_zynq(7z035) RX端_zynq(7z100). 两个FPGA通过SFP(光纤)接口相连进行GTX的通信. 环境:Vivado ...

  5. 疫情爆发,“缺芯潮”来袭,ZYNQ系列出货量剧增如何满足供求,看这里!

    1.疫情爆发,加剧"缺芯潮"! 据中国台湾<经济日报>6月5日消息,中国台湾半导体封测大厂京元电子(King Yuan Electronics)竹南厂发生聚集性感染事件 ...

  6. 移动机器人下位机软件

    文章目录 前言 一.串口通信部分 二.PWM调速 三.编码器数据获取 四.PID速度控制 五.里程计数据计算 总结 前言 移动机器人的控制系统软件部分分为上位机软件与下位机软件两部分,二者之间通过串口 ...

  7. 数据采集系统下位机与上位机代码

    数据采集系统下位机与上位机代码. 下位机采用开发板来完成. AD9226模数转换芯片,最大65MHz采样,12bit量化. 双通道采样. 上位机可以设置下位机的采样深度最大采集8K,采样率(1M,10 ...

  8. LabVIEW FPGA PCIe开发讲解-7.2节:目前主流的4大Xilinx FPGA PCIe DMA通信IP核讲解

    1.要开发一个带PCIe或者PXIe接口的FPGA板卡出来,除了硬件本身外,最重要的就是FPGA芯片里面的PCIe通信代码编写,俗称下位机FPGA编程:还有中间层的驱动文件编写以及上位机PC端的应用程 ...

  9. FPGA基于XDMA实现PCIE X4通信方案 提供工程源码和QT上位机程序和技术支持

    目录 1.前言 2.我已有的PCIE方案 3.PCIE理论 4.总体设计思路和方案 5.vivado工程详解 6.驱动安装 7.QT上位机软件 8.上板调试验证 9.福利:工程代码的获取 1.前言 P ...

最新文章

  1. android studio远程控制,Android Studio远程登录控制台缺少“网络”和“窗口”命令?...
  2. static关键字用法
  3. 【hdu】4521 小明序列【LIS变种】【间隔至少为d】
  4. 13、Power Query-逆透视列的实例(下)
  5. python把桢写入txt_ffmpeg 常用参数一览表及python 使用示例
  6. Python学习笔记:异步IO(2)
  7. 安装 pcre-8.1.0 出现错误
  8. JavaScript 温故知新 00
  9. 股价口碑相继探底 这家“比新东方还要成功”的机构能用AI搏出明天吗?
  10. SVN的代码回滚,并不如预期的那样好
  11. 使用harviewer显示har文件
  12. SpringBoot微信公众号开发
  13. 黑屏后面藏了什么?--解读微软打击盗版
  14. asp.net扫描仪编程及ajax图片数据上传
  15. 26 | 产品安全方案:如何降低业务对黑灰产的诱惑?
  16. urllib库爬取拍信创意图片(post请求)json传参
  17. MYSQL基础(sql语句)
  18. stm32时钟初始化过程浅析
  19. vue props 属性值接受多个类型 _@jie
  20. uniapp开发app真机调试连接电脑服务器请求失败解决方法

热门文章

  1. 李文星家属起诉BOSS直聘索赔230万;乐视网又停牌;余承东否认华为推区块链手机丨价值早报
  2. 爱普生Epson XP-830 一体机驱动
  3. 【USB】Zadig 工具的使用说明与下载
  4. 2021计算机二级抽考的是,2021年计算机二级office考试将采用2016版本软件
  5. 微波辐射数据读取与处理
  6. 前端入门学习笔记五十一
  7. 绿联mac网线转USB osx10.9-11.0.1
  8. 平均置业年龄33.5岁!为啥搞数据的都往成都跑?
  9. /bin/sh: bad interpreter: Operation not permitted
  10. 微信小程序:伪input组件的样式