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

FPGA编程时的一些注意事项(2)

FPGA编程时的一些注意事项(2)

二、 FPGA与上位机的握手
  FPGA中FIFO的使用使得FPGA端和上位机端在很多时候都可以异步操作。上位机中没有有效的数据传递到FPGA端,FPGA端就不会进行有效的计算并传输无效的数据。但在有些情况下,FPGA端与上位机端需要进行握手的操作。比如:一个项目需要通过Adapter端口进行数据采集,然后将数据传回到上位机。这种情况下,如果FPGA先于上位机开始执行,那么FPGA采集到的端口数据会迅速地填满FIFO(此时上位机还没有准备好去读取FIFO的数据)导致后续的数据无法保存到FIFO中(写入超时)。而当上位机开始读取FIFO时,会发现FIFO的前一段数据(数据的长度与FPGA端配置的FIFO大小有关)与后续的数据是非连续的。为了避免类似的问题,需要在FPGA与上位机之间握手。
        通常用于FPGA程序与Host程序同步的方法是使用一个握手控件。在FPGA的主程序之前,使用一个while循环,条件接线端链接着布尔控件。在上位机中,当一切准备就绪时(对FPGA的初始化以及其他初始化工作),可以为FPGA的Start控件赋上真值,这样,FPGA与Host端的数据传输就同步了,这是非常容易实现的方法。代码如下:

  另一种方法是使用FPGA中提供的中断。在FPGA端需要等待上位机的数据或者等待上位机做好接收数据的准备时,产生一个中断。该中断会阻塞程序直到该中断被确认。当上位机中准备好向FPGA传输数据或者接收来自FPGA的数据时,上位机可以对中断进行确认。代码如下:

三、FIFO的使用
1)  使用场景:
         该项目需要在回放时对信号进行精细的分析。尤其是有一个跳频信号,跳频的频带宽度为70MHz,跳频信号本身的带宽为5MHz,跳频信号的持续时间为1us~20us,跳频信号以突发的模式出现。需求是以较快的速率分析出信号文件中所有的频率点以及各个跳频信号所处的时间点。其实分析的原理不难,只需要对信号以足够精细的时间分辨率(1us)做FFT,判断该段信号是否有功率大于阈值的点就可以了。
        在项目初期,曾经尝试过直接在上位机中做FFT,判断阈值,找到频点以及对应的时间点。但经过测试,上位机端进行数据处理的瓶颈在于大的数据块的分割。本程序中的数据源是存在磁盘阵列中的数据文件,从磁盘阵列中读取文件本身的速率可以达到非常高,500MB以上,但达到此速率的前提就是每次读取一个大的数据块(几兆到几十兆字节),否则,读取速率无法达到理想值;但这种情况下,就需要在程序中对大块的数据进行分割,然后进行FFT。虽然测试时已经开通了多个流水线进行数据分割,但速率依然达不到要求。整个系统的最高处理速率只有40~50MB/s,这对于120G(流盘5分钟)的跳频信号分析显然是不能满足要求的(分析5分钟的数据需要花将近1个小时的时间)。
        基于这个原因,本程序将FFT的操作放在FPGA中完成。上位机中将大块的数据传输到FPGA中,FPGA天然的单点操作特性使得不需要进行大数据分割就可以完成小点数的FFT操作。由于N点时域信号做完FFT之后数据量没有减小,不能将FFT结果直接传回到上位机中进行阈值检测,所以FFT结果的阈值比较也在FPGA端进行单点比较,并将超过阈值的频点的索引值传回到上位机。
        最终,FPGA端以400MB/s的速率对信号进行处理。
2) 初始化和配置:
        每次在程序重新运行时,系统会对所有FIFO进行初始化,清除原有的数据。在上位机中对FIFO进行读取之前,要首先对FIFO进行开始操作,否则,虽然最终能读出数据,但前期会出现数据的丢失。当然,也可以通过编程的方式对FIFO进行初始化:使用FIFO的调用节点,先开始FIFO,再停止FIFO,再开始FIFO,就能完成FIFO的初始化并使FIFO处于就绪的状态。不过这种编程方法来初始化FIFO的操作不常用。
        FPGA与Host端通常采用DMA的方式进行数据传输,数据在DMA控制器的作用下从FPGA传输到上位机的缓冲区中,LabVIEW从缓冲区读取到应用程序内部;在从上位机往下位机传输数据时,LabVIEW将数据从应用程序内部写入到缓冲区中,然后DMA控制器通过总线从缓冲区获取数据。在配置时,一方面需要配FPGA端的FIFO大小,这是通过窗口配置的方式来实现的。FIFO本身的大小在一定程度上可以减低数据覆盖的危险,但FIFO设置的过大,会占用太多FPGA的资源,且是没有必要的;另一方面需要配置上位机端用于DMA FIFO的缓冲区大小。一般,缓冲区的大小为每次读取的数据块大小的5~10倍左右。
继承事业,薪火相传
返回列表