Chinaunix首页 | 论坛 | 博客
  • 博客访问: 63236
  • 博文数量: 9
  • 博客积分: 426
  • 博客等级: 下士
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-29 13:35
文章分类
文章存档

2015年(1)

2010年(6)

2009年(2)

我的朋友

分类: WINDOWS

2010-01-16 23:07:38

一种通过PCI总线配置FPGA的设计方法

王元强    朱为

(东南大学 电子科学与工程学院,江苏 南京 210096

  要:在软件无线电领域中,系统必须具有较强的动态重构能力。文章讨论了PCI协议特点和FPGA配置过程,给出了一种通过PCI总线配置卡上FPGA的设计方法。硬件部分采用CPLD来实现读写配置空间、PCI总线时序和FPGA配置时序,软件部分采用WinIO作为驱动程序。设计上简洁、灵活,不依赖专用PCI接口芯片,也不需要下载电缆。实践证明,这种方法便捷可靠,对PCI卡的设计具有很好的参考价值。

关键词PCI总线;配置FPGA;软件无线电

中图分类号                                文献标识码                                文章编号

One Design Method of Configuring FPGA by PCI Bus

Wang Yuanqiang    Zhu Wei

(School of Electronic Science & Technology, Southeast University, Nanjing 210096, China)

Abstract: In the field of Software Radio, systems have to be equiped with a strong ability of dynamic reconstruction. In the essay, the feature of PCI protocol and the operation of configuring FPGA are discussed, then a design method of configuring FPGA on cards by PCI bus is presented. In hardware part, a CPLD is used to implement PCI Configuration Read/Write Operation, and in software part, WinIO is used for the driver. The design is simple and flexiable because it doesn’t depend on special PCI interface chips and download cables. Pratice has proved the method convinent and reliable. So, it is valuale for guiding other PCI cards design.

Key Words: PCI bus; Configure FPGA; Software Radio


0引 言

       10年来,半导体工艺水平的进步和市场需求的骤增推动了FPGA向高速度、高密度和低成本方向飞速发展。由于它具有强大的处理能力和高度的灵活性,人们在PCI卡上使用FPGA进行图像处理、运动控制和协议转换已经逐渐成为一种主流的设计方法。然而在某些场合中设计者和用户还要求以FPGA为核心的硬件系统具有动态的功能重组和逻辑重构的能力。例如,在软件无线电中,硬件平台的核心器件FPGA经常要根据工作频段、业务种类、数据速率与格式、传输协议等被实时在线地重新配置[1]

系统中的硬件一般都是以PCI卡的形式存在,对于PCI卡上的FPGA器件,传统的配置方法有外挂ROM、通过串口和通过USB接口三种方法[2]。外挂ROM的方法显然不够灵活,保密性低;通过串口或者USB接口的方法必须外接一根下载电缆,较为烦琐。本文提出了一种通过PCI总线对卡上FPGA器件进行配置的方法。采用此方法配置或重配置FPGA时,操作者只需要在PC机上运行包含加载程序的软件,就可以在不同的任务阶段自动或手动地将准备好的配置逻辑通过PCI总线加载到FPGA中,整个操作过程完全软件化,无需拔插下载电缆;还可以通过Internet实现远程配置。在配置工作完成之后,配置电路还可以充当主机与卡上FPGA进行数据交换的桥梁。

1 总体方案

本文所述的设计遵守PCI SIG1999年发布的《PCI局部总线规范2.2版本》,信号环境为5VPCI时钟频率为33MHz,总线宽度为32位。

首先利用EDA工具编写RTL代码,然后进行编译、仿真、综合,最后生成配置文件。加载软件在被自动或手动触发后将相应的配置文件中的数据以一定的格式通过操作系统和PCI总线传递到PCI卡中。如何从PCI总线上获得数据,以及把数据按照FPGA的配置时序要求加载到FPGA器件中是整个设计的关键。本设计采用了CPLD来解决这一关键问题。图1示意了整个系统的架构和各部分之间的逻辑关系。

1 系统框架示意图

笔者也曾见过采用PCI接口芯片(如PCI9054)加单片机[3](或者加CPLD [4])的设计方案。与之相比,只采用CPLD的方案简化了硬件电路,降低了成本,节省了PCB面积;而且数据传输通道的速度不受单片机处理速度和引脚数量的限制。

2 硬件设计

       本文介绍的设计中选用了一片XilinxCPLD,型号为XC95144XL,封装为TQ100

2.1信号连接和PCB设计考虑

       基本的PCI总线操作要求下列信号必须被实现:CLKRSTFRAME#TRDY#IRDY#IDSELDEVSEL#AD[31:0]C/BE#[3:0]。这些信号都应连接到CPLDIO引脚上,其中CLK应该在CPLDGCK引脚上实现,时钟信号线的长度应控制在2.5英寸左右,RST应该在GSR引脚上实现。PRSNT#[1:2]的两个引脚至少有一个应接地。建议使用四层PCB来设计PCI卡,中间两层应为电源和地[5]

2.2 PCI总线时序分析和接口设计

       PCI总线功能强大,协议复杂,要在一片CPLD上实现主从设备之间数据传输的时序,需要有选择地实现接口协议。本设计中采用读写配置寄存器的总线操作来传输数据。这种方式仅支持单数据周期,对CPLD的资源要求低,并且不占用计算机系统的地址空间。

在配置写周期,CPLD把总线上的数据锁存到内部寄存器中;在配置读周期,CPLD把内部寄存器中的数据放置到总线上[5]。图2和图3分别示意了PCI总线上配置写操作和配置读操作的时序[6]

2  PCI总线配置写操作时序

 

3  PCI总线配置读操作时序

CPLD内要实现两个时序,一是PCI总线操作时序,二是FPGA配置时序。为此,在CPLD内部设计了两个状态机,分别命名为busstatecfgstate。前者对应于PCI总线操作,它可以在五个状态之间顺序切换:IDLEADDRESSDECODEPREPARELATCHPCI总线空闲时,状态机处于IDLE状态。当状态机在ADDRESS状态时,CPLD从地址/数据总线上获得目标寄存器的地址,从C/BE#[3:0]上获得操作类型编码。在LATCH状态时,CPLD将地址/数据总线上的数据锁存到内部寄存器中,或者是将内部数据放置到地址/数据总线上。在每一次总线操作中,状态机根据握手信号的组合变化情况按顺序切换。

       根据PCI规范,一个合法的PCI目标设备至少应该实现以下几个配置寄存器:供应商识别码寄存器(Vendor ID),设备识别码寄存器(Device ID),版本号寄存器(Reversion ID),分类识别码寄存器(Class Code)。除此之外,本设计还实现了一个用于存放命令字、状态字和数据的32位内部寄存器:

31           24             16           8         0 

State-reg

Rdata-reg

Cmd-reg

Wdata-reg

这个寄存器是CPLD数据中转的核心。PCI总线上的配置数据将先被存入Wdata-reg中,然后再写入FPGA中;从FPGA中读出的数据将先被写入Rdata-reg中,然后再被投放到PCI总线上。软件程序通过写入命令字到Cmd-reg中让CPLD执行相应的操作;通过查询State-reg的内容来获知工作状态。Cmd-regState-reg是软件程序和CPLD相互配合的枢纽。

2.3 CPLD配置FPGA的时序分析和逻辑设计

       FPGA器件的配置原理和基本方式都大同小异,这里以XilinxSpartan-IIE系列器件为例。它有五种配置模式:从串(Slave Serial)、主串(Master Serial)、从并(Slave Parallel)、主并(Master Parallel)和JTAG模式[7]。其中从并模式的数据宽度为8位,配置速度最快,数据格式简单,适用于CPLD或者MCU配置FPGA的场合,故采用这种方式。配置文件采用由Xilinx的综合开发工具ISE自动生成的BIN格式文件,它全部由二进制格式的配置数据构成,易于软件程序的处理和加载。

Spartan-IIE系列FPGA器件的正常配置过程包括四个步骤:启动配置、清除内存、加载数据和器件启动。对FPGA的配置从Cmd-reg收到启动配置命令开始,CPLD立即给FPGAPROGRAM# 引脚送去低脉冲,FPGA随即会置低INIT信号,表明它已经响应了配置操作,并开始清除内部SRAM[8]FPGA完成清除配置内存的工作后将拉高INIT信号,CPLD将会把这一状态写入State-reg中,供软件程序查询。接下来,软件程序会把配置数据依次写入Write-reg中,CPLD再把这些数据转写到FPGA中。在送完所有的配置数据后还应该给FPGA器件提供8个周期的时钟信号用于让器件进入执行设计逻辑的用户操作状态。配置操作成功之后FPGA会把DONE信号抬起,CPLD在检测到DONE变高之后将会在State-reg中写入表示配置成功的状态字,供用户程序查询。否则,表明配置失败。

       在成功配置FPGA后,原先用于配置操作的某些引脚(如WR#CS#,)随即转化为普通的IO口,可用于传输用户数据。

       状态机cfgstate用于协调CPLDFPGA的配置操作和数据传输。该状态机在以下七个状态之间切换:IDLE(空闲状态),INITIATE(启动配置),LOADING(加载配置数据),STARTUP(启动FPGA器件),OUTCTRL(向FPGA写入类别码和地址码),OUTDATA(向FPGA写入数据),GETDATA(从FPGA读出数据)。两个状态机busstatecfgstate联系的桥梁是State-regRdata-regCmd-regWdata-reg这四个寄存器。

3 软件设计

3.1底层驱动

       软件程序最基本的操作是读写PCI配置寄存器。在PC-AT架构的系统中这一操作转化为读写两个地址分别为0CF8h0CFChI/O单元的操作。在Windows NT/2000/XP中,操作系统不允许用户程序直接访问I/O单元,因此我们借助于能够打开操作系统IO特权操作的库—WinIO。在它的支持下,用户可以直接读写IO端口[9]。在软件程序中,WinIO充当底层驱动程序。

       读写地址为0CF8HCONFIG-ADDRESS的方式如下:

31          30     24 23       16 15      11  10       8  7         2   1       0

 EN

RSV

BUS

DEV

FUN

REG

0

0

EN(位31)是使能位,它用于确定何时把对CONFIG-DATA的访问转换为PCI总线上的配置访问;RSV(位30~24)是保留位;BUS(位23~16)用于选择系统中特定的PCI局部总线;DEV(位15~11)用于选择总线上的特定设备;FUN(位10~8)在设备支持多功能的情况下用于选择设备的特定功能;REG(位7~2)用于选择设备配置空间的双字;位1和位0是只读位,且返回值必须为0[4]

在设置好CONFIG-ADDRESS后,如果是读PCI配置寄存器,用户程序则调用WinIO的读IO函数,从CONGIF-DATA(地址为0CFCH)读出数据即为目标寄存器的内容;如果是写PCI配置寄存器,用户程序则调用WinIO的写IO函数,将要写入的用户数据写到CONFIG-DATA中即可。

为了便于编写软件程序,作者封装了两个函数用于读写PCI配置寄存器:

UINT ReadRegister(int BusNo, int DevNo, UINT RegAddr)                   

void WriteRegister(int BusNo, int DevNo, UINT RegAddr, UINT dwData)

BusNo表示PCI卡所在的PCI总线序号,DevNo表示PCI卡所安装的PCI插槽的序号,RegAddr是目标寄存器的地址,dwData是要写入寄存器的数据。

3.2 应用软件的设计

       由于PCI卡是即插即用(PnP)设备,因此PCI卡的地址空间是不固定的。为了访问目标配置空间,用户程序首先应该探测PCI卡所在总线的序号(BusNo)和插槽的序号(DevNo)。探测的方法是:让总线号在0~4之间变化,让设备号在0~31之间变化,逐一读取Vendor ID寄存器和Device ID寄存器,并和预先设定值相比较。当发现到二者都吻合时,记下此时的BusNoDevNo,并保存在全局变量中,供后面的ReadRegister()WriteRegister()使用。探测的PCI卡的C语言程序代码如下:

int bus,device;

UINT ioAddr,ioData;

int Scan() {

bus=0; device=0;

for(int i=0;i<5;i++) {

       for(int j=0;j<32;j++) {

bus=i; device=j;

ioAddr=0x80000000+bus*0x10000+(device*8)*0x100;

         _outpd(0xcf8,ioAddr);

         ioData=_inpd(0xcfc);

         if (ioData==0x55AA1022)  return 0;

         }

}

return -1;

}

       为了评估和测试PCI卡的性能,笔者使用VC++6.0设计了一个软件程序,包含以下六项功能:

读配置寄存器;写配置寄存器;配置FPGA

FPGA中读数据;FPGA中写数据;退出程序。经过调试,该软件程序可以准确无误地读写PCI卡上的配置寄存器,配置FPGA,传输用户数据。设计者可以根据具体的应用场合开发界面更美观和功能更完善的软件,但都应包含以上六项功能。

4 结束语

       本文介绍的采用CPLD通过PCI总线配置FPGA的设计方法已经在笔者研制的带有FPGA芯片的PCI卡上得以实现和应用。实践证明这种设计能够准确、可靠、便捷地将配置数据加载到FPGA中,配置过程彻底软件化。配置完成后,FPGA完全按照设计逻辑工作,结果与其他配置方式无异。在FPGA启动后,CPLD还可以担负起主机和FPGA之间数据传输的任务[10],数据宽度为8位时,传输速度可达2.5MB/s

[1]  刘伟,孟宪元. FPGA在软件无线电中的引用[J]. 有限电视与网络. 2001(1):69-71

[2]  乔建良,田思. 基于MCUCPLD/FPGA配置[J]. 现代电子技术. 2004(19):70-72

[3]  梅安华,田建生,刘欢等. 基于PCI总线FPGA配置系统的设计[J].计算机测量与控制. 2005.13 (4):375-377.

[4]  梅安华,田建生,刘欢等. 基于总线灵活配置FPGA设计[J]. 电子技术. 2004 (9):18-21

[5]  李贵山,陈金鹏. PCI局部总线及其应用[M].

[6]  Tom Shanley, Don Anderson. PCI System Architecture (4th edition) [M] :Addison Wesley Longman,Inc. 2000

[7]  Xilinx Inc. Spartan-IIE FPGA 数据手册[EB]. 2004.7

[8]  李鹏,兰巨龙. CPLDFLASH实现FPGA配置[J].电子技术应用. 2006(6):101-103

[9]  于朋飞,张元涛,张有志. 一种实现对PCI配置空间访问的方法[J].山东大学学报. 2003.8(4):421-424

[10] 曾哲昱,叶卫东.CPLD实现PCI总线目标接口[J]. 测控技术. 2002.21(1):45-47

作者简介

王元强,生于1980年,男,东南大学电子科学与工程学院硕士研究生,研究方向为嵌入式系统;

朱为,男,东南大学电子科学与工程学院硕士生导师,副教授,研究方向为嵌入式系统,图像处理与传输。

阅读(5781) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~