基于PXI总线的数据传输接口设计与实现方案
图 4 中,S0 为空闲状态;S1 若在PCI9054 对Local Bus 进行写的操作中为数据接收状态,若在PCI9054 读Local Bus 的操作中为数据准备状态;S2 为PCI 9054 读Local Bus 的操作中的数据发送状态;S3 为读写操作的终止状态。图中各状态转移触发信号均为PCI 9054Local Bus 端的控制信号。
图 5 PCI 9054 内部寄存器读写操作的状态转移图
图 5 中,S0为空闲状态,在读写启动信号en_rwreg=1的情况下进入工作状态;S1为读写周期开始状态,有效Local Bus 端的读写周期开始信号;S2 为读写周期等待状态,等待PCI9054 的LREADY#有效;S3 为突发读写方式下的响应状态,突发读写方式下,PCI9054的LREADY#有效后,使能内部逻辑进行相应的响应;S4 为读写周期响应状态,在非突发读写方式下或者突发读写的终止周期中的响应状态。
在实现了上述两个状态机模块后,FPGA的程序还需要包括对FFT处理器的输出数据进行数据帧封装,即给每一次FFT 处理器根据相应的配置参数进行处理输出的数据加上帧头,帧头中包含了此次传输的FFT 数据所覆盖的频段以及数据的长度信息。这样做的好处是上位机不需要额外的同步信息,只需要根据帧头中的频段信息以及长度信息就可以判断当前数据帧所表示的频谱信息。利用PCI9054 内部寄存器中的MailBox 寄存器组来实现数字频谱仪与上位机之间的参数传递。由于数字频谱仪需要的参数信息比较少,只需要频段选择信息,以及开始和结束数字频谱仪的控制信号,选择MailBox 寄存器组中的第七个位宽为32 位的寄存器来传递控制信息。
整个 FPGA 程序的流程示意图如图6 所示。
图6 FPGA程序流程示意图
接口驱动程序的设计可以通过两种方式实现,一种是通过专用的驱动程序开发工具进行驱动程序的设计,如DDK、DriverStudio 和WinDriver 等,另外一种方式是通过PLX 公司提供的PCI软件工具包SDK(Software Development Kit)实现接口的驱动设计,它提供了能够实现各种传输方式所需要的基本API 函数。
为了缩短开发周期,本文采用由PLX 公司提供的SDK 工具包进行驱动程序的开发。运用其SDK 提供的工作API 函数实现Block DMA 模式下的Burst Forever(无限突发)方式的数据传输。主要用到的函数如表1 所示。
由于本系统的特殊应用,还需要增加一些上层的应用程序,才能实现整个数字频谱仪数据的正常工作,主要包括数字频谱仪的参数控制字的生成和写PCI9054 内部寄存器MailBoxReg7,以及对接收的数据帧进行解封装的相关程序开发。
表1 Block DMA 模式下的SDK API 函数应用列表
本文使用了 PCI9054 的DMA传输方式,并且在Local端发起DMA传输,在上位机上采用中断的形式进行响应,可以减少占用上位机CPU 处理时间,使得上位机在进行数据传输的同时可以进行其他的操作。PXI 接口加上PCI9054 的开发模式,使得开发周期缩短了很多,避免了复杂的PXI 总线协议的逻辑设计和验证工作。本系统采用的PXI 总线的传输位宽32 位,采用无限突发的传输方式,在数据传输周期中的数据传输速率为132MB/s,但是由于增加了额外的控制周期以及其他的一些控制逻辑,使得数据的平均传输速率并没有达到这个值,但是完全可以匹配目前FFT 处理器的处理速率,可以保证数据传输的实时性。
评论