基于PCI/CPCI总线的高速数据采集卡的设计与实现
姓名:王伟楠申请学位级别:硕士专业:计算机系统结构指导教师:周利华
20040101
摘要本文在深入分析PCI/CPCI总线协议的基础上,提出了一种以PLX公司的PCI9054为桥接口芯片的基于PCFCPCI总线的高速数据采集卡的设计方案,并分为硬件系统设计和驱动程序设计两大方面详细阐述了其开发方法和实现过程。在硬件系统设计方面,首先讨论了电路设计中的一些常见问题,然后简述了串行EEPROM的配置,最后花了大量篇幅详细介绍了局部总线控制逻辑的实现方法。在驱动程序设计方面,首先对各种驱动程序开发工具的优缺点进行了简单比较,然后介绍了我们所选用的开发工具DriverStudio的工作原理,最后论述了基于PCI总线的数据采集卡的驱动开发过程。目前,基于PCI总线的高速数据采集卡已经成功应用到了西安电子科技大学多媒体所的《大幅面CIS扫描输入系统》中,解决了扫描仪与系统主机之间数据传输的速度瓶颈;而基于CPCI总线的高速数据采集卡已经成功应用到了军方某部队的《高性能指挥作战系统》中,大幅度提高了整个系统性能。关键词:数据采集,PCI总线,CPCI总线,VerilogHDL,驱动程序ABSTRACTThispaperbeginswithandthenbringsforwardbasedonanaprofoundanalysisofthePCIandCPCIbusspecification,implementationschemeofhigh—speeddataacquisitioncardasPCI/CPCIbuswhichtakesPCI9054thePCI/CPCIbusinterfacechipThispapercomprisestwomainparts:hardwaresystemdesignanddevicedriverdesign.Inthepartofhardwaredesign,somecommonproblemsinthedesignofcircuitareanalyzedandthenitisdiscussedhowtoconfiguretheEEPROM.Atlast,adetailedintroductionofthecontrollogicoflocalbusisputforwardInthepartofdevicedriverdevelopment,variouskindsdriverdevelopmenttoolshavebeencomparedatfirstofDriverStudio,thetoolandthenthepapergivesabriefintroductionoftheprincipleWeuse.Atlast,thedriverdevelopmentprocessisdiscussed.onNow,thehigh・speeddataacquisitioncardbasedinthesystemdataPCIbushasalreadybeenusedofLarge-ScaleCISScanninglnput,andscannersolvedthespeedbottleproblemofsametransferbetweenthelarge-scaleCISandthehostcomputer.Atthetime,thehigh-speeddataacquisitioncardbasedtheonCPCIbushasalsobeenadoptedbyhigh-performancecommandingsystem,andimprovedthecapabilitiesofthesystemgreatly.Keywords:Dataacquisition,PCIbus,CPCIbus,VerilogliDL'Devicedriver创新性声明本人声明所呈交的论文是我个人在导师指导下进行的研究工作及取得的研究成果。尽我所知,除了文中特别加以标注和致谢中所罗列的内容以外,论文中不包含其他人已经发表或撰写过的研究成果;也不包含为获得西安电子科技大学或其它教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中做了明确的说明并表示了谢意。申请学位论文与资料若有不实之处,本人承担一切相关责任。本人签名:王鳋摘日期地芏:21王关于论文使用授权的说明本人完全了解西安电子科技大学有关保留和使用学位论文的规定,即:研究生在校攻读学位期间论文工作的知识产权单位属西安电子科技大学。本人保证毕业离校后,发表论文或使用论文工作成果时署名单位仍然为西安电子科技大学。学校有权保留送交论文的复印件,允许查阅和借阅论文;学校可以公布论文的全部或部分内容,可以允许采用影印、缩印或其它复制手段保存论文。日期麴塑l!i日期刁净学・,・,・第一章绪论第一章绪论1.1数据采集的任务和意义随着计算机技术和数字信号处理技术的飞速发展和普及,数据采集系统也迅速地得到应用,尤其是高速数据采集系统的应用正日趋广泛。特别是在涉及到数字信息处理的领域中,如激光雷达信号处理、数字图像处理、数字示波器、超声波检测以及虚拟仪器等领域,能否实现高速准确的数据采集无疑将决定整个系统的性能。具体地说,数据采集系统的任务,就是采集目标数据源产生的模拟信号并将其转化为数字信号,然后送入计算机,根据具体的需要再由计算机进行相应的计算和处理,得到所需的数据。与此同时,系统还必须将上述计算处理后的部分(或全部)数据准确显示或打印,以实现对某些物理量的实时监视:当然,其中一部分数据还可能被计算机控制系统用来控制某些物理量。数据采集系统的好坏,主要取决于它的精度和速度。在保证精度的条件下,应用尽可能高的采样速度,以实现实时采集、实时处理和实时控制功能。对于那些数据量比较小或对实时性要求不高的应用,我们可以选用已经得到了广泛支持且速度较快的SCSI、USB和1394等常用接口,这些标准接口为各种数据采集应用提供了相对丰富的选择,使得像外设这样的生产厂商能够在追求数据传输速度的同时降低成本。他们只需要使生产的设备支持标准接口,减少了在数据采集接口方面研究开发的投入。然而,对于一些速度要求特别高的数据采集应用,PC机的标准接口已经远远不能满足需要。因此必须为这些应用设计专门的数据采集方案才能实现高速数据传输。我们称这样的应用为高速数据采集应用。与其对应的技术称为高速数据采集技术。PCFCPCI总线和基于PCUCPCI总线的数据采集技术就是在这种条件下涌现和发展起来的。1.2系统总线技术的发展计算机总线是计算机各部件之间进行信息传输的公共通道。现代微型计算机系统广泛采用总线结构。其优点是降低了系统成本、组态灵活、维修方便。随着微电子技术和计算机技术的发展,总线技术也在不断地发展和完善,而使计算机总线技术种类繁多,各具特色。●ISA总线ISA(industrialstaIldardarchitecture)总线标准是IBM公司1984年为推出PC/AT机而建立的系统总线标准,所以也叫AT总线。它基于PCI/CPCI总线的高速数据采集卡的设计与实现是对XT总线的扩展,其数据总线为8/16位,地址总线为24位,最高数据传输速率为16MB/s。●MCA总线由于Intel公司和MicrosoR公司的迅速发展壮大形成了对IBM公司的威胁,IBM公司为了保护自身的利益,将计算机总线标准由ISA总线升级到MCA总线,MCA总线改进了自动配置特性(无硬连接地址),而且提供了任选32位数据和地址支持,速度可达40MB/S。为了防止其它厂商的仿制,mM公司对MCA总线执行使用许可证制度,因此MCA总线并没有象ISA总线那样得到有效推广。●EISA总线EISA总线是1988年由Compaq等9家公司联合推出的一种兼容性更强的总线标准,该总线除了具有与MCA总线完全相兼容的功能外,还与ISA总线完全兼容。EISA总线是32位总线,支持多处理器结构,具有较强的I/0扩展能力和负载能力。EISA总线的最高传输速率为33MB/s,适用于网络服务器、高速图形图像处理、多媒体等应用领域。●VESA总线VESA(videoelectronicsstandardassociation)总线是1992年由60家附件卡制造商联合推出的一种局部总线,简称为VL(VESAlocalbus)总线。它定义了32位数据线,且可通过扩展槽扩展到64位,使用33MHz时钟频率,最大传输率达132MB/S,可与CPU同步工作。但vL总线只是适用于486的一种过渡标准,随着Pentium处理器推入主流PC市场,VESA总线基本消失了,PCI总线取而代之。・PCI总线PCI(peripheralcomponentinterconnect)总线是当前最流行的总线之一,是由Intel公司首先推出的一种局部总线。它定义了32位数据总线,且可扩展为64位,支持突发读写操作,最大传输速率可达132MB/S,可同时支持多组外围设备。PCI局部总线不能兼容现有的ISA、EISA、MCA(microchannelarchitecture)总线,但它不受制于处理器,是基于奔腾等新一代微处理器而发展的总线。●CompactPCI总线以上所列举的几种系统总线一般都用于商用PC机中,在计算机系统总线中,还有另一大类为适应工业现场环境而设计的系统总线,比如STD总线、VME总线、PC/104总线等。这里仅介绍当前工业计算机的热门总线之一—CompactPCI。CompactPCI的意思是“坚实的PCI”,是当今第一个采用无源总线底板结构的PCI系统,是PCI总线的电气和软件标准与欧式卡的工业组装标准的有机结合,是当今最新的一种工业计算机总线标准。在电气、逻辑和软件功能方面,CompactPCI与PCI完全兼容。第一章绪论1.3论文选题背景及作者主要工作本论文选题来源于作者参加的两个科研项目:《大幅面CIS扫描输入技术研究》和《高性能指挥作战系统研究》。由于这两个项目都对数据采集卡的性能(尤其是采集速度)提出了特别高的要求,传统的基于ISA总线的采集卡显然无法满足要求,即使是目前传输速度很高的USB、SCSI等接口也不能令人满意。当然,在市面上也存在着一些基于PCI/CPCI的超高速数据采集模块,如ADLINK的PCI7300A、CPCI7300,但这类产品往往是为通用的目标而设计的,并不能很好地满足特殊要求,而且价格十分昂贵。正是基于这种背景,作者仔细研究了PCI及CPCI总线规范,查阅了大量有关PCI/CPCI接口卡设计和数据采集方法等方面的资料和文献,提出了一种性能价格比比较高的基于PCI/CPCI的高速数据采集卡设计方案,并对其可行性进行了严格的论证,最终顺利完成了其硬件及驱动程序设计。其中基于CPCI的采集卡是为了适应特殊的工业环境需要而研制的。需要特别声明的是:在大幅面CIS扫描输入系统中,由于所有的A/D转换已经由扫描仪的主控卡完成,所以本文为此而设计的基于PCI的高速数据采集卡实际上完成的是对数字数据的采集,其功能主要包括高速数据采集、主机端命令发送、辅助输入输出等,在后面的章节中,作者将对此作更为详细的介绍。而在高性能指挥作战系统中,由于对雷达信号的处理非常复杂,所以我们将数据采集模块又详细划分为两个子模块,我们分别称之为雷达信号处理模块和数字信号采集模块,前者用于完成对雷达所提供的模拟信号的所有处理(A/D转换、复杂的数字信号处理等),并将生成的数字数据不断写入双端口DRAM中,而后者主要负责实时高速准确地从双端口DRAM中将数据采集到主控机,同时此模块还要完成主机与外设的通信以及对中断进行快速响应等功能,在本次设计中,作者完成的是后一模块。也就是说,作者所设计的基于CPCI的高速数据采集卡完成的也是数字信号的采集。因此,作者在此作特别说明,本文中的基于PCI/CPCI的高速数据采集卡只能用作数字信号采集,实际上可称作高速数字量I/O卡,但为了叙述的方便,在下文中我们继续称之为数据采集卡。还有一点要做特别声明:本文中的基于PCI的数据采集卡电路板设计由张洪刚同学完成,作者完成了内部控制逻辑设计及基于Win2000的驱动程序设计;而基于CPCI的数据采集卡软硬件设计是在付少锋老师的指导下由作者独立完成。高速数据采集技术的应用并不局限于本文中所提及的两个项目,其应用面是很宽的,因此论文中基于PCI/CPCI总线的高速数据采集卡在设计时充分考虑了通用性,读者可以直接或对采集卡上由高速CPLD实现的内部逻辑控制作少量改动即可应用到其他相关领域。基于PCI/CPCI总线的高速数据采集卡的设计与实现1.4论文结构本文从总体方案设计、硬件设计、软件设计(本文主要指驱动程序设计)等各个方面对基于PCFCPCI的高速数据采集卡设计作了具体的论述,全文共分五童。在第一章的绪论部分,主要对数据采集技术的作用及现状做了概述,同时对当前流行的计算机总线进行简要地分析和比较,最后简述了本文的研究意义。在第二章,简单介绍了PCPCPCI总线协议,对PCUCPCI体系结构、工作原理、配置空间等做了概要论述。在第三章,对采集卡的工作原理及整体方案设计作了简单论述。在第四章,详述了采集卡的硬件设计,包括硬件接口电路设计和内部控制逻辑设计等。在第五章,比较了各种驱动程序开发工具的优缺点,讲述了用DriverStudio开发基于PCI总线的数据采集卡的驱动程序的过程。第二童PCI/CPCI总线概述第二章PCI/CPCI总线概述2.1PCI总线简介2.1.1总线的基本概念在微型机应用系统中,需要利用总线在芯片与芯片、插件板与插件板、系统与系统之间进行连接和通信。总线是构成微型机系统的重要组成部分。总线设计的好坏会直接影响到整个微型机系统的效率、可靠性等各种性能。广义来说,总线就是连接两个以上数字系统元件的信息通路,通常可分为以下几类。1.片内总线:顾名思义,片内总线就是连接集成电路芯片内部各功能单元的信息通路。过去,这种总线的结构及设计都是由芯片研制部门及生产厂家来完成的。但是,随着专用集成电路(ASIC)技术的发展,微型机应用系统设计者为了设计出自己的专用芯片,对片内部线投入了越来越多的关注。2.元件级总线;元件级总线也可以称为插件板内总线。该总线限制在一块电路板内,用以实现电路板内各元件的相连接。元件级总线是系统设计者在构成系统时必须考虑的一级总线。3.内总线:内总线可以看作是插件板级总线,通常又称为系统总线。它用于构成微型计算机的各插件电路板的相互连接,是微型计算机的重要组成部分。从微型机问世以来,人们纷纷研究和设计各种系统总线。各种性能优良、用途不一的系统总线不断出现。而CPU运行速度的提高、多处理器结构的出现、高速缓冲存储器的广泛应用等,都要求有更高速的总线来传输数据,从而出现了多总线结构。多总线结构是指CPU与存储器、I/O等设备之间有两种以上的总线,这样可以将慢速的设备和快速的设备挂在不同的总线上,以减少总线竞争现象,提高琴统的效率。在多总线结构中,PCI局部总线是当前最流行的高性能总线之一一。在下面的章节中,我们将对PCI总线作进一步的介绍。4.外总线:外总线又称为通信总线,它用于微型机系统与微型机系统、微型机系统与其他仪器或设备的相互连接。一般来说。外部系统与设备相距微型机系统要远一些。它们的通信联系可以用并行方式或串行方式来实现。但数据传输速率通常都较低,不像内总线那样,都是并行的高速总线。2。1.2PCI总线的特点PCI(peripheralcomponentinterconnect)总线是由Intel公司首先推出的一种局部总线。它是一种32位或“位数据宽度、地址线数据线复用的总线。值得注基于PCI/CPCI总线的高速数据采集卡的设计与实现意的是,通过PCI局部总线的全部读写传送都可以采用突发传送,并且突发传送的长度由总线主设备决定。在交易开始时,目标得到起始地址和交易类型,但没有传送长度;在传送最后~个数据项时,主设备会通知目标在本次传送后会结束交易。PCI局部总线能够配合要求彼此间快速访问或快速访问系统存储器的适配器工作,也能让处理器以接近自身总线全速的速度访问适配器。在PCI系统中,Host:PCI桥称为j七桥(NorthB喇辨),连接主处理器总线到基础PCI局部总线。PCI/ISA桥称为南桥(SouthBridge),连接基础PCI总线到ISA总线,南桥通常含有中断控制器、IDE控制器、USB控制器和DMA控制器等,南桥和北桥组成芯片组。在基础PCI局部总线或PCI插入卡上,可以嵌入一个或多个vCI—PCI桥。一个芯片组可以支持一个以上的北桥。图2l表明了PCI、扩展、处理器和存储器总线间的基本关系:图2.1PCI总线系统结构目前我们见到的PC机几乎都采用PCI总线。该总线自1993年推出以来,得到了广泛的应用,这归于它的许多优秀特点:1.良好的性能:当采用32位传送时,数据传送速率达到132MB/S,而当采用64位传送时,数据传送速率达到264MB/S。2.独立于处理器:为PCI总线设计的器件是面向PCI总线的,而不是针对处理器的,所以设备的设计独立于处理器的升级。3.可扩展性好:一个PCI局部总线支持约lo个PCI设备,每个设备可以有8个功能,每个功能就是一个PCI逻辑设备,每个PCI总线支持80个PCI逻辑设备,系统中总共可以有256个PCI总线。4.低功耗:PCI技术规范的主要设计目标之一就是使用尽可能小电流的系第二章PcI/CPCI总线概述统设计,具体的实现方法包括利用波前端的反射驱动信号等。5.并行总线操作:桥支持完全总线并行操作,处理器总线、PCI总线和扩展总线在北桥和南桥的支持下完全可以并行操作。6.隐式总线仲裁:PCI局部总线仲裁能够在另一个总线主设备正在PCI局部总线上执行数据传送时发生。7.引脚数少:总线信号使用经济,一个功能的PCI目标只有47个引脚,主设备只有49个引脚。8.即插即用:在每个PCI接口上都包含一系列寄存器,其中存贮着包括主板信息在内的一系列信息。利用这些信息,主机能够自动配置PCI卡,使插到PCI插槽上的各接口卡都会为CPU所知且不会发生冲突。9.软件透明:在与PCI设备或面向扩展总线的同类设备通信时,软件驱动程序使用相同的命令集和状态定义。2.2PCI总线操作2.2.1PCI总线命令表21PCI总线命令编码和类型C/BE[3:0]#命令类型说明0000中断应答命令0001特殊周期命令0010I/0读命令0011I/O写命令0100保留010l保留0110存储器读命令0111存储器写命令1000保留1001保留1010配置空间读命令1011配置空间写命令1100存储器多行读命令1101双地址周期1110存储器一行读命令111l存储器写无效命令基于PCI]CPCI总线的高速数据采集卡的设计与实现PCI总线命令的作用是用来庭盥主设备和胰灞备之间的数据传输类型的,。它出现于地址周期的C/BE[3:0]#。这里的主设备是指通过总线仲裁获得总线控制权的设备;从设备是指在地址周期C/BE【3:O】拌上出现命令的同时,被An[Sl:0l线_k的地址寻址到的设各。表2.1列出了PCI总线命令的编码和命令类型。2.2.2PCI总线交易■既t屙舔想线上所有的赣据交易蓥率上棵悬由珊乙A她拌、IRDY#、1誓∞Y群三条信号线控制的。F蛋LA枷酣由当前主设备驱动,表明一个数据交易的开始和结束。IRDY#也是由当前主设备驱动,当主设备准备完成当前数据段时,此信号有效。在写交易中,有效的IRDY#表明主设备已经将有效数据驱动到数据总线;而在读交易中,有效的[RDY#表明主设备正准备接收来自当前寻址的目标设备的数据。TPd)Y#由当前寻址目标驱动,当目标准备完成当前数据段时,此信号有效。在读交易中,有效的TRDY#表明目标正在数据总线上驱动有效数据;而在写交易中,有效的TRDY#表明目标正准备接收来自主设备的数据。如果读者想要了解PCI局部总线交易的具体规则,请参见参考文献2。1.总线上的读交易图2.2表示了总线上一次读操作中有关信号的变化情况。辟一j、,I警船:~a∞I拒嘲卜-{B—‘BAT豇I)X州函Ⅸ杈TA-3H一:@目跳H一一簪1lII!厂’\fir一难~一#N[锚I二|Z一熏]mjjlll厂●-_———————————日嚏Tl'n饼卜———————————’惫丽蠹●—1硼一《—1瑚广+●—1网一冉憔舟雌件l耀PI-P,啮E图2.2PCI读交易时序从图中可看出,~旦FRAME#信号有效,地址期就开始,并在时钟2的上升沿处稳定有效。在地址期内,AD[31::00】上包含有有效地址,C/BE[3::0】撑上含有一个有效的总线命令。数据期从时钟3的上升沿开始,在此期间,AD[31::00】线上传的是数据,而∞E撑线上的信息却指出数据线上的哪些字节是有效的(即哪几个第二章PCI/cPCI总线概述字节是当前要传输的1。要特别指出的是无论是读操作还是后面要讲的写操作,从数据期的开始一直到传输的完成,C/BE3的输出缓冲器必须保持始终有效状态。在读交易的第~个数据期要求一个交换期,这需要由目标设备利用TRDY#来实现。在这种情况下,地址在时钟2处有效,然后主设备停止驱动AD线,在时钟4处目标提供有效数据。但在交换过后并且DEVSEL#信号有效时。目标设备必须驱动AD线。图中的DEVSEL#信号和TRDY#信号是由被地址期内所发地址选中的设备(目标设备)提供的,但要保证TRDY#在DEVSEL#之后出现。而IRDY#信号是发起读操作的设备(主设备)根据总线的占用情况自动发出的。数据的真正传输是在舳Y}f和TRDY#同时有效的时钟前沿进聿亍的,这两个信号的其中之一无效时,就表示需插入等待周期,此时并不进行数据传输。这说明,一个数据期可以包含一次数据传输和若干个等待周期。在图2.2中,时钟4,6,8、处各进行了一次数据传输,而在时钟3,5,7处插入了等待周期。在时钟7处尽管是最后一个数据期,但由于主设备因某种原因不能完成最后一次传输(具体表现是此时IRDY#无效),故FKAME#不能撤消,只有在时钟8处,1RDY#变为有效后,FRAME#信号才撤消。2.总线上的写交易图2.3表示总线上一次写交易的时序关系。1234567l9,限哪=bc。K彳\f、_rLr叫、彳\rLNr限哪=bi{i;j;ll;£=:f=======[=:工黛:,f==:}======}===±未:,越一====|=痤霉湮p雹母i二j亘耳=聊:≈E盟雩'飘掣I蛆掣!譬—PiIjI剁L卜i竺}I—坩!l'二i一一E一j一二:,坻i#I剽iiIllll耸il£:::£图2.3写交易时序由图可知,FRAME#信号的有效预示着地址周期的开始,且在时钟2的上升沿处达到稳定有效。除了地址期之后没有交换期外,在此类操作中数据和地址是由同一个设备发出的,其他与读交易相类似。整个数据期也与读交易基本相同,只是在第三个数据期中由目标设备连续插入了三个等待周期,时钟5处传输双方10基于PCI/CPCI总线的高速数据采集卡的设计与实现均插入了等待周期。值得注意的是,当F&删撤消时必须要有IRDY#有效为前提。以表明是最后一个数据期。另外,从图213中可以看出,主设备在时钟5处因撤消了IRDY#丽插入等待周期,表明耍写的数据将延迟发送,但此时,字节使能信号不受等待周期的影响,不得延迟发送。需要强调的是;上述的读/写操作均是以多个数据期为例来说明的,单个数据期情况与此类似。3.交易的终止过程无论是主设备,还是从设备,都可以提出终止一次PCI总线交易的要求,但要求不等于具体实施,也就是说双方均无权力单方面实施交易停止工作,需要互相配合。不过,有一点是肯定的,那就是传输的最终停止控制要由主设备完成,这是因为交易的结束必须满足系统的要求并且应是有次序的。这只有主设备才能做到。同时,所有传输的结束标志是FRAME#信号和IRDY#信号均己撤消而进入总线空闲状态(参看图2.3时钟9处)。●由主设备发起的终止主设备~般会在完成和超时两种情况下通过撤消FRAME#信号并建立IRDY#信号来请求终止交易。所谓完成是指主设备已经做完了要做的事情;所谓超时则是指当主设备的GNT#信号无效并且其内部的延时计数器已满。在2.2I钣规范中,允许主设备在没有目标设备响应的情况下终止交易,这个不正常的终止就叫做主设备废止。尽管将它应用于原始请求交易可能会产生致命的错误,但其交易的完成是完美的,因为它对其它的代理保留了正常的PCI操作。・由目标设备发起的终止当目标设备不能完成请求时,它可以用STOP#信号发起交易终止。目标设备用sToP}}和其他信号的不同组合方式向主设备表明导致终止的一些情况。目标发起的终止有以下三种:重试、断开和目标设备废止。所谓重试,是指由于目标设备忙,暂时不能进行交易而在任何数据被传输前请求的终止;所谓断开,是指目标设备在一定时间内不能做出响应并且不能继续突发时,于初始数据期数据的传输同时或完成之后请求的终止;所谓目标废止,是指因目标设备检测到一个致使错误或目标设备不能完成请求而产生的不正常终止。对于大多数目标设备,要求至少有实现重试的能力,其他形式的终止是可选的。・延迟交易对于在PCI规范要求范围内不能完成初始数据期的目标设备,可采用延迟交易终止。使用延迟交易的设备有两种:FO控制器和桥(特别是PCI--PCI桥)。延迟交易有两大优点,其一是:当对~个低速设备进行访问时,不需要保持等待状态,当发起主设备重新仲裁总线时,允许其他总线主设备使用总线带宽;其二是;在接受请求之前,不需要刷新所有的报告(存储器写)数据,对报告数据的真正刷新发生在延迟第二章PCI/CPCI总线概述交易完成于发起总线之前,这就使得在一个非报告交易完成且仍然保持系统规则的情况下,允许报告保持使能状态。2.3PCI配置地址空间在机器上电启动时,配置软件会扫描系统中的所有总线(包括PCI和其他),以确定总线上存在什么设备和各个设备有什么配置要求,这个过程常常指的是扫描总线、激活总线、检查总线、发现过程、总线枚举,执行PCI总线扫描的程序常被称为PCI总线枚举程序。为了实现这种即插即用功能,所有的PCI功能都必须实现由PCI规范定义的一组配置寄存器。依赖其操作特性,各设备功能还可以实现由PCI规范定义的其他要求的或可选的配置寄存器。另外,规范保留许多附加的配置单元,以实现功能指定的配置寄存器。图2.4配置首部。结构图每个PCI功能都拥有“个配置双字的单元,保留用于实现配置寄存器。第一个16双字的格式和用法由PCI规范定义,这个区域称为设备的配置首部区(或首部空间)。目前规范12基于PCI/CPCI总线的高速数据采集卡的设计与实现定义了三种首都格式,称为首部类型0、l和2。其中蓖部类型l是为PCI--PCI桥而定义,首部类型2是为了PCI-CardBus桥而定义,而酋部类型0是为了除PCI--PCI和PCI--CardBus桥以外的其他PCI设备而定义,其格式如图2.4所示,其中黑底色的寄存器是必须实现的。一般情况下,操作系统使用以下配置寄存器的内容来决定为该PCI设备加载何种驱动程序:供应商ID,设备ID,版本号,类别代码,子供应商,ID,子系统JD。这些寄存器的具体内容请参阅PCI规范。2.4CPCI总线简介2.4.1CPCI总线的引出对于工业控制行业而言,总线技术一直是技术进步的关键所在。1981年,Motorola提出VME总线标准,因其具有可靠性极高,散热性能好,易于安装和移动等优点,在20世纪80年代广泛应用于电信、军事等领域。然而,随着高科技工业的阔步发展,对于技术、价格的要求也日益提高,传统VME总线标准的劣势也逐渐暴露了出来:由于VME总线采用专用的工业设计方法,成本昂贵且应用范围有限;VME环境的软件移植必须定制,增加了验证和支持的工作量等。20世纪90年代,PCI总线作为台式机系统的业界标准被千百万台计算机采用,但是它无法提供高度的可靠性,也不能满足高可用性系统对正常运行时间的要求。而且.其主板很难散热,主板边缘接头可靠性低,在更换主板时极易受到损伤。显然,PCI也无法为现代工业控制提供性能优良的解决方案。为了充分利用上述两个标准的优点,而避开它们的局限性。包括Sun在内的400多家计算机供应商和制造商合作开发了CompactPCI标准。CompactPCI特别汲取了VME的精髓(密集坚固的封装,大型设备的极佳冷却效果1,并与Pc的优势(廉价、易于采用最新互连和处理能力的快速芯片)巧妙地结合在一起,既保证5个9的高可靠度,又降低硬件和软件的开发成本。目前CompactPCI已经取代VME以及STD工业标准,成为工业领域的新一代标准,更为重要的是,它还成为服务器背板市场中的主力军。CompactPCI上市产品的数量增长非常迅速,1998年销售额为3亿美元,1999年则达8亿美元。2.4.2CPCI总线的特点CompactPCI之所以能在电信和CTI等多个领域都得到广泛应用和普遍认可,是因为它具有许多优秀的特点,主要表现在以下几个方面:1.与标准PCI兼容;CompactPCI的CPU及外设同标准PCI是相同的,并且CompactPCI系统使用与传统PCI系统相同的芯片、防火墙和相关软件。第一章PCI/CPCI总线概述从根本上说,它们是一致的,因此操作系统、驱动和应用程序都感觉不到两者的区别,将一个标准PCI插卡转化成CompactPCI插卡几乎不需重新设计,只要物理上重新分布就行了。,2.遵从Eurocard封装标准:CompactPCI板采用经过20余年现场使用考验的欧规卡(Eurocard)结构,采用垂直安装、前抽取结构,提高了板卡的散热性、抗震性和易维护性。3.支持热插拔:所谓热插拔就是在运行系统不断电的条件下,拔出或插入功能模板,而不破坏系统正常工作的一种技术。CompactPCI连接器的电源和信号引线支持热插拔规范,这对于容错系统是非常重要的,这也是标准PCI所不能实现的功能。4.高传输速度:从总线速度上看,32位33MHz的CPCI总线最大传输速度为132MB/S,64位33MHz的为264MB/S,64位66MHz时的峰值速度可达每秒528MB/S;而32位的VME总线最大理论带宽为40MB/S,实际仅能达到每秒15MB左右的传输速度。两者的差距不言而喻。5.高可扩充性;CompactPCI总线易于扩展,可同时支持多达256个的标准PCI总线设备。它可在每个子系统中支持8个插槽(标准PCI是4个),加上桥接芯片后,CompactPCI可轻易扩展支持到32个插槽。14基于PCI/CPCI总线的高速数据采集卡的设计与实现第三章数据采集卡整体方案设计3.IPCI/CPCI总线接口方案选择3.1.1常见接口方案比较目前PCI接口电路的实现方案有多种,表3.1比较了常用的几种方案。表31常用PC!接口方案比较实现方案优点缺点技术比较成熟,价格比较便宜,外部连线太多,通过对支持ISP的CPLD预留接占用宝贵的PCB专用PCI接口芯片+CPLD口可减少新产品设计风险、加快空间,且容易产生产品升级速度。高频干扰。PCI接口控制器与CPLD之间的PCI软件包价格较一大批信号连接线变为CPLD的昂贵,而且使用这片内连接线,从而大大减小了外一模块软件编程高速CPLD+PCI软件包部信号连接线的数量,降低了印较复杂。制电路板设计的难度,增加了电路板的抗干扰性和稳定性。PCI接口控制器与CPLD之间的需要专门的写入一大批信号连接线变为CPLD的工具,该写入工具~次性编程FPGA器件(内片内连接线,从而大大减小了外价格昂贵,并且含PCI协议硬核)部信号连接线的数量,降低了印FPGA只能一次性制电路板设计的难度,增加了电写入。路板的抗干扰性和稳定性。将包括PCI控制器在内的所有逻由于PCI协议的复辑功能模块都在一块FPGA中实杂性,其接口的实自己在FPGA中实现PCI协现,具有开发成本很低,外部信现会比较困难,设议及其他逻辑功能号线连接较少,抗干扰能力较强,计的周期会较长硬件设计简单,而且可以根据实且很难在短时间现需要只实现部分PCI接口功能。内做到稳定。第三章数据采集}掩体方案设计在本次设计中,由于只涉及了很少的高频器件,而且对开发成本、开发周期等因素有着较高的要求,所以作者选用了专用PCI接口芯片+CPLD这种实现方案。目前市场上常见的专用桥接口芯片有AMCC的S5933,PLX的PCI9054、PCI9056,CYPRESS的CY7C09449等,结合考虑了各种因素,我们选用了PLX公司的PCI9054。3.1.2桥接口芯片PCI9054简介PCI9054是美国PLX公司继PCI9052之后推出的又一款低成本PCI总线接口芯片,采用PQFPl72pins封装,其主要特征如下:●符合PCI132~m/S。V22规范,在PCI总线与局部总线之间的数据传输速度可达●兼容PCIV2.2电源管理规范。・采用业界领先的数据管线结构,内部集成两个DMA引擎,支持主/从数据传输模式。●支持PCIV2.2VPD(VitalProductData)配置功能。●支持双地址周期(DAC)。●支持类型0和类型l配置周期。●可编程的突发管理。●可编程的中断生成器。●提供6个可编程F球O,以支持零延迟的突发数据传输。・核心采用3.3VCMOS技术,兼容5V信号环境,符合当前低功耗的发展趋势。●支持与MPC850/860系列、PowerQUICC系列、Inteli960mMPPC401系列CPU及其他类似总线协议设备之间的局部总线直接连接。・局部总线时钟可以和PCI总线时钟异步操作,最快可以达到50MHz。・本地总线可为三种模式:M模式、C模式和J模式,可利用模式选择引脚加以选择。・支持串行EEPROM接口。●32位多路复用月}复用局域总线支持8位、16位以及32位外围设备和存储设备。●工业温度范围内操作,支持CompactPCI热交换功能有关PCI9054的EEPROM配置、总线操作(包括PCI总线操作和局部总线操作)、DMA突发传输、中断处理等方面的的详细介绍,请读者参阅PCI9054数据16基于PCI/CPCI总线的高速数据采集卡的设计与实现手册。3.2基于PCI的数据采集卡的总体实现3.2.1PCI采集卡功能简介在本论文中,设计基于PCI的高速数据采集卡的直接目的就是为了解决《大幅面CIS扫描输入系统》中的速度瓶颈,即在大幅面扫描仪和主机之间建立起一条高速稳定的数据通道。大幅面CIS扫描输入系统的基本工作过程可简述如下:首先,主机通过采集卡与扫描仪进行握手,以确定能否进行数据传输、以怎样的协议进行数据传输等;然后,主机通过采集卡向外设发送扫描命令,通知扫描仪开始工作并上传扫描得到的图形图像数据;最后,主机通过采集卡高速采集扫描仪所提供的底层图形图像数据,并交给上层软件进行相应的处理。不难看出,数据采集卡需要实现以下三大功能:辅助输入/输出、命令发送和数据采集。其中辅助输入/{俞出功能就在主机和扫描仪之间搭建起一条可以进行可靠通信的桥梁,为双方传送相应的状态信息和控制信号。而命令发送功能则主要实现将主机发出的各种命令(扫描、复位等)准确地传送给扫描仪。因为考虑到命令数据传输量很小且对整个数据采集过程的顺利进行至关重要,所以在本次设计中我们采用了非常严格的握手时序进行命令传输。至于数据采集功能,则是本次设计的重点,必须保证高速稳定。本文选用了IDT公司的高速大容量双端口FIFO为数据采集卡提供高速数据缓存,将整个数据采集模块又分为了外设向FIFO上传数据和主机从FIFO读取数据两大部分,而且这两部分是并行执行的。这样,不仅实现了高速稳定的数据采集,又实现了灵活的异步操作,提高了数据采集卡的整体性能。采集卡的工作模式如图3.I所示。扫描◇洲◇主/l仪?命令发送机\\\数据采集:f图3.1基于PCI总线的采集卡的工作模式QIDE()QER_能.可中程过输传上缆电P在据数到_虑考又。求请入输据数和)第三章数据采集卡接体方案设计3.2.2PCI采集卡信号组定义通过上文的分析可知,该数据采集卡必须具有的信号组包括:辅助输入端口、辅助输出端口、命令输出端口和数据采集端口。我们定义了4位辅助输入端口和4位辅助输出端口,这样,不管对于主机端还是外设端,都可以表示多达16种不同的状态,这对大部分应用都已经足够。又因为主机向底层扫描仪发送的大部分都是单字节命令,而且即使是多字节命令,所要传输的数据量也是很少的,所以在本设计中我们定义了8位的命令输出端口。至于数据采集端口,为了达到高速采集的目的,我们其定义为32位宽度,这是本次设计中所选择的器件所能支持的最大字宽。在设计的过程中,还考虑到8位命令输出端口和32位数据采集端口不可能同时进行数据传输,而且端口上的数据信号又都是不需要长时间保持的,所以我们把8位命令输出端口合并到32位数据采集端口的低8位,这样可以节省采集卡的资源,使设计简洁而高效。为了确保命令输出和数据输入准确进行,我们又分别定义了以下两组控制信号:命令输出请求(DO)、命令输出应答(DOACK(DI、数据输入应答ACK)受到电磁干扰,我们为每一根信号线都配置了地线,这样在电缆中就可以采用双绞线的形式传输信号,每一对双绞线都是由一根信号线和一根地线组成,从而有效抑制了电磁干扰。数据采集卡接口信号组设计如图3.2所示:基于PCI总线的数据采集卡接口信号定义图3.2基于PCI总线的采集卡信号组定义lg基于PCI/CPCI总线的高速数据采集卡的设计与实现3.2.3PCI采集卡整体结构通过上文的叙述我们知道,该数据采集卡主要完成了辅助输入/输出、命令发送和数据采集等三大功能。而高速数据采集是本采集卡所要实现的最主要的功能,为了达到高速数据采集的目的,数据在从数据采集端口传送到主机内存的过程中应当没有任何瓶颈。为保证外设可以使用尽量快的速度上传数据,数据采集卡上设有高速双端口缓存(本设计选用了IDT公司的IDT72V3690。存储容量为36Kx36bit,异步读写时钟最快可以达到133MHz,支持读和写的快速并发进行1;而为了保证高速缓存中的数据能够及时准确地通过PCI总线传输到主机主存,必须使用高效的PCI桥控制芯片(本设计选用了PLX公司的PCI9054,该芯片集成有DMA引擎,可以在不占用主机系统板DMA资源的前提下进行高速的DMA方式的数据传输,最高传输速度可达132MB/S)。对于命令发送模块,由于数据采集卡以握手的方式向外设发送命令,而且命令本身的数据量很小,所以命令数据从主机内存到8位命令输出端13可以不经过高速数据缓存(这样可以简化设计),其过程可简述如下:主机发起相应的写操作之后,主机内存中的命令数据在HOST/PCI桥、PCI9054、内部控制逻辑的控制下,经由HOST/PCI桥、PCI总线、PCI9054内部缓存及驱动电路传送至命令输出端口,通知外设执行相应的操作。一辅助输出与命令发送的过程非常类似,只是最初主机执行的操作类型不同;而辅助输入的过程则刚好相反:主机发起相应的读操作之后,由外设端驱动的辅助输入信号在内部控制逻辑、PCI9054(桥接口芯片)以及主机上的HOST/PCI桥的控制下,经由驱动电路、PCI9054内部缓存、PCI总线及HOST/PCI桥传送至主机内存。在本设计中,采集卡上的内部控制逻辑是相当复杂的,它既要控制数据采集卡与外部设备之间的数据通信,又必须管理采集卡上几乎所有的器件使之协调工作以完成主机端通过PCI9054在局部总线上执行的各种操作。而且由于是高频数字电路设计,这对控制逻辑本身的信号延迟、同步控制等又提出了很高的要求。在本次设计中,我们选用了ALTER公司的EPM7128AETCl00.5来实现采集卡的内部逻辑控制。PCI总线规范规定PCI设备的每个PCI功能都需要提供配置空间用以实现配置寄存器,而且在系统启动时设备还应当为配置空间提供必要的初始化信息。因此数据采集卡上应当设计有ROM芯片以保存主机启动过程中需要的设备配置信息,包括设备识别参数和设备资源需求等。在本次设计中。桥接口芯片PCI9054不仅提供了PCI配置空间,而且还提供了对EEPRoM接口的支持,这样在系统启动时,PCI9054从EEPROM中读取诸如设备m、供应商D等基本信息以实现PCI配置空间。第三章数据采集卡整体方案设计数据采集卡的整体结构框图如图33所示h、命々输出驱动l~一模块l/:铲助誓岩驱动i今K19064卜而>l+:厂],’1lIf。’l,1卜、\/CPLD数外嗣+【据设采器I接集/口FIFOpJN驱、\、动电路GI;#助毽套驱动pJN\,j07图313基于PCI总线的采集卡整体结构3.3基于CPCI的数据采集卡的总体实现3.3.1CPCI采集卡功能简介绪论中我们已经提到,由于在《高性能指挥作战系统》中,对雷达信号的她理非常复杂,所以我们将数据采集模块又详细划分雷达信号处理模块和数字信号采集模块。前者用于完成对雷达所提供的模拟信号的所有处理(~D转换、复杂的数字信号处理等),并将生成的数字数据不断写入双端口DRAM中。而后者主要实现以下四项功能:a)处理外部中断源的中断请求;b)获取终端设备的状态信息;c)发送操作终端设备的控制信号;d)实时准确地从双端口DRAM中采集数据。在本论文中,作者所设计的基于CPCI的高速数据采集卡实际完成的是后一模块的功能,即高速数字数据采集功能,但为了叙述方便,我们仍称之为数据采集卡,其工作模式如图3.4所示。基于PCUCPCI总线的高速数据采集号的设计与实现///\状态读取N卜其控制发送主:他1/机模块/1:数据采集N_圈3.4基于CPCI总线的采集卡工作模式3.3.1CPCI采集卡接口信号定义在本次设计中,我们实现了CPCI卡的J4连接器(对应于底板的P4连接器)以完成与其他板卡之间的通信。由于双端口DRAM集成在另一块板卡上,为了读取其中的数据,我们必须提供12位的地址总线接口(为了防止读写冲突,DRAM的最高位地址始终由另~块板卡上的DSP提供)、16位数据总线接口和其他一些读操作所必须的控制信号(如cE一、Rw_、oE一等)接口。同时,为了实现获取终端设备的状态信息(如RsT、TsT等)、发送操作终端设备的控制信号(MC、TC等)和处理外部中断请求的功能,我们必须设计相应的接口。采集卡接口信号定义如图3。5所示。/1卜\卜\.LD[15:oo]:SA[11:00]>\JVyBIM-c一一BPTC基于cPcI总—DBAK线的数据采集卡信号组定义MTIRSTDSF—RSTTSTllAMoE/jl¨dd_RW一sL[1:0]图3.5基于CPCI的数据采集卡信号组定义第三章数据采集卡整体方案设计3.2.3CPCI采集卡整体结构此采集卡的设计思路与前面讨论的基于PCI的高速数据采集卡的设计思路非常类似,也选用了PLX公司的PCI9054来实现PCI接口设计。由于PCI9054只支持一个中断输入,所以在本次设计中我们用CPLD对其进行了扩充以支持两个外部中断源,具体实现过程我们将在采集卡的硬件设计部分讲述。在实现外设端状态信息获取和外设端控制信号发送等功能时,需要考虑相关信号的稳定性。我们利用CPLD将终端信号与局部总线建立连接,在CPLD中实现对相关信号的驱动,这样可不必再设计专门的驱动电路,节省了宝贵的板卡资源,在后面的章节中我们将会对实现过程做更详细的介绍。当然,从双端口DRAM中实时准确地采集数据才是本设计的重点。与对双端口FIFO的操作不同,对DRAM的读写除了提供必要的一些控制信号外,还必须提供合理的地址信号。而要像本论文中这样实现突发读写功能,则对时序提出了更加严格的要求,在下一章我们将用大量的篇幅来讲述其实现过程。+本次设计中,双端口DRAM我们选用了IDT公司的IDT7025,采集卡的总体结构图如图3.6:图3.6基于CPCI总线的采集卡总体结构基于PCI/CPC!总线的高速数据采集卡的设计与实现第四章数据采集卡硬件设计4.1电路设计中的一些关键问题4.1.1电源设计低功耗已经成为当前{燹1牛设计盼一种发展趋势,也是硬件设计的一个基本要求。在本次设计中,基于PCI的数据采集卡上的所有芯片都采用3.3V电源供电。但考虑副目前大部分PC机系统中只有5V的PCI插槽的现状,我们将PCI适配卡引脚组合设计为5V型,并利用电压转换电路将主机板提供的5V电源换为3.3V电源(本次设计中我们使用的I_T1587),这样既达到了低功耗的目的,又实现了5V信号环境兼容。而在设计基于CPCI的数据采集卡时,也采用了同样的处理方法。电压转换电路如图4.1所示。图41电压转换电路4.1.2时钟设计●PCI/CPCI总线时钟PCI总线时钟源自系统主板,为保证PCI读写交易能够按规定时序进行,PCI规范对PCI时钟的连接做了非常严格的规定,即PCI设备中PCI时钟信号线的长度必须是(25+/.0.1)英寸,而且只能连接卡上的一个负载。这里信号线的长度是指从金手指(PCI引脚)中点到PCI桥芯片的距离,为了满足这个长度要求,布线时必须使用蛇形走线的方法。而CPCI总线时钟源于系统卡,有着和PCI时钟同样的要求,布线时也采用了蛇形走线的方法。・局部总线时钟在基于PCI的数据采集卡上,局部总线时钟包括PCI9054局部总线时钟、可编程逻辑器件参考时钟和高速FIFO的读写时钟。为达到严格同步的目的,我们使用一个时钟源,再利用时钟分配器件CY2305来产生各个局部时钟。同时考虑到时钟信号经过传输线时会产生延迟,第四章数据采集卡硬件设计我们在布线时仍使用蛇形走线的方法,使各局部时钟信号线长度完全一致a而基于CPCI的数据采集卡的局部时钟只包括PCI9054局部总线时钟和可编程逻辑器件参考时钟,处理方法同上4.1.3信号驱动为了保证数据能在足够长的时间内稳定有效,我们必须对数据进行必要的驱动。在设计基于PCI的数据采集卡时,数据输入输出端口我们都采用了IDT公司的74FCT574锁存器对相关信号予以驱动。74FCT574利用时钟的上升沿锁存数据,其优点是可以在确保数据稳定的时刻锁存数据,避免了数据的不稳定状态,而且对其控制比较简单,可以简化采集卡内部控制逻辑。而在设计基于CPCI的数据采集卡时,由于输入输出信号比较少,又考虑到CPLD有资源剩余,我们利用CPLD对其进行驱动,具体实现可参见局部总线控制逻辑实现部分。4.1.4PCB设计中的几点说明本次设计中,数据采集卡的布线采用了四层板结构,其中中间两层分别为电源层和地层。在实际设计中,除了上文提及的时钟设计问题外,还有几点需要加以说明。・电源层被分割为3.3V和5V两部分,5V的电源是从PCI插槽引出的,3.3V电源是5V电源经转换后得到的。3.3V电源和5V电源共地,这样的设计即方便了布线,又有效抑制了各种干扰。●所有芯片的电源引脚都连按了去耦电容,特别是桥控制芯片PCI9054,它的所有引脚都连接了0luF和001uF的两个去耦电容,这样可以有效抑制电磁干扰。●高频电路布线要注意信号线近距离平行走线所引入的“交叉干扰”,若无法避免平行分布,可在平行信号线的反面布置大面积“地”来大幅度减少干扰。●高速电路器件管脚间的引线弯折越少越好。高频电路布线的引线最好采用全直线,需要转折,可用45度折线或圆弧转折,在高频电路中,满足这一要求可以减少高频信号对外的发射和相互间的耦合。●电源线和地线应尽可能加粗,以提供大电流。●信号走线不能形成环路,地线也不能形成电流环路。●对基于CPCI的数据采集卡,连接器与接口芯片之间的大部分信号都需要加10欧姆的电阻,以其适应电气特性。基于PCI/CPCI总线的高速数据采集卡的设计与实现4.2串行EEPRoM配置在系统启动时,PCI9054需要串行EEPROM为其提供一些必须的配置信息以实现对PCI配置寄存器和局部配置寄存器的初始化。这些信息我们需要事先用编程器写入到EEPROM中,而各个信息数据与EEPROM地址偏移量及PCI9054内部寄存器韵对应关系请参考PCI9054擞据手册。在次奉设计中,基于PCI的数据采集卡与基于CPCI的数据采集卡的EEPROM基本相同,下面简要列出了EEPl∞M的一些主要配置。1.与PCI配置相关●设备ID:5406h,表明桥芯片类别・供应商ml1085h,表明是PLX公司●类别代码:068000h,说明桥芯片为其他桥设备●版本号:OBh,表明桥芯片的版本号●时间片请求:00h,设备对每次保持PCI总线的时间无严格要求●优先级请求:00h,设备对PCI仲裁优先级没有特别要求・中断线寄存器:00h,设备对应于中断控制器IRQ0的输入・中断引脚寄存器:01h,设备通过INrA撑引脚产生中断●子系统设备ID:9054h,说明是PCI9054桥芯片●子系统供应商ID:1085h,表明是PLX公司・热交换控制:06h,说明设备热交换D为06・热交换下一能力指针;4Ch,说明设备特性链表下一项地址为4C2.局部配置相关●局部地址空间0范围:FFFFFF01h,表明范围大小为256字节,映射到PCI的“O空间。●局部地址空间0基地址:00000001h,表明基地址为00000000h,并且允许在从模式下访问局部地址空间0时对PCI地址进行译码。●局部地址空间0描述寄存器:884300C0h,说明局部地址空间0数据总线宽度为8位,不插入内部等待状态,使能READY#输入信号,允许突发传输,并使能BTI!R:№¥输入信号,预提取数据有效,串行EEPROM装入使用超长模式,PCI目标重试延迟为8个时钟周期。●局部地址空间1范围:FFFF0000h表明范围大小64K字节,映射到PCI的内存空间。●局部地址空间1基地址:80000001h表明基地址为80000000h,并且第四章数据采集卡硬件设计允许在从模式下访问局部地址空间0时对PCI地址进行译码。●局部地址空间I描述寄存器:00000043h,说明局部地址空间1数据总线宽度为32位,不插入内部等待状态,使能READY#输入信号,允许突发传输,并使能BTERM#输入信号,预提取数据有效,预取计数器有效。・局部总线模式仲裁:0101000Ch,使能局部总线延时计数器,并设置其计数值为oc,禁止局部总线暂停计数器,禁止局部总线主设备申请总线,DMA通道优先级设置为循环方式。4.3局部总线控制逻辑设计在本次设计中,我们选用了Alter公司的高速可编程逻辑器件来实现采集卡的局部总线控制逻辑,整个设计过程可简述如下:先用硬件描述语言VerilogHDL建模,然后在MAX+PLUSII、Active-HDL等环境中进行仿真验证,无误后生成编程文件并将其下载到CPLD中进行调试。在下面的章节中,我们将展开介绍。4.3.1硬件描述语言VerilogHDL简介HDL是硬件描述语言(HardwareDescriptionLanguage)的缩写。目前最流行的硬件描述语言有两种:VefilogHDL和VHDL。VedlogHDL起源于1983年的GDA(GatewayDesignAutomation),而VHDL出现较晚,最初是由美国国防高级研究计划局(DARPA)创立的。VerilogHDL是在应用最为广泛的C语言基础上发展起来的一种硬件描述语言,它是由GDA公司的PhilMoorby于1983年创建的,最初只设计了一个仿真与验证工具,之后又陆续开发了相关的故障模拟与时序分析工具。1985年Moorby推出了他的第三个商用仿真器Vedlog-XL,获得了巨大成功,从而使VedlogHDL得到了迅速的推广和应用。1989年CADENCE公司收购了GDA公司,并在1990年公开发表了VerilogHDL,同时成立了OVI(OpenVerilogInternational)组织以促进VerilogHDL语言的发展。1995VerilogHDL成为IEEE标准,即IEEEStandard1364—1995。VerilogHDL语言到目前为止已经有近20年的历史,拥有广泛的设计群体和非常丰富的成熟资源,它能形式化地抽象表示电路的结构和行为、支持逻辑设计中层次与领域的描述、可借用高级语言的精巧结构来简化电路的描述、具有电路仿真与验证机制以保证设计的正确性、支持电路描述由高层到低层的综合转换、便于文档管理、易于理解和设计重用。如今全世界有接近90%的半导体公司都使用VerilogHDL进行设计,它是事实上的IC行业标准。基于PCI/CPCI总线的高速数据采集卡的设计与实现4.3.2基于PCI的数据采集卡内部控制逻辑设计基于PCI的数据采集卡的内部控制逻辑是相当复杂的,它既要控制数据采集卡与外部设备之间的数据通信。又必须管理采集卡上几乎所有的器件使之协调工作以完成主机端通过PCI9054在局部总线上执行的各种操作。总体来说,可以将其功能分为五大部分:外设端数据上传控制、主机端命令发送控制、主机端数据读取控制、辅助输入控糊和辅助输出控制。下面我们将分别予以介绍。1.外设端数据上传控制外设端数据上传是指外设在接收到主机端韵相应命令后将应答数据通过采集卡的数据采集端口和锁存电路写入其高速FIFO的过程。本部分的控制逻辑是用有限状态机的方法实现的,状态转移过程如图4.2所示。图4.2外设端数据上传状态转换图该状态机工作过程如下:局部复位(LRESEr样有效)后,无论当前状态机处于何种状态都会转移到状态0(空闲状态。将锁存器触发信号DICP清0,同时无效FIFO写使能WEN#)。在某一时刻,外设有效输入请求信号DIREQ,这将导致状态机在下一个局部时钟(LCLK)上升沿由状态0转换至Ⅱ状态1(将DICP.置l产生上升沿以锁存数据,以便将采集端口上的数据锁存,同时有效FIFO写使能WEN#,以便在下一时钟上升沿将锁存的数据写入FIFO)。在紧接着的局部时钟上升沿,状态机将从状态1转换到状态2(无效FIFO写使能WEN#以防止数据的重复写入)。在某个时刻,外设无效输入请求信号DIKEQ,这时状态机将在下一个局部时钟上升沿由状态.2转换到状态0以等待下一次数据输入。另外需要指出的是:为了防止数据丢失,当FIFO缓冲区中没有剩余空间接纳数据时必须及时效DIACK信号以禁止外设端的数据上传。在本设计中,DIACK的实现非常简单,我们直接将其与FIFO的将满信号PAF#连接起来。这样当PAF掣第四章数据采集卡硬件设计无效时(高电平),DIACK有效,允许外设上传数据:当PAF孵i效时(低电平),DIACK无效,禁止外设上传数据。2。主机端命令发送控制主机端命令发送的过程可简述如下:命令数据在CPU和HOST/PCI桥的控制下由主机存储器传输到PCI9054内部缓存,然后在内部控制逻辑的控制下由PCI9054内部缓存发送到外设端。由于命令本身的数据量很小,而且非常重要(用以指示外设执行相应的操作),必须确保准确传输,所以在本部分的逻辑控制中,我们采用了严格的单字节握手的方式来完成局部总线到外部设备之间的数据传输,状态转移过程如图4.3所示。图43主机端命令发送状态转换圈.该状态机:1二作过程如下:局部复位(LRESET#唷效)后,状态机转移到状态o(空闲状态,输出锁存触发信号DOCP清0,无效锁存器输出使能信号DOOE#,无效输出请求信号DOREQ,同时无效写操作完成信号READY#)。某一时刻,盘机端执行写操作并寻址到命令输出,这将导致状态机在下一个局部时钟(Lcu0)上升沿由状态0转换到状态1(这是一个过渡状态,因为PCI9054还未驱动有效数据,还不能锁存)。在紧接着的局部时钟上升沿,状态机将从状态1转换到状态2(D0CP置l以产生上升沿锁存数据,有效DOOF-,#,同时有效READY#信号表示写操作完成)。在下一个局部时钟上升沿,状态机将从状态2转换到状态3(有效DOREQ信号向外设请求命令输出)。外设端检测到DOREQ后会自动无效DOACK信号,直至可以接收下一数据,这样可有效防止数据丢失。某个时刻,DOACK信号重新有效,状态机将由状态3转换到空闲状态以等待下一次总线操作。3.主机端数据读取控制主机端数据读取的过程可简述如下:主机端向采集卡发起数据读取操作,采集卡上高速FIFO中的数据在内部控制逻辑、CPU及基于PCI/CPCI总线的高速数据采集卡的设计与实现HOST/PCI桥的攫制下经由Pcl90,4传输至奎枫存储器。本部分的逻辑控制相对比较复杂,下面将简单介绍两点需要注意的问题。由于本设计所要实现的是高速数据采集,所以整个数据读取过程都采用了无限突发的方式,丽采集卡上高速FIFO到PCI9054的突发传输可由PCI9054或内部控锫4逻辑的任何一方终止。当PCI9054准备结束本次突发传输时,会有效BLAST#信号内内部控制逻辑说明当前周期为本次传输的最后一个数据周期,此时,内部控制逻辑必须及时无效FIFO的读控制信号,以防止数据丢失。而在数据传输过程中,如果出现FIFO变为空雷q情况,内部控制逻辑也可以用BTERM#信号请求1jCl9054结束本次数据传输,这样可以防止数据的重复传输。另一个值得~提的问题是:FIFO驱动数据到数据总线时数据的建立需要一定时间,而由于FIFO的读时钟和PCI9054的局部时钟完全同步,所以FIFO驱动数据到局部总线和PCI9054从局部数据总线上读取数据并不是在同一个时钟上升沿完成的。在数据读取状态,PCI9054读取的第一个数据是在进入该状态之前的那个时钟上升沿由FIFO驱动到数据总线上的,同样以后每个时钟上升沿PCI9054读取上一个时钟上升沿FIFO驱动到局部数据总线上的数据,而FIFO会在当前时钟上升沿驱动数据到数据总线为下一个读周期做准备。本部分的状态转移过程如图4.4。图4.4主机端数据读取状态转换图该状态机工作过程如下;局部复位(LRESET#有效)后,状态机转移到状态第四章数据采集卡硬件设计0(空闲状态,FIFO输出使能信号FIFOOE#无效,FIFO读使能信号PEN#无效,目标准备好信号READY#无效,目标终止传输信号BTERM#无效)。某~时刻,主机端执行读操作并寻址到FIFO读操作,这将导致状态机在下一个局部时钟(LCLK)上升沿发生状态转换:若FIFO不空(EF}f信号无效),则转换到状态5(有效REN#,有效FIFOOE#,则FIFO会在下一个时钟上升沿驱动数据到局部总线);若FIFO为空(EF#信号有效),则转换到状态4(这是一个等待状态,当EF#信号无效后将转换到状态5)。进入状态5后,状态机会检测BLAST#信号是否有效,若其有效,表明是单周期读操作,状态机会在下一个时钟上升沿进入状态7(有效READY#指示PCI9054读取数据,同时无效REN#禁止FIFO读操作以防止数据丢失);若其无效,表明是突发读操作,状态机会在下一个时钟上升沿进入状态6(有效READY#指示PCI9054读取数据,并且保持REN#有效允许FIFO在下一时钟上升沿驱动新数据到局部总线)。在状态6时,状态机会检测BLAST*}=信号和EF#信号是否有效,二者之一有效都会导致状态机转换到状态7(执行最后一次读操作)。若状态机处于状态7,在紧接着的局部时钟上升沿将会转换到空闲状态以等待下一次总线操作。4.辅助输入控制辅助输入的任务就是将外设端驱动到辅助输入端口的状态信息读取至主机端,这部分的控制逻辑非常简单,状态转移过程如图45。图4.5辅助输入状态转换图该状态机工作过程如下;局部复位(LREsET#有效)后,状态机转移到状态0(辅助输入锁存信号AUXI_CP无效,寄存器输出使能信号AUXI_OE#无效,目标准备好信号READY#无效)。当要进行辅助输入操作时,PCI9054有效ADS#并寻址到辅助输入,这将导致状态机在下一个局部时钟(LCLK)上升沿由状态0基于PCI/CPCI总线的高速数据采集卡的设计与实现转换到状态8(AUXICP置l以产生上升沿锁存戴提,有效AI腑,OE#将数据驱动到局部总线,同时有效geaDY#fff号指示PCI9054读取数据)。在下一个局部时钟上升沿,状态机将从状态8转挟至Ⅱ状态9(这是一个等待状态,以保证数据的准确传输)。在紧接着的局部时钟上升沿,状态机将从状态9转换到空闲状态以等待下一次总线操作。5.辅助输啦控制辅助输出的任务是将主机端所要表达的状态信息驱动到辅助输出端口。以便外设端随对检测。本部分控制逻辑比较简单,状态转移过程如所示图4.6。圈4.6辅助输出状态转换图该状态机工作过程如下:局部复位(u匝s硎}有效)后,状态机转移到状态0(空闲状态,辅助输出锁存信号AUXOCP清0,同时无效写操作完成信号READY#)。某一时刻,主机端执行写操作并寻址到辅助输出,这将导致状态机在下~个局部时钟(LCLK)上升沿由状态0转换到状态10(这是~个过渡状态,因为PCI9054还未驱动有效数据,还不能锁存)。在紧接着的局部时钟上升沿,状态机将从状态lO转换到状态ll(DOCP置l以产生上升沿锁存数据,同时有效gEADY#4富号表示写操作完成)。在下一个局部时钟上升沿,状态机将从状态n转换至U空闲状态以等待下一次总线操作。4.3.3基于CPCI的数据采集卡内部控制逻辑设计基于CPCI的高速数据采集卡的内部控制逻辑是也比较复杂,它主要完成以下四项功能:a)处理外部中断源的中断请求;b)获取终端设备的状态信息;c)第四章数据采集卡硬件设计发送操作终端设备的控制信号;d)高速采集双端ElDRAM中的数据。下面我们将分别予以介绍。1.处理外部中断源的中断请求本部分要完成两个任务:一是响应外部中断源的中断请求,设置相应的中断标识位,并判断中断使能标识位以决定是否通过PCI9054向主机发中断请求:二是处理来自PCI9054的中断相关操作,如使能/禁止中断、读取/清除中断标志等。主要VerilogHDL代码分析如下:a)always@(negedgeLRESET—orposedgeCLRINTorposedgeINTREQ)if0LRESETAintreg=l'b0;elseif(CLRINT)intreg=1’b0;elseintreg=1’bl;本部分主要完成对中断标志寄存器的设置,边沿触发:复位信号LRESET的下降沿及清中断信号CLRINT的上升沿都将清除中断标志(清O),而外部中断请求的上升沿将导致中断标志置位(置1)。其中CLRINT为内部变量,当主机端通过PCI9054执行清中断操作时,内部逻辑会控¥0CLRINT产生一个正脉冲,以清除中断标志。b)always@(negedgeLRESET—orposedgeINTENABLE)iff!LRESET-)intermble=l’b0;elseintenable=LD_input_reg[0];这一部分的作用是通过设置中断使能寄存器以使能/禁止中断,同样是边沿触发:复位信号LRESET的下降沿将中断使能寄存器清0(禁止中断),而设置中断使能信号INTENABLE的上升沿将把中断使能寄存器设置为用户指定的值(1或O)以使能/禁止中断。c)assignLINT_=!(intreg&imenable);此条语句的功能是根据中断标志及使能情况决定是否向PCI9054发中断请求,若中断标志为l(即已有外部中断请求),且中断使能标志位为1(使能中断),则有效中断请求输出信号ID盯(低电平有效)请求中断。d)读取中断标志的操作与下面将要讨论的状态信息读取操作实现方法完全一样,这里不再赘述。2.状态信息输入控制本部分的功能是响应主机端通过PCI9054发出的状基于PCI/CPCI总线的高速数据采集卡的设计与实现态信息输入请求,先将终端设备提供的状态信息锁存,然后再将其驱动到数据总线上,并通知PCI9054数据已经准备完毕,可以执行数据读取操作。在这里需要特别指出的是:由于用于PCI9054和CPLD通信的LD-BIO[7:0]为双向数据端口,所以在本部分逻辑中必须确保适时将其驱动为高阻态,以防止数据冲突。本部分是用状态机实现的,状态转移过程如图4.7所示。图4.7状态信息输入状态转换图该状态机工作过程如下:局部复位(LRESET#有"效)后,状态机转移到状态0(空闲状态,输入锁存信号INLATCH无效,输入使能信号READ—EN无效表明CPLD不驱动局部总线,同时目标准备好信号READY#无效)。某一时刻,主机端执行读操作并寻址到状态信息输入,这将导致状态机在下一个局部时钟(LCLK)上升沿由状态0转换到状态1(锁存信号INLATCH产生上升沿将外设的状态信息锁存到CPLD内部定义的寄存器中。)在紧接着的局部时钟上升沿,状态机由状态1进入状态2(有效使能信号READEN促使CPLD驱动局部总线,有效READY#通知PCI9054读取数据)。在下一个局部时钟上升沿,状态机将从状态2转换到空闲状态以等待下一次总线操作。3.控制信号输出本部分的功能比较简单,只是将主机端通过Pcl9054发出的控制信号锁存,然后进行驱动,发送到相应的控制端口并长期保持,直至复位或又一次控制信号输出。本部分是用状态机实现的,状态转移过程如图48所示。该状态机工作过程如下:局部复位(LRESET#有-效)后,状态机转移到状态0(空闲状态,输出锁存信号OuT—LATCH无效,输出使能WRITEEN信号无效,同时无效写完成信号READY#)。某一时刻,主机端执行写操作并寻址到控制信号输出,这将导致状态机在下一个局部时钟(LCLK)上升沿由状态O转换到状态3(这是一个过渡状态,因为PCI9054还未驱动数据到局部总线)。在紧接着的局部时钟第四章数据采集卡硬件设计上升沿,状态机由状态3进入状态4(锁存信号OUT_LATcH产生上升沿将局部总线上的数据锁存到CPu)内部定义的寄存器中,同时有效READY#表明写操作完成(。在下一个局部时钟上升沿,状态机由状态4进入状态5(有效使能信号WRITE_EN将上一周期锁存的控制信号输出给外设端并长期保持)。在下一个局部时钟上升沿,状态机将从状态5转换到空闲状态以等待下一次总线操作。图4.B控制信号输出状态转换图4.数据采集本设计中的数据采集过程可分为两大部分:一是DSP将终端设备提供的数据写入IDT7025,二是主机端通过PCI9054从IDT7025中读取数据。我们将IDT7025分为上下两个半区,并保证两个端口的最高位地址线始终处于反相关系,使对1DT7025的读写可以并发,即当DSP写IDT7025的上半区时,执行读操作只能读取IDT7025下半区的内容,反之亦然。本部分控制逻辑的作用就是响应主机端通过PCI9054执行的单周期或突发方式的数据采集操作,根据相关时序要求,为IDT7025提供控制信号,适时地将数据驱动到数据总线供PCI9054读取。这一部分逻辑比较复杂,是整个内部控制逻辑的重点。本部分是用状态机实现的,状态转移过程如图4.9所示。该状态机工作过程如下:局部复位(LRESET#有效)后,状态机转移到状态0(空闲状态,DRAM的输出使能无效防止其驱动局部总线,目标准备好信号READY#无效)某一时刻,主机端执行读操作并寻址到数据采集,这将导致状态机在下一个局部时钟(LcLK)上升沿由状态0转换到状态6(在这个状态,将局部地址总线的低12位锁存到CPLD内部地址寄存器)。在紧接着的局部时钟上升沿,状态机由状态6进入状态7(向DRAIVI提供有效地址,读写信号RW#置高表明是读操作,有效DRAM输出使能使能信号促使其将数据驱动到局部总线)。在状态7时,要判断BLAST#信号确定是不是突发数据传输,若BLAST#有效,基于PcI/CPCI总线的高速数据采集卡的设计与实现表明是单字节数据传输,则在下~个局部时锋止升沿进入状态舷(有效READY#通知PCI9054读取数据)。若BLAST#无效,表明是突发传输,则在下一个局部时钟上升沿进入状态9(有效READY#通知PCI9054读取数据,同时将地址寄存器的值加1)。若状态机处于状态9,则在下一个局部时钟上升沿进入状态10(无效READY#以防重复读取,同时向DRAM提供新的地址)。在状态10时,要判断BLAST#信号,若其有效,表明是最后一次数据传输,则在下一时钟上升沿进入状态8,若其无效,则在下一时钟上升沿进入状态9继续突发。若状态机处于状态8,则在下一时钟上升沿转换到空闲状态以等待下一次总线操作。图4,9数据采集状态转换图第五章数据采集卡驱动程序设计第五章数据采集卡驱动程序设计驱动程序是上层应用程序和底层硬件之间进行数据交换的媒介,它是操作系统的一个信任部分,其优劣将直接影响操作系统的稳定性和性能。WINDOWS是当今最流行的操作系统之一,在这种操作系统下的驱动程序主要有两种模式:VXD和WDM。本文将简要介绍基于WDM(Windows动程序的设计方法。5.1DriverModel)模型的驱WDM驱动程序工作原理Model的缩写,即Windows32模式驱动程序模型。WDM是WindowsDriver这种驱动程序模型可以在Windows98、WindowsME和Windows2000操作系统下使用。WDM是Microsofc全力推出的新驱动程序模式,目的是提供一种灵活的方式简化驱动程序开发,实现对新硬件的即插即用,减少并降低驱动程序开发的数量和复杂性。上层应用程序通过'i『DM驱动程序与底层硬件进行通讯的过程如图5.1所示:应用程序对设备I/O进行wll32API函数调用,这个调用由FO系统服务接收,I/O管理器从这个请求构造一个合适的请求包(IRP),然后将其传递给设备驱动程序,设备驱动程序与硬件打交道,并完成IRP的处理,最后I/0管理器把数据和结果返回给wln32和用户应用程序。图5.1WDM驱动程序工作原理基于PCI/CPCI总线的高速数据采集卡的设计与实现5.2WDM驱动程縻模型新特点WDM驱动程序模型可以看作是在WindowsNT4.0驱动程序基础上发展起来的驱动程序模型,相比于其他驱动程序模型。WDM具有很多新的特点,下面将做简要的介绍。1.支持即插即用(PnP)和电源管理即插即用是指外部设备可以在系统运行时添加或者删除,操作系统可以在任何时候分配设备需要韵硬件资源。WDM驱动程序支持即插即用,因而可以动态配置设备。电源管理是指设备对系统电源的使用情况是动态变化的。WDM驱动程序支持设备的电源管理,使得设备对系统电源的使用情况同设备所处的工作状态相关。操作系统通过发送IRP请求,通知外部设备进行资源配置和电源管理,这些IRP主函数的代码分别为IRPMJPNP和IRPMJPOWER。针对每个主函数代码还有详细的次函数代码,表明系统对设备进行的详细操作和请求。WDM设备驱动程序中有响应这些IRP请求的分发例程。2.支持WIVlIWMI是WindowsManagementInstrumentation的缩写,是一种向系统管理员报告管理信息的协议,这个协议能测量和管理消耗在本地或者是网络中客户机上的资源信息。WDM驱动程序必须支持WIVlI,一般这种请求是通过IRPMJSYSTEMCONTROL请求传递给PDO(物理设备对象)的,支持WMI的驱动程序具有以下特点:●可以测试应用程序性能、配置数据和其它信息。・可以允许应用程序改变驱动程序中的设置,使得驱动程序执行特定功能。●可以通知应用程序,驱动程序检测到哪些事件或者警告信息。3.支持类驱动程序,微驱动程序分层结构WDM驱动程序采用分层结构,可和其它驱动程序相联系,接收建立在其他驱动程序上的服务,也可向其它驱动程序发送IRP请求。WDM驱动程序模型支持类驱动程序,微驱动程序。类驱动程序是针对一个特定类设备的驱动程序,处理针对这一类设备的IP.P请求。类设备驱动程序向上为这一类设备提供了基于IRP的接口,向下对一个或者多个微驱动程序定义了接口。而微驱动程序主要任务是为特定驱动程序提供服务。这种类驱动程序,微驱动程序结构,使得系统支持新设备更为容易,也使得系统更为灵活和健壮。4.提供系统总线驱动程序WDM环境提供了系统总线驱动程序,通过系统总线驱动程序,设备驱动程第五章数据采集卡驱动程序设计序实现对物理设备的底层控制和资源配置。驱动程序依靠PDO(物理设备对象)存取系统总线驱动程序,一个FDO(功能设备对象)通过向PDO发送IRP,实现和总线驱动程序的通信。5.3驱动程序开发工具的选择对于开发WDM模型的驱动程序,有三个常用的工具可以选择:WindowsDDK、DriverStudio和Windriver。WindowsDDK是最基本的驱动程序开发工具,对于不同的操作系统分为DDK98和DDK2000两种。使用DDK开发驱动程序的效率是最高的,但开发人员要阅读大量的DDK文档,深入了解操作系统的内核工作方式,开发难度比较大,开发的周期也比较长。相比于DDK,DriverStudio简化了驱动程序的编写、调试和测试。它封装一些细节,为Win32应用程序提供了直接访问硬件的功能,开发人员可以专心去作需要的操作,但由于封装的问题,可能会带来一些bug,有可能导致项目的失败。WindRiver是一种非常方便的用于开发驱动程序的工具,开发人员根本不需要熟悉操作系统的内核知识,整个驱动程序中的所有函数都是工作在用户态的,通过与WindRiver的VXD和SYS文件交互来达到驱动硬件的目的。但用这种方法开发的驱动程序效率不高。结合实际要求,从开发效率和驱动程序的执行效率两方面考虑,我们选择了使用用DriverStudio进行驱动程序的开发。DfiverStudio有以下特点:・DriverStudio提供独特的DriverWizard可以自动生成代码,这样可以减少了程序员所写的代码量。●DriverStudio精心制作的类库减少了对简单接口的复杂操作,而且在模仿基本操作系统的面向对象特性时,甚至比微软的DDK所提供的程序性基≮‘C语言的接口做得更好。●IMverStudio提供了许多不同种类的驱动程序的例子,例如基于WI)M和NT模式,以及二者兼容的驱动程序源码。5.4基于PCI的高速数据采集卡驱动程序的实现开发基于PCI的数据采集卡的驱动程序,主要有三个方面的问题:硬件访问、中断处理和DMA传输,在下面的章节中,我们将对其展开论述,并将重点放在DMA驱动程序开发上。基于PCI/CPCI总线的高速数据采集卡的设计与实现5.4.1硬件访闯X86处理器有两种独立的地址空间:I/O地址和内存地址。而对于微型机接口卡,其中的I/o和存储器芯片可以定位于这两种独立的地址空间,在i/o地址空间的范围称为I/0映射,在内存地址空间的范围称为内存映射。DriverWorks为我们提供了两个类来实现对映射芯片的访问:KIoRange类实现对I/0映射芯片的访问,KMemoryRange类实现对内存映射芯片的访问,这两个类除了其中的构造函数不同之外,其他成员函数完全相同。对于PCI设备,其配置空间的基地址寄存器值决定请求的地址空间的类型和大小,驱动程序根据以上情况声明KIoRange和KMemoryRange类实例。在本设计中,桥芯片PCI9054的基地址寄存器0和1分别固定用于其内部操作寄存器的内存映射和I/0映射地址,基地址2用于设备卡的I/0映射,基地址3用于设备卡的内存映射,所以声明两个KIoRange类实例和两个KMemoryRange类实例,如下所示:KMemoryRangem_MemoryRangeO:K1oRangem_IoPortRangeO;KIoRangem_IoPortRangel:KMemoryRangem_MemoryRangel:在PIlP启动例程中,初始化KMemoryRange和KloRange类实例。当创建PCI设备驱动程序时,对于定义的空间类型实例,在PnP例程中将自动包含这些实例初始化的代码。这两个类的对象可用同一个初始化函数,例如,实例m_MemoryRangeO和m_loPortRangeO的初始化代码如下:status;m_MemoryRangeO.Initialize(pResListTranslated,pResListRaw,0);status=m_IoPortRangeO.Initialize(pResListTranslated,pResListRaw,0l其中第一个参数pResListTranslated为翻译资源表指针;第二个参数pResListRaw为原始资源于指针;第三个参数为翻译资源表的序号,指明为表中第五章数据采集卡驱动程序设计的第几个资源,分YO空间和内存空间,都是从0开始排序。对于第三个参数,我们还可以创建一个KpciConfiguration类的实例将各个基地址寄存器映射到顺序的I/O或内存空间。例如:KPciConfigurationPciConfig(m_Lower.TopOfStack0);status=m_MemoryRange0Initialize(pResListTranslated,pResListRaw,PciConfig.BaseAddresslndexToOrdinal(0));其中基地址寄存器的序号(O一5)需要根据不同的类实例加以修改。初始化完成之后,就可以调用访问函数了,例如,可以用成员函数inb、inw、ind从端口(存储器)读一个(多个)字节、字、双字的数据;可以用成员函数outb、outw、outd向端口(存储器)写一个(多个)字节、字、双字的数据。在PllP停止和删除例程中,应当使KIoRange和KMemoryRange类实例无效,如下所示:m_MemoryRangeO.Invalidate0;mloPortRange0.Invalidate();m_IoPortRangelInvalidate0;mMemoryRangel.Invalidate();5.4.2中断处理很多情况下,设备在执行它们的硬件行为时,往往与正常的CPU操作并发并且异步进行,因此,在设备需要CPU提供服务时就会产生中断。中断处理一般需要声明两种类实例:KInterrupt和KdeferredCall。在本设计中,只有一个中断瓣.,在PCI9054实例中声明如下:classPCI9054Device:publicKPnpDevice(protected:KInterruptm__Irq;KDeferredCallm_DpcFor_Irq;);Kinterrupt类实现硬件中断的处理,而KdeferredCall类用于实现延时过程调基于PCI/CPCI总线的高速数据采集卡的设计与实现用。一般而言,中断服掇侧程的处理时间应尽可能短,把大部允的中断处理工作放在延时过程调用例程中。这两个实例m_Irq和m_DpcFor_Irq都是在PnP启动例程中初始化的,代码如下:status=m_Irq.InitializeAndConneet(pgesListTranslated,LinkTo(Isr_Irq),thisXm_DpcFor_Irq.Setup(LinkTo(DpcForIrq),this);对于Kinterrupt类实例,我们可以先对其初始化,再将其与一个中断服务例程连接起来,也可以像本例这样用InitializeAndConneet函数(第一个参数为翻译资源表指针;第二个参数是中断服务例程地址,第三个参数是传递给中断服务例程的环境参数指针)初始化和连接一起完成。而对于KdeferredCall类的实例,初始化并与相应的延时过程调用例程连接可用上述的Setup成员函数实现,这里不再赘述。需要说明的是,m_Irq对应的中断服务例程和m_DpcFor_Irq对应的延时过程调用例程需要事先在PCI9054实例中声明:classPCI9054Device:publicKPnpDevice(public:MEMBER_ISR(PCI9054Device,Isr_Irq);MEMBER_DPC(PCI9054Device,DpcForIrq););在中断服务例程中,首先判断中断是否是自己的设备产生的,若不是,返回FALSE;若是,进行必要的处理,请求一个DPC(延时过程调用),然后返回TRUE。在PnP停止和删除例程中,应当使Kimerrupt类实例断开并无效,如下所示:m_trq.Disconnect();Invalidate();第五章数据采集卡驱动程序设计5.4.3DMA传输使用D^IA的目的是最小化CPU介入数据传输操作,要做到这一点,DMA设备使用了一个辅助处理器,叫做DMA控制器,用来在内存和外围设备之间传输数据。这样就允许CPU在进行I/0操作的同时继续做其他有益的工作。虽然具体的细节不同,但大多数DMA控制器有一个非常相似的体系结构。在这种体系结构的最简单形式中,它包括DMA缓冲区的起始地址的地址寄存器和计算传输的字数和字节数的计数寄存器。在对这些寄存器进行正确的编程并且设备启动之后,DMA控制器开始独立地传输数据。对于每一次传输,它就增大内存地址寄存器,及减小计数寄存器。当计数寄存器达到零时,DMA控制器产生一个中断,而设备准备进行另一次传输。开发DMA的驱动程序是比较复杂的。DriverWorks为我们提供了三个类:KDmaAdapter、KDmaTransfer和KCommonDmaBuffer,用于实现DMA操作。KdmaAdapter类用于建立一个DMA适配器,它标明一个DMA通道的特性和提供串行化访问的服务。KdmaTransfer类用于控制DMA的传输,启动一个DMA传输、DMA传输数据缓冲区物理地址和传输字节数、以及DMA传输结束后数据由公用缓冲区拷贝到应用程序数据缓冲区,这些工作都是由KdmaTransfer类实现的。KcommonDmaBuffer类用于申请系统提供的公用缓冲区,对于DMA操作,系统提供了一个特殊的内存,即物理上连续的内存,称为公用缓冲区。对于支持分散,聚集DMA的设备,因其并不要求在物理上连续的内存,可以不使用公用缓冲区。除了KdmaAdapter类实例是自动生成的外,其他两个类的实例和DMA壮绪回调例程均需声明,在PCI9054实例中声明如下:classPCI9054Device:publicKPnpDevice{public:DEVMEMBERDMAREADY(PCI9054Device,OnDmaReady)VOIDInvalidate(void);VOIDStartDMA(ULONGPAddress,ULONGNBytes);#ifdef』OMMENT_ONLYVOIDOnDmaReady(KDmaTransfer4pXfer,l(IrpI);#endif42基于PCI/CPCI总线的高速数据采集卡的设计与实现protected:KDmaAdapterm_Dma;KDmaTransfer+m_CurrentTransfer;KCommonDmaBufferm_Buffer;):在P11P启动例程中,类KDmaAdapter和KcommonDmaBuffer的实例会被初始化。对于KdmaAdapter的实例,初始化时要定义一个设备描述结构以决定DMA适配对象的一些属性。而类KeommortDmaBuffer的实例的初始化比较简单,只须指明相关的适配器对象和要求的缓冲区字节长度即可。在本例中,实例初始化的代码如下:DEVICE_DESCRIPTIONdd;RtlZeroMemory(&dd,sizeof(dd));ddVersion=DEVICEDESCRIPTIONVERSION;//结构的版本号dd.Master=TRUE;//总线主控器设备dd.SeatterGather=FALSE;//设备不支持分散/聚集模式dd.Demand,Mode=TRUE;//从属设备使用请求模式dd.AutoInitialize=FALSE;//从属设备不使用自动初始化模式dd,Dma32BitAddresses=TRUE;//DMA寻址使用32位dd.IsnoreCount=FALSE;//设备的传输计数得到正确维护dd.DmaChannel=o://使用DMA通道0dd.InterfaceType=PCIBus;//总线类型为PCIdd.DmaWidth=Width32Bits;//PCI默认宽度dd.MaximumLength—MAX_DMA_LENGTH;//单个传输的最大长度m_Dma.Initialize(&dd,m_Lower.TopOfStack0);m_Buffer.Initialize(&mDma,2048);在pIlP停止和删除例程中,应当使用Invalidat“)函数无效相应的类实例。对于KdmaTransfer类的实例,即DMA传输对象,有几种产生方法,可以作为设备类的一个成员数据以全局对象的方式产生传输对象;当然也可以使用堆栈结构,在需要时分配传输对象。在本例中,我们使用了根据需要在堆中动态分配DMA传输对象的方法。本部分相对比较复杂,部分源代码分析如下://Startlo例程,用它来启动一个新的IRP请求。VoIDPCI9054Device::Start]o(Klrpn第五章数据采集卡驱动程序设计if(!I.TestAndSetCancelRoutine(LinkTo(CancelQueuedIrp),NULL,CurrentlrpO)){return:)//开始执行IRP请求switch(IMajorFunctionO){caseI砌’J加J匝AD.SefialRead(I);break;CaSeIRPMIWRITE‘SedalWrite(I);break;defauh:ASSERT(FALSE);PnpNextIrp(I);break;)//SefialRead例程,实现串行化读操作,当从队列中取出IRP请求时,如果是读请求,则调用这个例程,从而保证多个读请求不被同时执行。voidPCI9054Device::SerialRead(KlrpI){t<<。’EnteringSerialRead\n’’:NTSTATUSstatus=STATUS—SUCCESS;//针对这个IRP请求产生适配器对象,用来传输数据。mCurremTransfer2new(NonPagedP001)KDmaTransfer(this,&mDma)if(mCurrentTransfer==NULL){基于PCI/CPCI总线的高速数据采集卡的设计与实现)//初始化传输对象,采用公用缓冲区作为DMA数据区Status=mCurrentTransfer->Initiate(this,&m_Dma,I.Mdl0,(IMajorFuncfion()一IRP—MJ~READ)?FromDeviceToMemoryFromMemoryToDevice,LinkTo(OnDmaReady),&m_Buffer);//如果不能正确完成初始化if(!NT_SUCCESS(status)){})//Read例程,响应来自系统的请求IRP—M,—READ//执行结果是将这个请求加入到队列中,强制进行串行化序列化NTSTATUSPCD054Device::Read(KlrpI、(//检查请求的合法性if(IReadSize0—0、(I.Information0=O:returnI.PnpComplete(this,STATUS—SUCCESS);}肌亥请求入队列retumQueuelrp(I,LinkTo(CancelQueuedlrp));}’//DpcFor__Irq延时调用例程,调用Continue函数VOIDPCI9054Device::(PVOIDArgl,PVOIDAr92){m_CurrentTransfer->Continue(UseTransferSize);)第五章数据采集卡驱动程序设计45//OnDmaReady回调例程VOIDPCI9054Device::OnDmaReady(KDmaTransfer‘pXfer,Klrpn(,/检查传输对象中是否还有需要传输的字节数目if(pXfer->BytesRemaining()一o){Ⅳ如果没有,则调用中止例程,成功完成皿中。pXfer->Terminate0;I.Informafion0=I.ReadSize(CURRENT);I.Status()=STATUSSUCCESS;PnpNextlrp(I);m_CurrentTransfer2NULL;deletepXfer;return://进行实际数据传输,首先要得到传递数据的物理内存地址描述PTRANSFER—DESCRIPTORptd;while(pXfer->SequenceTransferDescriptors(&ptd)){t<<‘’Physicaladdress0x’’<<ptd一>td_PhysAddr.LowPart“It,Lengthis0x”“ptd一>td_Length<<””<<EOL;){憾动DMAif((ULONG)pXfer->BytesRemaining()==[.ReadSize0)StartDMA(ptd一>td_ehysAddr.LowPart,ptd・>tdLength);//Starld)MA例程VOIDPCI9054Device::StartDMA(ULONGPAddress,ULONGNBytes){/,设置DMA通道0寄存器,启动块传输方式,从FIFO读数据,,传输完成引起通道0中断,并将引起PCI中断m.IoPortRange0outd(DMAMODE0,0x20C00);基于PCFCPCI总线的高速数据采集昔的设计与实现//DMA传输的PCI地址m_IoPortRangeO.outd(DMAPADR0,PAddress)//DMA传输的局部地址m_loPortRange0.outdoMALADR0,Ox8);//DMA传输的字节数m_IoPortRange0.outd(DMASIZ0,NElytes);,/传输方向:从局部到PCIm_IoPonRange0.outd(DMADPR0,OxS);//使能通道0,开始DMA传输m_IoPortRange0.outb(DMACSRO,Ox3);结束语和展望47结束语和展望本次毕业设计共历时一年零一个月。在这期间,作者深入分析了PCI总线协议,深刻理解了高频数字电路设计方法和高速数据采集原理,研制开发了基于PCI/CPCI的高速数据采集卡。经综合测试和现场应用验证表明,采集卡已达到了要求的性能指标,可以很好地完成高速数据采集的任务。作者在电路设计、可编程逻辑设计和Window驱动程序设计等方面都倾注了大量的心血,具体工作如下:1.提出了一种基于PCI的高速数据采集卡的设计方案,并完成了采集卡局部控制逻辑设计和基于Windows2000驱动程序设计。2.提出了一种基于CPCI的高速数据采集卡的设计方案,并完成了电路板原理图、印制电路板和内部控制逻辑设计。3.完成了所有调试工作,并撰写了相关的技术资料和文档。总体来说,本次毕业设计是成功的,但由于时间比较仓促、作者能力比较有限,还存在着很多可以加以改进的地方:1.在硬件方面,使用PCI9054尽管比较方便,但同时存在着价格比较高、电路板面积比较大等缺点,可以将PCI接口芯片的动能和局部控制逻辑集成到一块FPGA或CPLD中实现,这样既可以提高电路板的集成度,又可以降低成本。2.在驱动程序设计方面,使用DriverStudio尽管降低了开发难度,但同时也降低了效率,可以直接用微软提供的DDK开发驱动程序以提高敬率,当然这样会提高难度。3.在其他方面,必然还存在着作者尚未发现的不足,在今后的工作中我惫进一步去发现并予以完善。基于PCI/CPCI总线的高速数据采集卡的设计与实现致谢值此论文完成之际,我要向多年以来一直关心我、爱护我、帮助我的老师和同学们致以最诚挚的谢意。首先,非常感谢我的导师厨利华教授。周老师在课题分析设计和论文撰写过程中都给予了我悉心的指导和热情的帮助。周老师渊博的知识、开阔的思路、严谨的治学态度和忘我的工作精神对我的成长产生了非常深远的影响,在此我向敬爱的周老师表示最衷心的感谢l特别感谢付少锋老师。付老师在工作上给予了我无私的帮助,在生活上给予了我无限的关怀,这些对于我的论文的顺利完成都起到了至关重要的作用。十分感谢蒋洪老师和葛兰老师。在我研究生阶段,他们不仅在工作上给了我诸多指导和帮助,而且还在生活上给予了我无微不至的关怀和照顾。衷心感谢车向泉老师和李龙海老师。他们给我的关心、帮助和合作让我难以表达感激之情。真心感谢与我朝夕相处的同学们:司刚、侯雷、黄胜、陈勉、鱼亮,与他们讨论与交流让我受益匪浅。最后,再次向所有关心过、帮助过我的人致以最诚挚的谢意1参考文献参考文献[11TOMShanley,DonAnderson.PCI系统结构.第4舨,北京电子工业出版社,2000。[2】李贵山,戚德虎.PCI局部总线开发者指南.第1版,陕西:西安电子科技大学出版社,1997。[3】宋万杰,罗丰,吴顺君.CPLD技术与应用.第一版.陕西:西安电子科技大学出版社,2000。【4]赵雅兴编著.FPGA原理、设计与应用.第一舨.天津:天津大学出版社,1999.16—65。【5】刘明业,蒋敬旗,刁岚松等译.硬件描述语言Verilog.第四版.北京:清华大学出版社,2001。【6]张亮编著.数字电路设计与VerilogHDL.第一版.北京:人民邮电出版社,2000。[7】夏宇闻.复杂数字电路与系统的VerilogHDL设计技术.第一版.北京航空航天大学出版社,1998。【8】老虎工作室编.电路设计与制版:Protel99高级应用.第一版.北京:人民邮电出版社,2000。[9】李伯成,侯伯亨,裘雪红.微型机应用系统设计.第二版.陕西:西安电子科技大学出版社,2000.第六章。【lO]王建华,张焕生,侯丽绅等译.Windows核心编程.第四版.北京:机械工业出版社,2000。【11]周明德编著.保护模式下的80386及其编程.第一版.北京:清华大学出版社,1993。【12】武安河,邰铭,于洪涛.WDM设备驱动程序开发.第一版.北京:电子工业出版社,2003。【13】张惠娟,周利华,翟鸿鸣.Windows环境下的设备驱动程序设计.第一版.陕西:西安电子科技大学出版社,2002。[14]ArtBaker,JerryLozano.Windows2000设备驱动程序设计指南.第一版.北京:机械工业出版社,2001。[15】张洪刚著.大幅面CIS扫描输入技术中高速数据传输通道的设计与实现.陕西:西安电子科技大学硕士论文,2003。【16]PCISpedMInterestGroup(SIG).PCILocalBusSpecification.Revision22.】998基于PCI/CPCI总线的高速数据采集卡的设计与实现【17】PLXTechnology,Inc.PCI9054DataBook.Version1.0.1998.118】PLXTechnology,Inc.PCI9054RDK.LITEHardwareReferenceManual.Version1.0.1999.[19】VANTIS.High-SpeedBoardDeignTechniques.RevisionC.1997.[20】PeterChambers.TenCommandsforExcellentDesign.VLSITechnology,Inc.1997.[211IDT.33VHigh-DensitySuperSync36-BitFIFO.20014.[22]ALTERA.MA)(7000ProgrammableLogicDeviceFamily.Version6.3.200110.6.29【23]KevinSkahill.VHDLTechniques,ExperimentsandCaveats.1996[24]AndrewRushtonVHDLforLogicSynthesis.1998[25】MicrosoRWindows2000DriverDevelopmentKitDocument.Microsoft.2000.6读研期间的研究成果读研期间的研究成果王伟楠、付少锋、车向泉,基于PCI的高速数据采集卡的设计与实现,已被中国核心期刊《计算机仿真》录用。52基于PCI/CPCI总线的高速数据采集卡的设计与实现附录A基于Pel的数据采集卡电路原理图附录A基于PCI的数据采集卡电路原理图54基于PCFCPCI总线的高速数据采集卡的设计与实现附录B基于CPCI的数据采集卡电路原理图
因篇幅问题不能全部显示,请点此查看更多更全内容