摘 要:以现场可编程门阵列(FPGA,Field Programmable Gate Array )为核心的软件无线电平台在近年得到了广泛应用。由于具有极强的实时性和并行处理能力,FPGA 芯片在无线通信、信号处理等领域得到了广泛应用。但是鉴于FPGA 有易失性的特点,使得需要配备可擦可编程只读存储器(EPROM,ErasableProgrammable ReadONLYMemory)芯片对其进行加载。对于要求实时切换不同算法的应用场景,需要系统设计能够对FPGA进行动态加载。这里介绍了Xilinx系列FPGA的加载原理,基于紧凑型PCI(CPCI,CompactPeripheral Component Interconnect)总线设计,实现了对多片FPGA的动态加载。
0 引言
由于具有极强的实时性和并行处理能力,FPGA芯片在无线通信、信号处理等领域得到了广泛应用。
作为一种半定制电路,FPGA 的使用非常灵活,对于同一片FPGA,通过加载不同的编程数据可以产生不同的电路功能。但是,由于基于静态只读存储器(SRAM,Static Random Access Memory)的架构,FPGA 掉电后就变为白片,再次上电时需要EPROM 芯片对其进行加载。对于需要切换算法的场景,就需要通过上位机对其进行动态加载。本文在深入分析了FPGA 配置流程和理解CPCI 总线的基础上,设计实现了基于CPCI 总线的FPGA 动态加载。
1 硬件设计
系统中需要对三片Virtex5 系列的芯片进行动态加载,整个硬件结构框图如图1 所示。Spartan-3E与PCI9656直接相连,作为主控制芯片Spartan-3E一方面接收来自CPCI 总线的数据,对V5 芯片进行参数下载、动态加载等;另一方面接收V5 芯片的传递来的各类数据,根据上层软件的请求,将各类状态信息或实时处理数据上传到工控机。
2 PCI9656 芯片介绍
PCI 接口协议比较复杂,接口电路实现起来较为困难,在设计基于PCI或CPCI总线的数字设备时,采用各公司提供的通用PCI I/O 芯片或IP 核,可简化复杂的PCI 接口设计。PCI9656 是PLX 公司为高速PCI 总线应用而设计的通用I/O 芯片,PCI9656配备DMA 引擎、可编程直接主控和直接从属数据传输模式以及PCI 信息传输功能。零等待状态突发操作,PCI 总线突发传输速度高达528 MB/s,局域总线突发传输速度高达264 MB/s.
PCI9656 的局部总线有M、C、J 三种接口模式,为了简化数据传输控制逻辑,设计中采用了C 模式,该接口模式为适合大多数处理器的通用模式。在数据传输中,PCI9656 传输数据有两种模式:突发模式和直接内存存取(DMA,Direct Memory Access)模式。其中突发模式一般用于传递少量不连续数据的场合,DMA模式则用于传递大量连续数据的场合。
在设计中,所有的参数上传、下载都是通过突发模式传输的,而三片V5 芯片的加载,连续处理数据的上传则是通过DMA 模式完成的。
3 FPGA 加载概述
FPGA 的加载有多种模式,主要有主串模式(Master Serial),从串模式(Slave Serial),边界扫描模式(Boundary Scan),SPI 模式和SelectMap 模式等。设计中采用了Slave Serial 模式,该模式由外部处理器或控制器提供时钟,总共用到了CCLK,PROG_B,DONE,INIT_B,DIN 5 个管脚,其中CCLK 管脚为加载提供时钟,当PROG_B 信号置低300ns后检查INIT_B信号为高电平即可通过DIN管脚送入数据进行加载,当数据加载完成后检查DONE管脚为高电平表示配置完成。Slave Serial 模式的时序图如图2 所示。
FPGA 的配置文件有多种不同的格式,例如BIT,BRT,BIN,MCS,EXO,TEK,HEX 等。由于ISE 软件调用Bit Gen 程序直接生成的文件格式为BIT,故系统如能直接用BIT 文件作为配置文件将省去文件转换的麻烦,通过分析发现BIT 文件与BIN(直接二进制配置文件)文件相比仅仅多了文件头,又由于FPGA 配置过程中会进行同步、器件ID 检查等操作,因此多出的文件头部分会自动忽略,故而通过Slave Serial 方式直接下载BIT 文件配置FPGA 是可行的。
4 硬件模块设计
Spartan-3E中的程序设计包含PCI9656配置模块,负责对PCI9656 芯片进行初始化;PCI9656 接口模块,负责与PCI9656 进行数据交互;参数模块,负责将接收的参数重新分配给三个芯片或者将一些状态信息上传到工控机;FPGA 配置模块负责将接收到的FPGA 的BIT 文件流通过FIFO 将不连续数据缓冲为连续数据,并触发配置逻辑,对FPGA 进行配置。
系统的模块划分如图3所示。
4.1 PCI9656 配置模块
PCI9656 一般都有对应的EEPROM,用于上电时初始化芯片工作的相关参数。根据实际需求,由于需要初始化的参数较少,PCB 设计中没有放置EEPROM,需要Spartan-3 E 通过本地总线对其进行初始化。对于PCI9656,初始化其PCI Subsystem ID、PCI Subsystem、Vendor ID 后,在工控机就可以进行其他配置,配置这两个参数只需要通过本地总线往地址0X2C写入相应数据即可。
4.2 参数模块
由于以突发模式下载到Spartan-3E 的数据是以32 bit 为单位的,且三片FPGA 需要的参数各不相同,因此需要对下载到Spartan-3E 的数据进行整理分类,再根据不同需求,下载到三片FPGA 中去。
状态参数的上传与下载流程相反。
4.3 FPGA 加载模块
DMA 方式下载到Spartan-3E 的32 bit数据在块内是连续的,但是块与块之间是不连续的,为了保证FPGA 加载过程不中断,在Spartan-3E 中需要一个FIFO 将数据进行缓冲,从而保证BIT 数据流的连续性。为了确保加载数据在FIFO 中读不空,在设计中当FIFO 中的可读的数据大于一定门限的时候触发加载逻辑,同时为了防止FIFO 写满导致丢失数据,当FIFO中可读的数据到达一定门限后,就不再请求DMA.通过这样的保护,可以保证BIT 流加载文件在加载逻辑开始后可以连续不断的输入给FPGA,直到FPGA 加载完成。
工控机按照32 bit 读取BIT 文件存在Byte 翻转的情况,下载到Spartan-3E 后需要再把32 bit的数据进行翻转过来,只需要用FIFO 读时钟32 倍频的时钟进行计数,将FIFO 读出的32 bit 数据按照翻转的对应关系顺序送出读取即可满足要求。
为了区分3片FPGA 的加载,设计两比特的标志位,用以区分不同的FPGA.在加载FPGA 之前先通过软件先下载两比特标志位,配置模块根据标志位,切换数据流向,从而可以配置3 片不同的FPGA.
5 软件设计
PCI9656 芯片的驱动程序从其配套的SDK 开发包中获取,工控机的控制软件由C++语言完成,开发环境基于Borland 公司的C++Builder6.
在PLX公司提供的软件开发包中,含有PCI9656与上位机通信的动态库文件Plxapi.dll.该文件包含了众多函数,可以直接调用。在设计中用PlxIoPortWrite 和PlxIoPortRead 来实现突发数据的下载和上传,用PlxDmaBlockTransfer来实现FPGA的配置数据流的下载和大量实时数据的上传。
6 结语
本文提出了基于CPCI 总线的FPGA 动态加载的设计与实现,在40 M 的工作时钟下,在对同一块FPGA 进行加载时,加载速度可以达到JTAG 加载方式的10 倍之多。该设计可以对三片FPGA 芯片进行快速稳定的下载,与常规PROM 加载方式相比有着快速灵活的优势,对加载速度和实时性要求比较高的系统设计中,具有很强的可操作性和可借鉴性。