赞
踩
这种方法是,把DDR当做一个非常大的FIFO来使用,优点是:简单实用,缺点是:不适合复杂的数据投递
单工:DDR缓存足够大,Slave将所有数据投递完成后,Master才开始搬运数据。
双工:通过简单通讯机制,Slave和Master进行交互。列如,产生中断通知Master获取数据;另一方面,主机依据已经获取的packet数量,来通知Slave可以进行下次大规模数据传输。注意:Slave需要支持多个请求,及内部有请求buffer来缓存Master请求。因为当前请求可能未结束,Master就会下发新的请求。
如上图所示,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传输可以是读也可以是写。
调试过程中遇到的问题:
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不溢出。
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.对于脉冲同步信号,最好进行打两排进行时钟同步。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。