[摘要]::PCI 总线接口控制器的设计是基于PCI总线的应用设计的关键所在。本文在介绍PCI9054接口控制器的基础上,给出了一种通用的高速数据采集接口的设计,并提出了一种新的包括PCI9054单周期读、写和DMA读操作的VHDL状态机设计。经测试证明,该接口的数据采集速率能稳定的达到200Mbit/s。
[关键词]:PCI总线,PCI9054,本地总线,VHDL 状态机。
0. 引言
PCI总线(Peripheral Component Interconnect)是Intel公司推出的一种高性能32/64位局部总线,最大数据传输速率为132—264Mbyte/s。,是目前使用较为广泛的一种总线。在高速信号的实时处理中,利用PCI总线将采集数据直接传送到微机系统内存,可有效解决数据的实时传输和存储,为信号的实时处理提供方便。利用PCI总线进行高速数据采集,可以简化电路设计。而且这种高速数据采集接口模块可以在多次设计中重复使用,缩短产品的研发周期。本文通过对专用接口芯片PCI9054的性能分析,特别是对单周期读、写和DMA读操作的时序进行了分析,提出了一种新的包括PCI9054单周期读、写和DMA读操作的VHDL状态机设计,并讨论了通用的PCI总线高速数据采集接口模块的实现方案。
1.PCI9054性能简介
PCI9054是PLX公司推出的一种32位33MHz的PCI 总线主控I/ O 加速器。它采用多种先进技术,可以将复杂的PCI 接口应用设计变得简单。利用PCI 9054 灵活的局部总线可以方便地连接多种存储器、I/ O 外围设备和CPU, 其中包括与Motorola 公司的MPC 860、Intel 公司的960、IBM公司的PPC 401等处理器之间的直接连接。PCI9054 可广泛应用于Motorola 公司的MPC 860 适配器设计、ComPACt PCI热交换适配器、PCI 总线主控适配器和嵌入式主机等设计系统中。
PCI9054的本地总线时钟可与PCI总线时钟异步,本地总线有三种工作模式:M模式、C模式和J模式,可方便地与多种微处理器连接。其中在C模式下,本地总线(LOCal bus)为非复用的32bit地址与数据总线,时序与控制比较简单。PCI9054还有三种数据传送方式,PCI主发起,PCI从目标,DMA方式。PCI从目标即PCI9054作为PCI总线的从设备,由总线上的其他主设备向它传送数据。而在PCI9054的本地总线端,PCI9054 又作为主设备,向本地的存储空间和I/O空间传送数据。在DMA方式中,PCI9054提供了两个独立的DMA通道,都可以进行PCI总线到本地总线和本地总线到PCI总线的DMA传送。
在设计本地总线的数据传送接口时,主要有两项工作,一是需要对PCI空间到本地空间,或本地空间到PCI空间的地址映射,进行相应的存储器配置。二是根据PCI9054提供的本地总线控制信号设计本地总线的逻辑控制功能,实现相应的数据传送时序。
2.基于PCI9054的高速数据采集接口
由于PCI9054内部的读写FIFO容量太小,需要外置扩展FIFO。作为一个较为通用的设计,我们采用的FIFO芯片是IDT公司的IDT72V3690。该芯片的容量为36k*36byte,由于该系列的FIFO芯片在封装上完全兼容,所以可以根据需要选用更大容量的FIFO芯片.
在PCI9054本地总线端的主要信号线的连接如图1所示,其中,FIFO的读时钟RCLK信号就是本地总线的时钟信号,由本地20MHz的晶振提供。写时钟WCLK信号由前端数据采集模块和数据一起提供。
2.1 CPLD的本地总线可编程逻辑设计
当进行数据采集时,由应用程序向驱动程序发出采集命令,再由驱动程序在PCI目标单字节写方式下向PCI9054写入一个数据,表示数据采集的开始。CPLD在接收到LHOLD总线申请信号后,响应LHOLDA信号。接着PCI9054发出地址选通信号,LW/R一直为高,PCI9054收到地址信号LA2后,在下一个周期使READY信号为低,判断LD0位的高低,如果为低,则输出一个写使能信号WEN到FIFO,使FIFO开始传送数据。
数据采集开始后,从数据采集模块送出的数据通过D0-D31接入到IDT72V3690。FIFO在半满时送出半满标志信号(HF),CPLD(XC9536XL)就向PCI9054发出一个中断请求信号,接着再由PCI9054向PCI总线发出中断请求信号,CPU响应中断,在中断响应程序内,发出读命令,要读取的字节数,地址信号等。PCI9054先通过LHOLD申请Local bus控制权,CPLD通过LHOLDA响应,使PCI9054得到局部总线的控制权。PCI9054将PCI地址空间映射到本地地址空间,接着启动本地总线的DMA周期。CPLD收到读信号(LW/R)和地址选通信号(ADS),地址(LA0)后(FIFO只需要一位地址选通),使能FIFO的读使能端(REN),使FIFO数据线上的Q0-Q31有效,同时也使PCI9054的准备好信号(READY)有效,开始数据传送。在最后一个数据传送之前,BLAST信号有效,CPLD在一个时钟周期后使FIFO的读使能(REN)无效,完成一次数据传送过程。
图2为PCI9054单周期读、写和DMA读的VHDL语言时序控制状态机设计。状态0为空闲状态,如本地总线请求信号LHOLD被置1,则转到状态1,否则留在状态0。状态1为总线保持状态,在此状态下应将本地总线响应信号LHOLDA置1。如ADS信号为0且LWR为0,则转到状态2,如ADS信号为0且LWR为1则转到状态3,如ADS信号为1且LWR和BLAST为0则转到状态4,这表明此次读操作为单周期读。状态2为DMA读状态,在此状态下应将READY信号和FIFO读使能信号REN置0,表示数据有效可以读取。如BLAST为1,则表明此次DMA读取还未完成,继续留在状态2,如BLAST为0,则表明此次DMA读取完成,转到状态4。状态3为单周期写状态,在此状态下也要置READY信号为0,以表示写数据有效,在BLAST为0时转到状态4。状态4为读写操作完成状态,当LHOLD被置0时,表明PCI9054不在请求本地总线,则转到状态0,当BLAST为0且LHOLD为1时,表明PCI9054还要进行读写数据,则转到状态1继续。
2.2 串行EEPROM(NM93CS56)的配置
NM93CS56是2kbit的串行EEPROM,PCI9054在系统启动的时候通过读取其存储的数据来配置一些必要的寄存器,以完成PCI9054的初始化。如果EEPROM内配置的数据不符合要求,系统将无法启动,PCI9054也将无法工作。NM93CS56的配置如下所示:
54 90 B5 10 80 06 0B 00 00 00 00 01 00 00 00 00 00 00 00 00 FF FF C8 FF 00 00 81 00 80 00 00 00 30 00 FF 05 00 00 01 00 00 00 00 00 47 81 C3 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 54 90 B5 10 FF FF FE FF 00 00 4C 00 00 00 43 01 00 00 06 4C
其中,EEPROM配置以字为单位,在写入时低字节在前,高字节在后,如DevICe ID 为90 54,写入EEPROM的顺序则是54 90。EEPROM主要完成了对本地配置寄存器的初始配置以及一些控制寄存器的配置,如本地存储空间到PCI内存空间和I/O空间的映射等。本文将本地存储空间映射到了PCI内存空间,存储范围为1M。其他配置寄存器的意义可以参考对照PCI9054的数据手册。
2.3 IDT72V3690的配置
IDT72V3690可以在读写端口提供x36/x18/x9的可选总线宽度,在读写端口可以进行非同步/同步设置,提供两种控制模式:标准IDT模式和FWFT模式。还可以设置几乎满,几乎空的预定字节数等。
IDT72V3690需要在写操作之前进行主复位,以设置它的一些初始状态,所以需要上电复位,我们选用了上电复位芯片MAX814T,在上电时对FIFO进行复位。FIFO的初始设置主要有:BM,OW,IW全为低,使输入输出宽度为36位;FWFT/SI 为低,表示是标准IDT模式,只要REN和WEN使能,就可以读写数据; OE为 低,表示允许输出端输出; IP为 低,表示不加校验位,即只用到0-31数据线;PFM为高,表示是同步方式,即在时钟上升沿读写数据。
2.4 板卡的PCB设计
板卡的PCB设计要遵循高速信号PCB走线的要求,该板卡采用4层板,两层信号层,一层电源,一层地。尤其要注意PCI总线端PCI9054与PCI插槽“金手指”的走线:普通信号线长度,从插槽“金手指”的中心到PCI9054的长度不超过1.5英寸,33MHz的PCI总线时钟信号走线长度为2.5±0.1英寸。因为PCI总线端的信号采用反射波方式即总线驱动靠反射波叠加使信号电压达到要求的振幅,而电压上升的过渡时间相当于总线周期的三分之一。因此PCI总线端的信号与普通芯片的入射波信号不同,不能直接互连,所以PCI9054内部就完成了信号波形和信号格式的转换。所以,为了满足反射条件,要严格按照上面所说的两个条件进行布线,实际布线中我们对时钟信号采用了蛇形走线,走线长度为2.5英寸。
4.WDM驱动程序设计
我们利用NuMega公司提供的DriverStudio完成了驱动程序的开发, DriverWorks是DriverStudio的一个组成部分,能够非常方便地实现针对WDM驱动程序的开发。DriverWorks中的类库封装了针对驱动程序的各种通用操作,可以大大缩短驱动程序的开发周期。
该双向接口模块的驱动程序主要完成三项功能,PCI目标单周期写,PCI目标单周期读,DMA读。单周期写和单周期读比较简单,直接用KIoRange的读写成员函数就可以完成。
DMA读主要是利用DriverWorks提供的KdmaAdapter,KDmaTransfer和KCommonDmaBuffer类实现DMA传输,KdmaAdapter用于建立一个DMA适配器,它说明DMA通道的特性,KDmaTransfer用于DMA传输控制,KCommonDmaBuffer用于申请系统提供的公用缓冲区。
驱动程序首先设置PCI9054的工作方式和中断寄存器、DMA配置寄存器,然后等待本地中断的到来。如果本地中断到来,则表明FIFO已到达半满状态,则在设备成员函数Isr_IRQ()中屏蔽本地中断,在设备成员函数DpcFor_Irq()中调用KDmaTransfer:: Continue()函数进行DMA传输。在设置DMA配置寄存器时,要注意DMAMODE0寄存器的设置,它的1:0位应设置为11,表示32位数据传送;第8位应设置为1,表示允许本地总线的突发传送;第11位应设置为1,表明在DMA传输中保持本地地址为常量(FIFO读写端口地址不变)。