基于PCI总线的数据采集系统设计与实现

程序天使   2008-10-15 09:41 楼主
写在前面
近些年来计算机局部总线技术发生了很大程度的变化,第三代IO3GIO)技术——PCI-E无论在访问延迟、带宽,还是在扩展性方面都向前迈进了一大步,PCI-E总线技术在硬件方面发生了翻天覆地的变化,但是在软件方面还能与PCI总线保持兼容。本站在后继将会对PCI类总线投入足够的关注,并且讨论在仪器科学方面的应用。作者曾经设计过基于PCI总线方面的数据采集系统,在此对该系统进行分析总结,算是对PCI总线技术进行分析的一个开头吧~~

PCI总线数据采集系统实物
设计实现的PCI数据采集卡第一版如下图所示:

    这是鄙人的本科毕业设计,这也是我做的第一个独立完成的较大型设计,所以这张照片我一直珍藏着,在此,我要感谢我的导师,是他给我提供了这样的平台。在PC端,我为采集卡开发了测试软件,通过该软件可以操作PCI数据采集卡,并且能够显示数据采集的信息。下图是开发的第一版PCI数据采集信息显示界面,该界面基于VC++/MFC平台开发。在此,贴上这两张图片,留作纪念。

       通过测试波形可以看出,设计的数据采集卡存在很大的噪声,噪声主要来自于前向通道,第一版的前向通道设计的不是很好,特别是低噪运放的电源由电荷泵的转换器提供,带载能力极弱,大大增大了前向通道的噪声,降低了信噪比。后来在设计第二版的采集系统时,很好的设计了前向通道,所以得到了非常满意的结果。
采集系统原理
    测量信号(输入范围为:±5V)CPLD时序逻辑的控制之下通过模拟选择开关和程控放大器,并在缓冲级的配合之下输入到差分转换电路,将单端信号转换成双端差分信号,差分信号具有很高的抗共模干扰能力,降低了模数转换器的输入噪声。信号送入模数转换器之后,在CPLD的时序控制之下进行采保、量化,转换完毕的数据直接送入FIFO进行数据缓存。当缓存区的数据达到2K满时,CPLDPCI总线控制器发出中断请求信号,PCI桥路控制器将接收到的中断请求信号转换成PCI总线中断请求信号,通知PC主机以DMA的方式将FIFO中的数据读入到内存,完成一次数据采集、数据传输和存储过程。PCI总线控制器在系统上电的过程中首先读取PCI配置寄存器中的配置信息,实现PCI系统的自动配置和即插即用。

关键技术分析数据采集
数据采集的核心为ADC,在PCI数据采集系统中采用了一款14位垂直电压分辨率,具有2.2Msps采样率,5V供电的模数转换器——MAX1201,该芯片是一种流水线型的ADC,由级联的若干级电路组成。每一级电路包括1个采样/保持放大器、1个低分辨率ADCDAC以及1个求和电路。流水线性ADC在采样率和分辨率方面都处于中间水平,速度最高的ADC通常采用高速比较的电路结构,精度最高的ADC可以采用Δ-Σ的方式。

为了充分利用ADC的直到奈奎斯特频率的优良AC特性,模数转换器采用了差分信号输入的模式。采用差分信号输入模式可以获得两倍的信号量程、提高抗干扰性能、对输入信号的放大器预处理要求降低等优点。单端信号转换成差分信号采用了低噪声、宽频运放Max4108,转换电路参考如下:
PCI总线控制器
设计PCI设备一个比较简单的方法就是采用现有的PCI总线控制器,如果自己采用FPGA去开发PCI控制器,那么系统的开发周期将会大大加长。我在设计的时候采用了现有的PCI总线控制器。2003年时PCI总线控制器主要有AMCC公司的5933PLX公司的PCI9052PCI9054,另外TI公司也提供了一些总线控制器。起初我选择了AMCC5933,因为5933很多人搞过,中科院光机所还有一篇论文描述AMC5933,所以当初我决定选用AMC5933,并且设计了系统原理图。可惜的是5933我没有买到,该芯片面临停产,郁闷的只好把以前的方案全部推倒。万幸的是在北京出差的师兄(研究生之后就成为师兄啦~)给我带来了PCI9054的消息,PCI9054在北京很多,通过这个消息,我立即修改方案,决定采用PCI9054作为PCI主控制器。从这一段经历可以看出,在PCI设计之初,我对PCI设计方面的资讯了解不是很全面哦~~实际上,这是一方面,另一方面2003PCI设计不像如今这样满地都是,2003PCI9054芯片需要176元,如今PCI9054价格在60~70元之间。而且那个时候网上的资料也很少,文档只有datasheet。好了,言归正传,下面介绍PCI9054的设计。


PCI9054PCI总线主控制器,在PCI总线上,其地位与CPU等同,都是PCI总线的主控制器。PCI9054可以向PCI总线仲裁器发出总线申请请求,获的总线之后,PCI9054可以向总线上的其它PCI设备读写数据,利用该特性,PCI9054可以直接将采集得到的数据DMA到系统内存中,而无需经过CPU的读写操作。


PCI9054是一个PCI总线桥,其将本地简单的ISA总线转换成了PCI总线,所以PCI9054也可以称之为总线桥。本地ISA总线在PCI9054中称之为local bus,该总线类似于内存总线,所以可以很容易与控制器、FPGA进行时序接口。由于通过桥的转换,设计者更多的是关心local bus的行为,屏蔽了PCI总线上的具体行为,因为,PCI9054能够将local bus的行为映射成PCI的时序行为。通过这种机制,PCI设备的设计大大简化了。


PCI总线是第二代IO总线,与第一代IO总线(ISAVMEEISA)相比,最大的一个优点在于plug & play(即插即用pnp)。为了实现即插即用,PCI协议规范中引入了配置空间的概念,这也是学习、设计、研究PCI总线很重要的一个概念。配置空间的提出从思路上来看应该是顺利成章的事情,其主要目的是解答CPU提出的如下三个问题:
1、
你是谁?
2、
你需要什么资源?
3、
你有什么功能?
通过这些解答这三个问题,CPU就可以为PCI设备分配资源(中断、IO地址),并且可以加载设备驱动程序。在系统上电的时刻,PCI总线控制器会通过特殊接口(例如SPI)扫描配置芯片,如果不存在配置芯片,那么采用默认值填充配置空间,否则,会从配置芯片中读取配置数据,然后设置配置空间的各项寄存器。PCIhub会检测到PCI设备的插入行为(检测PCI设备的插入是通过PRSNT1PRSNT2两个引脚实现的,此外,这两个引脚还表示了设备需求的功耗大小),然后开始发起读PCI配置空间的过程,读完配置空间之后开始分配资源,并且加载驱动,这个过程在后继blog会有详细分析~~


PCI的配置空间设计非常重要,设计过程中采用了93s66作为配置芯片,如果配置空间中的数据设置错误,那么系统将无法正确加载驱动程序。

回复评论 (2)

基于PCI总线的数据采集系统设计与实现

PCB布板
PCI总线时钟频率只有33MHz,所以频率不是很高,但是需要注意的一点是PCI时钟采用的是反射升压的原理,也就是说PCI时钟是通过终端反射来提升信号幅度,这里利用了传输线的原理。这就对PCI时钟线的长度提出了要求,必须符合规范中的2.5 英寸长度要求,否则会导致多块PCI板在同一个系统中出现无法正常工作的情况。为了达到这样的长度,时钟线的布线往往采用蛇形走线,细心的朋友可能已经看出我设计的PCB存在问题,PCI接口上没有蛇形线,PCI时钟线肯定在B面(元件面)的,为什么没有看到蛇形线呢?其实,这是第一版PCI数据采集系统设计中的一个问题,只不过问题没有表现出来罢了。

设备驱动程序
在开发第一版PCI设备过程中,非常得益于PLX提供的评估驱动和PLX调试工具,否则我的本科毕设不知道是否能如期完成~~在毕设完成之后的那个暑期,我开始自己编写PCI数据采集卡的设备驱动程序,该驱动的开发基于driverstudio平台,采用C++的方法进行开发,开发过程阅读了三本Windows驱动书籍,其中对我最有效的是武安河的《WDM设备驱动程序开发》。


PCI数据采集卡的驱动主要完成了IO读写、DMA中断事务的处理以及DMA的数据传输。在Driverstudio中将Window DDK进行了封装,所以编写设备驱动时直接采用封装的类库就可以了,例如使用DMA传输的方法,采用KDmaTransfer。关于Windows平台下的设备驱动编写在后继的blog中将会有相应的博文进行讨论。

PCI数据采集卡设计心得
对于数据采集部分的心得我不想多说了,其与应用相关,对于不用的应用具有不同的信号特征,针对不同的信号特征,可以采用五花八门的数据采集方法。例如,并行高速采样、等效采样、高分辨率采样、浮点采样等等。这里再说两句PCI总线的设计心得:
1、
得益于PCI总线控制器,PCI设备卡的设计、实现并不是十分复杂,无论是DMA数据传输还是IO数据读写都可以相对比较容易的完成,设计的重点就在于local bus时序方面的设计(通常采用FPGA实现local bus的时序接口)。传统的PCI总线频率只有33MHz,所以对于PCB设计难度不是很大。总的而言,PCI设备卡的开发应该是一个大众化的技术。
2、
对于硬件设计人员而言,设备驱动是PCI设备开发过程中遇到的一个技术高峰。对于自学、开发设备驱动,我大概用了一年左右的时间,对于系统内核的真正理解、把握是在我工作之后。当我从事软件开发一段时间过后,回过头来看看我曾经开发的PCI设备驱动,原来是如此简单!但是对一个纯硬件人员而言,的确有难度,因为硬件人员对操作系统的机制不熟悉,导致理解设备驱动处于“空中楼阁”的状态,只知其然,但不知所以然。如果要战胜这一技术高峰,需要硬件人员在软件方面的知识积累。
3、
PCI系统开发的核心技术在于总线控制器,总线控制器一般分成两大类,一类为PCI桥;另一类为PCI设备控制器。国内搞PCI总线控制器的有,但是做成产品的好像没有。PCI总线控制器分两部分,一部分为物理层的收发器,传统的PCI总线不需要,如今的PCI-E就需要了,所以更是提高了设计难度;另一部分为PCI logic core,这一部分的设计难度相对小点,实现控制通道和数据通道。对于搞高速互联技术方面研究的人员而言,这一点是需要我们去关注和投入智慧的地方。
点赞  2008-10-15 09:42

Re: [分享] 基于PCI总线的数据采集系统设计与实现

保存下来慢慢看
lz对vc++进行数据采集的编程很熟练吧?
我原来是学软件的,现在从事的是数据采集编程,主要就是研华的板卡,不知lz熟悉不?我还在慢慢摸索中
点赞  2008-12-6 11:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复