首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

FPGA编程时的一些注意事项

FPGA编程时的一些注意事项

问题:
        随着NI的FPGA产品的广泛使用,很多同事和客户都碰到了一些FPGA编程时遇到的问题。由于FPGA不能实时调试,每次修改一点代码之后都要编译很长时间之后才能看到修改的效果,所以,我们希望尽量在FPGA编写代码时就将更多的问题考虑到位。本文针对项目过程中碰到的一些实际问题进行阐述,希望可以为大家在FPGA编程过程中提供一些帮助。
        项目描述:该项目是一个实时频谱监测、流盘以及跳频信号检测的需求。具体参数是IQ速率为100MHz,流盘5分钟(要做类似Reference Trigger的效果,即按下按钮之前的一分钟和按下按钮之后的四分钟信号一起流盘),检测跳频信号的时间点和相应的频点,其中跳频信号的参数是:突发性,每次持续1ms~20ms,跳频信号在每个频点上的持续时间是1us~20us,跳频频率70000/s,每个频点上的信号带宽是5MHz;使用的硬件是5792+7966.其中与FPGA相关的部分就是数据采集和跳频信号的检测。对于数据采集部分,5792有专门的采集范例可以供大家参考,而跳频信号的检测算法是将数据每隔128个点做一次FFT(100M的采样率,对于1us的跳频信号持续时间,对应为100个时域采样点)。做出的FFT结果如果超过阈值,则将FFT结果的序号回传给上位机进行保存。
解答:
一、DMA传输的速率
        对于PXIe-7966R,官网上标定的DMA的传输速率为800MB/s,理论上可以完全满足项目中的400MB/s的传输速率要求。但实际测试过程中,传输的速率接近但总是达不到400MB,这直接影响了信号的实时采集和流盘。经了解,FPGA的DMA BenchMark与FIFO的数据位宽、总线带宽以及DMA控制器的速率都有一定关系。见下图:

  注:上图中PXIe系统下,FPGA的时钟使用的是200MHz的时钟。而PXI系统下,FPGA的时钟使用的是160M (U8 和U16),133M(U32和U64)。
注:上图中使用的机箱是PXIe-1075,使用的控制器是PXIe-8130.

通过观察上述PXIe和PXI板卡的速率统计,可以看到:
对于PXI板卡,在 U8场景下,FPGA每秒钟产生160MB的数据,U16场景下FPGA每秒产生320MB的数据。众所周知,PCI总线的传输带宽为133MB/s,那为什么上图中U8情况下的速率才33MB/s,U16情况下的速率才66MB/s呢?这是因为PCI总线的传输模式是并行传输,总线位宽和时钟频谱分别是32位和33M(一般的desktop都是这样的配置),也就是说每个时钟周期传输32个比特的数据。因此,如果传输的是U8或者U16的数据类型,那么相当于每个传输周期浪费了3/4或者1/2的位宽。因此,U8情况下每次只能传输一个字节,结合33MHz的时钟频率,使得DMA 的Benchmark只有33MB/s。U16的情况下的DMA速率为66M也是可以理解的。而U32以及U64的情况下,只能达到133M的极限速率。
对于PXIe板卡,FPGA读写 FIFO的时钟固定为200MHz,因此,如果FIFO的数据类型是U8,那么每秒钟FPGA端就产生200MB的数据;如果FIFO的数据类型是U16,那么每秒钟FPGA端就产生400MB的数据量。这些数据量远小于1075机箱的单槽带宽(PCIe Gen 1 ×4,1GB/s),因此,总的DMA Benchmark 就等于FPGA端产生数据的速率。如果FIFO的数据类型为U32,那么FPGA产生数据的速率就达到了800MB,这几乎1075机箱的单槽传输极限,因此U32场景下DMA的BenchMark接近800MB/s。继续增加FPGA端FIFO的位宽,在200MHz的时钟频率下FPGA每秒钟产生1.6GB的数据,但这时PCIe总线的传输速率不可能再大幅提升,因此,U64情况下DMA的Benchmark 还是在800MB左右,所以我们很容易得出DMA的传输速率限制为总线的单槽传输带宽。
实测1085+8135环境下的DMA速率
为了验证此种情况(U64,200M时钟)下DMA的传输速率限制确实为总线的单槽传输带宽,我们有理由假设,如果使用1085机箱(单槽传输速率为4GB/s),DMA的传输速率应该可以达到1.6GB/s。因此,我又搭建了相关的系统对1085机箱下的7966 DMA速率进行测试:
硬件环境:PXIe-8135+PXIe-1085+PXIe-7966
测试方法:在7966中以200M的时钟不断将U64数据写入到FIFO中,FIFO大小2048;上位机中对FIFO进行全速读取(缓冲区中有多少点读多少点),上位机缓冲区设置为200M;
测试结果:DMA速率900MB/s左右.修改上位机中FIFO的缓冲区大小,DMA速率没有出现大的波动,依然在900MB/s。观察CPU占用率在18~20%,每次循环查看缓冲区中的点数10000点不到,说明上位机的读取速率完全不是瓶颈。
分析结果可以发现:此时系统总线的单槽带宽已经不是限制因素,上位机的读取速率也完全可以跟上。DMA传输链路上的瓶颈,除了FPGA产生数据的速率、总线传输带宽、上位机的读取速率之外,还有一点是我们之前没有考虑到的——就是DMA控制器的速率。在我们实际测试的这种场景下,DMA控制器的速率成了DMA链路传输速率受限的主要原因。这个结果与官网上说7966的DMA传输速率为800MB/s以上是相互吻合的。
总结:
i)  PXI总线的带宽比较低,目前支持PXI总线的FlexRIO只有较老的795x系列,这种情况下限制DMA传输速率的主要是总线带宽;
ii)  PXIe 总线的带宽比较高,不同机箱的单槽传输带宽各有不同,因此,对DMA传输速率上限有一定的影响;
iii) FPGA端在一定的时钟频率下,如果希望提升数据率,可以使用更宽的数据位宽;
iv) DMA控制器的速率是板卡本身硬件上对DMA速率的限制——7966的DMA速率为800M以上,7975的DMA速率可以达到1.6GB/s;
当然, DMA的传输性能的影响因素,比如上下行的影响。上图中给出的数据中,对于7965的上下行DMA速率相差不大,但对于7954的上下行DMA速率相差很大。对于这一点,还需要更加深入地研究。本文不再深入讨论
继承事业,薪火相传
返回列表