0 引言
在现代数据采集及处理系统中ISA,EISA、MCA 等扩展总线已无法适应高速数据传输的要求,而PCI 局部总线以其优异的性价比和适应性成为大多数系统的主流总线。目前开发PCI 接口大体有两种方式,一是使用专用的PCI 接口芯片,可以实现完整的PC1主控模块和目标模块接口功能,将复杂的PCI 总线接口转换为相对简单的用户接口,用户只要设计转换后的总线接口即可。虽然缩短了开发周期,但缺点是可能只用到部分PCl接口功能,这样就造成了一定的逻辑资源浪费,而且也缺乏灵活性,还可能增加板上的组件,导致产品成本的增加和可靠性的降低。二是使用可编程器件FPGA。
采用FPGA 的优点在于其灵活的可编程性。
首先PCI 接口可以依据插卡功能进行最优化,而不必实现所有的PCI 功能,这样可以节约系统的逻辑资源。并且用户可以将PCI 插卡上的其他用户逻辑与PCI 接口逻辑集成在一个芯片上,实现紧凑的系统设计。当系统升级时,只需对可编程器件重新进行逻辑设计,而无需更新PCB 电路板。
现在已经有越采越多的用户使用可编程器件如FPGA、CPLD等进行PCI设备的开发。本文所论述的PCI 从设备接口控制器是作为一个转换接口工作干PCI 总线与用户设备之间,其主要功能是完成用户设备与PC1总线间的信息传送。
1 PCI简单介绍
PCI 总线接口信号如图1 所示。
其中CLK_p 是系统时钟,时钟频率有33 MHz和66 MHz 两种。RSTn_p 是系统复位信号,AD_p(31:0)是地址、数据复用总线。PCI 总线传输采用命令驱动的方式,总线命令的作用是用来规定主、从设备之间的传输类型,出现在地址期的CBE_p(3:0)上。在这个时期,主设备通过驱动PCI 地址/数据总线上分配范围的起始地址来识别从设备,同时主设备通过驱动传输类型给4 位宽PCI 命令/字节使能信号线而识别传输类型。由于主设备仅在PCI 一个时钟周期内发出起始地址和传输类型,所以每个PCI 从设备都有责任在时钟的下一个上升沿锁存地址线上的地址和命令/字节信号以便顺序译码,通过对已被锁存的地址和命令/字节使能信号进行译码目标,设备能够确定自己是否是主设备所要进行传输的设备。假如某个从设备发现自己正是主设备所要求的进行数据传输的那个从设备,就必须通过有效DEVSELn_p 设备选择信号线进行数据传输。假如主设备在一个规定的时间段没有采样到有效的DEVSELn_p,那么这次的传输请求失败。假使主设备采样到有效的DEVSELn_p,在地址期结束后进入数据期,即地址/数据总线成为数据总线,用于在每个数据期传送数据,则从设备负责锁存起始地址并在每个后继数据传送中自动递增。
PCI 总线的突发传输方式是PCI 总线的基本传输方式,也是其特点之一。突发传输周期由一个地址期和一个或多个数据期组成,PCI 支持存储器空间和I/O 空间的突发传输方式。突发传输方式由PCI 桥来实现,在不产生副作用的前提下它可以把对存储器的多次访问合并为一次访问,PCI桥可利用初始化软件配置时所提供的地址范围来区别能不能合并。一个PCI 设备可以将自己的基址寄存器预取为1,表明允许PCI桥进行预读和合并写数据。对于PCI 桥来说当遇到要写的数据是不可预取的时,则在PCI 桥缓冲器的数据合并操作必须停止,并将以前的合并结果清除,进行正常的非突发传输方式。实际上只要处理器发出的一系列写数据所隐含的地址顺序相同,主桥总是可以将它们组合成为突发数据传输方式。其他具体要求可参考PCI2.2版本的协议。
2 基于FPGA 的设计
本文所实现的PCI 主要控制有I/O 的读/写、内存的读/写、配置读/写、突发传输模式等16项操作,模块设计框图如图2 所示。
利用Aldec 的Active-HDL8.1 软件,采用框图设计顶层文件,实现结果如图3 所示。
其中,极性产生器包含在接口模块里,关于PCI 寄存器的配置参数利用PACKAGE 进行统一设置。
3 硬件仿真
依据设计图,对其中的部分设计进行仿真。关于命令寄存器与地址计数器模块,根据CBE_p(3:0)来设定工作模式,其中突发工作模式主要由Din(1:0)来确定,各种工作模式的设定时刻由FRAMEnd来确定。工作时,FRAMEnd由高向低变化产生命令判断信号,然后根据CBE_p 的值译码出工作模式,送给相应的信号。本次仿真是由内存读命令到内存写命令,然后是配置写命令的仿真过程。在FRAMEnd 变低的下一个时钟上升沿进行判断,并把命令字付给Command 信号。仿真结果如图4 所示。
极性产生器主要是根据ADo 和CBEi 产生极性标志信号NEW_PARo。其中RESET 是复位信号,CE_Ado是使能信号。仿真波形如图5 所示。
极性校验器主要用来做接口配置、配置寄存器设置信号,逻辑相对复杂。极性校验器仿真波形如图6所示。其中DET_PERR、SIG_SERR送给配置寄存器模块,NEW_OTPERR、NEW_PERRno、NEW_SERRno送给I/O接口模块。
4 结语
基于FPGA的PCI接口设计经验证是可行的,同时可以充分利用原系统中FPGA 的资源,这对减少系统的组件,提高系统可靠性有很大益处。通过这次尝试,对PCI 接口协议有了深入的认识,为了使基于FPGA 的PCI 接口设计实用化,后续还需要进行用户逻辑与接口的封装等工作,以及驱动程序等应用软件的编写。