随着计算机测试技术的飞速发展,越来越多的外部设备通过串口与计算机进行通信,实现信息共享以及设备的集中控制和管理。利用串口进行通信具有结构简单、传输距离远、成本低廉等优点,被广泛应用于各个领域。同时,PCI(Peripheral Component Interconnect)总线是一种高性能32/64位局部总线,最大数据传输速率为132 Mb/s,可同时支持多组外设,数据吞吐量大,是目前应用最广泛、最流行的一种高速同步总线。因此,利用PCI总线实现上位机与外部设备的串口通信,可以提高通信能力。
由于大部分I/O 设备没有PCI总线功能,要实现设备与PCI总线的连接,需要PCI接口芯片、通用异步收发器UART(Universal Asynchronous Receiver Transmitter)等。而目前开发PCI总线与外部设备的串口通信大体上有两种方式:(1)使用专用的芯片,如:PCI专用接口芯片S5920、S5933等;UART专用芯片8250、8251、16450、16550等。使用厂家提供的专用接口芯片,用户可能只使用到它的部分功能,会造成一定的资源浪费,而且专用芯片价格高。(2)使用可编程器件FPGA。使用FPGA较使用专用芯片具有以下优点:一方面用户可以根据需要进行设计,不会浪费资源;另一方面可以将PCI接口、UART都做在一片FPGA内,这样就不需要外接专门的芯片,简化了电路、缩小了体积、提高了系统的可靠性。
1系统硬件设计
本设计中选用Altera公司的FPGA芯片EP1C6SQ240作为核心器件,完成PCI接口以及UART的设计,实现PCI总线与串口的连接。选用美信公司的MAX490芯片作为电平转换电路。系统的硬件连接框图如图1所示。
数据传输过程:上位机通过PCI总线发送并行数据到UART的数据缓存器中,然后数据经UART的数据缓存器进入UART的移位寄存器进行并串转换后,通过串口传到下位机。反之,下位机通过串口将数据传送到UART的移位寄存器中,进行串并转换,然后进入UART的数据缓存器中,最后传到上位机。
设计中采用,传输距离长、抗干扰能力强的RS422串口。但是规定RS422:逻辑1的电平为-6 V~-2 V;逻辑0的电平为+2 V~+6 V。而FPGA的I/O电平一般为0~3.3 V,二者之间的电平不兼容。为了使二者之间的供电电压保持一致,必须加入电平转换电路。为此选用美信公司的MAX490芯片来实现二者之间的电平转换,其电路原理图如图2所示。
1.1 PCI总线接口
PCI总线接口的功能是将一个不支持 PCI 协议的后端设备接口到PCI 总线上。为了实现PCI总线接口的基本功能,必须完成如下模块的设计:PCI空间配置模块、偶校验模块、地址译码和命令译码模块、设备状态机模块等。PCI总线接口原理框图如图3所示。
1.1.1 PCI空间配置模块
PCI协议支持3种地址空间:I/O空间、内存空间和配置空间。配置空间是PCI所特有的一种空间,其大小为256 B,前64 B是必需的,记录了PCI串口设备的基本信息。PCI设备的一些主要的信息如下:
(1) VendorID、DeviceID:分别表示设备的生产厂商和设备编号。
(2) Command:命令寄存器,包含设备控制位,包括允许存储器读写响应等。
(3) Status:状态寄存器,记录PCI总线的相关事件信息。
(4) Base Adress Register:基地址寄存器,指示此PCI设备按I/O方式还是按内存方式进行读写以及需要的地址空间大小。
(5) Interrupt Line、Interrupt Pin:为设备使用的中断号和中断引脚。
1.1.2 偶校验模块
PCI总线的偶校验用于检验数据传输是否正确。在PCI总线上,利用偶校验模块检查每次传输中主设备是否正确地寻址到目标设备,以及它们之间的数据是否正确地传输。
1.1.3 地址译码和命令译码模块
地址译码模块主要用于检测地址与此PCI串口设备的基地址是否匹配,如果匹配,则PCI串口设备响应当前的总线操作。
命令译码模块表示PCI串口设备响应不同的总线命令,通过检测PCI-cbe[3:0]信号线上的值,完成命令译码。
1.1.4 设备状态机模块
PCI总线接口电路是时序复杂的接口电路,它的复杂性由PCI总线操作的多样性决定。根据PCI的总线操作类型和总线操作时序关系,在这里抽象出一种简洁明了,符合总线时序、更易于硬件描述语言实现的状态机。总线接口状态机示意图如图4所示。状态机的设计是整个设计的核心部分,利用该状态机可以完成配置寄存器、存储器、I/O的读写操作。
状态机包括4个状态:空闲(idle)状态、配置读写(con)状态、存储器或I/O读写(rw)状态、传输中止(backoff)状态。系统复位后,状态机转入空闲状态,在空闲状态中采样总线,并根据总线的变化来决定状态机即将转入的状态。如果此时命令总线上是配置寄存器读写命令,判断PCI-irdy信号是否有效来决定下一可能的状态。如果信号无效,则状态机转入传输中止状态,然后返回空闲状态;如果信号有效,则状态机转入配置读写状态。如果此时命令总线上是存储器或者I/O的读写命令,则判断PCI-frame信号是否有效来决定下一可能的状态。如果信号无效,状态机转入传输中止状态,然后返回空闲状态;如果信号有效,状态机转入存储器或I/O读写状态。
1.2 UART模块
PCI总线传输的是并行数据,而串口传输的是串行数据,要想实现PCI总线与串口的数据传输,必须通过UART完成数据的串并/并串转换。本文设计的基于FPGA的UART由4个模块组成:波特率发生器模块、寄存器控制模块、接收模块以及发送模块。UART的总体框图如图5所示。
1.2.1 波特率发生器模块
波特率发生器实际上就是一个分频器,用来产生和串行通信所采用的波特率同步的时钟,这样才能按照串行通信的时序要求进行数据接收或发送。本设计中UART收发的每一个数据宽度都是波特率发生器输出时钟周期的16倍,即假定当前按照9 600 b/s进行收发,那么波特率发生器输出的时钟频率应为9 600×16 Hz。
1.2.2 寄存器控制模块
设计的UART包括:2个数据缓冲寄存器(接收、发送缓冲寄存器);2个状态寄存器(中断识别、线路状态寄存器);2个控制寄存器(中断使能、线路控制寄存器);2个移位寄存器(接收、发送移位寄存器)。寄存器控制模块完成除了移位寄存器外的所有寄存器的读写控制。
1.2.3 接收模块
接收模块包括接收缓冲寄存器和接收移位寄存器。在接收数据开始时,为了能够准确地传输数据,先要清空接收缓冲寄存器和接收移位寄存器,然后接收移位寄存器等待检测数据的起始位。检测到有效的起始位后开始接收数据,同时启动接收数据计数器,统计接收数据的位数,直到接收到满足需求的数据位。如果需要奇偶校验,则产生校验位。最后接收停止位,完成1帧数据(起始位+数据位+奇偶校验位+停止位)的接收,将数据存入接收缓冲寄存器,进行下一帧数据的接收,并通知上位机读取数据。
接收模块通过状态机来完成数据接收,其状态机包含4个状态:空闲状态(idle)、移位状态(shift)、奇偶校验状态(parity)和停止位状态(stop),如图6所示。其工作过程如下:当系统复位时,状态机进入空闲状态,等待接收开始位;当开始位被确定有效后,状态机进入移位状态。在移位状态中,接收模块为每个数据位的移入等待16个内部时钟周期,接收完特定的数据位后,若奇偶校验使能有效,则跳转到奇偶校验状态;否则,进入停止位状态,而后进入空闲状态,重复上述过程。
1.2.4 发送模块
发送模块包括发送缓存寄存器和发送移位寄存器。在发送数据开始时,清空发送缓存寄存器和发送移位寄存器后,发送缓存寄存器接收发送来的数据,然后从发送缓存寄存器向发送移位寄存器发送数据。首先发送起始位到发送移位寄存器,同时启动发送数据计数器,记录发送数据的个数,直到发送移位寄存器接收到满足需求的数据。若奇偶校验使能有效,则跳转到奇偶校验状态;否则,进入停止位状态,完成1帧数据的发送。只要发送缓存寄存器不为空,则继续传输下一帧数据。其状态机的实现与接收模块的类似。
2 系统软件设计
2.1 驱动程序
WinDriver是一套PCI驱动程序开发包。它改变了传统驱动程序开发的方法与思路,极大地简化了驱动程序的编制。同时,WinDriver又没有牺牲驱动程序的性能,是一套高效、快捷的PCI驱动程序开发软件包[4]。WinDriver可在VC/C++、Delphi、BC++、VB等多种开发环境中使用,本设计选用VC++作为驱动程序的开发环境,通过WinDriver生成VC++代码,根据设计的需要修改生成的代码以完成此PCI设备的驱动。驱动程序流程图如图7所示。
2.2 应用程序
应用程序负责调用、连接驱动程序,实现与驱动程序的通信。连接到驱动程序后,向驱动程序注册,同时启动串口监测工作线程,等待事件发生。当驱动程序接收到中断后,通过发送消息通知应用程序,处理发生的事件。处理后退出应用程序,结束等待事件线程。应用程序流程图如图8所示。
本文介绍了一种基于FPGA的PCI总线串口卡设计方法,简单说明了其硬件的设计和驱动程序、应用程序的编写方法。该设计符合通用的PCI规范,支持即插即用功能,传输速率高,抗干扰能力强。可以广泛应用于各类测试设备、工厂自动化等,具有很高的实用价值。