论文部分内容阅读
摘要:本文介绍了如何利用USB接口为H.264解码器FPGA验证平台提供文件下载功能,并根据H.264解码器的特点分别从硬件设计、FPGA固件设计、USB驱动程序设计和USB应用程序设计四个方面对该系统的结构和功能进行了阐述。
关键词:H.264;FPGA;USB
引言
H.264是ITU2T的视频编码专家组(VCEG)和ISO/IEC的活动图像编码专家组(MPEG)联合制定的一种新的数字视频编码标准。它优异的压缩性能将在数字电视广播、视频实时通信、网络视频流媒体传递以及多媒短信等各个方面发挥重要作用。因此,设计符合H.264标准的芯片将是大势所趋。
H.264解码器芯片的FPGA验证平台要求将待解码的视频数据从PC机下载到H.264解码器验证板上供解码之用,由于下载的数据量大而且要求下载的速度快,串口显然是无法胜任的。另外,为了减少开发成本和增加系统的灵活性,不采用直接将所有数据下载到验证板上的方案,而是要求数据实时的下载供H.264解码器解码。笔者为H.264解码器的FPGA验证平台提出了一种USB下载方案,并在Xilinx公司的FPGA xc3s5000上实现。
硬件设计
USB接口芯片选择
本系统采用了Philips公司的一款带并行总线、支持D M A传输的U S B接口芯片PDIUSBDl2,它符合USBl.1版规范,可与任何外部微控制器或微处理器实现高速并行接口(2MB/s);主端点的双缓冲区配置增加了数据吞吐量并轻松实现实时传输;采用GoodLink技术的连接指示器,根据通信的状况会有不同的指示,易于诊断设备的故障;外围接口电路简单。PDIUSBDl2的这些特点满足了H.264解码器验证平台所要求的速度要求,并且使用该接口器件易于调试,可大大缩短开发周期。
USR接口硬件电路
FPGA与PDIUSBDl2的连接电路与51单片机与PDIUSBDl2(以下简称D12)的接法类似,如图1所示,但有几点需要注意:(1)FPGA的IO口电压范围一般是0--3.3V,应采用D12的3,3V接法,即:将D12的Vcc和Vout3.3脚同时接到3.3V电压,如下图所示。(2)D12有两种供电方式:总线供电和自供电方式。前者的最大电流为500mA,但这是在配置以后才有的,在设备配置前设备只能获得最大100mA的电流,也就是说在配置总线前设备的电流要控制在100mA内。考虑到H.264解码器验证平台的器件较多,并且为了以后扩展方便,采用后者即自供电方式。采用自供电方式时需要注意的是:自供电电源要与USB总线共地,EOT脚通过电阻连接到Vbus上,使用EOT来检测USB总线是否连接上,同时也保证了设备不会通过USB口向Vbus输出电流。
软件设计
H.264解码器从比特流中提取数据的方法
H.264协议中用描述子定义了从比特流中提取句法元素的方法,描述子是句法元素的解码算法,每个句法元素都有相应得描述子。H.264定义了的描述子有:ae(v)、b(8)、ce(v)、f(n)、i(n),i(v)、me(v)、se(V)、te(V)、u(n)/u(V)、ue(v)。可以看到,描述子都在括号中带有一个参数,这个参数表示需要提取的比特数。当参数是n时,表明调用这个描述子的时候会指明n的值,也即该句法元素是定长编码的。当参数是v时,对应的句法元素是变长编码,这时有两种情况:i(v)和u(v)两个描述子的v由以前的句法元素指定,也就是说在前面会有句法元素指定当前句法元素的比特长度,除了这两个描述子外,其他描述子都是熵编码,它们的解码算法本身能够确定当前句法元素的比特长度。

由上可知,H.264解码器从比特流中提取数据的长度是不固定的,为了保证H.264解码器能够流畅的从比特流中提取数据,我们需要建立一个合适大小的缓冲区,将从PC机发送来的比特流放在该缓冲区内,并且始终保证该缓冲区有一定量的数据存在。
USB下载程序流程
为了保证H.264解码器的缓冲区内始终有一定量的数据可用,采取的解决方案如图2所示。左半部分是PC机的工作流程图,右半部分是FPGA的工作流程图。PC机首先对USB设备进行枚举操作,枚举成功后,开始通过管道2I~ipe2)向D12的端点2发送数据,然后再读取从FPGA返回的数据,若PC机收到的数据是FF,则继续发送;若不是,则进行循环读设备操作,直到所读取的数据为FF才继续向设备发送数据。FPGA首先对PC机发来的枚举命令进行响应,枚举成功后,判断H.264解码器的两个缓冲区(这里使用两个缓冲区是为了将下载数据的接收和H.264解码器对数据的提取两个部分分隔开,使两者互不影响)是否均为满,若均为满,则发00到PC机,用来通知PC机暂时停止发送数据;若缓冲区1为空,则将从PC机接收来的数据放入缓冲区l,同时发FF到PC机;缓冲区2为空时同缓冲区1的处理类似。
FPGA固件开发
本系统FPGA固件部分可分为两大部分:USB_Core部分(图3中的虚线框内部分)、与H.264解码器的接口缓冲区部分(图3中除虚线框和H.264 Decoder之外的部分)。下面具体介绍各个部分。
·FPGAMemory D12模块
该模块是FPGA内部的一块Bl o ckMemory,分为三个区域:D l 2_buffer;DeviceDescr,ConfigDescr,InterfaceDescr,EndpointDescr;Top_buffer。第一块区域D12_buffer用作D12_CmdHandle模块的读写缓冲区;第二块区域用来存放D12的属性信息,包括:设备描述符DeviceDescr、配置描述符ConfigDescr、接口描述符InterfaceDescr和端点描述符EndpointDe scr。第三块区域用作U S B—t o p模块的数据读/写缓冲区。Initialize USB、USB_top、D12_CmdHandle三个模块通过一个三选一数据选择器MUX3分时复用该模块。
·Initialize_USB模块
该模块负责在程序刚开始的时候将D12的属性信息写到FPGAMemory_D12内部,供枚举之用。
·D12_CmdHandle模块
该模块负责实现对D12的读写操作,对D12的读写操作有3种基本类型命令:初始化、数据流和普通命令。该模块为上层的USB_top模块提供命令接口,对USB_top模块发来的命令进行处理,并将结果返回给USB_top模块。需 要注意的是该模块工作的时钟是经过分频之后的时钟,频率低于2Mhz。这主要是为了满足D12的读写时序要求(D12的读和写周期不能小于500ns)。
·USB_top模块
该模块是整个USB_Core部分的核心模块。开始时,它调用Initialize USB模块将D12的属性信息写入FPGAMemory D12中;然后,处理PC机发来的中断,调用D12 CmdHandle模块对D12进行读写操作;另外还包含了对USB标准请求和厂商请求的处理。同时它还为与H.264解码器的接口缓冲区部分提供了接口,将缓冲区的满空情况传送给PC机来控制PC机对数据的发送或停止。
·FPGAMemory_l和FPGAMemory_2模块
该两个模块是FPGA内部两个大小相同的Block Memory,它们用作H.264解码器(H.264_Decoder)的数据缓冲区。当这两个缓冲区中的任何一个为空时,就将PC机通过USB口发来的数据放入该缓冲区;当两个缓冲区均为满时,通过将停止命令写入D12缓冲区然后PC机进行读设备操作的方法使PC机暂停数据发送,其中两个缓冲区的使用数据选择器MUX2进行切换。H.264解码器则是顺序从这两个缓冲区读数据,当读完一个缓冲区的数据时,通过数据选择器MUX2切换到另一个缓冲区,同时将该缓冲区空满标志位置为空标志。
主机端软件部分的设计
图1、图2
USB驱动程序
WIN98/2000/XP的驱动程序与以往的直接跟硬件打交道的WIN95的VXD方式的驱动程序不同。它是WDM(windows Driver Model)类型的。开发驱动程序的传统方法是使用Microsoft公司提供的Windows DDK,但使用其开发USB驱动是十分的复杂的,笔者使用了驱动程序的快速开发工具DriverStudio,该软件能自动生成WDM程序的框架,一般都已经包括了标准的请求的建立,我们所需要做的仅仅是加上厂商请求的建立。
在调试usB驱动时,我们可以使用DriverStudio的SoftlCE软件进行驱动程序的调试。SoftlCE结合了硬件调试器的强大功能和符号调试器的易用性,能够显示程序的源代码,并允许通过符号名访问局部和全局的数据。
USB应用程序
USB应用程序通过USB驱动程序实现对设备的访问,编写USB应用程序必须符合USB驱动程序定义的接口规范。一般说来使用Driver Wizard生成一个驱动程序后,会同时生成一个*ioctl.h的文件,这个文件是建立软件和驱动之间的通信的桥梁,它定义了访问驱动程序的接口,在编写USB应用程序的时候需要将其引用进去。
USB应用程序的编写使用VC编译环境下的API函数实现。程序中主要用到两个API函数:CreateFile()和DeviceloControl()。首先查找设备,打开设备的句柄:调用Win32函数CreatFile()得到设备驱动程序的句柄。然后进行读写和控制操作:调用win 3 2函数D eVi c eIoCont rol()通过得到的句柄把IOControlCode和相关的输入输出缓冲区提交给驱动程序。最后关闭设备句柄:当退出用户程序时,用CloseHandle()关闭设备。
结语
该USB下载系统已经在Xilinx公司的FPGA xc3s5000上实现,成功地应用于H.264解码器验证平台。该模块共占用1079个Slice、541个Slice触发器、1968个4输入LUT。通过对该模块的进一步优化,可将其作为IP Core嵌入到H.264解码器芯片中,进一步增强芯片的功能。
1.刘韬,楼兴华.FPGA数字电子系统设计与开发实例导航.人民邮电出版社,2005年1月
2.周立功等.PDIUSBDl 2 USB固件编程与驱动开发.北京航空航天大学出版社,2005年5月
3.毕厚杰.新一代视频压缩编码标准一一H.264/AVC.人民邮电出版社,2005年11月
4.PhiIip s SemicOnducto r.PDIUSBD 1 2USB interface device with par-allel bus datasheet.1 999 Jan 08
5.武安河.Windows 2000/×P WDM设备驱动程序开发.电子工业出版社,2005年5月
关键词:H.264;FPGA;USB
引言
H.264是ITU2T的视频编码专家组(VCEG)和ISO/IEC的活动图像编码专家组(MPEG)联合制定的一种新的数字视频编码标准。它优异的压缩性能将在数字电视广播、视频实时通信、网络视频流媒体传递以及多媒短信等各个方面发挥重要作用。因此,设计符合H.264标准的芯片将是大势所趋。
H.264解码器芯片的FPGA验证平台要求将待解码的视频数据从PC机下载到H.264解码器验证板上供解码之用,由于下载的数据量大而且要求下载的速度快,串口显然是无法胜任的。另外,为了减少开发成本和增加系统的灵活性,不采用直接将所有数据下载到验证板上的方案,而是要求数据实时的下载供H.264解码器解码。笔者为H.264解码器的FPGA验证平台提出了一种USB下载方案,并在Xilinx公司的FPGA xc3s5000上实现。
硬件设计
USB接口芯片选择
本系统采用了Philips公司的一款带并行总线、支持D M A传输的U S B接口芯片PDIUSBDl2,它符合USBl.1版规范,可与任何外部微控制器或微处理器实现高速并行接口(2MB/s);主端点的双缓冲区配置增加了数据吞吐量并轻松实现实时传输;采用GoodLink技术的连接指示器,根据通信的状况会有不同的指示,易于诊断设备的故障;外围接口电路简单。PDIUSBDl2的这些特点满足了H.264解码器验证平台所要求的速度要求,并且使用该接口器件易于调试,可大大缩短开发周期。
USR接口硬件电路
FPGA与PDIUSBDl2的连接电路与51单片机与PDIUSBDl2(以下简称D12)的接法类似,如图1所示,但有几点需要注意:(1)FPGA的IO口电压范围一般是0--3.3V,应采用D12的3,3V接法,即:将D12的Vcc和Vout3.3脚同时接到3.3V电压,如下图所示。(2)D12有两种供电方式:总线供电和自供电方式。前者的最大电流为500mA,但这是在配置以后才有的,在设备配置前设备只能获得最大100mA的电流,也就是说在配置总线前设备的电流要控制在100mA内。考虑到H.264解码器验证平台的器件较多,并且为了以后扩展方便,采用后者即自供电方式。采用自供电方式时需要注意的是:自供电电源要与USB总线共地,EOT脚通过电阻连接到Vbus上,使用EOT来检测USB总线是否连接上,同时也保证了设备不会通过USB口向Vbus输出电流。
软件设计
H.264解码器从比特流中提取数据的方法
H.264协议中用描述子定义了从比特流中提取句法元素的方法,描述子是句法元素的解码算法,每个句法元素都有相应得描述子。H.264定义了的描述子有:ae(v)、b(8)、ce(v)、f(n)、i(n),i(v)、me(v)、se(V)、te(V)、u(n)/u(V)、ue(v)。可以看到,描述子都在括号中带有一个参数,这个参数表示需要提取的比特数。当参数是n时,表明调用这个描述子的时候会指明n的值,也即该句法元素是定长编码的。当参数是v时,对应的句法元素是变长编码,这时有两种情况:i(v)和u(v)两个描述子的v由以前的句法元素指定,也就是说在前面会有句法元素指定当前句法元素的比特长度,除了这两个描述子外,其他描述子都是熵编码,它们的解码算法本身能够确定当前句法元素的比特长度。

由上可知,H.264解码器从比特流中提取数据的长度是不固定的,为了保证H.264解码器能够流畅的从比特流中提取数据,我们需要建立一个合适大小的缓冲区,将从PC机发送来的比特流放在该缓冲区内,并且始终保证该缓冲区有一定量的数据存在。
USB下载程序流程
为了保证H.264解码器的缓冲区内始终有一定量的数据可用,采取的解决方案如图2所示。左半部分是PC机的工作流程图,右半部分是FPGA的工作流程图。PC机首先对USB设备进行枚举操作,枚举成功后,开始通过管道2I~ipe2)向D12的端点2发送数据,然后再读取从FPGA返回的数据,若PC机收到的数据是FF,则继续发送;若不是,则进行循环读设备操作,直到所读取的数据为FF才继续向设备发送数据。FPGA首先对PC机发来的枚举命令进行响应,枚举成功后,判断H.264解码器的两个缓冲区(这里使用两个缓冲区是为了将下载数据的接收和H.264解码器对数据的提取两个部分分隔开,使两者互不影响)是否均为满,若均为满,则发00到PC机,用来通知PC机暂时停止发送数据;若缓冲区1为空,则将从PC机接收来的数据放入缓冲区l,同时发FF到PC机;缓冲区2为空时同缓冲区1的处理类似。
FPGA固件开发
本系统FPGA固件部分可分为两大部分:USB_Core部分(图3中的虚线框内部分)、与H.264解码器的接口缓冲区部分(图3中除虚线框和H.264 Decoder之外的部分)。下面具体介绍各个部分。
·FPGAMemory D12模块
该模块是FPGA内部的一块Bl o ckMemory,分为三个区域:D l 2_buffer;DeviceDescr,ConfigDescr,InterfaceDescr,EndpointDescr;Top_buffer。第一块区域D12_buffer用作D12_CmdHandle模块的读写缓冲区;第二块区域用来存放D12的属性信息,包括:设备描述符DeviceDescr、配置描述符ConfigDescr、接口描述符InterfaceDescr和端点描述符EndpointDe scr。第三块区域用作U S B—t o p模块的数据读/写缓冲区。Initialize USB、USB_top、D12_CmdHandle三个模块通过一个三选一数据选择器MUX3分时复用该模块。
·Initialize_USB模块
该模块负责在程序刚开始的时候将D12的属性信息写到FPGAMemory_D12内部,供枚举之用。
·D12_CmdHandle模块
该模块负责实现对D12的读写操作,对D12的读写操作有3种基本类型命令:初始化、数据流和普通命令。该模块为上层的USB_top模块提供命令接口,对USB_top模块发来的命令进行处理,并将结果返回给USB_top模块。需 要注意的是该模块工作的时钟是经过分频之后的时钟,频率低于2Mhz。这主要是为了满足D12的读写时序要求(D12的读和写周期不能小于500ns)。
·USB_top模块
该模块是整个USB_Core部分的核心模块。开始时,它调用Initialize USB模块将D12的属性信息写入FPGAMemory D12中;然后,处理PC机发来的中断,调用D12 CmdHandle模块对D12进行读写操作;另外还包含了对USB标准请求和厂商请求的处理。同时它还为与H.264解码器的接口缓冲区部分提供了接口,将缓冲区的满空情况传送给PC机来控制PC机对数据的发送或停止。
·FPGAMemory_l和FPGAMemory_2模块
该两个模块是FPGA内部两个大小相同的Block Memory,它们用作H.264解码器(H.264_Decoder)的数据缓冲区。当这两个缓冲区中的任何一个为空时,就将PC机通过USB口发来的数据放入该缓冲区;当两个缓冲区均为满时,通过将停止命令写入D12缓冲区然后PC机进行读设备操作的方法使PC机暂停数据发送,其中两个缓冲区的使用数据选择器MUX2进行切换。H.264解码器则是顺序从这两个缓冲区读数据,当读完一个缓冲区的数据时,通过数据选择器MUX2切换到另一个缓冲区,同时将该缓冲区空满标志位置为空标志。
主机端软件部分的设计
图1、图2
USB驱动程序
WIN98/2000/XP的驱动程序与以往的直接跟硬件打交道的WIN95的VXD方式的驱动程序不同。它是WDM(windows Driver Model)类型的。开发驱动程序的传统方法是使用Microsoft公司提供的Windows DDK,但使用其开发USB驱动是十分的复杂的,笔者使用了驱动程序的快速开发工具DriverStudio,该软件能自动生成WDM程序的框架,一般都已经包括了标准的请求的建立,我们所需要做的仅仅是加上厂商请求的建立。
在调试usB驱动时,我们可以使用DriverStudio的SoftlCE软件进行驱动程序的调试。SoftlCE结合了硬件调试器的强大功能和符号调试器的易用性,能够显示程序的源代码,并允许通过符号名访问局部和全局的数据。
USB应用程序
USB应用程序通过USB驱动程序实现对设备的访问,编写USB应用程序必须符合USB驱动程序定义的接口规范。一般说来使用Driver Wizard生成一个驱动程序后,会同时生成一个*ioctl.h的文件,这个文件是建立软件和驱动之间的通信的桥梁,它定义了访问驱动程序的接口,在编写USB应用程序的时候需要将其引用进去。
USB应用程序的编写使用VC编译环境下的API函数实现。程序中主要用到两个API函数:CreateFile()和DeviceloControl()。首先查找设备,打开设备的句柄:调用Win32函数CreatFile()得到设备驱动程序的句柄。然后进行读写和控制操作:调用win 3 2函数D eVi c eIoCont rol()通过得到的句柄把IOControlCode和相关的输入输出缓冲区提交给驱动程序。最后关闭设备句柄:当退出用户程序时,用CloseHandle()关闭设备。
结语
该USB下载系统已经在Xilinx公司的FPGA xc3s5000上实现,成功地应用于H.264解码器验证平台。该模块共占用1079个Slice、541个Slice触发器、1968个4输入LUT。通过对该模块的进一步优化,可将其作为IP Core嵌入到H.264解码器芯片中,进一步增强芯片的功能。
1.刘韬,楼兴华.FPGA数字电子系统设计与开发实例导航.人民邮电出版社,2005年1月
2.周立功等.PDIUSBDl 2 USB固件编程与驱动开发.北京航空航天大学出版社,2005年5月
3.毕厚杰.新一代视频压缩编码标准一一H.264/AVC.人民邮电出版社,2005年11月
4.PhiIip s SemicOnducto r.PDIUSBD 1 2USB interface device with par-allel bus datasheet.1 999 Jan 08
5.武安河.Windows 2000/×P WDM设备驱动程序开发.电子工业出版社,2005年5月