在前面的课程种,我们已经提供了FDMA和XDMA配合使用,应用于PCIE传图的方案。但是前面的课程没有使用到中断,这是一大遗憾,有不少客户希望我们米联客(MSXBO)可以增加FDMA和XDMA中断通信的例子。由于平时比较忙,一晃2019年都快结束了,抓紧2019年的尾巴,增加2个中断的例子,本文种的是第一个例子。 首先我们要理解下XDMA的中断类型,以及控制时序: 1)、Legacy Interrupts: 对于Legacy Interrupts中断,当user_irq_ack 第一次为1的时候usr_irq_req可以清0,当user_irq_ack 第二次为1的时候,可以重新设置usr_irq_req发起中断。 在PCI总线里面INTx中断是由四条可选的中断线决定的,这种中断方式是共享式的,所有的pci设备把中断信号在一条中短线上相与,再上报给cpu,cpu收到中断以后再查询具体是哪个设备产生了中断。 2)、MSI Interrupts: MSI 发出usr_irq_req 中断请求后,user_irq_ack 为1只是说明中断已经北主机接收了,但是不代表已经处理,软件或者驱动层可以去清零usr_irq_req。 MSI中断和MSI-X都是往配置的CPU中断寄存器里进行memory写操作,来产生中断,效率比INTx是共享式高,其中MSI最多支持32个中断向量,而MSI-X最多支持2048个中断向量。 3)、MSI-X Interrupts: 当usr_irq_req 中断请求后,只要user_irq_ack为1 就可以清零usr_irq_req,但是没说明说明时候可以置1,重启下次中断。 经过以上所有中断方式测试,发现,MSI-X中断,会导致系统非常慢,估计是底层频繁中断导致,软件非常卡反而影响了传输效率,Legacy和MSI 对于usr_irq_req的清除,对于大数据量的传输,比如一幅图像的传图,只要确保usr_irq_req足够长的时间,中断就能被响应。 或者当软件收到中断后,通过AXI-LITE接口清除usr_irq_req。 usr_irq_req清除后可以重新置位响应中断。 本文就是采用了增加AXI-lite接口来控制清除usr_irq_req中断信号。 先看下整体的BD设计: 可以看到XDMA支持8条中断信号输入,而且我们增加了2个axi-gpio的IP,其中axi_gpio_0用于清除中断请求,axi-gpio_1用于控制FDMA控制器部分的复位(启停)。 展开XDMA的IP看下IP的设置,在中断部分,使用MIS中断,支持8个中断向量 可以看到XDMA支持8条中断信号输入,而且我们增加了2个axi-gpio的IP,其中axi_gpio_0用于清除中断请求,axi-gpio_1用于控制FDMA控制器部分的复位(启停)。 展开XDMA的IP看下IP的设置,在中断部分,使用MIS中断,支持8个中断向量 如下图在FDMA控制代码改名位fdma_ctr_irq,此文件中, 我们增加了中断控制,并且把帧缓存增加到8,越大的缓存,越有利于带宽的重大化利用。而且可以看到,axi_gpio_1引出的信号irq_rstn,用于整个fdma_ctr_irq的复位。这样通过上位机的控制就可以控制FPGA代码的复位了。 xdma_irq_req 就是申请PCIE中断请求,而xdma_irq_ack用于清除xdma_irq_req的相应位。xdma_irq_ack引出到axi_gpio_0的soft_io,这样上位机控制控制axi_gpio_1的soft_io就可以清除xdma_irq_req相应的中断请求位。 再来看下FMDA控制代码部分fdma_ctr_irq代码中,如下图,当一帧图像传输完成后,设置了W0_irq位1 以下代码中,根据时序要求,先对W0_Fbuf寄存一次,这样才能确保设置中断请求的相关位置是刚刚完成写内存的指向位置。由于是异步采样,对于清除中断请求的信号,xdma_irq_ack需要三次缓存。 最后通过设置xdma_irq_req的相关位为1请求PCIE中断,以及清除xdma_irq_req的相关位为0,以便下次中断请求。 通过逻辑代码分析可以看出如果上位机无法及时响应中断,会出现丢中断的情况。对于不允许数据丢失的应用场合,在增加多缓存的情况下仍然无法满足要求的,只有通过增加PCIE带宽和PC的处理能力来解决。 程序下载后重启电脑,通过观察在线逻辑分析仪,上位机没有开启,整个时候ui_rstn为0,FMDA控制代码处于复位状态。 设置好分辨率,点击play,上位机就会取消ui_rstn复位,FDMA控制代码处于工作状态。 上位机在开启线程中等待中断的产生,当中中断产生后及时清除中断,下图中通过控制GPIO的输出可以非常简单的清除中断请求。Sleep(20),是视频采集中为了保证视频流的均匀采集而设置了,可以设置Sleep(0)以便达到最高速度,但是对于视频流采集,由于申请了8个缓存,中断处理的快慢会影响视频的显示效果。 在PCIE的初始化代码中,申请连续的内存,并且设置开发板的内存偏移地址,这里采用了8缓存,所以需要设置8个缓存的地址。在初始化代码中通过控制GPIO的输出,而控制FDMA FPGA采集代码的启动和停止。 在PCIE的退出代码中,让FMDA 的FPGA代码再次处于停止状态(复位状态)。 本次的PCIE上位机做了改进,相比之前的代码更稳定,界面也可以手动输入分辨率,来调整视频分辨率。下面还有一篇关于FDMA中断支持ADC采集的方案,等论坛博文发布完毕,我会整理编入米联客PCIE教程中。 MA703FA-100T HDMI视频输入中断代码链接:https://pan.baidu.com/s/1M7hNHF9xeXHookU8N2VMVQ 提取码:pwv5 |
扫描关注,了解最新资讯