基于PCI总线的测控卡的设计
2008-10-20
作者:张 德 马淑芬 吴嗣亮
摘 要: 介绍了一种基于PCI总线的测控板卡的设计,使用PCI9054实现总线控制,利用FPGA实现测控板卡的发送逻辑、接收逻辑和数据缓冲功能,并采用了乒乓FIFO;最后给出了用WinDriver编写设备驱动程序的方法。
关键词: PCI9054 FPGA 状态机 乒乓FIFO WinDriver
PCI总线是一种高性能的局部总线,它具有32/64位总线宽度,且总线地址和数据复用,支持猝发传输,传输速率高达132MB/s;同时可支持多组外围设备。另外,PCI总线不依赖于热和CPU,具有较好的兼容性。
近几年来,现场可编程门阵列(FPGA)在现代电子设计中的成功应用,使充分利用FPGA的本身资源设计专用电路,完成系统功能成为可能,从而简化了电路、缩小了体积、提高了稳定性、具有更大的灵活性。
基于这种设计思想,笔者利用FPGA和PCI总线接口芯片设计了一种测控电路板卡,经实际运行,效果很好。
1 系统结构与功能
本板卡为基于PCI总线,采用RS485电平传输的异步串行通信测控卡。它与PCI总线的协议部分采用PCI9054专用接口芯片来完成。PCI9054是由美国PLX公司生产的一款高性能PCI I/O加速器,它采用了先进的32位数据管道结构技术,支持复用/非复用的32位数据/地址总线,本地总线有三种模式可选:M、C、J模式,被广泛应用于PCI总线板卡的开发中。在本设计中,PCI9054工作在C模式下,采用中断方式,总线周期为 “PCI目标读单周期" title="单周期">单周期”和“PCI目标写单周期”,数据总线为8位。
异步串行通信电路部分完全用FPGA来实现。在设计上,笔者选用了Xilinx公司的SpartanⅡ系列的XC2S200来实现异步串行通信的接收、发送和接口控制功能,FPGA具有在线可编程能力,设计者可根据实际需求分配资源。
测控卡的通信协议为起止式协议,采用固定的帧格式:1位开始位、8位数据位、1位停止位,无奇偶校验位,在软件中采用统一的CRC校验,传输波特率为19.2kbps。为保证接收数据" title="接收数据">接收数据的正确性,设计中采用16倍频波特率作为接收采样时钟,并把第八个采样值作为接收数据。
测控卡主要完成以下工作:采用RS485差分电平传输的遥测数据经过电平转换后,由接收模块" title="接收模块">接收模块接收后乒乓缓存到FIFO中,并通过PCI总线接口芯片PCI9054以单周期方式送到计算机内存中以便进行下一步处理。发送模块" title="发送模块">发送模块接收到PCI总线传输过来的遥控命令后,按照通信协议格式组帧,在通过电平转换芯片转换成RS485电平后,以19.2kHz的频率发送给目标设备,实现对目标设备的各种控制。
根据以上分析,笔者设计的测控卡的具体功能结构如图1所示。下面详细阐述各部分的功能。
·MAX3490E:完成RS485差分电平到TTL电平的转换;
·接收模块:完成遥测数据的接收和缓冲;
·发送模块:完成遥控数据的缓冲和发送;
·接口模块:实现与PCI9054的接口功能,完成读写和传输控制操作;
·PCI9054:完成和PCI 总线的接口协议。
1.1 发送模块设计
发送模块主要实现对遥控数据的缓存和并/串转换,同时按照设计的异步串行通信数据帧格式进行相应的处理,最后将数据串行发送。处理器读取线路状态寄存器信息,检查发送FIFO(TxFifo)是否为空,如为空且有遥控数据待发,则将遥控数据通过PCI9054发送并存储到发送FIFO中。发送状态机读取TxFifo中数据,通过并/串移位后用19.2kbps的波特率串行输出。发送状态机实现起止位“0”、并/串移位信号、停止位“1”的发送,具体如图2 所示。
开始:当移位寄存器" title="移位寄存器">移位寄存器空,发送模块处于等待开始状态,一旦检测到非空,发送起始位“0”,状态机进入移位状态;
移位:通过并/串移位寄存器串行发出,当完成8bit 移位后,状态机转入停止状态;
停止:在这个状态,为发送的数据加上一位停止位,然后转入开始状态,等待下一个数据。
发送模块包含8位并/串移位寄存器TSR、51×8 bits发送FIFO(TxFifo)、用于实现发送遥控数据计数的52计数器等。发送模块内部电路结构如图3所示。
1.2 接收模块设计
接收模块实现遥测数据的串/并转换,同时完成起始位、停止位的识别捕获及遥测数据的缓存。由于本设计中由设备每100ms定时发送一帧(181字节)接收数据,当FIFO产生满标志时,将耗时(181×(8+2)/19200)ms,即约95ms,仅剩5ms左右的时间让PC机响应,由于操作系统的特点,不能充分满足PC机的响应时间,这会造成接收数据混乱。为保证PC机所需的响应时间和数据的正确性和实时性,笔者使用了两个满标志为181的接收FIFO进行乒乓切换,收到良好的效果。
接收模块包含8位串/并移位寄存器、两个满标志为181的接收FIFO(RxFifo、RxFifo_Cache)、采样电路、捕获电路、读写通道选择电路和移位计数器电路。其中,采样比较电路采样起始信号、数据信号和结束标志,通道选择电路用来对FIFO乒乓切换读写通道进行选择。接收模块内部结构如图4所示。采样电路、捕获电路在采样捕获到起始信号“0”后根据通信协议接收串行数据,经过串/并移位后乒乓存储到FIFO中,由PCI9054根据满、空信号乒乓读取。
1.3 接口模块设计
接口模块主要实现PCI9054和接收、发送模块的通信,包括传输控制逻辑、时钟分频控制,笔者根据PCI9054的单周期读写时序给出了各类寄存器的读写信号、总线响应信号、控制信号等。该模块含有五个寄存器:接收FIFO寄存器(RFR)、发送FIFO寄存器(TFR)、线路控制状态寄存器(LCSR)、中断标识寄存器(IIR)和中断使能寄存器(IER)。具体说明如下: ·LCSR:通过读该寄存器获取各个FIFO的状态信号(置1有效,0无效)。LCSR格式如下:
TxFifocompleted:数据传输完成(1完成,0未完成);
TxFifoEmpty:发送FIFO寄存器空(1空,0非空);
TxFifoFull:发送FIFO寄存器满(1满,0未满);
RxFifoEmpty:接收FIFO寄存器空(1空,0非空);
RxFifoFull:接收FIFO寄存器满(1满,0未满)。
·IIR:通过读取该寄存器获得中断类型。IIR格式如下:
0100(int0):接收FIFO(RxFIFO)满中断;
0010(int1):发送FIFO(TxFIFO)空中断;
0001(idle):无中断。
·IER:可以通过写该寄存器相应位使能或取消中断。IER格式如下:
TxFifoI:发送FIFO空中断使能 (1允许,0禁止);
RxFifoI:接收FIFO满中断使能(1允许,0禁止)。
中断产生由接口中断状态机实现,具体如图5所示。
空闲:空闲状态,没有中断产生;
中断int0:接收FIFO(RFR)满,产生中断,要求PCI9054响应;
中断int1:发送FIFO(TFR)空,产生中断,要求PCI9054写入数据或读取中断标识寄存器IIR。
2 驱动程序的开发
驱动程序主要是完成对硬件板卡的内存映像地址、I/O地址的存取,并正确处理来自板卡的硬件中断。与传统开发设备驱动程序的方法不同,WinDriver不要求开发者非常熟悉操作系统平台,掌握核心开发/调试知识等;并且WinDriver设备驱动程序工具包将驱动程序的开发作了最大的简化,它为开发人员提供了功能全面的API函数。开发人员只要根据硬件板卡功能的需要调用所需的函数即可。本测控卡驱动程序需要完成设备的初始化、FIFO的读写等,笔者选择相应的函数将其封装成一个测控卡驱动类,并加以例化,供应用程序调用,即很好地实现了硬件功能。
利用专用PCI总线接口芯片可以实现完整的PCI主控模块和目标模块接口功能,将复杂的PCI总线接口转换为相对简单的用户接口,避免了用户直接面对复杂的PCI总线协议,降低了设计难度。利用FPGA设计自己需要的专用电路,具有极大的灵活性,设计者可以根据实际的需要,在FPGA资源允许的条件下对设计进行优化扩展。譬如笔者在设计过程当中,利用FIFO实现了数据缓存,并根据数据的实际长度加大了FIFO的深度,有效地降低了中断次数或查询次数;同时,FIFO的乒乓切换很好地满足了PC机所需的响应时间,保证了接收数据的正确性,对整个系统起到优化作用。利用WinDriver 开发驱动程序,简单实用,缩短了开发周期。
参考文献
1 李圣怡,戴一帆,王宪平.Windows环境下软硬件接口技术[M].长沙:国防科技大学出版社,2001
2 李贵山,陈金鹏.PCI 局部总线及其应用[M].西安:西安电子科技大学出版社,2003
3 叶玉明,姚伯威,彭 卫.基于PCI总线数据采集系统研究[J].中国测试技术,2003(1):47~48
4 PCI9054 Datasheet [M]. USA:PLX Corp,2001