当前位置:   article > 正文

Xilinx PCIe与DDR经验谈_pcie读写ddr

pcie读写ddr

PCIe与DDR经验谈


一、PCIe_card_32ch实现框图

在这里插入图片描述
这种方法是,把DDR当做一个非常大的FIFO来使用,优点是:简单实用,缺点是:不适合复杂的数据投递

二、正点原子SRAM使用

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

二、常见的PCIE Endpoint设备数据交互方式

在这里插入图片描述
单工:DDR缓存足够大,Slave将所有数据投递完成后,Master才开始搬运数据。
双工:通过简单通讯机制,Slave和Master进行交互。列如,产生中断通知Master获取数据;另一方面,主机依据已经获取的packet数量,来通知Slave可以进行下次大规模数据传输。注意:Slave需要支持多个请求,及内部有请求buffer来缓存Master请求。因为当前请求可能未结束,Master就会下发新的请求。

四、通过AXI DMA的方式与DDR交互,然后PCIE读写DDR


如上图所示,DMA Controller实现下级模块数据搬移,对于DMA控制器而言,他只能实现数据搬移到DDR,这里只能搬移到PCIE采集卡的本地DDR,无法搬移到Host的DDR中,如果需要搬移到HOST DDR中,需要PCIE来搬移。
如上如所示,DDR中存放了DB0~DB4(Descriptor Buffer),Descriptor Buffer由HOST通过PCIE接口来写入,Descriptor Buffer通常有一下几个描述字段(可以参考xilinx dma datasheet 或者 VIRTIO/SRIOV):

/++++++++++++++++++++++++buffer descriptor++++++++++++++++++++++++++
offset | name | desciption
00 | nextdesc_ptr | bit4-0 is Rsvd.0x00->0x20->0x40->0x60.
04 | nextdesc_ptr_msb |
10 | da |
14 | da_msb |
18 | control | bit31-24:SOF/EOF/INT_EN/WIAT_FLAG/XX/XX/XX/XX bit23-0:cdma transfer len.
1C | status | bit3-0:DMAAXIWRERR/DMAAXIRDERR/SGAXIWRERR/SGAXIRDERR/SGINTERR/LEN_ERR/CPL. bit31-4:RSVD.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/

**nextdesc_ptr:**用于指示下一个DB地址;
**da:**表示DMA传输的起始地址
control: transfer len用来指示DMA传输长度,SOF/EOF,分别用来指示第一次dma传输和最后一次dma传输
****status:****CPL用来表示本次DMA传输是否结束。DMA传输可以是读也可以是写。

五、上送ADC数据到PCIe板卡

在这里插入图片描述
调试过程中遇到的问题:
A.ADC写入数据时,wr_natvie中的FIFO溢出问题:
1.FIFO代码出错,版本有问题,替换成VDMA的FIFO
2.PCIE Block Design中,AXI Interconnect IP核设置中,对输入和输出都添加32深度的FIFO,来提高性能(即带宽)
3.AXI WRITE的Burst长度由16改成256,来提升AXI写带宽效率;当ADC时钟为50M,数据位宽64,带宽约为3.2Gb/s,Burst长度为16时,FIFO溢出有计数,当修改为256时,FIFO不溢出。

六、PCIE采集卡FPGA内部实现框图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

七、PCIe调试过程中遇到的奇奇怪怪的问题

1.PCIe 8lane 在KU060上与PC机无法link,原因:DDR4与PCIE内部逻辑复位时序有要求。让PCIe先上电完成,等待link_up之后,再对DDR4进行初始化。
2.PCIE中断问题,配置IP Core为MSI中断,user_req发起请求且ack进行了应答,但是官方驱动没有打印中断。
类似现象,参考文章:(初步解决方法:对user_req信号进行延迟,保证CPU能响应中断,大约为0.5ms)
XDMA PCIE中断的处理
米联客(MSXBO)FDMA IP结合XDMA IP实现PCIE中断实现图像采集

3.软复位cfg_rst信号,由于该信号由寄存器控制,到了模块内部,该信号可能是异步信号,因此该信号进行跨时钟域处理,否则会出现复位异常,导致逻辑无法工作,且难以排查!
解决方法:模块内部使用相应时钟进行打怕处理,只是两排;或者使用xilinx提供的异步复位原语:

   xpm_cdc_async_rst #(
      .DEST_SYNC_FF(4),    // DECIMAL; range: 2-10
      .INIT_SYNC_FF(0),    // DECIMAL; 0=disable simulation init values, 1=enable simulation init values
      .RST_ACTIVE_HIGH(0)  // DECIMAL; 0=active low reset, 1=active high reset
   )
   xpm_cdc_async_rst_inst (
      .dest_arst(dest_arst), // 1-bit output: src_arst asynchronous reset signal synchronized to destination
                             // clock domain. This output is registered. NOTE: Signal asserts asynchronously
                             // but deasserts synchronously to dest_clk. Width of the reset signal is at least
                             // (DEST_SYNC_FF*dest_clk) period.

      .dest_clk(dest_clk),   // 1-bit input: Destination clock.
      .src_arst(src_arst)    // 1-bit input: Source asynchronous reset signal.
   );

4.Aurora信号的channel_up信号不易作为复位信号提供给其他逻辑,因为当光口信号稍差时,channel_up会不稳定,这样就意外的复位逻辑,soft_err信号需要计数,以便知道信号质量。
5.依然推荐整体工程中有一个复位管理模块,来控制各个模块的上电时序
6.对于脉冲同步信号,最好进行打两排进行时钟同步。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/496541
推荐阅读
相关标签
  

闽ICP备14008679号