>
首页 » 技术文章 » 高速通信中基于FPGA的PCI总线接口研究与设计

高速通信中基于FPGA的PCI总线接口研究与设计

作者:吴德铭 陆达  时间:2006-12-04 22:18  来源:电子设计信息网-www.edires.net
摘要:本文介绍了目前PCI总线接口的常用实现方法及其优缺点,提出了一种利用Xilinx公司的PCI软核来实现多处理机高速通信中PCI接口的方法。该方法采用紧凑设计思想,通过把PCI软核、先进先出数据缓冲器(FIFO)和收发器结合起来完整实现PCI接口通信功能,并实现在一个FPGA芯片中。该PCI接口结构紧凑工作可靠,容易扩展应用在多处理机间的高速通信中。

关键词:现场可编程门阵列;PCI核;PCI总线;先进先出;接口设计

引言

PCI的含意为周边器件互连(Peripheral Componen Interconnect)。PCI总线是高速同步总线,可提供32位或64位数据宽度。PCI总线接口设计是高速网络互联设备的主要部分。PCI总线设备分为MASTER(主设备)和TARGET(从设备),因此,PCI总线接口通信也分为MASTER和TARGET两种方式。设计者可以根据实现的成本、难度以及板卡的尺寸限制等实际情况选择实现PCI总线接口的方法。

1)采用专用芯片设计PCI接口
目前市场上有一些专用的PCI接口芯片,如AMCC(Applied Micro Circuits Corporation)公司的S5920(TARGET接口)和S5933(MASTER接口),PLX公司的PCI9052和PCI9054等。采用这些专用芯片,优点是功能强,可靠性高,设计者可避开复杂的PCI总线接口关系,方便实现PCI接口;缺点是芯片本身及其所需的非易失性存储器件占用宝贵的板卡面积,用户可能只使用到部分功能,会造成一定的资源浪费,系统的性能不够优化,设计上也缺乏灵活性。

2)用CPLD或FPGA自行设计PCI接口
该方法可根据系统需要有选择地实现PCI的相应功能,设计灵活,有利于系统优化,且具有较高的性能价格比,节省板卡面积;但缺点是要求设计者对PCI总线协议必须有较深入的理解,实现难度大。

3)利用PCI核来实现PCI接口
为克服前两种方式的缺点,可利用PCI核来实现PCI接口,使得设计更有效、更快,尤其是更利于调试,灵活性好。PCI核有软核、硬核之分。FPGA+PCI硬核方式与专用PCI接口芯片相似,将PCI接口逻辑固化在FPGA里,设计者只需根据要求设计PCI用户设备逻辑接口,并能通过顶层仿真验证PCI接口以及用户设备逻辑设计的正确与否。而FPGA+PCI软核方式可根据实际要求配置PCI软核,再将PCI软核与PCI用户逻辑集成在一片FPGA中,并可以在顶层通过仿真及下板编程验证PCI接口以及用户逻辑设计的正确与否,灵活性更好。

本文在Xilinx公司的LogiCORE PCI基础上,给出高速通信中基于FPGA的PCI总线接口实现的一种设计方法,将用户功能逻辑与PCI核连接起来,实现在Spartan II芯片中。

1 Xilinx LogiCORE PCI简介

Xilinx公司的PCI核完全符合PCI2.2标准,支持33/66MHz、32/64位数据的传输,PCI核的结构如图1所示。

图1 PCI核的结构图

整个PCI核的外围信号可分为两类:PCI侧信号和用户侧信号。前者是符合PCI总线规范的标准信号。该PCI核的功能就是将左边复杂的PCI侧信号转换成右边的用户侧信号。用户侧信号按功能可分为周期控制信号、主/从设备控制信号和状态机信号等。在本文设计中,PCI核设置为从工作模式,只需用其部分信号与用户模块相连接,所以下面仅对设计中用到的关键用户侧信号进行解释。
CFG[255:0]:PCI设备配置空间的接口信号;
ADDR[31:0]:在地址周期,输出PCI总线当前作业的起始地址;
ADIO[63:0]:地址数据复用总线,该总线由三态缓冲器驱动;BASES_HIT[7:0]表明基地址寄存器译码并选中相应的PCI映射空间;
ADDR_VLD:表明当前作业地址线上的起始地址有效;CFG_HIT表明一个有效的配置周期开始;
S_DATA_VLD:表明ADIO总线上的数据有效(Target模式下);
S_WRDN:从设备模式下,为1表示从设备写,为0表示从设备读;
S_DATA:在Target模式下当前从设备正处于数据周期;
IDLE:在Target模式下当前从设备正处于空闲状态;
CLK:PCI总线时钟,由全局时钟缓冲驱动;
RST:PCI的复位信号,作为用户模块的异步复位信号;

PCI核依照PCI的主/从模式提供相应简单的主/从两组独立的信号。用户可根据实际需要确定应用哪种工作模式,从而选用一组或两组信号。这样,PCI核作为桥梁作用把PCI总线和用户逻辑连接起来,而用户可以实现核心逻辑。

2 高速通信中PCI总线接口的系统设计

为实现高速通信中PCI总线接口,笔者基于FPGA并利用PCI核,给出高速通信接口实现的一种设计方法,具体是根据需要配置PCI核,设计异步先进先出数据缓冲栈和PCI核相连,协同收发器完整地组成PCI接口的功能逻辑,并实现在一个FPGA芯片中,这样有利于优化通信接口的性能。而且,当采用不同协议进行通信时,只要修改FPGA内部逻辑,整个通信接口可以很好移植且完好工作。

该高速通信PCI总线接口如图2所示,主要包括PCI核、PCI核的配置模块和用户逻辑模块三大部分。PCI核作为PCI总线与用户逻辑之间的桥梁,避开用户逻辑与PCI总线直接打交道。PCI核的配置模块负责对PCI核进行配置,使之适合在不同的工作环境中。用户逻辑模块负责实现整个通信接口具体的内部逻辑功能。在此设计方法中用户逻辑模块完成高速通信中数据的收发及缓冲。整个通信接口工作过程按数据流向可分为两个流程:一是接收数据。当高速串行数据到达收发器时,收发器的接收模块自动检测并接收串行数据,然后进行串/并转换,接着在状态机控制下,如果接收FIFO可写(即不在满状态),就将接收数据写到接收FIFO中。当PCI发出读命令时,接口逻辑译码出读操作,然后在状态机控制下,如果接收FIFO有数据(即不为空状态),将从接收FIFO读出数据并送到主机。二是发送数据。当主机发送数据时,发出PCI写命令,接口逻辑译码出写操作,然后在状态机的控制下,将发送数据暂存到发送FIFO中,当然,此时发送FIFO要处于非满状态。一旦发送FIFO不空并且发送模块已就绪,便可在状态机控制下自动从发送FIFO取出一数据送到收发器中,由发送模块将数据进行并/串转换,最后串行数据高速发送出去。

图2 高速通信PCI接口的总体设计框图

2.1 PCI核配置
Xilinx的PCI核可以直接在其出产的Spartan和Virtex系列芯片上使用,符合PCI2.2协议标准。根据不同的芯片,可分别支持32bit、64bit的总线宽度,33MHz、66MHz的总线频率,3.3V、5V电平标准。通过PCI核配置,可对PCI设备配置空间和地址寄存器块等定制。一般有两种配置方式:一种是利用基于Web的配置工具进行配置,产生相应的配置文件;另一种则是手工修改配置文件。

2.2 FIFO的实现
由于PCI读写FIFO时钟频率与收发器读写FIFO频率不同,所以接收FIFO和发送FIFO设计为异步方式的FIFO。接收和发送FIFO模块定义如下:
modulefifoctrl(
read_clock_in,//读时钟
write_clock_in,//写时钟
read_enable_in,//读请求
write_enable_in,//写请求
fifo_gsr_in,//复位
write_data_in,//写数据,32位
read_data_out,//读数据,32位
fifostatus_out,//状态信息
full_out,//满标志
empty_out//空标志
);
模块共有10个端口,其中,前6个为输入端口,后面4个为输出端口。FIFO大小在此设计中为255×32bit。在Spartan II FPGA芯片里有足够的RAM资源可用,所以FIFO模块采用双端口RAM实现,RAM的两个端口可以并行读,不对同一存储单元操作的情况下可以并行写。FIFO的读写操作分别受独立的读时钟和写时钟控制,为能可靠且快速译出FIFO的状态信息,采用具有一定复杂性的逻辑。方法是由写时钟驱动写指针,由读时钟驱动读指针,由写指针转化产生两个写的格雷码地址(write_addrgray和write_nextgray),由读指针转化产生三个读的格雷码地址(read_addrgray,read_nextgray和read_lastgray),通过这些格雷码地址可以快速可靠产生FIFO满和空标志,而且避免了由于独立的读写时钟造成FIFO进入不可知的状态之中。

2.3 状态机的实现
由前面介绍的整个通信接口工作过程可知,状态机的控制至关重要,只有在状态机的严密控制下,整个接口才能稳定地按一定时序进行工作。系统中设计了实际三个独立的状态机,如图3所示。

图3 状态机转换图

状态机(a)用来控制PCI读写时序,即控制接收FIFO的“读”和发送FIFO的“写”,它由三个状态组成:空闲状态、写状态和读状态。状态及转换关系如下:空闲状态 不存在PCI读写操作时,处于空闲状态。

写状态接口逻辑从PCI核的信号译码出主机准备往发送FIFO写数据,则由空闲状态进入写状态,同时产生激励写信号到发送FIFO。若只写单个数据下一周期就返回到空闲状态,否则若是突发写则连续处于写状态,写完所有数据后再返回空闲状态。读状态接口逻辑从PCI核的信号译码出主机准备从接收FIFO读数据,则由空闲状态进入读状态,同时产生激励读信号到接收FIFO。若只读单个数据下一周期就返回到空闲状态,否则若是突发读则连续处于读状态,读完所有数据后再返回空闲状态。

状态机(b)用来控制收发器的接收模块往接收FIFO的“写”时序,它也由三个状态组成:空闲状态、写状态和结束状态。状态及转换关系如下:
空闲状态:当接收数据已准备好且接收FIFO不满时进入写状态,否则继续处于空闲状态。
写状态:写接收FIFO状态。写信号只持续一个周期便自动进入结束状态。
结束状态:成功写入数据后的状态,下一周期便返回到S_IDLE状态。该状态的自身循环是屏蔽冗余的接收数据准备好状态,因为接收模块不会有突发模式,每次只操作一个数据。

状态机(c)用来控制收发器的接收模块从接收FIFO的“读”时序,它只由两个状态组成:空闲状态和读状态。状态及转换关系如下:
空闲状态:当发送FIFO不空且发送模块就绪时下就进入写状态,否则继续处于空闲状态。
读状态:读发送FIFO数据时的状态,读信号只持续一个周期便返回空闲状态。

2.4 串行收发器
高速串行通信要求收发器必须具有高速工作频率,Xilinx公司推出的高端产品如Virtex II Pro系列产品就内嵌RocketIO多路吉比特串行收发器MGT(Multi-Gigabit Transceiver),其速率高达3.125Gb/s。本文采用Spartan II芯片自行设计收发器,其速率虽低但原理一样,同样验证了接口的可行性。至此,高速通信中的PCI总线接口设计已完成,它在接口逻辑和状态机控制下,实现了PCI核与用户逻辑间紧密连接,收发器自动监测并接收串行数据写入接收FIFO,并且自动从发送FIFO中取出数据串行发送出去。

3 硬件编程与验证

Spartan-II 200 PCI开发板为基于Xilinx的Spartan-II FPGA系列芯片开发设计PCI总线接口提供一个良好的仿真环境。板中带200000门的Spartan-II芯片(XC2S200-6FG456C)具有456个管脚。极高的门密度和大量的用户I/O,允许在低成本的FPGA里实现完整的系统解决方案。Spartan-II是2.5V SRAM工艺FPGA,带有14个RAM块,2352Slices,每个RAM块容量是4kbit,利用RAM可以用来构造接收FIFO和发送FIFO。另外,基于Web配置工具配置PCI核工作在5V工作电压的环境,以32bit方式进行数据传输。

对复杂数字系统而言,传统设计方法已不适用。本系统采用硬件描述语言并按照FPGA/CPLD一般设计流程进行设计,使用FPGA设计工具ISE6.2进行项目管理。首先是系统的设计输入及编写测试基准(Testbench),利用ModelSimSE6.0仿真软件进行仿真;然后使用Synplify7.6综合工具进行综合,综合后再进行综合后仿真;接着实现(具体再分为转换、映射、布局布线三个过程),并进行时序仿真;最后生成mcs文件及bit位文件。利用专用下载工具通过电缆把mcs文件写到Spartan-II PCI开发板上的PROM中。这样当板卡插入PCI槽上电后,PROM中的数据将自动导入到FPGA中,系统可以开始工作。另外,专门为此PCI卡编写了在Windows下的驱动程序以及用户界面的测试程序。

这里给出PCI接口逻辑的工作时序,如图4所示。以读写单个数据为例进行说明。当主机发出写数据命令时,接口逻辑译码出写操作并协同图3中的状态机(a)产生向发送FIFO写数据的激励信号FSM_Write,写入后发送FIFO的写指针增1,状态标志TxFifoEmpty由高变低,同时记数器及时记录当前FIFO中的数据个数。同理,当主机发出读数据命令时,接口逻辑译码出读操作并协同图3状态机(a)产生从接收FIFO读数据的激励信号FSM_Read,读出后接收FIFO的读指针增1,记数器减1,及时记录当前FIFO中数据个数。

图4 PCI接口的工作时序图


相关推荐

基于PCI总线模块的多通道串行数据采集系统设计

数据采集  PCI总线  FPGA  2010-12-07

CAN总线/RS232接口的设计

CAN总线  RS232  接口设计  2009-06-14

CAN总线/RS232接口的设计

CAN总线  RS232  接口设计  2009-05-24

Xilinx ECU 汽车电子开发方案

Actel推出业界首款用于可编程逻辑器件的4x4 mm封装FGPA

基于CH365芯片的PCI总线接口卡的设计与实现

在线研讨会
焦点