《电子技术应用》
您所在的位置:首页 > 可编程逻辑 > 设计应用 > 基于FPGA的PCI总线串口卡设计
基于FPGA的PCI总线串口卡设计
来源:电子技术应用2010年第8期
高晓青, 杨瑞峰
中北大学 信息与通信工程学院, 山西 太原030051
摘要: 为了方便外部设备与计算机进行串口通信,提出一种基于FPGA的PCI总线串口卡设计。利用Altera公司的FPGA芯片EP1C6SQ240实现了串口和PCI总线的连接。介绍了用FPGA实现PCI接口、UART的方法,将PCI接口、UART的核心功能集中在FPGA上,使整个设计紧凑、小巧。该设计符合PCI 2.2规范,传输速率高,可广泛应用于各类测试设备、工厂自动化、有线通信等领域。
中图分类号: TP336
文献标识码: A
文章编号: 0258-7998(2010)08-0134-04
Design of PCI bus serial port card based on FPGA
GAO Xiao Qing, YANG Rui Feng
School of Information and Communication Engineering, North University of China, Taiyuan 030051, China
Abstract: In order to facilitate the serial communication of external devices and computers, a design of serial port card of PCI bus based on FPGA is presented in the paper. The serial port and PCI bus are connected by the FPGA chip EP1C6SQ240 of Altera Corporation. The introduced a method of design the PCI interface, UART in the same FPGA. FPGA is used to embed the core function of PCI interface and UART into it,so that the whole design is compact. The design is up to PCI Rev.2.2. And the serial port’s transmission rate is very high. Therefore, it can widely be applied in such fields as test equipments, shop automation,wire-line communication, etc.
Key words : PCI bus;FPGA;serial ports;UART;WinDriver

    随着计算机测试技术的飞速发展,越来越多的外部设备通过串口与计算机进行通信,实现信息共享以及设备的集中控制和管理。利用串口进行通信具有结构简单、传输距离远、成本低廉等优点,被广泛应用于各个领域[1]。同时,PCI(Peripheral Component Interconnect)总线是一种高性能32/64位局部总线,最大数据传输速率为132 Mb/s,可同时支持多组外设,数据吞吐量大,是目前应用最广泛、最流行的一种高速同步总线[2]。因此,利用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 波特率发生器模块
 波特率发生器实际上就是一个分频器,用来产生和串行通信所采用的波特率同步的时钟,这样才能按照串行通信的时序要求进行数据接收或发送[3]。本设计中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规范,支持即插即用功能,传输速率高,抗干扰能力强。可以广泛应用于各类测试设备、工厂自动化等,具有很高的实用价值。
参考文献
[1]     徐志春.基于PCI总线的多串口通信适配卡设计[J].微计算机信息,2007,23:294-296.
[2]     王友波,刘明业.PCI总线接口控制器的FPGA设计[J].北京理工大学学报,2004,24(5): 423-426.
[3]     杨大柱.基于FPGA的UART电路设计与仿真[J]. 微计 算机信息, 2007,23(5-2):212-213.
[4]     刘映杰,张在峰,刘玮,等.用WinDriver开发PCI设备驱动程序[J]. 信息技术,2004, 28 (2):78-80.

此内容为AET网站原创,未经授权禁止转载。