首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于FPGA的以太网音频广播系统,软硬件协同之二

基于FPGA的以太网音频广播系统,软硬件协同之二

4、方案论证:
设计思想:采用FGPA模块接收以太网传来的数字语音信号,并进行存储,再通过音频D/A转换器将数字信号转换为模拟信号在音响设备上进行播放。分为两个部分实现:语音信号采集与发送部分和信号接收与播放部分。①语音信号采集模块(编程实现)在PC机上进行,然后采用UDP传输方式以IP广播包方式通过以太网发送出去。②接收端是在FPGA开发板上实现语音数据包的接收,并将数据处理后送给音频解码芯片进行解码,转换成模拟信号进行播放。

方案论证:本系统采用服务器端和广播终端的架构,由音频流服务器采集、处理语音信号,通过以太网进行传输,然后由Spartan 3E作为广播终端来接收以太网传输的数据,并进行D/A转换处理后输送到播放设备。

服务器端的设计:服务器端在PC机上实现,主要完成语音数据的采集、存储和发送。其中,语音数据的采集和存储采用WAVE音频函数来实现。使用WAVE低级音频函数,可直接与音频驱动程序交互,通过窗口消息或回调函数来管理音频数据块的录入和存储,并提供了一个设备无关接口。在使用音频设备之前,必须打开设备驱动程序,确定系统音频设备的能力,用完之后必须关闭音频设备。具体流程如下:

①查询设备数目。使用waveInGetNumDevs函数来获取波形输入设备的个数。只有确定设备存在,才能打开、使用设备。

②打开波形输入设备。使用waveInOpen函数,该函数打开与指定设备ID相关联的设备,并以给出指定内存句柄的方法放回打开波形设备的句柄。需要在waveInOpen中指定的一个回调函数或者线程,其作用是在一个数据缓冲区被录满后被调用,以对这些数据进行处理,和其他一些相关的操作。

③准备音频数据块。在音频数据录入之前,必须准备好音频数据块。将数据块传送给设备驱动程序就可以开始录音了。使用waveInPerpareHeader函数为输入缓冲区准备头部,使用waveInAddBuffer函数添加一个输入用的数据缓冲区。在用完数据块后,必须用waveInUnprepareHeader函数来清除对音频数据块的准备。

④开始录音。使用waveInStart函数。

⑤停止录音,关闭设备。调用waveInReset和waveInClose函数。结束录音时,在waveInClose之前先调用waveInReset,以清除尚在等待录音的缓冲区。

录音过程中,若缓冲区已满,但录音还在继续,为防止语音数据丢失,就需要再加入一个缓冲区进去。考虑到添加缓冲区的处理是有时间延迟的,而音频对时间很敏感,所以要预先设置好至少两个数据缓冲区。当一个缓冲区满时,就调用另外一个,即可保证所录得的音频数据不会有断开的间隔。录制波形音频时如果缓冲区已满,系统将发送MM_WIM_DATA消息给应用程序,程序接收到这个消息后,就可以从消息带回的参数中得到缓冲区的指针,从而读出缓冲区的数据,或对数据进行处理,并且该缓冲区的数据读完后要用waveInAddBuffer函数将缓冲区重新送入设备,循环利用。在本设计中采用两个缓冲区来存放语音数据。

音频数据的发送:数据发送采用MFC的CSocket类来实现。CSocket类是由CAsyncSocket类继承而来,与CSocketFile类和CArchive类一起工作来发送和接收数据。软件实现:当数据缓冲区满时,需要将已采集到的语音数据通过以太网发送出去,这就要用到Socket网络传输。利用CSocket类创建一个套接字,然后将录音缓冲区中采集到的语音数据依次封装成IP包进行发送。语音数据发送流程图如图4所示:


图4 数据发送流程图
要实现语音信号的实时播放,必须对语音信号进行实时传输,所以在以太网上传输数据采用UDP传输方式。虽然TCP提供一种面向连接的、可靠的字节流服务,可以实现数据的可靠传输与出错重传,但是这也导致了TCP协议对资源的占用更多。TCP主要适用于对数据的完整性要求很高的网络传输的应用。UDP不一定提供可靠的数据传输,它只是把应用程序传给IP层的数据报发送出去,并不保证它们能到达目的地。由于UDP在传输数据报之前不用在客户和服务器之间建立连接,没有超时重发机制,所以传输速度很快。当某个程序的目标是尽快地传输尽可能多的信息,强调传输性能而不是传输的完整性时,如音频和多媒体应用,UDP是最好的选择。

录音缓冲区的大小为1024个字节,这样才能避免语音信号丢失,但是在系统终端对语音数据包进行处理的时候,如果数据包过大,则产生严重的噪音,因此系统终端要求接收到的语音数据IP包不能过大,设计中终端处理IP包的大小为128个字节,这样当服务器端录音缓冲区满时,需要对数据进行分割,封装成IP数据包,然后再发送。这里要采用广播地址。在局域网内实现广播,只需将IP地址中主机部分设为全1,本设计中IP广播地址设为192.168.1.255。

广播系统可以有多个广播终端,既可实现全区域的广播,还可以实现局域广播,即对指定的终端进行广播。要实现对指定的终端的广播,服务器端必须知道各个终端的IP地址,然后才能实施对应的广播。考虑到终端数量不多而且是在相对固定的局域网中,采用静态IP地址分配,其特点是IP地址对每一台计算机都是固定的。可以将各个终端的IP地址写入一个配置文档,如:“IPADDR.txt”。服务器首先读取配置文档中的IP地址,将终端IP地址与服务器端的终端号进行绑定,然后每次选定广播终端时也得到了对应终端的IP地址,即可实现区域广播了。另一方面,也必须使终端能够判断出所接收到的IP包是不是发给自己的。是则存储并转发给音频解码器;不是则丢弃。可以在IP包头进行设置,广播终端根据IP数据包包头来判断数据是否发给自己。IP数据包采用广播包的形式进行数据传输。

可以将广播的内容保存下来以便在以后可以使用。本设计对每次广播的内容进行了存储,存储文件设置为Record.wav。每次录音缓冲区满时,即将IP广播包发送出去,同时对其进行存储,在文件末尾将数据写入文件,并改变文件的长度。

广播终端的设计:要实现FPGA与以太网的通信,可以将FPGA终端设计为一个嵌入式系统,即采用基于FPGA的嵌入式系统实现以太网的互联。可以利用Xilinx的MicroBlaze微处理器软核和相应的外设,通过Xilinx EDK搭建系统所需的软硬件平台,完成嵌入式系统的设计。FPGA控制着以太网物理层的操作,内置一个符合MII标准的以太网控制器MAC,FPGA通过MII连接到开发板上的LAN83C185 Ethernet PHY,以便和以太网进行通信,接收以太网发送给本终端的IP数据包,进行存储,并转发给音频解码芯片进行播放。

硬件部分:
硬件电路结构分为两个部分,基于Spartan 3E开发板的音频数据接收模块和音频解码模块。

Xilinx Spartan 3E开发板上的XC3S500E FPGA作为控制芯片,在EDK中配置MicroBlaze微处理软核作为CPU,配置FPGA内置Ethernet MAC IP核(MAC是EDK开发平台的一部分),外部存储器采用DDR SDRAM,采用Xilkernel嵌入式操作系统和LwIP协议栈,构建一个完整的嵌入式系统实现以太网互联。

硬件结构图如图5所示:


图5 硬件结构图
MicroBlaze微处理器软核是可嵌入在FPGA中的RISC处理器软核,采用哈佛结构的32位指令和数据总线,具有运行速度快、占用资源少、可配置性强等优点,支持CoreConnect总线,和其他外设一起可以完成可编程片上系统的设计。特征:32个32位通用寄存器和2个专用寄存器;32位指令系统,支持3个操作数和2种寻址方式;分离的32位指令与数据总线,符合IBM的OPB总线规范;通过本地存储器总线(LMB)直接访问片内块存储器;具有高速的指令和数据缓存(cache),三级流水线结构;具有硬件调试模块;带8个输入输出快速链路接口。
记录学习中的点点滴滴,让每一天过的更加有意义!
返回列表