FPGA/ASIC技术
摘 要:采用IP核的设计方法,将外设组件互连标准(PCI)总线接口与具体功能应用集成在一个FPGA上芯片, 提高了系统的集成度。在对PCI IP核进行概述的基础上,介绍了IP核的设计方法,实现了PCI总线接口,并设计DMA 控制器解决了接口和主机间的数据传输瓶颈问题,最后说明了驱动程序的设计方法。通过在PCI机箱的实验测试,设计在功能和时序上均符合PCI技术规范,而且硬件工作稳定可靠,达到预期目标。
外设组件互连标准(PeripheralComponentInterconnection,PCI)是一种由Intel公司1991年推出的用于局部总线的标准。PCI总线位宽32bit工作频率33MHz,数据速率132Mbps,同时支持总线宽度扩展到64bit, 工作频率66MHz,数据速率528Mbps。PCI总线具有即插即用,中断共享,高速 数据传输等功能 [1,2] 。
PCI总线系统可以满足通信与网络的需求,在 嵌入式系统中具有广泛的应用前景。尤其是很多其 他的总线,如PXI和PCIE都是由PCI总线发展而来的。嵌入式系统可以在PCI总线上安装各种扩展卡以实现不同的功能。总线的定义对协议、时序、负载、电器性能和机械性能都有严格的规定,充分保证运行的可靠性和兼容性。
PCI总线接口的主要完成不同信号环境间的转换,使得数据传输可以顺畅进行。
PCI总线接口的实现方法有很多种。设计者可 以根据实现的难度, 成本以及板卡的尺寸限制等实际情况加以选择[3,4]
1.1 专用接口芯片
如PLX公司的PCI9054、 PCI9656等。采用这些芯片的优点是可靠性高,设计者可以避开复杂的PCI 总线接口关系。缺点是用户可能只是用到部分功能, 会造成一定的资源浪费,并且设计上也缺乏灵活性。
1.2 专用IP核
优点是开发速度快,灵活性好,缩短开发周期。缺点是IP核价格昂贵。例如Xilinx公司的LogiCore。
1.3自行开发
CPLD或FPGA自行设计。优点是可以灵活实现PCI功能。节省系统的逻辑资源,方便系统升级。缺点是需要详细了解PCI总线协议,实现难度大。
Xilinx公司的PCIIP核版本是Initiator/Target v4.13forPCI。此IP核支持存储器读写、I/O读写、配置空间读写3种读写方式。其最多有3个地址空间,每个大小都可根据用户需要具体设置。如果有 不使用的BAR最好被禁用,以优化其性能 [5,6] 。
PCIIP核对FPGA设备是预先实现和经过验证的模型。在FPGA芯片内的管脚定义和资源的相关位置是定义好的,利用用户约束文件控制关键路径以确保设计的PCI接口的时序满足要求。用户通过选择合适的芯片和用户约束文件,包括管脚定义约 束和时序约束, 以满足运行在33/66MHzPCI时钟下的时序要求。每种芯片和封装都有特定的时序约束来保证接口的性能,所以用户约束文件最好是在IP核推荐文件的基础上增加用户部分的时序约束。
此IP核文件还提供仿真测试文件,用户可以改 变参数和时序, 完成应用设计后对顶层文件进行仿真验证设计功能的正确性。
其主要的功能是将左边复杂的PCI接口信号转换成右边的用户接口数据和控制信号,完成用户设备与PCI总线的信息传递。具体应用时只需要关心 用户侧的信号, 具有很强的灵活性。根据用户性质的不同,用户侧的信号分为相对简单的2组独立的Target(被动)模式和Initiator(主动)模式的信号。用户根据实际需要来确定应用哪种模式,并选用相应控制信号和状态机信号作为接口。
3.1 Target操作
PCIIP核支持Target模式下的单个数据传输和多个数据传输。而且只要涉及到Initiator模式的数据传输就必须用到Target模式的接口,反之是不需要的。下面对Target模式下用户侧重要信号进行简 单介绍[6] 。
ADDR_VLD:地址总线上的地址有效;
S_DATA_VLD:ADIO_OUT总线上的数据有效;
S_WREN:‘1’标志Target写,‘0’标志Target读;
S_CBE[3:0]:总线命令和字节有效;
BASE_HIT[7:0]:基地址寄存器译码;
S_READY:数据传输准备好; S_DATA:设备处于数据传输状态。
3.2 Initiator操作
IP核作为PCI总线主设备进行Initiator写操作时, DMA控制器与Initiator控制逻辑模块共同将FIFO缓存输出的数据通过DMA操作发送到IP核 的本地端;Initiator读操作时, Initiator控制逻辑模块将IP核本地端的数据通过DMA操作发送到FIFO缓存的输入端。下面对Initiator模式下用户侧重要信号进行简单介绍。
REQUEST:用来请求Initiator传输;
M_DATA_VLD:总线发生数据传输;
M_SRC_EN:数据指针增加;
M_READY:准备好传输数据;
M_ADDR_N:表示当前操作的地址;
M_DATA:表示数据传输的状态。
在Xilinx公司芯片XC5VLX50T-1I上利用PCI的IP核实现PCI接口的读写。FPGA的内部结构如 图1所示。
图1FPGA内部结构图
4.1 寄存器读写
在Target模式下进行数据传输,设备能做的就是响应主设备的命令,接收数据完全处于被动状态。设计只实现Target模式的单个数据传输,因此时序相对简单。
4.2DMA操作
在Initiator模式下进行数据传输必须严格按照PCI局部总线规范进行。实际应用时,将FPGA的数据通过PCI总线写入到计算机内存,若传输要求的速度高,通常以DMA方式实现,由硬件设备代替CPU接管总线并负责数据传输,省去了由CPU负责传输时所必须的寻址指令。DMA控制器在IP核Initiatorburst写操作基础上完成。
DMA部分的设计是本地逻辑的重要部分,设计的优劣会影响到数据的传输速率。参看参考文 献[ 6]中的具体的控制流程状态机,如图2所示。
图2DMA控制状态机
REQ_S:主设备开始向总线仲裁器申请总线;然后根据DIR确定进入读状态还是写状态。
WRITE_S:写状态;数据传输结束时,判断是否需要重新申请总线。
READ_S:读状态;数据传输结束时,判断是否需要重新申请总线。
DEAD_S:致命错误的终结状态;OOPS_S:传输评估状态。
根据DMA控制器程序的设计,需要设置的参数有目标初始地址(START_ADDR)、目标结束地址(END_ADDR)、读写设置(DIR)、burst长度(BURST_LENGTH)和开始标志(START)。
Initiatorburstwrite模式实际工作时,在ChipScope软件中观察到的时序图如图3所示。
图3用户端DMA接口时序
4.3 驱动程序开发
在WindowsXP操作系统下,以VC++6.0为 开发环境, 利用WinDriver工具开发PCI接口的驱动程序。寄存器写操作直接采用WinDriver提供的函数XXX_WriteDword();寄存器读操作采用函数XXX_ReadDword()。
DMA操作分为2部分:①申请一段连续的内存, 用函数WD_DMALock()申请指定大小的连续数据缓冲区;②写参数至FPGA相应寄存器中,最后 启动传输, 传输结束后,用DMA->pUserAddr访问存放数据的数据缓冲区。
由此可见,利用Windriver开发PCI的驱动程序是较为方便的。另外,在驱动程序开发完成后,还可以很方便地打包成安装文件,从而使驱动程序可以独立运行。
基于PCI总线的接口设计已经不是一个新鲜的课题,但随着设计开发提出的指标越来越高,开发的难度并未减弱。Xilinx公司的PCIIP核集成在FPGA中,完成接口功能,并与用户逻辑配合工作,实现数据的缓存和传输。相比较采用专用处理芯片的方法,虽然增加了设计的复杂度,但是系统的可移植性好,系统升级也容易。经过实践测试,大大缩小 电路板面积, 更有灵活、稳定、可靠的特点。对于DMA控制器的设计能提高数据传输的速率, PCI总线的性能得到充分发挥,相信以后会得到更广泛的应用。
全部0条评论
快来发表一下你的评论吧 !