文章来源:傅里叶的猫微信公众号
前端时间大概介绍了下喆思的CXP HOST/DEVICE IP
既然讲到CXP ,就不能不提PCIe,市面上常见的CXP 采集卡是基于PCIe接口的,为了满足CXP 电口 12.5G 4lane/8lane 或者基于光口的40G/100G 的数据传输带宽,必须上PCIe Gen3x8/16,以便把视频数据快速传到上位机。
以下是CXP 采集卡的大概框图:
如何设计一个CXP HOSTàDDR4àXDMAàPC 的传输系统来满足以下需求:
传输带宽:PCIe Gen3x8 达到6.5GB以上,Gen3x16 达到12GB以上
*灵活性:满足1-4相机同时接入
可靠性:满足长时间传输不丢数据**
基于此类的需求,我们在CXP host 输出到DDR4缓存之间加入一个DMA 写模块(Multi_ch_dma_wr),该模块用来控制多通道分块缓存,这里的多通道指的是XDMA 的1-4通道。具体的分块缓存如下图示意:
这个块根据上位机设置的translate size来自动分配。块分好后,可以根据块来进行读写控制。我们假定XDMA的C2H是2通道,tran_size =4M,CXP数据是按照顺序写入256个块,0/2/4/8..为通道0缓存块,1/3/5/7..为通道1缓存块。CXP 数据按照顺序从0à1à2à3的顺序依次写入,XDMA 通道0 按照0à2à4à8的顺序读,1通道按照1à3à5à7的顺序读,这里通道0和1读顺序是交替读取的,逻辑保证不会跨块读,这是关键。如下图所示:
在写速率快的情况下,写指针追着读指针,读完一个块,前端fifo里面的数据会写到这个块
写读速率快的情况下(正常也是这种方式),读指针追着写指针,写完一个块,通道0或者通道1立刻读取。
换成测试数据,可测试DDR4(64bitx2400M)的读写极限带宽在16GB左右
当把DDR换成UltraRam,可测试PCIe Gen3x16的读带宽,大概11-12GB左右(我们用的ZU19EG,UltraRam只有4MB,这不是gen3x16的极限带宽)
如下图是接入TDI 线扫相机图像速率(像素填充到2byte传到上位机)
用UltraRam 测试PCie 读数据带宽:
测试读数据速率如下:
常见的一种情形是多采集设备接入,比如4通道相机,块控制可按如下所示:
如果更多的相机,可对块进行更详细的写控制,软件对读到的块进行拆分,送到各个相机处理模块,或者只是显示,可对相机画面进行拼接,利用2通道或者4通道传输即可。
另外一种极限情况是CXP-12 8lane 或者CXPOF 100G的相机,这时需要发挥gen3x16的极限性能,考虑用双通道DDR4 来做缓存,需要对Multi_ch_DMA_wr进行块控制修改,同时软件也需要做相应的改动。
该数据缓存的块控制可根据输入源灵活控制。
已在服务器以及台式电脑的win10/ubuntu/centos系统下长时间稳定运行,无丢数无错报。
以上讨论的FPGA缓存控制需要驱动和软件的配合才能实现,需要定义一些寄存器进行交互包括定义中断流程等。此设计可实现较为通用的PCIe高速数据系统,不仅仅是CXP,比如ADC,DAC等高速采集回放设备。