基于pci总线的高速数据采集卡设计

基于pci总线的高速数据采集卡设计

ID:32985821

大小:2.63 MB

页数:77页

时间:2019-02-18

上传者:U-22107
基于pci总线的高速数据采集卡设计_第1页
基于pci总线的高速数据采集卡设计_第2页
基于pci总线的高速数据采集卡设计_第3页
基于pci总线的高速数据采集卡设计_第4页
基于pci总线的高速数据采集卡设计_第5页
资源描述:

《基于pci总线的高速数据采集卡设计》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

武汉理工大学硕士学位论文基于PCI总线的高速数据采集卡设计姓名:程松林申请学位级别:硕士专业:通信与信息系统指导教师:周祖德20060501 武汉理工大学硕士学位论文摘要随着大规模集成电路和计算机技术的飞速发展,数字技术渗透到各个技术领域。但是自然界中大多数物理信号却是模拟信号,因此,将模拟信号转化成数字信号是进行信号处理和分析的首要前提。数据采集系统即是完成将模拟信号转换成计算机能识别的数字信号的任务。传统的数据采集系统是基于ISA总线设计的,由于ISA总线带宽的限制,无法满足高速数据传输的要求。而PCI局部总线的引入,打破了数据传输的瓶颈,它以其优异的性能成为微机总线的主流。基于PCI总线的数据采集系统是高速数据采集的发展方向。传统数据采集卡一般使用SRmd或SDRAM作为数据缓存,SRAM容量小,价格昂贵,SDRAM价格便宜,但数据传输带宽有限,本文采用DDRSⅨ淑M作为缓存,存取速率离,存储容量大,且价格便宜。本文从硬件设计和驱动程序开发两个方面对基于PCI总线的高速数据采集卡进行了研究。论文中酋先讨论了DDRSDRAM的特性,DDR控制器的基本结构和时序,以及PCI总线的基本结构和时序,并介绍了FPGA的基本原理和开发过程。然后对基于PCI总线的商速数据采集卡的各模块进行了详细的设计,包括AD转换接口设计,DDR控制器设计和PC|总线控制器模块设计。文巾采用FPGA实现了DDR控制器功能和PCI总线控制器功能。外加DDR存储器作为高速缓存是提高数据采集卡采样速率的一个重要措施,AD转换芯片的数据通过DDR控制器存入DDRSDRAM,DDRSDRAM中的数据再通过PCI总线传给上位机处理,完成了对信号的采样、数据的存储和传输功能。论文给出了用FPGA进行时序逻辑设计的基本原理图和Verilog程序。最后还介绍了对PCI总线数据采集卡驱动程序WDM的开发及编程方法。通过仿真和测试,该数据采集卡采样率可达到250MSPS,存储容量可达1GByte。关键字:数据采集,PCI总线,DDR控制器,FPGA 武汉理工大学硕士学位论文Abstr∞tWiththerapiddevelopmentofLSI(LargeScaleIntegration)andcomputerscience,digitaltechnologyhaspenetratedintoeveryfieldofknowledge.Asmostph)7sicalsignalsinthenatureareanalogsignals,theconversionfromanalOgsignalstodi西alsignalshasbecomethekeystepintheprocessofsignalprocessingandanalysiscontr01.Dataacquisitionsystemconvertsanalogsignalstodigitalsignals,whichcallberecognizedbycomputer.TraditionaldataacquisitionsystemisdesignedbasedonISAbus.butwiththelimitsofitsbandwidth,itisdifficulttoperformhigh.speeddatatransmission.PCIlocalbus,withitsoutstandingcapabilityandexcellentadaptation,hasresolvedthisproblemandbecomethemainbus证thecomputer.PCIbus.baseddataacquisitionsystemhasplayedadollIinantroleinhigh-speeddataacquisition.Meanwhile.traditionaldataacquisitionboardusesSRAMorSDRAMasdambuffer.AsSRAMhaslOWcapacityand圭li啦lcost,whileSD洲haslOWcostandlimitedtransmissionbandwidth.DDRSDRAMiSadoptedasdatabu船rinthispaper,whichhasmeritofhigllspeed,hishcapacityandlowCOSt.PCIbus-basedhigh·speeddataacquisitionboard,includinghardwarcdesignanddriverprogram.isresearchedinthispaper,FeaturesofDDRSDRAM,basicconfigurationandtimingofDDRcontroller,togetherwithbasicconfigurationandtimingofPCIbus,arediscussedfirst,whilebasictheoryanddevelopmentprocessofFPGAareintroduced.TheneachmoduleonPCIbus-basedhi曲-speeddataacquisitionboardiSdetaileddesigned.FPGAiSadoptedtorealizefunctionsofDDRcontrollerandPCIbuscontrollerinthispaper.TheaccessionofDDRcontrolleraSdatabufferiSaneffectivemo.冶.surctoenhancethesamplingfrequencyofdataacquisition.DataafterA/DconversionwillbestoredinDDRSDRAMthroughDDRcontroller,andthenthestoreddatawillbetransmittedbyPCIbustouppercomputerforprocessing.Thewholeboardrealizesfunctionsofsignalsampling,datastorageanddatatransmission.1kschematicsand、铡logsourceprogramoftiminglogicaldesignusingFPGAareprescntcdinthepaper.Attheendofthepaper,developmentofdriverprogramWDMforPCIbus—baseddataacquisition:boardiSmentioned.mughsimulationtest.thesamplingfrequencyoftheboardCanreach250MSPS,whilestoragecapacityCanachieve1GByte.K目ywords:DataAcquisition,PCIBus,DDRController,FPGAlI 独创性声明y861405本人声明,所呈交的论文是本人在导师指导下进行的研究工作及取得的研究成果。尽我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得武汉理工大学或其它教育机构的学位或证书而使用过昀材料。与我一同工作的同志对本研究所傲豹任何贡献均已在论文中作了明确的说明并表示了谢意。签名:崔鳌毖趁日期:滏堕:里:塑关于论文使用授权的说明本人完全了解武汉理工大学有关保留、使用学位论文的规定,即学校有权保留、送交论文的复印件,允许论文被壹阅和借阕;学校可以公布论文的全部或部分内容,可以采用影印、缩印或其饱复制手段保存论文。f保密的论文在解密后应遵守此规定)签名:毽妊拄(注:此页内容装订在论文扉页) 武汉理工大学硕士学位论文第1章绪论1.1研究的目的与意义数据采集是指将温度、压力、流量、位移等模拟量采集、转换成数字餐后,再由计算机进行存储、处理、显示或打印的过程。相应的系统称为数据采集系统。随着计算机技术的飞速发展和普及,数据采集系统也迅速地得到应用,在生产过程中,应用这一系统可对生产现场的工艺参数进行采集、监视和记录,为提高产品质量,降低成本提供信息和手段。在科学研究中,应用数据采集系统可获得大量的动态信息,是研究瞬间物理过程的有力工具,也是获取科学奥秘的重要手段之一。随着技术的发展,各种各样基于数字化的产品不断推陈出新,给我们的生活带来了极大的好处,数字化之所以能如此得到广泛拓展开来,其主要在于以下两个优点:其一是数字处理灵活、方便。在软件无线电领域,正在构建一个较通用的平台,通过软件来实现现在许多“僵化”硬件平台的功能,这正是基于数字化带来的灵活性;其二是数字系统稳定可靠。在早期,较之模拟系统,数字系统的最大优点就在于有良好的稳定性【1】【21。数据采集的任务,具体地说,就是采集传感器输出的模拟信号并转换成计算机能识别的数字信号,然后送入计算机或相应的信号处理系统,根据不同需要进行相应的计算和处理,得出所需的数据;与此同时,将计算机得到的数据进行显示或打印,以便实现对某些物理量的监视,其中一部分数据还将被控制生产过程中的计算机控制系统用来控制某些物理量。数据采集几乎无孔不入,它已渗透到了地质、医药器械、雷达、通讯、遥感遥测等各个领域,为更好的获取信息提供了良好的基础。另外,评估一个信号源的质量,也可以通过数据采集的手段将信号采集存入计算机,再通过各种处理方式来评价信号源的好坏。这时,该数据采集系统就类似一台测试仪器。当然,我们得认可系统的各项指标满足要求【3l[舢。 武汉理』:=犬学硕士学位论文1.2数据采集的匿内外研究现状随着微电子技术的飞速发展,高速数据采集技术也得到了长足的发展。数字存储示波器是典型的数据采集系统。随着其采样率的不断提高,它已成为高速或超高速数据采集系统。制造高速或超高速采样率的数字存储示波器的公司主要有Agilent,Teklxonix,Nicolet和Lecroy等,数字存储示波器的最高采样率也已达到lOGSPS。另外,逻辑分析仪、频谱分析仪、网络分析仪等也属于超高速数据采集系统范畴{5】161。基予标准总线并带有高速DSP的高速数据采集板卡产品非常多,技术先进、市场主流的厂商主要有SpectrumSignalProcessing,SPEC,Signatec,Acquisitionlogic,Bluewave等公司。下面扼要介绍目前世界上最先进的数据采集系统产品及其技术性能指标。SpectrumSignalProcessing公司推出的采样率200MSPS8bADVME板卡是基于VME总线和高速DSP的超高速数据采集和处理系统。该板卡集成有一片1.2亿次/秒浮点数运算速度ADSP2106xSHARC处理器。其主要技术指标还包括:128KB×48b或512KBx48b零等待SRAM;6个SHARCLink口:输入电压范围士O.5V;输入时钟可选为200MHz,100MHz或50MHz;多种触发模式;两个96脚VME总线连接器[§PPl和用以及6个SHARClink口连接器。该板卡配有初始化与数据采集软件,并支持APEx并行软件开发工具。SPEC公司的SPl225是带有1GSPS8b精度数字化仪的超高速数据采集模块(HSDAM)PCI卡。最高可进行500MHz或1GHz波形分析。SPl225I作在连续采样模式,可进行预触发数据存储。在波形数字化并存储在256KB存储嚣后,数据可通过PCI总线传输给PC机。采集系统的核·15,是SPEC'sHSDAMPCB模块,HSDAMPCB模块包含一个定制的GaAsASIC数据采集控制器、一个AD转换器及256KB存储器。该板卡触发方式、门限及采集模式均可通过PCI总线由用户编程设置。其它特性包括可编程数字门限比较器、可编程采样率卜1,2,4,⋯2561和可编程预触发延迟等。其应用领域包括静态分析、频谱分析、激光多普勒速度测量、光时间域反射测量等。Signatec公司是有着十多年历史的,面向商性能数据采集、信号处理、波形产生和数据存储等应用的PC机板卡设计制造商。Signatcc推出的AD板卡PDA12A采样率为125MSPS,分辨率为12b,信号带宽由DC~50MHz。可通过SAB总 武汉理工大学硕士学位论文线(SignatecAuxiliaryBus)以250MBps的速率向其它处理、回放或存储器件传输数据。还能通过PCI总线DMA模式以100MBps速率传输数据。PDA12A实际上是由双通道信号同时采样,每通道采样率62.5MSPS,两通道正交采样可获取125MSPS采样率。单通道的数据存储空间为256KBxl2b或1MBXl2b两种可选。Signatec公司的基于PCI总线8bAD板卡PDA500采样率高达500MSPS,带宽为DC~500MHz。可通过SAB2总线(SignatecAuxiliaryBus2)以500MBps的速率向其它处理、回放或存储器件传输数据。还能通过PCI总线DMA模式以100MBps速率传输数据。存储容量1MB或4MB两种可选,用主从配置模式最多4块PDA500可互联用于多通道高速同步采集。根据内存配置与SAB结构豹不同,其报价从$6100到$75001,¨i“。2001年Acquisitionlogic公司推出基于PCI总线的采样率分别为500MSPS,1GSPS8b数据采集板卡AL500和AL5lG,其存储深度为64MB,256MB和1000MB三种可选。PCI总线为主模式,数据宽度为32b,时钟频率为33MHz,突发模式下传输速率高达133MBps。两种板卡还具有DSP功能:通过对板卡上现场可编程门阵列FPGA硬件实现信号处理:能实时地完成输入数据为200MHz带宽2次型插值或400MHz带宽4次型插值运算等。2003年2月Ultraview公司制造出基于PCI总线的采样率为1.25GSPS8b数据采集卡,型号为AD21250DMA,其存储深度为8GB。在66MHz和64b数据宽度下,PCI总线DMA模式向主机传输数据速率可达320MBps。此卡可用于基于PCI总线的运行操作系统为Solaris8Unix的Sparc所有平台。其报价为$12955。通过上面的介绍可看出:除了属于通用仪器的超高速数据采集系统以外,对于其它超高速数据采集系统而言,基于标准总线、具有海量数据存储深度、高速DsP能力和超高速AD所组成的超高速数据采集系统为当今发展趋势。在设计和选用系统时,就要有这四方面的考虑,即不但要考虑超高速数据采集部分,还要考虑其标准总线接口、数据存储深度和DSP处理器的性能,因为系统的艇体性能已不单是超高速数据采集部分的性能,标准总线接口、数据存储深度和DSP也已成为评价系统整体性能的重要指标。对于不同应用领域或不困的应用环境和要求,系统的这四个组成部分会有所区别。在工业控制、自动测试和信号处理领域应用广泛的标准总线有CompactPCI,PXI,PCI,PMC,VME和vxI等,每一种总线都有自己的特点,所以总线的选择对于系统来说是很重要的。目前国内市场上的高速数据采集卡的采样频率⋯般在100MSPS以内,这主 武汉理工大学硕士学位论文要是受到AD芯片和存储器带宽的影响。高速AD芯片全靠从国外进口,一是价格非常昂贵,二是区域性的技术保密,解决这种局面的途径需要从芯片设计上着手。随着DDR存储器芯片在PC上的广泛应用,高端嵌入式系统设计领域也开始使用DDR存储器,本论文在FPGA上实现了DDR控制器接口,使用DDR存储器芯片作为缓存,提高了存储速率,加大了存储容量,解决了存储带宽的影响[911101。1.3本论文的主要工作本文从硬件设计和驱动程序开发两个方面对基于PCI总线的高速数据采集卡进行了研究。论文中首先讨论了DDRSDRAM的特性,DDR控制器的基本结构和时序,以及PCI总线的基本结构和时序,并介绍了FPGA的基本原理和开发过程。然后对基于PCI总线的高速数据采集卡的备模块进行了详细的设计,包括AD转换接口设计,DDR控制器设计和PCI总线控制器模块设计。文中采用FPGA实现了DDR控制器功能和PCI总线控制器功能。外加DDR存储器作为高速缓存是提高数据采集卡采样速率的一个重要措施,AD转换芯片的数据通过DDR控制器存入DDRSDRAM,DDRSDRAM中的数据再通过PCI总线传给上位机处理,完成了对信号的采样、数据的存储和传输功能。论文给出了用FPGA进行时序逻辑设计的基本原理图和Verilog程序。最后还介绍了对PCI总线数据采集卡驱动程序wDM的开发及编程方法。本文共分为五章:第一章绪论,概述了研究数据采集系统的目的和意义,以及国内外数据采集系统的研究现状;第二章介绍了DDR控制器以及PCI总线协议的相关理论,同时介绍了FPGA的开发流程和Verilog语言相关知识:第三章首先对高速数据采集卡进行了总体设计,然后对各个模块的设计做了详细分析:第四章论述了数据采集卡的驱动开发和应用软件设计:第五章对所设计的数据采集卡进行了测试和性能分析,得出了结论;第六章归纳了本文的主要工作,并展望了今后的研究工作。 武汉理工大学硕士学位论文第2章D豫洲及PCI协议研究DDRSDRAM是一种带同步接口的高速动态随机存储器,这种同步接口和其内部的Pipeline结构,使它具有非常高的数据传输率。DDRSDRAM采用了多块(Bank)存储器结构和突发模式,Bank的数量以及荦亍列地址韵位数主要取决于存储器的容量,每一个bank通过行列来寻址。列地址空间对应一页的存储器空间(OrJDDRSDRAM中的1页即为DDRSDRAM一行的数据容量)。DDRSDRAM与SDSDRAM最大的不同在于前者内部有DLL模块和DQS模块,因而能提供很好的DQS信号用于数据采样,使得DDR可以在时钟的上下边沿都进行数据采样,而后者只在时钟的上边沿采样数据【1I】。DDRSDRAM器件的管脚分为以下几类【121:(1)控制信号管脚:包括片选(CS),时钟(CLK).时钟使能(CKE),行、列地址选择(RAS、CAS),读写选择(WE),数据选通(DQS),数据屏蔽(DM)。(2)地址信号管脚:SA,是分时复用管脚。根据行、列地址选择管脚,控制输入的地址为行地址或列地址,而在初始化时用于传送模式字数据给DDRSDRAM内的模式寄存器。(3)数据管脚:DQ,是双向管脚。2.1.2叻R爨利落的¨DDRSDRAM的命令由一些专用控制引脚和地址线辅助完成。cs/RAs/CAs/wR在时钟上升沿的状态决定具体操作动作,地址线和BANK选择控制线在部分命令中作为辅助参数输入。特鄹需要注意的是DDR_SDRAM的DQS信号十分特殊,DQS在DDRSDRAM的写操作时是由外部提供给DDRSDRAM,而在读DDRSDRAM时,DQS由DDRSDRAM提供给外部用户。由 武汉理工大学硕士学位论文于特殊的存储结构,DDRSDP渔M命令比较多,其命令的真值袭如表2-1所示。表2-1DDRSDR,蛆vt的命令真值表一_一AIO/AP㈡A,0:热NoteCoMM_∞CKl弧☆雨器;醛WEB^吼1RegisterExtendedMRSLOPCOOERegisterModeRegts‘erSetLOPCODE{2A时ORefreshHLHEntTyHExflL3BankA酬ve&RowAddfHXLHRowAddressRead&IAutoPlBchargeDisableHXLVocd们pc。I”mnA州俯昌s1AutoPrechargeEnableH】⋯Write&IAutoPrechargeDisableVLc曲聃flo““m“A60佬辅IAutoPmchjrgeEnable4,68urstStopHXLHBankSeledbnV⋯⋯’ge㈨BanksXLHXEntry}{AcmvePowerDownExitLHXEntryLHPrechargePowerOowrlModeExitLDM(UDM/LDMforx16only)8HXgNooperation(NOP)NotdefinedLH§◆空操作(NOP):表示空操作,可以用来在空闲或等待状态防止其它的命令被执行。◆模式字设置(EMRS、MRS):在时钟的上升延,当DDRSDRJuV[检测到信号CS=0,RAS=0,GAS=0,WE=0,则进行模式字设置操作(EMRS、MRS)。该操作通过行列地址(A0.A11)和BANK地址(BA0、BAI)的值来配置器件模式寄存器,如果没有掉电或被重新配噩,寄存器中的值会一直保持不变。模式寄存器的设置值必须与器件的延迟参数以及与读写操作的控制时序等要求一致,否则将导致错误或不可靠的读写。本系统使用的是SAMSUNG公司的DDRSDRAM,该器件有两个模式寄存器:模式寄存器(MRS)和扩展模式寄存器(EMRS)。通过BA0来判断是对哪个模式寄存器设置。MRS模式寄存器用来确定DDRsDRAM的其体】:作模式。内容包括:定义突发读写的数据长度,突发的类型(即选择是顺序突发还是问隔突发),CAS的大小(即读命令发出和第一个有效数据读出之间的时间间隔大6 武汉理。J:人学硕士学位论文小),运行模式(即正常模式或者厂商测试模式选择)和DLLReset。而EMRS主要用来控制一些MRS未定义的功能设景。包括:DLL的使能开启选择等。◆BANK激活(ACTIVE)在对DDRSDRAM进行读、写操作之前,必须先用ACTIVE命令来使需要操作的行处于“打开”的状态。在时钟的上升延,当DDRSDRAM检测到信号CS=0,RAS=0,CAS=I,WE=I,则进行ACTIVE操作。ACTIVE命令用来激活特定BANK,并打开该BANK中的某一行,为接下来的操作做准备。在进行ACTIVE命令的同时,BA0和BAl的值用来选择需要激活的BANK,地址线A0.A11的值用来选择相应的行。BANK激活命令到后续读写的延迟必须一;小于DDRSDRAM的RAS到CAS延迟时间指标(tRCD)。所以在控制DDRSDRAM时,激活BANK后,必须等至少tRCD的时间后才能进行有效的读、写操作。此外,当一个BANK中有一某行被打开后,如果要想读或写同一个BANK中的其它行,就必须先关掉该BANK,然后再重新激活该BANK并打开新的一行。对BANK进行PRECHARGE操作即可关掉该BANK,两次激活的间隔应不小于RAS周期时间指标(tRC)。被打开的行保持打开/激活状态直到下一次所在BANK执行Precharge命令。BANK激活有效时间为tRAS(max)。◆读操作(READ)在一‘个BANK被激活后,经过tRCDR时间就可以执行读操作了。在时钟的上升延,当DDRSDlUM检测到信号CS=0,RAS=I,CAS=0,WE=I,贝|:|进行读操作。在READ命令发出的同时,BA0和BAl的值用来选择要操作的bank,地址线A0,A7(不同器件的列地址宽度不同)的值用来选择开始的列地址。AP的值决定是否需要自动PRECHARGE这个功能(注意,通常不同的器件的AP不同,本系统所用DDRSDRAM器件的A_P为A8)。如果AP=I,那么在读完后,DDRSDRAM芯片会自动执行内部PRECHARGE的命令,在这个内部PRECHARGE命令没有执行完之前,对该bank的任何操作(READ,WRITE,PRECHARGE,ACTIVE)都是无效的:如果不选用自动PRECHARGE即AP=0,那么被访问的行在读完后仍保持“打开”的状态可供下次读写(注意,该行打开的有效时间为tRAS(max),不同器件tRAS不同)。在发出READ命令后,要等待CAS延时后有效数据才会出现在数据线上,CAS延时一般为两个或三个时钟周期,不同器件的CAS时间是不同的。要注意的是,在DDRSDRAM的READ操作时,DQS信号是由DDRSDRAM器件自己产生的。读操作时,DQ与DQS 武汉理工人学硕士学位论文的关系如图2-t所示:CLK个个个个小个介f删。1_《P—广—广]r_1—呵》T。QS十—十—1,r\√、一卜—t-—1_。Q}{_卅斗{{图2一l读操作的DQ与DQS关系图◆写操作(WRITE)与READ命令相似,在一个BANK被激活后tRCDW经过时间,就可以执行写操作了。在时钟的上升延,当DDRSDRAM检测到信号CS=0,RAS=l,CAS=0,WE=0,则进行写操作。在WRITE命令发出的同时,BA0和BAl的值用来选择要操作的bank,地址线A0.A8(16位数据的情况)的值用来选择开始的列地址。AP的值决定是否需要自动PRECHARGE这个功能,如果选用,那么在写完后芯片会自动执行内部PRECHARGE的命令,在这个内部PREcHARGE命令没有执行完之前,对该bank的任俺操作(READ,WRITE,PRECHARGE,ACTIVE)都是无效的;如果不选用自动PRECHARGE,那么被访问的行在写完后仍保持“打开”的状态可供下次读写(注意,该行打开的有效时问为tRAS(max))。在对DDRSDRAM写操作时,在输入数据的同时,须由外部提供DQS信号给DDRSDRAM器件的。写操作时DQ与DQS的关系如图2.2所示:c.-K个个个个小介一个小个彳州。1-哪P—r]广1—1—下—下中断图2—3PCI总线接口引脚图PCI总线的必选信号共5组,它们分别如下:(1)系统信号:PCI系统信号包括CLK和RST#。CLK为PCI总线上的所有操作提供时钟,丽RST#为复位信号。(2)地址与数据信号:PCI总线是数据线和地址线复用,总线命令线和字节使能线复用。在地址期和数据传输期.ADj二分别存放地址和有效数据,C/BE上分别存放总线命令和字节使能信号。(3)接口控制线:PCI总线的整个传输过程由FRAME#、IRDY#_乖EITRDY#三个信号控制。FRAME#信号表示一次访问的开始和持续。IRDY#和TRDY#分别表示主/从设备能够完成当前数据传输的能力。另外,IDSEL#为配置操作片选信号,DEVSEL#为设备选择信号,STOP#表示当前的目标节点要求主节点停止现行的数据传输。(4)仲裁信号:REQ#向仲裁器请求使用总线,而GNT#表示访问请求己被批准。只有主设备才有仲裁信号。(5)错误报告信号:PCI提供了错误报告信号和超时处理等可靠措施,使数据传输的可靠性大大增加。其中PERR#报告非特殊周期中的数据奇偶错,丽SERR#用来报告地址奇偶错和特殊周期中的数据奇偶错以及其它造成严重后果的系统错误。除了以上必备的信号,若系统要实现中断功能,则应有INTA#~INTD#信号。觚川”丌睢,仃、【r-、 武汉理J二大学硕士学位论文对于单功能设备,只需要使用INTA#即可,其余3条信号均无意义。若为多功能设备则根据需要逐次实现INTA#~INTD#po】f2l】。2.2.2陀I总线的龠令总线命令的作用是用来规定主、从设备之间的传输类型,它出现在地址周期的C/BE[3:O】拌线上。这里的主设备是指通过仲裁而获得总线控制权的设备:从设备是指在C/BE[3:O】拌上出现命令的同时,被AD[3l:O】线上的地址选中的设备。表2.2给出了PCI总线命令的编码及类型说明。其中,命令编码的“1”表示高电平,“O”表示低电平。表2.2PCI总线命令的编码及类型说明Cd'BE[3:0】命令类型说明0000中断应替(中断识别)0001特殊周期0010I/O读0011IlO写0100保餐0101保留0n0存储黼雯0111存储罄骂1000保留1001保黧1010配鬟渡10n配置写1100存储器多行谈n01双擞E髑期1110存德鉴一行谈1H1存德器写无效◆中断应答命令,中断应答命令是一个读命令,并且对中断控制器的寻址 武汉理工大学硕十学位论文采用隐含方式。◆特殊周期命令,特殊闵期命令不包含目标地址,而是以广播的形式发给所有设备。◆I/O读命令,该命令用来从一个映射到I/O地址空间的设备中读取数据。◆保留命令,该类编码是为将来的用途而保留的。PCI的任何设备都不能将它们挪作它用。◆I/O写命令,该命令用来向一个映射到I/O地址空间的设备写入数掘。◆存储器读命令,该命令用来从一个映射到存储器地址空间的设备读取数据。如果能保证无副作用产生时,从设备可以为该命令进行预先读取。◆存储器写命令,该命令用来向一个映射到存储器空间的设备写入数据。◆配置读命令,该命令用来从每个设备的配置空间读取数据。如果u一个设备的IDSEL引脚有效,且AD[1:01=00时,那么该设备即被选定为配置读命令的目标。◆配置写命令,该命令用来向每个设备的配置空间写入数据。·个设备被选中的条件是,它的IDSEL信号有效并且AD[I:0]=00。2.2.3POl总线垒闫分配为了实现自动配置,每个PCI设备必须提供256字节的配置空间结构。该空闯是具有特定记录结构或模型的地址空间,它又分为头标区和设备有关区两部分,具体分配如表2.3所示。表2.3PCI总线空问分配14 武汉理工大学硕士学位论文设备识别供应商代码00H状态寄存嚣命令寄存器04H分类代码修改版本08FI内置自检头类型最小时延Cache大小0CH10H14H基址寄存蓄18H1CH20H24H保留28H子系统设备标识子系统厂襄识别2CH扩展ROM基址寄存卷30H保留34H保留38H最长等待时间最短获准诗中间中断弓l脚中断线3CH一个设备的配置空间不仅在系统自举时可以访问,在其它时间内也是可以访问的。配置空间头标区占“字节,每个设备都必须支持该区的寄存器分配,该区中的各个字段用来唯⋯地识别设备,并使设备能以一般方法控制。设备寄存器空间占64~255字节,因设备而异。软件可以通过检查PCI总线,确定总线上的设备,所以配嚣软件必须读取每个PCI槽位上的设备供应商识别码。如果读取的位置上不存在一个设备,则从宿主总线连到PCI桥必须准确无误地报告出来。由于OFFFH是一个非法的供应商识别码,所以宿主总线连到PCI桥可以返回一个全“l”,作为一个设备的配置空阆寄存器的读出值,以表示设备彳i存在。所有符合PCI要求的从设备都必须支持设备识别和供应商识别,命令和状态字段、其它寄存器的实现是可选的,也就是可以将它们作为保留的寄存器来处理,具体视设备的功能而定。头域中的“供应商代码”由PCIslG发布,以保证它的唯一性。“设备识别”、“修改版本”、“分类代码”三个寄存器用于PCI总线设备识别及其功能识别。头域中的“命令寄存器”用于对PCI总线设备的PCI操作进行粗略控制。头域中的“中断引脚”寄存器表明设备的中断送到桥接器的那一个中断引脚。头域中的“中断线”寄存器表明该设备在主机中所占有的中断号(IRQ0~IRQl5),由系统分配并写入。头域中的“基址寄存器”配置空间头标区包括本地配置寄存器、本地空间寄 武汉理工大学硕二E学位论文存器、扩展ROM寄存器。它们的作用都是建立PCI地址空间与本地地址空问的映射关系吲。2.2.4阳l盼编址PCI定义了三个物理空间:存储器地址空间,I/0地址空间和配置地址空削。这些编址是分布式的,每个设备都有自己的地址译码。PCI总线支持正向编码和反向编码两种类型。(1)I/O地址空间在i/O地址空问,全部32位AD线都被用来提供一个完整的地址编码(字节地址),这使得要求地址精确到字节水平的设备不需要多等一个周期就可完成地址译码(产生DEVSEL#信号),也使负的地址译码节省了一个时钟周期。在I/O访问中,AD【l:0】两位很重要,它一方面用来产生DEVSEL#信号,更值得注意的是它也表示传输涉及到的最低有效字节,并且要与C/BE[3:01#相配合。表2-4给出了AD[1:01和C/BE[3:01#的对应关系。表2_4AD[1:O]和C/BE[3:O】#的对应关系ADlADOC/BE3拌C/BE2#C,BEl群C/BEO#}0OXO『0lX01OX0l1lOl1(2)内存地址空间在存储器访闷中,所有目标设备都要检查AD【l:OlJ要么提供所要求的突发传输顺序,或者执行一目标设备断开操作。对于所有支持突发传输的设备都应能实现线性突发传输顺序。而Cache的行切换不一定必须实现。在存储器地址空间,要用AD[31;21译码得到一个双字地址的访问。在线性增长方式下,每个数据周期过后地址按一个DWORD(四个字)增长,寅到对话结束。在存储器访问期间,AD[I:01的含义如下:当ADO:0]--00时,突发传输顺序为线形增长方式;ADfl;01=0l时,为Cache行切换方式;AD[1:o]=lx时,为保留。(3)配置地址空问在配景的地址空问中,要用AU[7:21将访闻落实到一个DWORD地址。当一个设备受到配置命令时,若IDSEL信号成立且AD[1:0]=00,则该设备即被选为访问的目标,否则就不参与当前的对话。如果译码如的命令符合某桥路的 武汉理工大学硕士学位论文编号,日.AD[I:01=ol,则说明配置访问是对该桥后面的设备进行配罱。2.2.5陀l总线藏譬传输PCI是地址/数据复用总线,每一个PCI总线数据传送由两个节拍组成:地址节拍和数据节拍。一个地址节拍由FRAME#信号从非激活状态(高电平)转换到激活状态(低电平)的周期开始。在地址节拍,总线主设备通过C/BE[3:01#端发送总线命令,如果总线读命令,紧接着地址节拍的时钟周期叫做总线转换周期,在这一个时钟周期内,AD[31:O]既不被主设备驱动也不被从设备驱动,以避免总线冲突。而对于写操作,就没有总线转换周期,总线真接从地址节拍遴入数据节拍。地址节拍的时间是一个PCI时钟周期,数据节拍的时间取决于要传送的数据个数,⋯个数据节拍至少需要一个PCI时钟周期,在任何一个数据节拍都可以插入等待周期。FRAME#从有效变为无效表示当静正在进行最后~个数据节拍。总线操作结束有多种方式,通常由主设备和从设备共同撤消准备信号:TRDY#和1RDY#。如果从设备不能够继续传送,可以设置STOP#信号,表示从没备撤消与总线的连接;丽如果所寻址的从设备不存在或者DEVSEL#信号~赢为无效状态都可能导致主设备结束当前总线操作,使FRAME#和IRDY#变成无效,回到总线空闲状态。(1)PCI突发读图2-4表示了总线上一次读操作中有关信号的变化情况:从图中可看出⋯照F洲E撑信号有效,地址期就开始,并在时钟2的上升沿处稳定有效,在地址期内AD[31:001上包含有有效地址,CreEl3:01#上含有一个有效的总线命令,数据期是从时钟3的上井沿处开始的。在此期间,AD[3l:01线上传的是数据,面C/BE#线上的信息却指出数据线上的哪些字节是有效的,即哪几个字节是当前要传输的,要特别指出的是无论是读操作还是后面要讲的写操作,从数据期的开始一直到传输的完成C/BE3的输出缓冲器必须始终保持有效状态。图中的DEVSEL#信号和TIu)w信号是由被地址期内所发地址选中的设备(从设备)提供的,但要保证TRDY#在DEVSEL#之后出现,而lRDW信号是发起读操作的设备(主设备)根据总线的占用情况自动发出的。数据豹真正传输是在[RDY#和TRDY#同时有效的时钟前沿进行的,这两个信号的其中之一无效时,就表示需插入等待周期,此时并不进行数据传输,这说明一个数据期可以包含一次数 武汉理工大学硕士学位论文据传输和若干个等待周期。在图2.4中,时钟4、6、8处各进行了一次数据传输,而在时钟3、5、7处插入了等待周期,在读操作中的地址期和数据期之间,AD线上要有‘一个交换期,这需要由从设备利用TRDY#强制实现,也就是TRDY#的发出必须比地址的稳定有效晚一拍,但在交换期过后并且有DEVSEI。撑信号时从设备必须驱动AD线。在时钟7处尽管是最后一个数据期,但由于主设备因某种原因不能完成最后一次传输,具体表现是此时IRDY#无效,故FRAME#不能撇消,只有在时钟8处IRDW变为有效后,FRAM酬信号才撤消。l213{s67{8enJ广、n一nU1U弋nr门}—<葡H≥—(t扭l><匿!!i×矗蔫3>---;l——·o吐击夸(字节健蕾×字节筏麓×字节健麓>—_,——r’广-'__一——/},f|L__/地畦墁t矗孽1.蠹捌里2.置■璺3一等梅披玉等I々摭毒等舒状恚图20PCI突发读时序(2)PCI突发写图2.5表示总线上一次写操作的时序关系。由图可知,总线上的写操作与读操作相类似,也是FRAME#信号的有效预示着地址周期的开始,且在时钟2的上升沿处达到稳定有效,整个数据期也与读操作基本相同,不再详细说明。只是在第三个数据期中由从设备连续插入了三个等待周期,时钟5处传输双方均插入了等待周期。值得注意的是,当FRAME拌撤消时必须要有IRDY#发出为前提,以表明是最后一个数据期。另外,从图2-5中可以看出,主设备在时钟5因为撤消了IRDY#而插入等待局期,表明要写的数据将延迟发送,但此时,字节使能信号不受等待周期的影响,不得延迟发送。要说明写操作和读操作的刁i问点,那就是在写操作中,地址期与数据期之间没有交换周期,这是因为,在此类操作中数据和地址是由同一个设备(主设备)发出的。最后强调的是一E述的读/写操作均是以多个数据期为例来说明的。如果是一个数据期时,FRAME#=帅竺=㈣兰帅||||三㈣ 武汉理工大学硕士学位论文信号在没有等待周期的情况下,应在地址期,读操作应在交换周期过后撤消。ll23t56789rLr、U’乙乙弋J1U卜广、U广-、,-5|’rT-—<蕊D(i丽×盏_2X盏舶>≮Ltlt卜《南磷布磅《蕊Ⅸ字节倥熊>‘!不丫一r——/---5,.‘’,弋|L一,⋯}I【、土_/’1地址段7’1h捌段r’1量蓓日i赣●曩3译恃瓤/li罨{彳艟器碍t}瓶蚤图2.5PCI突发写时序(3)传输终止无论是主设备还是从设备都可以提出终止一次PCI总线传输的要求,但要求不等于具体实旌,也就是说双方均无权力单方面实施传输停止:【作,需要互相配合,不过有一点是肯定的,那就是传输的最终停止控制要由主设备完成,这是因为传输的结束必须满足系统的要求并且是有次序的,这只有主设备才能做到。同时,所有传输的结束标志是FRAME#信号和IRDY#信号均已撤消而进入总线空闲状态,参看图2-5时钟9处。◆由主设备提出的终止主设备是通过撤消FRAME#信号并建立IRDY#信号来提出终止请求的,实际上这样做的目的就是告诉从设备现在已进入了最后的数据期,此后IRDY#“直保持有效直到出现TRDY#信号,完成最后一个数据的传输,接着IRDY#便撤消,从而达到完全终止的条件FRAME#和IRDY#同时无效,结束传输进入总线空闲状态。◆由从设备提出的禁止如果从设备希望终止一次传输,就应向主设备发出STOP#信号以示请求,只要STOP#信号一有效就必须保持到FRAME#信号撤消为止,在此期阔IRDY#和TRDY#间的关系与STOP#和FRAME#闻的关系是互相独立的。也就是说,在目标设备要求终止传输的操作中数据的传输可有可无,具体情况取决于当时19㈨~胁黧:㈣ 武汉理1:大学硕士学位论文IRDY#和TRDY#的状态,但有一‘点应说明,当从设备发出sTO黝信号同时又使TRDY#信号无效时,则表明从设备将不再传输任何数据,这也意味着,主设备在此时不必等待最后一次的数据传输而使整个操作结束。综合前述内容,在PCI总线上的所有传输操作中FRAME#、IRDY#、TRDY#和STOP#这几个信号一般都遵循下列原则:◆当STOP#信号有效时,FRAME#应在其后的2-3个时钟周期内尽快撤消,但在撤消时应置IRDY#为有效,而目标设备应无条件地保持STOP#的有效状态直到FRAME#撤消为止,但是,一旦FRAME#撤消紧跟着STOP#也必须撤消。◆任何时钟前沿,若STOP#和TRDY#同时有效就表示是传输的最终周期,IRDY捍要在下一个时钟的前沿之前撤消,也就是表示传输的结束。◆对于被目标终止的对话,主设备若要继续完成它就必须用下一个未传输数据的地址来重试访问。◆。旦从设备发出了TRDY#或STOP#,它就不能改变DEVSEL#、TRDY#和STOP#信号直到当前的数据期完成。2.2.6即l总线的律麓帆剜每个PCI总线主设备都有各自的请求线REQ#和批准线GNT#。在要求使用PCI总线执行数据传输时,总线主设备必须先从PCI总线仲裁器申请使用总线。在任意时刻,每个总线主设备都有可能有效其请求线REQ#,通知总线仲裁器它正在请求总线。总线仲裁器根据系统指定的算法来确定哪个请求的设备该获得总线使用权后,并有效其GNT#信号线。PCI采用隐式总线仲裁。即在当前主设备正在执行数据传输时,PCI机理允许总线仲裁发生。如果仲裁器决定将下一次交易的总线所有权授予某个主设备,而不是当前交易的主设备,它从当前主设备取回GNT#(即先取得)并将之发给总线的下一个所有者,但是,直到当前主设备让总线空闲,下一个所有者才取得总线所有权。隐式总线仲裁不必占用PCI总线周期,提高了总线使用效率。但是如果在总线空闲期,就不一定采用隐式仲裁。PCI总线仲裁主要利用REQ#和GNT#两个信号线实现。仲裁器可以在任何时钟上置某一设备的GNT#无效。若某一设备要利用PCI总线传输数据时,必须确保它的GNT#信号在此时有效。下面给出PCI总线仲裁的协议规则:◆若设置了GNT#信号无效而FRAME#有效时,当前的数据传输是合法 武汉理:[大学硕士学位论文的且继续进行下去。◆若总线不处于空闲状态,则一个设备GNT#信号有效和另一个设备的GNT#信号无效之间必须有一个延迟时钟,否则会在AD线上和PAR线上出现时序竞争。◆当FRAME#无效时,为了响应更高优先级主设备的服务,可以在任意时刻设嚣GNT#和REQ#无效。若总线占用者在GNT#和REQ#设置后,在处于空闲状态16个PCI时钟后,仍未开始数据传输,仲裁器允许当前主机“打破”这个状态。仲裁器也可以在任意时刻移去GNT#,以便服务于一个更商优先级的设备。2.3FPGA与Verilog语言介绍本文所研究的高速数据采集卡的控制核心以及DDR控制器和PCI控制器都是基于FPGA芯片的,用Verilog语言设计实现的,所以在详细设计之前对FPGA开发技术和Verilog语言进行简要介绍。2.3.1日·馘概要FPGA指的是现场可编程门阵列,它的基本功能模块是由n输入的查找表,存储数据的触发器等组成。将查找表和触发器用可编程的布线资源连接起来,就可以实现不同的组合逻辑和时序逻辑。FPGA一般由底层可编程硬件单元、BlockRAM资源、布线资源、可配最10单元、时钟资源等构成。底层可编程硬件单元一般由触发器(FF)和查找表(LUT)组成,Altera公司的FPGA的底层可编程硬件资源叫LE,由一个FF和一个LUT组成,而Xilinx公司的FPGA的底层可编程资源叫SLICE,由两个FF和两个LUT组成。可配置Io单元,是FPGA内部一个重要的单元,通过在实现中配置相应的选项,可使IO单元适配不同的IO接口标准,不同的器件可支持的IO标准不同,一些高端器件可以支持:IⅣTTL,LVCOMS、PCI、GTL、GTLPHSTL、SSTL、LDT、LVDS、LVDSEX,I、BLVDS、ULVDS、LVPECL、LVDCI等多种Io标准。布线资源用以连接不同硬件单元,根据用途不同,布线资源的工艺、速度、驱动能力都不相同。有全钢的全局时钟布线资源,也有速度较快,抖动延时很小的长线资源,普通的布线资源也分很多种。时钟资源主要指片内集成的一些PLL或者DLL,用于完成时 武汉理r大学硕士学位论文钟的高精度、低抖动的倍频、分频、相移等操作。目前,Altera公司的芯片集成的是PLL,Xilinx公司的芯片主要集成的是DLL,它们各有优缺点,时钟控制的功能复杂,而精度却非常高,一般在ps的数量级12311z4】【25112611271[281。BlockRAM是FPGA的一个重要资源,在片内集成RAM是FPGA的优势之一,高端FPGA的片内RAM规模越来越大,应用也越来越广泛,是SOPC(可编程片上系统)的有力硬件支持。使用片内RAM可实现单口RAM、双口RAM、同步/异步FIFO、ROM、CAM等常用的单元模块。由于FPGA器件实现的各功能块可以同时工作,从而实现指令级、比特级、流水线级甚至是任务级的并行执行,从而大大地加快了计算速度。由FPGA实现的计算系统可以达到现有通用处理器的数百甚至上千倍。并且,由于FPGA可动态地配置,系统的硅片面积不再是所支持无线接口数的线形函数,因此有可能在很少的几片甚至片FPGA中集成一个支持所有标准的系统。由于FPGA内部结构的特点,它可以很容易的实现分布式的算法结构,这一点对高速数字信号处理十分有利。许多实时图像和视频处理功能均适合于用FPGA器件来实现,包括:图像旋转、图像缩放色彩校正和色度校正、阴影增强、边缘检测、直方图功熊、锐化、中值滤波器和斑点分析等。2.3.2veril吨语言曩要VerilogHDL简称Verilog,是一种应用广泛的描述电子电路行为和结构的一一种硬件描述语言,可用与从算法级、门级到开关级的多种抽象层次的数字系统设计。硬件描述语言可以将我们的设计在非常抽象的层次上加以描述,设计人员可以在不考虑具体制造工艺的情况下,对设计做寄存器传输级(RTL)的描述。Verilog于1995年成为IEEE标准,即IEEEStandard1364.1995。作为一种标准的硬件描述语言,Veritog有如下特点:◆首先,作为一种多用途的硬件描述语言,它具有很好的易学性和易用性。在语法上与C语言非常相似。◆其次,Verilog语言允许在同一模块中进行不同抽象层次的描述。这样一来,设计人员就能同时使用开关级、门级、寄存器传输级或行为描述代码对同一硬件模块进行描述。而且,设计人员只需要学习一门语言就可以完成对硬件的仿真和层次设计工作。◆第三,大多数逻辑综合工具都支持Verilog,使得Verilog成为设计人员 武汉理’1:_=大学硕士学位论文的一个最好选择。◆第四,所有的制造厂商都提供了Verilog的工艺库,用以支持仿真。这就位用Verilog设计的芯片可以在不同的厂家进行生产,提供了更大的灵活性。◆第五,Verilog的程序语苦接口拥有更大的功能,允许用户用c语言对内部数据结构进行描述。Vefilog程序的基本设计单元是“模块”(module)。Verilog模块结构完全嵌在module和endmodule关键字之间,每个Venlog程序包括四个部分:模块声明、端口定义、信号类型说明和逻辑功能描述‘2911301[31113211331。2.3.3FPG^设计滚程1.设计输入QuartusII软件在File菜单中提供‘'NewProjectWizard⋯”向导,引导设计者完成项目的创建。建立一个.工程后,设计者可以添加或新建Venlog文件。设计输入可以用文本编辑器,也可以用图形编辑器。对于复杂系统来说,建议使用文本编辑器来进行设计输入。2.设计编译QuartusII编译器完成的功能有:检查设计错误、对逻辑进行综合、提取定时信息、在指定的Altera系列器件Stratix.EPlS20中进彳亍适配分割,产生的输出文件将用于设计仿真、定时分析及器件编程。3.设计定时分析单击Project菜单下的“TimingSettings⋯”选项,可以方便地完成时间参数的设定。QualtusII软件的时序分析功能在编译过程结束之后自动运行,并在编译报告的TimingAnalyses文件夹中显示。其中我们可以得到最高频率fmax、输入寄存器的建立时间tsu、输出寄存器时钟到输出的延迟teo和输入保持时间th等时间参数的详细报告,从中可以清楚地判定是否达到系统的时序要求。4.设计仿真QuartusII软件可以进行仿真,但是功能远不如ModelSimSE5.7E软件强大。在本设计中,使用的就是ModelSimSE5.7E软件,可以进行功能仿真和时序仿真。在ModelSimSE5.7E中进行完整的系统仿真时,需要自写良好的TESTBENCH。5.器件编程 武汉理工人学硕士学位论文殴计者可以将配置数据通过MasterBlaster或ByteBlasterMV通信电缆下载到器件当中,通过被动串行(PassiveSerial)配置模式或JTAG模式对器件进行配旨编程,还可以在JTAG模式下给多个器件进行编程。利用QuartusII软件给器件编程或配置时,酋先需要打开编程器(在New菜单选项中选择打开ChinDescriptionFile),在编程器中可以进行编程模式设置(Mode下拉框)、硬件配置(ProgrammingHardware对话框)及编程文件选择(AddFile⋯按钮),将以}=配鬣存盘产生.cdf文件,其中存储了器件的名称、器件的设计及硬件设置等编程信息。当以上过程正确无误后,单击Start按钮即可开始对器件进行编程配置。24 武汉理I:人学硕十学位论文第3章高速数据采集卡的设计3.I整体设计高速数据采集卡的结构框图如图3.1所示,它由A/D转换电路、FPGA川编程器什、DDRSDRAM存储器电路组成,其中,FPGA集成了DDR控制器和PCI桥控制器舯11351136】【37j。信号输^l℃l接[I笔PC图3-I高速数据采集{}的结构框图输入信号经AD9480构成的采样电路转变为数字信号,AD9490是8位单片高速模数转换芯片,有最高250MSPS的转换速率。使用ALTERA公司的Stratix系列EPl$25C780来实现系统控制和DDR控制器功能,将输入FIFO中的数据存储到DDRSDRAM中,采样结柬后又将DDRSDRAM中的数据读出,通过PCI择制器传给上位机处理㈣∞I。AD转换模块的电路部分由时钟产生电路、模拟输入电路和AD转换器等组成.此模块由FPGA控制。3.2。1加制旧O功麓介缨AD9480是ADI公司生产的8位单片模数转换芯片。最适于高逮低功耗的数AD9480是ADI公司生产的8位单片模数转换芯片。晟适于高遽低功耗的数 武汉理工大学硕士学位论文据采集中。芯片尺寸很小,使用简单,能达到最高250MSPS的转换能力,具有卓越的线性和动态能力[40l。AD9480对多路分配的TTL/CMOS输出逻辑和低电压差分信号(LVDS)输出提供传统支持,以便能够与现有的和下一代的专用集成电路(ASIC)兼容。在CMOS多路分配模式下,AD9480可以交叉存储模式或并行模式以半时钟速率在两个8bit通道中移动数据。当工作在LVDS输出模式时,AD9480通过单一输出通道以全时钟速率输出数据,雌达到最佳豹输出性能。这种8bitAD9480ADC除了能够支持LVDS输出简化设计考虑,它还具有46.4dB信嗓比(sNR)和无失码等优点。AD9480还能够保证在--40℃~+85℃的整个工业温度范围内保持:e0.35LSB的DNL。该转换器采用3.3V单电源供电并且包含一个内部基准电压源和采样鼹踪保持电路。AD9480与ADI公司的AD9041A高速ADC具有相同的引脚配置,允许设计工程辉通过简单的电路板修改升级其产品,从而降低系统开发成本。AD9480的功能框图如图3.2所示:ⅥN+VrN.CL昭}CUK_VREFSENSEAGNDDrONDDRVDDAVDDPDWNSlLVDSⅨAS图3-2AD9480的功能框图D7.DO(LVOS)Dc0+DC(). 武汉理工人学硕士学位论文AD9480肇本特性如下:◆微分非线性误差(DSB):士0.25LSB◆积分非线性误差(LSB):士O.26LSB◆单3.3V供电(3.0V至3.6V)◆250MSPS采样时功耗为590roW◆模拟信号输入的峰峰值为lv◆内部自带lV的参考电压◆单端或差分信号输入◆LVDS输出(ANSl644标准)◆省电模式◆时钟稳定器图3.3是AD9480的采样时序图,差分时钟信号由CLK+和CLK一输入,AD9480在每单个时钟周期输出一次数据,每次8位。输出的采样数据采用蒺分的方式输入FPGA的输入FIFO。图3.3AD9480采样时序图3.2.2加转换接口毫蘑设计1.采样时钟电路高速AD对用户提供的采样时钟质量及其敏感,采样保持电路本质上是~1个“混频器”,时钟的任何噪声、扭曲或抖动都会导致AD的输出端信号失真。所以时钟电路的设计必须谨慎考虑。 武汉理:【:大学硕士学位论文AD9480内部有一时钟稳定电路,对时钟的上升沿锁定,对采样率在100MSPS至250MSPS的中心平率进行优化,时钟稳定的功能能被PIN28脚使能。时钟信号支持差分和单端输入方式。本电路采用高精度的外部有源晶振,然后由差分接收器MCl00LVELl6D将晶振输出的单端信号转变为AD9480支持的差分时钟,这样可以减少共模二F扰。时钟电路如图3.4所示:图3-4采样时钟电路2.模拟输入电路AD9480的模拟输入电路是一个差分缓冲,为了获得最好的动态性能,VIN+和VIN。的阻抗必须匹配。若用单端输入方式,SNR(信嗓比)和S1NAD(信号噪声及失真比)都将降低。模拟输入的自偏置电压大约为1.9V。若是对交流信号采样,可以用一个宽频变压器来实现单端信号到差分信号的转换,但应注意,根据具体的应用来选择变压器次级端的RC滤波电路,这样可以减少输入噪声。对于有直流分量的信号的采样,可以用AD8138来驱动,电路原理图如图3.5所示:待采集的模拟信号从ANALOGIN输入,经AD9480驱动后以差分的形式从AD9480IN.和AD9480IN+输出。VOCM引脚设震AD8138的输出电压,使输出电压以VOCM为参考按1:1输出,VOCM引脚与AD9480的REFOUT相连,REFOUT引脚的电压为1V,所以AD9480IN.和AD9480IN+的峰峰值也是lV,保证了AD芯片的正常采样。 武汉理【:大学硕士学位论文图3-5模拟输入电路3.其它电路除了时钟电路和模拟输入电路外,AD9480还有参考电压电路和其它的配髯电路等。整体电路图如图3-6所示。PDWN和S1引脚分别完成了AD9480的功耗控制和数据输出格式选择,由FPGA控制。当PDWN为0时,AD9480正常工作,为1时,AD9480停l}=j.作,进入低功耗模式,此时的功耗仅为15mW;当Sl为高时,数据是二进制偏移输出方式,当S1为低时,数据时互补输出方式。SENSE是AD9480的参考电压控制脚,当SENSE为VDD时,AD9480是外部参考电压方式,当SENSE为o.5V时,AD9480是参考电压可编程方式,当SENSE为GND时,AD9480是内部固定参考电压方式,本设计中,采用内部固定参考电压方式,参考电压为lV。LVDSBIAS是AD9480的输出电流调节端,设计中接入了3.7K的电阻,使得单路输出信号的电流为3.5mA,在每路差分信号的接收端使用了100欧的终端匹配电阻,使得每路信号的幅值为350mV。 武汉理工大学硕士学位论文图3-6AD转换熬体电路图AD9480的供电采用模拟、数字分离的方式,模拟电源与数字电源分离,模拟地与数字缝分离。3.3DDR控铹嚣设计本系统的DDRSDRAM选用三星公司的K4H1G0838A芯片,该芯片的容量是1Gbit,数据总线宽度为8bit。一片存储芯片的电路原理图如图3.7所示⋯。 武汉理工大学硕士学位论文图3-7单片KAHlG0939A芯片存储器电路原理图设计中使用8片存储芯片构成的存储器阵列,数据总线宽度为64bit,存储容量为8Gbit。3,3。2嘲控辫曩时痒竣计在本系绕中,使用FPGA来控制操作DDRSDRAM。通过FPGA的调度控制将采样数据高速存入DDRSDRAM器件中。DDRSDRAM的操作很复杂,对时序要求也十分严格,这使得系统用户对DDRSDRAM的控制有些困难。这就要求有专门的控制器,能使FPGA系统很方便的操作DDRSDRAM。针对本系统的使用需要,本文设计了基于FPGA的DDR控制器,并用Verilog给予实现。DDR控制器在数据采集系统中的结构图如图3-8所示,FPGA系统通过CMD[2:0】命令组合和ADDR[ASIZE.1:O】来控制DDR控制器,DDR控制器收到命令后对命令进行译码,自动产生对应的RAS、CAS、WE等信号,并讲数据 武汉理工大学硕士学位论文写入和读出DDRSDRAM,用户不用关心刷新和预冲等操作。使用该控制器,FPGA能对DDRSDRAM完成突发读和突发写操作。该控制器设计灵活,使用简便,FPGA可以通过该控制器实现对DDRSDRAM的任何系统需要的操作【42】。————CLK—————-———CLK——+一CLKN———+SADDRTA$——c叉N———-。lZE—l:函’————CKB————'一BA[BSIZE-1:O卜+FPGA-CMD[2:0卜--SA[SStZE一1:0】—’内部——RASN———÷DDRSDRAM系统总线+CMDACK一控制器一存储器———CASN———+一DAIN[DSIZ.一WEN———'E·1:O】。OQM[MSIZE·l:O】+.DAoLrTIDsIZE一1.01一DQ[DSIZE-1:O卜+——DQ$———+FPGA图3-8DDR控制器在数据采集系统中的结构1+DDR控制器的结构DDR控制器的结构框图如图3-9所示。靡曜I圈=口雾..1-————————硼ID+ⅢZE.101—卜——————◆⋯DOMI(DSjZE/8)I01————————+——DO斟(DgzE78)一I们———————’'图3-9DDR控制器的结构框图 武汉理工大学硕士学缱论文DDR控制器由控制接口模块、命令模块和数据通路模块组成。控帝《接口模块接收从FPGA内部总线来的命令和相关寄存器地址,对命令进行译码并将请求发送给命令模块;命令模块接收从控制接口模块译码后的命令和地址,产生相应的命令给DDRSDRAM存储器;数据通路模块在读取命令READA和写命令WRITEA期间处理数据交换。2.DDR控制器的命令及寄存器DDR控制器共完成8种操作,其控制命令如表3.1所示:表3,1DDR控制器的命令命令值说明NOP000空操作READA00l带自动预充电的读WRITEA010带自动预充电的写I也FRESH011自动刷新PRECHARGE100预充电所有LoAoMoDE10l配置模式寄存器LOADREGlJ10配置控制器寄存器LOAD—REG211l配置刷新间隔寄存器(1)NOP:在系统总线接收到CMDACK命令后,就会在一个时钟周期后向DDR控制器发送NOP命令。(2)READA:READA命令指示控镱g器对ADDR指定的DDRSDRAM执行带预充电的突发读。控制器在收到砌擒D命令后首先向DDRSDRAM发出激活指令。当控制器发出CMDACK命令后的(RC+CL+4)个时钟周期,突发读的数据会出现在DATAOUT上。CL是CAS反应时间的整数部分。因为DDR存储器端的数据接口位数只有DATAOUT数据位数的一半,所以DATAOUT上的有效突发读数据长度只有DDR存储嚣端配置的一半。在READA命令期间,用户傈持DM为低。(3)w对TEA:WRITEA命令指示控制器对A叻R指定的DDRSDRAM执行带预充电的突发写。控制器在收到WRITEA命令后首先向DDRSDRAM发出激活指令。突发序列中的第一个数据必须与w砒TEA和ADDR同时出现。当控制器发出CMDACK命令后的(tRC.2)个时钟周期,主机必须启动向控制器俦送数据。控制器将DATAlN端口数据位的一半以2倍的数据率送给DQ端口。因此, 武汉理工大学硕士学位论文DATAIN端口的突发长度是DDR存储器端配露的一半。DM输入定时的通过控制器发送至IJDDRSDRAM存储器的DQM。(4)REFRESH:REFRESH命令指示控制器对DDRSDRAM执行自动刷新,控制器对REFRESH命令响应CMDACK。(5)PRECHARGE:PRECHARGE命令指示控制器对DDRSDRAM执行预冲,控制器对PRECHARGE命令响应cMDACK。(6)LOAD—MODE:LOADMODE命令指示控制器对DDRSDRAM执行装载模式寄存器命令。写入DDRSDRAM寄存器的值必须同时出现在ADDR£,ADDR的值直接映射到DDRSDRAM的A11-A0';[脚上。(7)LOAD—REGl、LOAD_REG2:这两个命令是配置DDR控制器内部2个寄存器的命令。DDR控制器内部有2个16位的配置寄存器:REGl和REG2,分别由命令LOADREGl和命令LOAD—REG2配置。REGl中包含了cAS延迟、RAS至-tJCAS延迟、REFRESH命令持续时闯及突发长度;REG2是一个16位的寄存器,包含了DDR的刷新间隔。3.DDR控制器的状态机DDR控制器首先初始化,然后进入IDLE状态,初始化部分的流程如图3.10所示:初始化从复位开始,然后预冲所有bank,然后设置扩展模式寄存器和模式寄存器,然后预冲所有bank,然后刷新2个时钟周期或以上,然后设甓模式寄存器,最后进入初始化状态IDLE。 武汉理工人学硕士学位论文RESE,r图3—10DDR控制器初始化流程DDR控制器的状态机如图3一ll所示。控制器初始化到IDLE状态,V--个状态可能是PRECHARGE、LOAD—MODE、REFRESH或ACT,这取决于命令的需要。状态机中的虚线表示自动的状态,对于READ和WRITE状态,控制器首先到ACT状态。 武汉理T大学硕士学位论文图3.11DDR控制器状态机在WRITE状态期间,控制器从ACT到WRITE,然后到WRITEDATA状态。控制器停留在WRITE_DATA状态,直到BRUST_STOP命令和突发写数据数完成为止。在READ状态期间,控制器首先到READ状态,发出READ命令到DDRSDRAM。然后控制器到READ_WAIT状态去等待CAS延迟。CAS延迟是可编程的,通过LOADMODE命令。CAS延迟时间到后,控制器到READDATA状态,发出控制信号给数据传输模块接收数据。突发读结束或者收到BURSTSTOP命令后,控制器返回到IDLE状态。4.DDR控制器各模块设计(1)控制接口模块控制接口模块对来自主机的命令进行译码,让NOP,WRITEA,READA,REFRESH,PRECHARGE和LOADMODE命令通过,保持ADDR的数据到命令模块。对LOAD_REGl帮LOAD_REG2命令进行译码,在内部将ADDR的值装载给REGl和I也G2。 武汉理工大学硕士学位论文控制接口模块同时包含了一个16位的自减计数器和控制电路,用于对命令模块定时产生刷新命令。这个16位自减计数器的值从寄存器REG2装载,自减到0。当自减计数器NO时,REFRESH_REQ会输出中断,壹到命令模块响应中断请求为止。响应信号会使计数器的值重新装载,并且不断重复。控制接口模块的框图如阁3.12所示:图3.12控制接口模块框图(2)数据通路模块数据通路模块提供了DDR数据接口到内部总线接口间的数据通路。无论数据从内部总线写到DDR接口还是从DDR接口读入内部总线均要使用数据通路模块。当内部总线向DDR控制器发WRITEA命令时,数据总线要将数据写入DDR:当内部总线向DDR控制器发READA命令时,数据总线从DDR读出数据。数据通路模块在DDR接口的一边完成了2个转换:一是将DDR过来的数据总线宽度翻倍,二是将DDR时钟上、下沿送出的数据用200MHz的时钟频率接收。数据通路模块在和内部总线连接的一边也相应地做了2个转换。 武汉理工大学硕:}学位论文图3—13和3.14分别为数据通路模块的读、写框图。窀.帑oo图3一13数据通路模块读框图图3.14数据通路模块写框图(3)命令模块命令模块接收来自控制接口模块的命令和来自刷新控制逻辑的刷新请求,生成相应的命令送给DDR存储器。这个模块包含一个简单的仲裁器,用来对接收的各种命令进行仲裁,刷新控制逻辑的优先级高于控制接口模块。当仲裁器接收了控制接口模块的命令后,命令模块使用3个移位寄存器来生成适当的时序给DDR存储器。一个移位哿存器用来控制激活命令时序,一个用来控制READA38 武汉理工大学硕士学位论文和WRITEA命令,一个用来计时操作命令的持续时间,为仲裁器确定最后的请求操作是否完成。命令模块同时也执行地址复用的功能。命令模块的框图如图3—15所示。RⅡREQdotmp3.4PCI接口设计图3.15命令模块的框图在本系统中,我们通过PCI接口对数据采集卡进行控制,而且通过PCI接口读取采样数据。PCI接口实现了采集卡与PC间的数据传输功能,是本设计中的一个重要组成部分。本系统设计中直接用FPGA实现了33MHz,32位的PCI总线接口,而不使用另外的PCI挢芯片,这样既增加了系统的可靠性,又减少了成本。3.4.1功能描述33MHz,32位的PCI总线接口用于FPGA系统总线与上位机PCI接口问的数据通信。PCI接口的功能是实现目标板和PCI总线的数据收发。当PCI主机准许PCI总线数据传输,PCI接口执行总线上的PCI读写周期。PCI总线接口的输入输出接口如图3.16所示,左边是PCI总线端,与上位机的PCI总线相连,右边与FPGA系统总线相连。辫{I黜鲫 武汉理工大学硕士学位论文所示PCI总线端33圳“32位PCI总线揸。图3—16PCI总线接口的输入输出FPGA系统总蛙端PCI总线端接口功能介绍和FPGA系统总线端接口功能介绍如表3-2、表3-3表3-2PCI总线端接口功能描述信号名信号方向有效状态定义描述PCIAD双向N,APCI地址,数据复用总线PCICBEL输入OpCl命令/字节允许复用PCIPAR双向奇偶校验PCI从设备在读周期时驱动此信号,PCI主设备在地址发送完成写数据的过程中驱动此信号PCIFRAMEL输入OpcI主设备在一个周期开始时驱动此信号为低,在突发操作的最后一个数据之前的时钟沿变高PCITRDYL输出0当PCI从设备能完成一次数据传输时驱动此信号低PCIIRDYL输入0当PCI主设备能完成一次数据传输时驱动此信号低PCISToPL输出OPCI从设备发出的停止信号pClOEVSEL__L输入OPCI从设备驱动此信号为低来决定当前传输的地址空间是否在一个基地址寄存器中PCIlDSEL输入1当PCI主设备将要配鬣从设备时驱动此信号为高PCICLK输入上升沿时钟输入到所有的PCI设备上PCIRSTL输入O对PCI总线上所有的设备进行复侮操作PCIDqTAL输出O中断信号 武汉理工大学硕士学位论文表3-3FPGA系统总线端接口功能描述信号名信号方向有效状态定义描述BKENDAD输出N/A后端设备20位地址总线BKENDDAr双向N,A后端设备32位数据总线BEL输出0字节允许信号BASE_REGION0L输出O通知后端设备传输开始,存取地址空间通过基地址寄存器1译码BASEREGIONlL输出0通知后端设备传输开始,存取地址窀问通过基地址寄存器0译码R—W—L输出RD=011WR=0通知后端设备当前传输将要读或碍『DATA—WRITEL输出O数据写允许DATA_READ-L输出O数据读允许READYL输入O来自后端设备的准备信号DATASTOPL输入0来自后端设备的停止信号BKEND—IN££输入0中断倍号来自后端设备,通过控制器传输给PCI总线BKEND_ABORT_L输入0后端设备声明操作失败信号PCI总线接口由顶层模块、地址锁存模块、配置模块、基地址检查模块、状态机、奇偶校验模块和熏试模块7个模块构成,模块框图如图3.17所示。下面将对各个模块的功能进行详细的分析。顶层模块图3.17模块框图 武汉理工大学硕士学位论文◆顶层模块:这是硬件描述语言的顶层设计,这个模块仅仅用米创建缓冲区示例和对所有的底层模块进行调用。◆地址锁存模块:这个模块包含了各种组合逻辑,用来对地址信号等其它控制信号进行锁存,作为其它模块的输入信号。◆配置模块:该模块实现PCI的配置空间,同时控制对配置空间的读写操作。可以实现两个基地址空间BAO和BAI,地址空间大小可设定,地址空间分别可为Io或MEMORY。本模块生成用于地址检查的信号BA0EN,BAIEN,BALO_SIZE[31:4】和BALl—SIZE[31:4】;同时生成地址空间类型标示信号COM[I:01’作为状态机模块的输入。◆基地址检查模块:基地址检查模块有瞬个功能,通过基地址0配鬟只写寄存器REGloh和通过基地址l配置寄存器REGl4h)第二个功能是对基地进寄存器O和1的地址进行译码,给状态机模块发出通知信号。该模块根据配置模块的输入,检查数据操作地址是否在本PCI设备内。◆状态机:PCI目标设备状态机是本设计的核心部件,它控制着PCI总线和后端设备之间数据流的总线时序。在检测到PCIFRAMEL信号由无效到有效的跳变届,状态机可以从空闲状态转移到配置交易或数据操作交易的起始状态。是配嚣交易还是数据操作交易,是通过检查PCICBEL和PCIIDSEL信号得出的。对于配置交易来说,被访闷的双字地址是由PCIAD[7:2]决定的,是配簧读还是配置写由PcLcBE_L[3:0]上的交易类型决定。对于没有实现的寄存器,配置读返回的值为00000000h。对于数据操作交易来说,地址检查模块提供的HITBA0L和HITBAIL信号决定对哪个地址空间做操作。状态机产生BASEREGIONOL或BASE_REGIONl一L信号向后端模块声明开始数据操作。后端模块以READYL信号作为就绪回应信号。接到READYL信号后状态机有效PCITRDYL信号,此时只要主设备PcI—IRDY-L信号有效,⋯个双字数据的传送就在这个时钟周期的上升沿完成了。若为突发操作,下一双字节的数据传送在下一时钟上升沿完成。从设备可以使用DATASTOPL信号要求主设备终止当前正在进行的数据操作。后端设备可以使BKENDABORTL声明操作的失败。 武汉理工大学硕士学位论文◆奇偶校验模块;生成奇偶校验位,使得PCI_AD[31:O】,PCI_CBE—L[3:O】和PCI—PAR信号线上共有偶数个l。◆重试模块:PCI设备对一次读写操作做应答,需在16个时钟内使DEVSEL有效,若PCI设备应答了一个读写操作,但用户接口没有REDAY,则PCI设备重试操作,直到计数器超时。该模块是一个计数器,当计数超时生成重试信号RETRY。3.4.3状态机分析状态机的设计是PCI接口设计的核心,状态机模块是本设讨一中最复杂的模块。本设计中根据PCI交易的流程,共划分了12个状态,本节通过沦述各个状态的定义、各状态下的操作和状态之间的转移条件来分析状态机模块的功能是如何实现的。12个状态分别为idle,con_wait,conwait2,CON,backoff,rwwait,nvwait2,read—wait,nv,last_rw,abort和mtry。状态的转移流程如图3.18所示。图3-18状态转移图43 武汉理工大学硕士学位论文idle是空闲状态,表示当前总线上空闲。复位后状态机自动进入空闲状态,如满足执行配置交易或数据操作交易的条但:,将转移到con配置交易)或_wait(IWrwait(数据操作交易),否则一直停留在idle状态下。每次交易完成或被终止后将由backofr状态转移到idle状态。在idle状态下状态机的转移主要由pciidsel、pciflamel,pcicbel和tom[I:01等信号决定,在这个状态下还要根据这些信号t栏成readflag标志信号,表示下面的操作是不是读操作。若是配置交易,状态机将从idle状态经历三个状态。conwait,COIlwait2,COD完成交易。在conwait状态,使devsell信号有效,然后状态转移到conwait2状态:在COnwait状态,使devsell信号有效,表示选中配置空间,然后状态转移到conwait2状态;在conwait2状态,使trdyl信号有效,表示目标设备就绪,然后状态转移到con状态;在conwait2状态,检查irdyl信号:看主设备是否就绪,若就绪,配置数据正常传送,进入backoff状态,否则保持con状态,直到看主设备是否就绪。若是数据操作交易,状态机首先从idle状态进入INNwait状态。在nvwait状态下,要检查HITBAoL和HITBALlL信号,看操作是否命中PCI设备的某个地址空闯,若未命中则取消交易,返回idle状态,否则进入刑wak2状态。rwwait2状态下的状态转移较复杂。除了保留原状态外,还可能转移到readwait,刑,lastrw和retry状态。状态的转移条件如表3-4所示。表3_4nvwait2状态下的转移条件l前一状态后一状态转移条件rwwaA2nⅣwait2readyl&retry_lrwwait2readWait!readyl&retry_l&readflagl'Wwait2rw!ready_l&datastopI&retry_l&!read.flag&!pci_frameIrwwait2lastrw(!ready_l&retry_l&!read—flag&pci_frame1)ll(!read_l&!datastop_l&retryl&!read_flag)Mwait2l℃trV!retryl从表3-4可以看出,若是后端设备没有准备好(readLl一1),将保持rw—wait2状态,同时启动重试计数器;在计数器溢出之前,若后端设备仍未准备好,则进入retry状态;若后端设备准备好∞adLl==o),且为读操作(read_flag==1),则 武汉理1:大学硕士学位论文进入read—wait状态:若为写操作则根据datal和pcil的取值进入_stop_framerw或last—rvr状态。从rw_wait2状态起,状态机的转移要受操作类型(读或写)和数据期长度(单数据操作或突发传送),以及后端设备响应(是否就绪,是否支持突发)的共同影响,因此状态转移复杂。但最终都将以正常完成,重试(retry)或废止(abort)的方式结束,经过一个backoff状态后回到空闲状态,等待下一次交易的开始。 武汉理工大学硕士学位论文第4章高速数据采集卡的软件设计本课题的信号采集卡软件分为两部分,~一是PCI专的驱动程序设计,使硬件通过驱动程序向应用程序层提供⋯个用户接r-I:二是用户应用程序设计,通过驱动程序接口来控制和访问硬件,达到采样数据的目的。4.1Windows设鲁重动程序概述VXD:VxD是虚拟驱动程序,即VirtualDeviceDriver,它是系统用来管理系统资源(硬件或软件)的可执行二进制代码。VxD可以动态地加载或卸载,这样就可以节约宝贵的系统内存资源。KMD:KMD是KernelModeDriver的缩写,它是WindowsNT下提出的管理,维护硬件运作的驱动程序模式。该DRIVER运行于WindowsNT的KERNEL模式下(类似于R1NGO,但是,一个KMD的运作环境在不同的时候是根本不嘲的。WDM:WDM是WindowsDriverModel的简写,它是微软公司为当前主流操作系统的驱动程序设计的一种构架。它实际也可以理解为一个即插即用(PNP)的KMD,WDM己成为主流的驱动程序模式【43114引。4.1.2Ilindon绷疆鞠麓摩的种类Windows2000驱动程序种类和关系如图4.1所示。虚拟设备驱动程序(VDD)是一个用户模式部件,可以使DOS应用程序访问x86平台上的硬件。VDD通过屏蔽I/O权限掩码来捕获端口存取操作,它基本上是模拟硬件操作,这对于那些赢接对微机硬件编程的应用程序特别有用。PllP驱动程序就是一种遵循Windows2000即插即用协议的内核模式驱动程序。WDM驱动程序是一种PnP驱动程序,它同时还遵循电源管理协议,并能在 武汉理下大学硕士学位论文Windows98.Windows2000和WindowsXP间实现源代码级兼容。WDM驱动程序还细分为类驱动程序(classdriver)和微小驱动程序(minidriver),类驱动程序管理属于己定义类的设备,微小驱动程序给类驱动程序提供厂商专有的支持。文件系统驱动程序在本地硬盘或网络上实现标准PC文件系统模型(包括分级目录结构和命名文件概念)。图4.1Windows2000驱动程序种类和关系显示驱动程序是用于显示和打印设备的内核模式驱动程序。遗留设备驱动程序也是一种内核模式驱动程序,它直接控制一个硬件设备而不是其它驱动程序帮助。这种驱动程序主要包括WindowsNT早期版本的驱动程序,它们可以不加修改地运行在Windows2000中。4.1.3■明疆磅翟黼点在WDM驱动程序模型中,每个硬件设备至少有两个驱动程序。其中’个驱动程序称为功fl&(Function)驱动程序,通常它就是你认为的那个硬件设备驱动程序。它了解硬件上作的所有细节,负责初始化I/O操作,有责任处理I/0操作完成时所带来的中断事件,有责任为用户提供一种设备适合的控制方式。另⋯个驱动程序称为总线(Bus)驱动程序。它负责管理硬件与计算机的连接。例如,PCI总线驱动程序检测插入到PCI槽上的设备并确定设备的资源使用情况,它还 武汉理下大学硕士学位论文能控制设备所在PCI槽的电流开关。WDM功能驱动程序通常由两个分离的执行文件组成。一个文件是类驱动程序,它了解如何处理操作系统使用的WDM协议(有些协议相当复杂),以及如何管理整个设备类的基本特征。另一个文件称为微小驱动程序,它包含类驱动程序用于管理设备实例的厂商专有特征例程。类驱动程序和微小驱动程序合在+起才成为一个完整的功能驱动程序。一个完整的驱动程序包含许多例程,当操作系统遇到一个IRP时,它就调用驱动程序中的例程来执行该IRP的各种操作。4.2开发工具豹遗撵开发设备驱动程序有多种开发工具可以选择,主要包括{45j146】:(1)DDK:DDK是Microsoft出品的设备驱动程序开发工具包DDK(DeviceDeveloperKi0。该软件包中包括了有关设备驱动开发的文档、编译需要的头文件和库文件、调试工具和程序范例。另外在DDK中还定义了一些设备驱动程序可以调用的系统底层服务。它有Windows98DDK和Windows2000DDK两个版本。前者能够开发Windows95/98/Me小T下的VxD,KMD和WDM驱动程序,后者可以开发Windows98/Me/NT/2000下的KMD和WDM驱动程序。(2)VtoolsD:Vireo公司出色的VtoolsD由可视的VxD代码生成器QuickVxD,C运行库、VMM/VxD服务库、C抖类库以及VxD的装入程序等组成。利用QuiekVxD生成的框架程序和经充分测试过的C运行库或c十+类库可以绕过DDK用C或c++来编制驱动程序,这就大大地简化了开发的难度,提高了可靠性。框架程序可以直接在VisualC十+集成开发环境中用NMAKE编译为VxD。(3)WinDriver:WinDriver是美国酗疆Tceh公司出品的用于编写驱动程序的另一种工具包。它包括一个类似于QuickVxD的代码生成器WinDriverWizard、一个WinDriver发行包、两个公用程序。与VToolsD一样,WinDriver工具包的优点在于允许编程人员用MSDEVVisualC/C++,BorlandDelphi或者其它Win32编程工具软件在用户模式(UserMode)上编写设备驱动程序,丽不是将大量精力放在编写那些复杂的,难予调试的内核模式代码。WinDriver生成的代码可以运行于Windows95/98/NT3.5l肘T4.0和Windows2000等各种平台。(4)DriverWorks:NuMega公司的DriverWorks以面向对象的(OOP)的方式。 武汉理T大学硕士学位论文将编写WDM及W1NNT驱动程序所需的对内核模式访问及硬件的访问封装成类。这样只要在它的向导程序的指引下,根据硬件的具体参数填写必要步骤,就可以很方便地完成所需驱动程序的框架。最后根据具体的要求添加新的类对象和所需的代码就可以成功地完成自己的驱动程序。DriverWorks是基于VC++的,它生成的是标准的VC工程,只要将所建的工程在VC下编译,就可以,#成最终的设备驱动程序。以i二介绍的各种工具各有优点。DDK功能强大,编程灵活,适用范围广,可以应用于各类硬件驱动程序的编写,但对编程人员的要求较高,编程难度较大。VToolsD主要工作环境是在Windows95/98下,它具有较强的开发能力和较高的开发效率,是编程人员常用的工具。WinDriver的适用面比前两者窄,它主要针对ISA/PCI插卡,而对其它类硬件的技术支持较少,但它编写的程序可同时工作在Window39S/98烈T操作系统。DriverWorks对于WindowsNTF和Windows98与W‘mdows2000共同支持的Win32驱动模型(WDM)设备驱动程序的开发提供完全的支持。DriverWorks中包含一个非常完善的源代码生成lj具(DriverWizard)以及相应的类库和驱动程序样本,它提供了在C++下进行设备驱动程序开发的支持。另外,DriverWizard还能生成专为特殊设备定制的代码,比如:USB设备,PCI设备,即插即用设备,ISA设备等等。本课题选用Numega公司开发的DriverWorks作为驱动程序开发工具开发Win2000下的WDM模型的驱动程序。4.3WDM驱镌穗痒的基本结构当用DriverWizard创建一个WDM驱动程序框架时,将生成两个.cpp文件:一个是驱动程序的,另一个是设备程序的。在这两个文件中,有许多例程,诸如DriverEntry,AddDevice等。这些例程可分为两种:必须的基本例程和根据需要可选择的扩展例程。DriverWorks提供了三个类:KDriver,KPnpDevice和KPnpLowerDeviee,用于实现WDM驱动程序的框架结构。4.3.1KDriYer类KDriver类提供设备驱动程序的基本框絮结构。它负责驱动程序的初始化,并负责将tRP分发到目标设备对象。KDriver是抽象类,必须创建一个KDriver 武汉理工大学硕士学位论文类的派生类,并重载DriverEntry例程,在DriverEntry例程中做一些初始化1二作。框架自动创建类实例,而且是唯一的⋯个实例,可以用Driverlnstance函数返蚓KDriver类实例地址。每当PnP子系统检测到驱动程序所负责的设备时,就凋用AddDevice例程。Unload例程负责最后的清除工作。KDriver类的例程在驱动程序中。KDriver的基本例程如下:l、DriverEntry例程DriverEntry例程负责驱动程序的初始化,所有的驱动程序都必须包含在DriverEntry例程。当装载程序时,p11P管理器为每个驱动程序调用一次DriverEntry例程。DriverEntry例程负责驱动程序的初始化,用以初始化驱动程序范围的数据结构和资源。DriverEntry例程主要有以下三个功能。(1)设置AddDevice,Unload,Dispatch和其它例程的入E1地址:(2)可以从注册表中获取一些必要的信息以初始化驱动程序:(3)初始化其它的在驱动程序范围内的数据结构和资源。2、AddDe-Jiee锣ll程在驱动程序扔始化之后,PIlP管理器调用驱动程序的AddDevice例程来初始化由该驱动程序所控制的设备。在AddDevice例程中,驱动程序创建了一个设备对象作为目标I/O设备,并将设备对象附着到设备堆栈中.设备堆栈为每·个相关设备驱动程序包含一个设备对象。在设备被首次枚举时,AddDevice例程在系统初始化时被调用。当系统运行时,一旦有一个新设备被枚举,系统将调用AddDevice例程。AddDevice函数的基本职责是创建一个设备对象并把它连接到以PDO为底层的设备堆栈中。相关步骤如下所示:(1)创建设备对象,并建立一个私有的设备扩展对象。(2)寄存一个或多个设备接口,以便应用程序能知道设备的存在。另外,还可以给出设备名并创建符号连接名。(3)初始化设备扩展和设备对象的标志位。(4)把新设备对象附着到设备堆栈中。3、Unload例程WDM驱动程序包含Unload例程,该例程负责删除有DriverEntry例程所分配的驱动程序范围内的资源,如内存,事件等。 武汉理工大学硕士学位论文KPnpDevice是KDevice类的派生类,在驱动程序中只作为基类使用。它支持即插即用和电源管理,主要处理IRPMJPNP和IRPMJPOwER1RP。KDevice类代表设备驱动程序,提供与应用程序的接口功能,承担IRP分发任务,提供与底层设备的接口功能,提供与其它系统对象(如中断,DMA等)的接口功能。1、基本例程(1)Pnp例程Pnp管理器使用IRP来指导驱动程序启动,停止和删除设备,并套询驱动程序的设备:WDM是PlIP驱动程序,必须具备Pnp例程。当用DriverWizard生成WDM框架程序时,将自动产生三个PnP例程(启动,停止和删除)和一默认PnP例程。在启动例程中,获取系统分配的资源,做一些初始化工作。在停止例程中,暂时使配置的资源无效。在删除例程中,释放分配的资源。如果是虚拟的驱动程序设备,可能没有资源配置,仅返回S聃矾ISSUCCESS就可以了。通常情况下,三个PflP例程(启动,停止和删除)和一个默认PnP例程已经够用了。当然,根据需要,可重载其它PllP例程。(2)Power例程WDM驱动程序必须支持电源管理,电源管理器使用IRP指示驱动程序来改变电源形态、等待并响应系统唤醒事件和奁询驱动程序的设备。如果设备不支持电源管理,仅有一个默认Power例程就够了。(3)WMI例程WDM驱动程序还支持WMI,用于管理计算机系统。如果设备不支持WMI,仅有一个默认WMI例程就够了。2、扩展例程(1)Dispatch例程调度例程处理应用程序与驱动程序之间的通信,调度例程包括Create,Close,Cleanup,Read,Write和DeviceControl。(2)Startlo例程对于一个实际物理设备的访问,在某一时刻只能有一个操作在进行。这就要求在一个IRP未处理完之前,绝不允许处理另一个IRPo换句话说,这要求对IRP进行排队,即串行处理,因此便需要Startlo例程。 武汉理工大学硕士学位论文4.3.3KPnpLowerl)evice类KPnpLowerDevice类提供了一个物理设备对象的模型,它是KLowerDevice类的派生类。当驱动程序创建或初始化一个KPnpLowerDevice类实例的时候,它就将一个设备对象连向了一个物理设备对象。4.4基于PCI慧镶韵系统的骧动稷序钓开发4.4.1阳I驱舔琵序触特点在设计驱动程序之前,首先要对欲控制的硬件设备进行细致地分析,更需要详细了解硬件设备的特性。硬件设备的特性会对驱动程序设计产生重大的影响。需要了解的最主要的硬件特性包括:(1)设备的总线结构设备采用什么总线结构非常关键,因为不同的总线类型(如ISA和PCI)在许多硬件工作机制上是不同的,所以驱动程序设计也不同。(2)寄存器了解设置的控制寄存器、数据寄存器和状态寄存器及这些寄存器工作的特性。(3)设备错误和状态了解如何判断设各的状态和错误信号,这些信号要通过驱动程序返回给用户。(4)中断行为要了解设备产生中断的条件和使用中断的数量。(5)数据传输机制最常见的数据传输机制是通过I/O端H(port),也就是通过CPU的1N/OI『T指令进行数据读写。PC机的另一种重要的传输机制是DMA,但PCI规范不包括从属DMA的说明。(6)设备内存许多设备自身带有内存,PCI设备大多是采用映射的方式映射到PC系统的物理内存。有的设备还要通过驱动程序设置设备的接口寄存器。有关驱动程序的加载和响应用户请求的内容,在DDK文档中有规定,所以设计设备驱动程序 武汉理工大学硕士学位论文主要面临的问题是如何进行硬件操作,这是根据设备的不同而不同的。而硬件驱动程序的功能虽然千差万别,但基本功能足完成设备的初始化、对端口的读写操作、中断的设置、响应各调用以及对内存的直接读写。4.4.2陀I设鲁驱动翟序构组成PCI驱动程序主要由以下几个部分组成:1、设备初始化PCI-最备驱动程序要实现识别PCI器件、寻址PCI器件的资源和对PCI器件中断的服务。PCI系统BIOS功能提供了BIOS的访问与控制的具体特征,所有软件(设备驱动程序、扩展ROM码)将通过标准中断号1AH调用BIOS功能访问特殊部件。PCIBIOS规范有完整的有关PCIBtOS功能的描述。在PCI设备驱动程序的初始化过程中,利用指定器件识别号(device,厂商识别号(、_id)vendorid)检索号(index)搜索PCI器件,通过调用PCBIOS确认其存在,并确定其物理位鬻:总线号、器件号和功能号,这是该器件/功能在系统中的唯⋯寻址标志。利用总线号、器件号和功能号可以寻址该器件/功能的PCI配置空间(configurationspace)。没备驱动需要从配置空间获得硬件的参数。PCI设备的许多参数,包括所用的中断号,端口地址的范围I/O方式、存储器的地址、存储器映射方式等,都可以从PCI配置空间的各基址所对应的寻址空问中得到。读写配置空间可以调用BIOS中断1AH,也可以先向配置空间地址寄存器(OCFSH)写入总线和设备号(在搜索PCI器件时得到的)和寄存嚣号,再对配置空间数据寄存器(OCFCH)进行读写。对设备驱动来说,最重要的是获得基址寄存嚣r(BADR),不能认为PCI器件资源总是设计设备时设置的初值,系统可能会根据硬件情况为PCI设备分配新的资源。确定一个端口是按什么方式映射的。可以读对应端口的配置寄存器(ConfigurationRegister)。读出后,判断其位,如果位为数据值0,表示其是按内存方式设置的,否则为I/O方式设置的。如果要获得基址的大小,可以向基址寄存器写入FFFFH,然后读基址寄存器,如果是内存方式,从第4位开始的数目表示基址的大小,如果是I,0方式,则从第2位开始的的数目表示基址的大小。在WindowsNT下,查找PCI设备的工作是由HalGteBusData完成的,也可以使用前述的办法读取配置寄存器,但DDK推荐使用HaiGetBusDataOffset函数。2、端口操作在PC机上,∞端口寻址空间和内存寻址空间是不同的,所以处理方法也 武汉理上大学硕士学位论文不同。I/O空间是一个64K字节的寻址空间,它不像内存有实模式和保护模式之分,在各种模式下寻址方式相同。在Windows9XF,用户程序可以直接使用I/O指令,而不一定非通过专门的驱动程序来完成,所以如果软件对硬件的操作完全是通过I/O端口操作来完成的,甚至可以不用专门设计驱动程序,直接由应用程序来完成对硬件的控制。由于PCI总线是32位的总线标准,在进行I/0操作时,通常要进行双字(DWORD)操作,而且以前大多数c/C++编译软件没有提供双字的函数,所以需要构造双字操作读写函数inpd/outpd。在WindowsNrI下,系统不允许处于rin93的用户程序和用户模式驱动程序直接使用I/O指令,如果使用了I/O指令将会导致特权指令意Pl-(privilegedinslxuctionexception)。所以任何对I/O的操作都需要借助内核模式驱动来完成。具体的做法有两种:(1)在驱动程序中使用IoReportRescourceUsage报告资源占用,然后再使用READPORTXXX、WRITEPORTXXX函数进行读写,撮后还要使用IoReportRescourceUsage取消资源占用;(2)驱动程序修改NT的FOPermissionsMap(IOPM),以使系统允许用户程序对指定的I/0端口进行操作,这时用户程序采用通常的I/O指令进行操作。第二种方式的优点是速度快、用户程序设计简单,但牺牲了程序移植性。程序不能移植到非Intel的系统中,而且如果多个程序同时读、写同一个端口容易导致冲突。<3)内存的读写Windows工作在32位保护模式下,保护模式与实模式的根本区别在于CPU寻址方式上的不同,这也是Windows驱动程序设计中需要着重解决的问题。Windows采用了分段、分页机制,这样使应用程序产生一种错觉,好象程序中可以使用非常大的物理存储空间。这样做最大的好处就是一·个程序可以很容易地在物理内存容量不一样的、配置范围差别很大的计算机上运行,编程人员使用虚拟存储器可以写出比任何实际配置的物理存储器都大得多的程序。每个虚拟地址由16位的段选择字和32位段偏移量组成。通过分段机制,系统由虚拟地址产生线性地址。再通过分页机制,由线性地址产生物理地址。线性地址被分割成页目录(PageDirectory)、页表(PageTable)和页偏移(Offset)_三个部分。当建立一个新的Win32进程对,操作系统会为它分配一块内存,并建立它自己的页目录、页表,页目录的地址也同时放入进程的现场信息中。当计算一个地址时,系统首先从CPU控制器CR3中读出页目录所在的地址,然后根据页目录得到页 武汉理一F大学硕士学位论文表所在的地址,再根据页表得到实际代码/数据页的页帧,最后再根据页偏移访问特定的单元。硬件设备读写的是物理内存,但应用程序读写的是虚拟地址,所以存在着将物理内存地址映射到用户程序线性地址的问题。从物理地址到线性地址的转换工作也是由驱动程序来完成的。在Windows98下,使用DDK的VMMCaIIMapPhysToLinear进行地址映射。驱动程序的内存映射部分主要是调用VxD的系统服务MapPhysToLinear。在WindowsNT下,首先调用IoReportResourceUsage请求使用设备的内存。然后调用HalTranslateBusAddress转换与总线相关的内存为系统的物理内存地址。再使用MmMaploSpace把设备的内存映射到虚拟空间。在设备驱动卸除时,用MmMaploSlmce断开设备的内存和虚拟空间的连接。(4)中断的设置、响应与调用对中断的设嚣、响应与调用应该在驱动程序中完成。对中断的调用就象前面调用BIOS的lAH中断读取配置寄存空间一样可以由DDK的ExecInt完成。PCI设备驱动程序应当从PCI配鼍寄存器的中断寄存器(INTLN)和中断引脚寄存器(INTPIN)qb获得有关中断的信息。DDK还提供了响应中断事件的服务。如在Windows98中,VPICD服务用来管理所有硬件中断事件。PC机的硬件中断需要确定硬件中断的IRQ,对一个特定的IRQ中断源,VPICD或者提供缺省的中断处理函数,或者允许其它VxD重载中断处理函数。(5)设备驱动的调用编写设备驱动并不是最终的目的,总是需要由用户程序来调用驱动并实现一定的功能。一般调用设备驱动是使用CreateFile函数打开设备文件,得到一个文件旬柄。完成硬件操作之后,可以调用C10seHandle(hVxD)关闭设备驱动。这种调用方式也是WindowSNT调用设备驱动的标准方法。对于VxD来说还有其它的调用方式,如DPMI方式,但采用DevieeloControl的方法可以保证程序在WindowsNT和Windows9X下的兼容性,在两个操作系统下,仪有CreateFile语句是不同的。4.5开发PCI设鲁鞫渤程序WDM酶关键褥麓开发PCI设备驱动程序WDM,主要有三个方面的问题:硬件涛问、中断处理和DMA传输。下面就这三个方蔺进行讨论。 武汉理工大学硕士学位论文4.5.1硬—孛访问X86处理器有两种独立的地址空间,这两种地址空间分别是I/O地址和内存地址。I/O地址空间只有64KB,而内存空间现在达到40GB。对于微机接口母,其中的I/O和存储器芯片可以定位于这两种独立的地址空间中。~个芯片的地址在I/O地址空间的范围称为I/O映射,在I/O地址空间的设备只能通过I/O指令来访问,如汇编语言的IN,OUT指令来访闷。而⋯“个芯片的地址在内存空间的范围称为内存映射,可以通过一些内存访问指令来访问。l、KIoRange和KMemoryRange类KloRange类实现了I/O映射芯片的访问。KMemoryRange类实现了对内存映射芯片的访问。这两个类除了其中的构造函数有不同之处外,其它成员函数完全相同。2、KloRegister和KMemoryRegister类KloRegister实现对KIoRange类实例中单个地址的访问。KMemoryRe西ster实现对KMemoryRange类实例中单个地址的访问。相应的对象没有规定字长,可以字节,字或双字访问。3、KIoRegisterSafe和KMemoryRegisterSafe类KloRegisterSafe是KIoRe昏ster的“’个安全版本。KMemoryRegisterSafe是KMemoryRegister的一个安全版本。4、硬件访问编程根据配罨声明KIorange和KMemoryRange类实例。对于所设计的PCI设备,其配嚣空间的基地址寄存器fO~5)值决定请求的地址空间类型和大小,驱动程序根据以上情况声明KloRange和KMemoryRange类实例。I.5.2中断越淫1、KInterrupt类Klnlerrupt类实现硬件中断的处理。其成员函数包括中断的初始化,及将~个中断服务例程连接到一个中断和解除其连接等。2、中断处理编程声明KInterrupt和KDeferredCall类实例。中断处理需要中断服务例程和延迟过程调用例程,需要声明。当创建驱动程序框架时,若有中断资源,这些是自动生成。在PnP启动例程中,初始化KInterrupt和KDeferredCall类实例,这 武汉理工大学硕士学位论文些也是自动生成的。在PllP停止和删除例程中,应当是KInterrupt类实例断开并无效。中断服务例程和延迟过程调用例程编程。在中断服务例程中,酋先判断该中断是否是自己的设备产生的.若不是,返回FALSE;若是,进行必要的处理,请求一个DPC,然后返回TRUE。在延迟过程调用例程中,进行相应的中断处理。4.5.3D卧传输DriverWorks提供了三个类:KdmaAdapter,KDma'lYansfer和KCommon-DmaBuffer类,用于实现DMA操作。KdmaAdapter类用于建立+个DMA适配器,它说明DMA通道的特性。KDmaTransfe:类用于DMA传输控制。KcommonDmaBuffer类用于申请系统提供的公用缓冲区。l、KDmaAdapter类对于DMA传输,驱动程序需创建一’个DMA适配器对象,它标明⋯个DMA通道的特性和提供串行化访问的服务。KDmaAdaper类实现对DMA适配器的操作。2、KDmaTransfer类KDmaTransfer类控制DMA的传输。KDmaTransfer要求一个KDmaAdapter类实例。如果需要一个公用缓冲区,可以要求一个KCommonDmaBuffer类实例。启动一个DMA传输、DMA传输数据缓冲区物理遗址和传输字节数,以及DMA传输结束后数据由公用缓冲区拷贝到应用程序数据缓冲区,这些工作都是由KDmaTransfer类实现的。3、KCommonDmaBuffer类对于DMA操作,系统提供了一个特殊的内存,即物理上连续的内存,成为公用缓冲区。公用缓冲区是稀有的系统资源,应该避免浪费使用。对于支持分散/聚集DMA的设备,因其并不要求在物理上连续的内存,因此可不使用公用缓冲区。KCommonDmaBuffer类实现对公用缓冲区的操作。4、DMA传输编程声明DMA编程的三个类实例和DMA准备就绪回调例程。除了KDmaAdapter类实例是自动生成的外,其它均需要声明。在PllP启动例程中,初始化类实例。在PnP停止和删除例程中,应当是类实列无效。 武汉理工大学硕士学位论文4.6应用程序和WDM豹透信4.6.1应用程序对—隧晦通信在Windows中,Win32应用程序调用WDM的Win32函数有五个:CreateFile、ReadFile、WriteFile、DeviceloControl和CloseHandle。l、打开一个wDM设各采用Win32函数CreateFile如下:如果采用设备接口方式汉别设备,即用GUID标识设备,调用方法为:CDeviceInterfaceClassDevClass(pClassGuid,pError)此申明定义由pClassGuid指向的GUID初始化的一个设备接口类对象DevClass。CDeviceInterfaceDevInterfaee(&DevClass,instance,pError):此申明定义一个设备接口对象DevInterface。hDevice=CreateFile(DevInterfaee.DevicePath0,GENERIC_READIGENERIC—WRITE,FILE—SHARE_READIFILESHAREWRITE,NUI,L,OPEN_EXISTING,FILE_ATTRIBUTE_NOMAL,NULLl:如果采用符号链接方式识别设备,即用符号链接名识别设备,调用方法为:char+m_sLinkName=\\\\.\kADCARDDevice0://本设备符号链接名hDevice=CreateFile(m_sLinkName,GENERIC_READIGENERIC—WRITE,FILE_SHARE_READrFILE—SHARE_WRITE,NULL.OPENEXISTING,0,NULL);一旦获得了设备的有效句柄,就可以调用Wirl.?2豳数来产生对应于此设备58 武汉理工大学硕十学位论文的相应irD。2、关闭~个设备WDM允许多个应用程序打开同一个设备,它为每个应用程序创建一个设备对象。当其中一个应用程序调用CloseHandl“)函数,驱动程序首先收到“清除”IRP,然后在清除例程中清除和此设备对象有关的待处理的IRP,最后收到“关闭”IRP,关闭例程关闭设备对象。3、DevieeloControl0函数的调用对于DevieeloControl0函数的调用,驱动程序根据I/O控制命令来决定浚如何获取应用程序的缓冲器地址。I/O控制命令中的数据访问方式有四种:METHODBUFFERED,METHOD—IN—DIRECT,METHOD—OUTD1RECT和METHODNElTHER。(1)如果控制命令定义为MATHODBUFFERED,系统分配⋯个缓冲区用于输入和输出,该缓冲区的字节数为应用程序的输入和输出缓冲区的最大字节数。驱动程序必须先拷贝输入数据,然后再复制输出数据。驱动程序通过Kirp::loctlBuffer获得缓冲区的地址。对于输出,驱动程序必须将存储字节数赋给IRF.InformationO。完成后,I/O管理器将数据从系统缓冲区复制到应用程序的数据缓冲区。(2)如果I/O控制命令定义为METHODINDIRECT和METHOD_OUT_DIRECT,那么地址参数具有不同的含义。输入缓冲区被复制到一个系统缓冲区,驱动程序可用Kirp::loctlBuffer访问这个缓冲区。输出缓冲区被类Kmemory对象映射,驱动程序可用Kirp::Mdl访问这个缓冲区。本设计中采用METHODINDIRECT和METHODOUTDIRECT方式。如下是读Base0的主要代码:KMemoffMem(1.MdlO);//usethememolyobject//tocreateapointertothecaller’SbufferPULONGpOutBuffer=(PULONG)Mem.MapToSystemSpace0;PULONGplnBuffer=(PULONG)I.10ctlBuffer0;ULONGOffset=0,count;Offset=-’pInBuffer:count=+(plnBuffer+1);m_MemoryRangeForBasel.ind(Offset,pOutBuffer,cotmt):59 武汉理工大学硕士学位论文4。6.2-喇对应用藿序构通信WDM支持使用Win32事件对Win32应用程序通信。应用程序仓口建~个事件后,可以直接将事件旬柄传递给WDM,然后等待WDM发送事件消息,WDM驱动程序获取这个事件的一个对象指针后只能在

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭