基于FPGA技术实现USB通信软件毕业设计Word下载.docx
《基于FPGA技术实现USB通信软件毕业设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于FPGA技术实现USB通信软件毕业设计Word下载.docx(21页珍藏版)》请在冰豆网上搜索。
所面临的主要问题是,速度仍然不够快,USB1.1版的最高速度为12Mbps,因此当连接设备多了时,带宽共享导致每个设备得到的有效带宽太小。
所以USB所应用的范围仍然很窄,针对于这些缺点,经过改进的USB2.0规范诞生了。
1999年初在Intel的开发者论坛大会上,与会者介绍了USB2.0规范,该规范的支持者除了原有的Intel、Microsoft和NEC等成员外,还有惠普、朗讯和飞利浦三个新成员。
1999年10月,正式制定了USB2.0通用串行总线规范,2001年11月Comdex展览上,基于USB2.0的外设产品系统如USB2.0界面扩充卡、外接式硬盘、外接式刻录机等产品开始出现。
随着时间的推移,USB已成为PC的标准配置。
基于USB的外设越来越多,现在可以直接使用WindowsME默认驱动的外设就有:
调制解调器,键盘,鼠标,光驱,数码相机,活动硬盘,手柄,软驱,扫描仪等,而非独立性I/O连接的外设将日渐减少。
即主机控制式外设减少,智能软件控制的外设增多。
1.2国内外相关研究状况
2008年11月18日,由Intel、微软、惠普、德州仪器、NEC、ST-NXP等业界巨头组成的USB3.0PromoterGroup宣布,该组织负责制定的新一代USB3.0标准已经正式完成并公开发布。
新规范提供了十倍于USB2.0的传输速度和更高的节能效率,可广泛用于PC外围设备和消费电子产品。
制定完成的USB3.0标准已经移交给该规范的管理组织USBImplementersForum(简称USB-IF)。
该组织将与硬件厂商合作,共同开发支持USB3.0标准的新硬件,不过实际产品上市还要等一段时间。
第一版USB1.0是在1996年出现的,速度只有1.5Mb/s;
两年后升级为USB1.1,速度也大大提升到12Mb/s,至今在部分旧设备上还能看到这种标准的接口;
2000年4月,目前广泛使用的USB2.0推出,速度达到了480Mb/s,是USB1.1的四十倍;
如今八个半年头过去了,USB2.0的速度早已经无法满足应用需要,USB3.0也就应运而生,最大传输带宽高达5.0Gb/s,也就是625MB/s,同时在使用A型的接口时向下兼容。
IEEE组织最近也批准了新规范IEEE1394-2008,不过新版FireWire的传输速度只有3.2Gb/s,相当于USB3.0的60%多一点。
难怪苹果等业界厂商普遍对该技术失去了兴趣。
USB2.0基于半双工二线制总线,只能提供单向数据流传输,而USB3.0采用了对偶单纯形四线制差分信号线,故而支持双向并发数据流传输,这也是新规范速度猛增的关键原因。
除此之外,USB3.0还引入了新的电源管理机制,支持待机、休眠和暂停等状态。
测量仪器大厂泰克(Tektronix)在上个月第一家宣布了用于USB3.0的测试工具,可以帮助开发人员验证新规范与硬件设计之间的兼容性。
USB3.0在实际设备应用中将被称为“USBSuperSpeed”,顺应此前的USB1.1FullSpeed和USB2.0HighSpeed。
预计支持新规范的商用控制器将在2009年下半年面世,消费级产品则有望在2010年上市。
1.3USB的特点
USB总线与传统的外围总线接口相比,主要有以下一些特点:
(1)传输速度快:
USB有低速(Low-Speed)、全速(Full-Speed)和高速(High-Speed)三种传输模式,传输速率分别为1.5Mbps、12Mbps和480Mbps,可以灵活选择以适应各种不同类型外设的需求。
(2)安装配置简单快捷:
USB设备支持即插即用(PlugandPlay)和热插拔(HotPlug)功能。
USB连接器将各种各样的外设I/O端口合而为一,使之可热插拔,并具有自动配置能力。
在电脑正常工作时,用户只要简单地将外设插入到PC的USB总线上,PC就能自动识别所连接的是什么设备,并动态的加载驱动程序,而无须关机断电或重新启动,打开机箱等操作,实现真正的即插即用。
(3)供电方式灵活,总线结构简单
USB总线自身能够提供5V电压,最大500mA电流。
同时,也可以由外部供电,或使用两种供电方式的组合,并且支持挂起和唤醒模式。
总线结构简单,信号定义仅由2条电源线,2条信号线组成。
(4)良好的兼容性:
USB接口标准有良好的向下兼容性,例如USB2.0就能很好的兼容USB1.1的外设。
系统会自动侦测外设接口的版本,并自动选择传输速度。
(5)使用和扩展灵活:
为了适应各种不同类型外设的要求,USB提供了四种不同的数据传输模式。
增加外设时无需在PC内添加接口卡,多个USB集线器可相互传送数据,使PC可以用全新的方式控制外设。
使用USBHub可以同时连接多达127个外设。
(6)广泛的应用
1.4系统软件设计要求
(1)通过大规模可编程芯片FPGA完成对数据的实时处理、并进行转换,以便进行数据传输。
(2)编写下载到USB芯片中的固件程序,完成对电路时序的控制,实现数据从硬件电路到计算机之间的传输。
(3)开发在Windows下的驱动程序和应用程序,完成数据的存储、分析及显示等功能。
1.5系统基本方案
系统确定的基本方案:
PC主机控制程序与USB接口模块进行通信,并通过USB接口模块控制FPGA进行语音的采集、存储、回放。
系统框图如图1_5-1所示:
图1_5-1系统框图
1.6软件设计主要内容
本系统软件主要由以下四个部分组成:
(1)PC主机应用程序设计
(2)USB接口模块WINDOWS驱动程序设计
(3)USB接口模块固件设计
(4)FPGA模块语音采集,存储,回放控制程序设计
第二章软件实现方案选择论证
2.1PC主机应用程序设计实现方案
方案一:
采用VisualBasic编程
VB是VisualBasic,是微软的比尔盖茨发明的,专为编程初学者设计,界面友好。
但VB是不够完全的面向对象编程工具,属本地编译语言,其效率相对VC低了很多。
方案二:
采用VisualC++编程
VC++是在Windows平台下构建32位应用程序的强大而有复杂的开发工具,是目前世界上使用最多的开发工具之一。
VC++的应用非常广泛,从桌面应用程序到服务器端软件,从系统软件到应用软件,从单机程序到分布式应用程序,VC++无所不在。
VC++是完全面向对象的编程工具,VC++效率高,封装性好,继承性高。
掌握VC++编程,对于电子专业人员而言也是非常必要的。
综上,选择方案二。
2.2WINDOWS下USB设备驱动程序的设计实现方案
采用DDK进行驱动程序开发
DDK是DeviceDevelopmentKit——设备开发包,是由微软提供的专业的设备驱动程序开发包,里面有很多驱动程序开发的例子。
但对于刚接触USB设备驱动程序开发的人员而言,有点博大精深。
采用DriverStudio进行驱动程序开发
DriverStudio是Numega公司提供的驱动程序开发工具,它提供对USB总线的封装,大大简化了对USB总线的操作接口。
DriverStudio中的DriverWorks软件为开发WDM程序提供了一个完整的框架,相比于DDK驱动程序的开发会比较简单。
综上,采用方案二。
2.3USB设备固件设计实现方案
采用汇编语言进行固件程序开发
汇编语言有执行效率高的优点,但其可移植性和可读性差,以及它本身就是一种编程,效率低下的低级语言,这些都使它的编程和维护极不方便,从而导致整个系统的可靠性也较差。
采用C语言进行固件程序开发
使用C语言进行嵌入式系统的开发,有着汇编语言编程不可比拟的优势。
其优势主要是:
编程调试灵活方便,生成的代码编译效率高,完全模块化,可移植性好,便于项目维护管理等。
2.4FPGA程序设计实现方案
采用Verilog语言进行开发
产业界Verilog比较流行,其语法比较自由。
VerilogHDL推出已经有20年了,拥有广泛的设计群体,成熟的资源也比VHDL丰富。
Verilog更大的一个优势是:
它非常容易掌握,只要有C语言的编程基础,通过比较短的时间,经过一些实际的操作,可以在2~3个月内掌握这种设计技术
采用VHDL语言进行开发
目前,高校教学主要采用VHDL,其语法比较严谨。
VHDL语言具有很强的电路描述和建模能力,能从多个层次对数字系统进行建模和描述,从而大大简化了硬件设计任务,提高了设计效率和可靠性。
VHDL具有与具体硬件电路无关和雨设计平台无关的特性,并且具有良好的电路行为描述和系统描述的能力,并在语言易读性和层次化、结构化方面,表现了强大的生命力和应用潜力。
本人对VHDL语法与设计流程也比较熟悉,固以VHDL为首选。
第三章PC主机应用程序设计
3.1开发环境VC++6.0简介
本设计应用程序的开发采用VC++6.0,VC++是在Windows平台下构建32位应用程序的强大而有复杂的开发工具,VC++是微软公司开发的一个IDE(集成开发环境),是目前世界上使用最多的开发工具之一。
VC++应用程序的开发主要有两种模式,一种是WINAPI方式,另一种则是MFC方式,传统的WINAPI开发方式比较繁琐,而MFC则是对WINAPI再次封装。
3.2API函数简介
API——ApplicationProgrammingInterface(应用程序接口)函数,这些函数是Windows提供给应用程序编程的接口,也就是系统提供的函数,主要的函数都在Windows.h头文件中进行了声明。
Windows操作系统提供了1000多种的API函数,API函数名大都是有意义的单词的组合,每个单词的首字母大写,这些函数的准确拼写与调用语法都可以再MSDN中查找到。
3.3应用程序控制界面设计
本系统控制界面设计如图3_3-1所示:
图3_3-1语音采集与回放系统控制界面
3.4应用程序设计
在Win32系统中,把每一个设备都抽象为文件,此时的应用程序只需通过几条简单的文件操作API函数,就可以实现与驱动程序中某个设备通信。
一个驱动程序可以驱动多个设备,并且此驱动程序可能为Windows系统中已有的,也可能为用户安装的。
通常,这些Win32API函数有以下几种:
CreateFile函数.打开一个设备,返回一个与设备相关的句柄。
该函数的声明形势如下:
HANDLECreateFile(
LPCTSTRlpFileName,//要打开的设备名
DWORDdwDesiredAccess,//访问模式
DWORDdwShareMode,//共享模式
LPSECURITY_ATTRIBUTESlpSecurityAttributes,//通常为NULL
DOWRDdwCreationDistribution,//创建方式
DOWRDdwFlagsAndAttributes,//文件属性和标志
HANDLEhTemplateFile//临时文件的句柄,通常为NULL
);
如果调用成功,该函数返回打开设备的句柄。
ReadFile函数。
从设备中读取数据,该函数的声明形式如下:
BOOLReadFile(
HANDLEhCom,//设备句柄
LPVOIDlpBuffer,//指向接收缓冲区的指针
DWORDnNumberOfByteToRead,//指向所要读的字节数
LPWORDlpNumberOfBytesRead,//指向调用该函数读出的字节数
LPOVERLAPPEDlpOverlapped//异步结构
WriteFile函数,向设备写数据,该函数声明形式如下:
BOOLWriteFile(
HANDLEhCom,//设备句柄
LPCVOIDlpBuffer,//指向读数据缓冲区
DWORDnNUMBEROfBytesToWrite,//所读的字节数
LPDWORDlpNumberOfBytesWritten,//指向已读入的字节数
其中,参数hCom为CreateFile函数所打开的串口句柄。
(4)DeviceControl函数。
对设备进行一些自定义的操作,比如更改设备等。
该函数的声明形式如下:
BOOLDeviceControl(
HANDLEhDevie,//设备句柄
DWORDdwIoControlCode,//所要执行的操作命令码
LPVOIDlpInBuffer,//输入缓冲区
DWORDnInBufferSize,//输入缓冲区空间大小
LPVOIDlpOutBuffer,//接收缓冲区
DWORDnOutBufferSize,//接收缓冲区空间
LPDWORDlpBytesReturned,//实际所需接收数据个数
其中,参数hDevice为CreateFile函数所打开的串口句柄。
(5)CloseFile函数,关闭一个由CreateFile打开的设备。
该函数声明形式如下:
BOOLCloseHandle(HANDLEhCom);
其中,参数hCom为CreateFile函数多所打开的串口句柄。
这些函数的执行,都对应着驱动程序的一些分发例程。
表3_4-1是常用API函数和驱动程序的IRP对应关系表。
表3_4-1常用API函数和驱动程序的IRP对应关系
API函数
IRP
说明
CreateFile
IRP_MJ_CREATE
打开设备
ReadFile
IRP_MJ_READ
从设备获取数据
WriteFile
IRP_MJ_WRITE
向设备发送数据
CloseFile
IRP_MJ_CLOSE
关闭设备
DeviceIoControl
IRP_MJ_DEVICE_CONTROL
控制操作
3.4.1查找设备
利用CreateFile函数打开一个串口,通常可用以下程序实现:
HANDLEhCom
HCOM=CreateFile(“COM1”,//设备名
GENERIC_READ|GENERIC_WRITE,//允许读和写
0,//独占方式
NULL,
OPEN_EXISTING,//打开而不是创建
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,//重叠方式
NULL
(1)获取设备信息
一个应用程序与某个设备的驱动程序通信前,一定要获取此设备的独特标识符(GUID)。
GUID是一个128位的值,它表征了唯一一个设备对象。
在实际开发中,可以在编写设备驱动程序时获得该设备的GUID,也可以通过API函数调用获得。
可以调用Windows设备管理函数SetupDiGetClassDevs来获取的信息集。
该函数的声明如下:
HDEVINFOSetupDiGetClassDevs(
INLPGUIDClassGuid,OPTIONAL
INPCTSTREnumerator,OPTIONAL
INHWNDHwndParent,OPTIONAL
INDWORDFlags
(2)识别接口信息
SetupDiEnumDeviceInterface函数返回设备信息集的一个设备接口元素的环境结构,每次调用该函数返回一个设备接口的信息。
可以重复调用此函数,直至获取了设备信息集中所有的设备的接口信息。
BOOLEANSetupDiEnumDeviceInterface(
INHDEVINFODeviceInfoSet,
INPSP_DEVINFO_DATADeviceInfoData,OPTIONAL
INLPGUIDInterfaceCalssGuid,
INDWORDMemberIndex,
OUTPSSP_DEVICE_INTERFACE_DATADeviceInterfaceData);
(3)获得设备路径名
在调用上一个函数SetupDiEnumDeviceInterface时,获得了一个DeviceInfoData结构。
该结构指向标识一个请求设备的接口。
为了得到该接口的详细信息,可以通过调用函数SetupDiEnumDeviceInterfaceDetail来实现。
此时,返回该接口的详细信息中包含了设备接口的名称。
用户的首要任务就得到解决。
SetupDiEnumDeviceInterfaceDetail函数的声明如下:
BOOLEAN
SetupDiEnumDeviceInterfaceDetail(
INHDDEVINFODeviceInfoSet,
INPSP_DEVICE_INTERFACE_DATADeviceInterfaceData,
OUTPSP_DEVICE_INTERFACE_DETAIL_DATADeviceInterfaceDetailDATA,
INDWORDDeviceInterfaceDetalDatasize,
OUTPDWORDRequirdSize,
OUTPSP_DEVINFO_DATADeviceInfoData);
3.4.2打开设备
有了打开设备的路径名,下一步的任务就是打开该设备,获得这个设备的句柄。
如前所述,打开一个设备是通过调用API函数CreateFile来实现的。
当需要与所打开的USB设备通信时,还必须打开相应的USB端口。
3.4.3读写USB设备
对于应用程序来说,读写USB端口与读写串口并无什么的区别。
在用ReadFile和WriteFile读写USB设备时,既可以同步执行,也可异步执行。
在同步执行时,函数知道操作完成才返回。
这意味着在同步执行时线程会被阻塞,从而导致效率下降。
在异步执行时,即使操作还为完成,调用的函数也会立即返回。
费时的I/O操作在后台进行,这样线程就可以干别的事情。
ReadFile()函数和WriteFile()函数是否执行异步操作有CreateFile()函数决定的。
如果在调用CreateFile()创建句柄是指定了FILE_FLAG_OVERLAPPED标志,调用ReadFile()和WriteFile()对该句柄进行的读写操作可以是异步,如果未指定异步标志,则读写操作是同步。
异步操作结构声明如下:
typedefstruct_OVERLAPPED{
DWORDInternal,
DWORDInteralHigh,
DWORDOffset,
HANDLEhEvent,
}
OVERLAPPED;
3.4.4关闭通信
和关闭串口一样,关闭USB端口也是调用CloseHandle()函数来完成。
函数调用形式如下:
CloseHandle(hComn);
第四章USB接口模块驱动程序设计
本设计不属于Windows的标准设备,故要自己设计驱动程序。
USB的驱动开发是一个技术难点,也是一个技术核心。
Windows的驱动开发需要安装的开发软件有:
1)WinDDK
2)DriverStudio3.2
3)VC++6.0
4.1驱动程序开发
Windows环境下驱动程序共有三类:
一类是Vxd虚拟设备驱动程序,起源于Windows3.1时代,用于Windows95/98操作想系统中。
一类是KMD内核模式驱动程序,用于WindowsNT下。
还有一类是WDM—Win32驱动程序模型,是微软从Windows98开始,推出的一个新的驱动类型,它是一个跨平台的驱动程序模型,WDM驱动程序还可以在不修改源代码的情况下经过重新编译后在非Intel平台下运行。
WDM在NT