实现语音压缩算法的高速硬件平台
1 基本概念介绍
1.1 CY7C68013性能特点
CY7C68013(EZ-USB FX2)是Cypress半导体公司的新一代高速USB系列,可以用USB2.0最大数据传输率传输数据。该芯片基于EZ-USB FX芯片开发,集成有发送器、SIE、8051微控制器、存储器和可编程IO接口,是一种完全集成的USB2.0方案[2]。
1.2 G.723.1简介
G.723.1是一种低码率语音压缩标准,是H.324标准系列的一部分,也是VoIP的常用解决方案之一,可在低比特率通信终端(PSTN和无线网络)上进行多媒体通信。使用G.723.1标准能够将8 kHz采样l6 bit的线性PCM语音信号压缩成6.3 Kb/s或5.3 Kb/s的比特流,其压缩比例较高,占用带宽较低,而且具有很好的音质。
2 硬件设计
2.1 TMS320C6713外设接口HPI
TMS320C6713是一款高性能的32位浮点DSP,适用于专业音频信号处理。HPI即主机接口,是TMS320C6713片上集成的外设接口之一。通过HPI 可以方便地实现多处理器系统,外部处理器作为主处理器,DSP作为从处理器。通过HPI 接口,外部主机可以访问DSP除L2控制寄存器、中断选择寄存器、仿真逻辑之外的全部存储器映射空间。
2.2 读写时序
本实验采用CY7C68013和TMS320C6713芯片。在GPIF接口部分,IFCLK设置为48 MHz内部时钟,使用16位宽的数据总线(设置WORDWIDE=1),分配CTL[2:0]控制HPI的时序。使用GPIF Tool生成波形描述符,分别用于HPIC/HPIA/HPID的读写控制。值得注意的是:由于HDS1*/HDS2*/HCS*相关,可以使HCS*有效,HDS2*置“1”,并通过HDS1*控制选通;HHWIL控制传输的是第一半字还是第二半字;HCNTL[1:0]决定哪个寄存器正被访问[3]。由于采用DIN连接器,其传输速率最高可达几十兆赫兹,这也是其传输瓶颈。如果采用手工单独装配的SMA硬件连接器,其硬件连接的速度完全可以满足GPIF和HPI的要求。当然,前者每个引脚的成本不到后者的百分之一[1]。图1为GPIF和HPI读写HPID寄存器的时序关系图。
通过FX2固件、利用非GPIF I/O信号引脚可实现更多的信号输出。使用DM74LS573N锁存器,采用数据锁存的办法可以减小由布局布线等原因带来的互感、串联电感、寄生电容等减缓信号传播的影响,在硬件测试阶段能够有效解决传输误码的问题。由于74LS573的传输延迟,系统的可靠性建立在牺牲系统带宽的基础上。改用74LVC16245双向缓冲器,可以实现GPIF主控的数据读、写功能。图2为带锁存器的GPIF和HPI读写HPID寄存器的时序关系图。
2.3 硬件连线
系统整体硬件连线示意图如图3。
图4为带锁存器的GPIF和HPI硬件连线示意图。
3 软件设计
此方案包括4个方面的程序设计:固件程序、驱动程序、主机应用程序和DSP数据处理程序。
3.1 固件程序
固件程序是指运行在CY7C68013 51内核中的程序,主要包括设备描述符信息、设备功能代码和USB同DSP处理器间的通信控制功能代码。对于使用GPIF的FX2系统,固件还应能够分配FIFO读和写波形到4个FIFO中的任何一个。
3.1.1 固件程序设计
固件程序开发基于KEIL C51,使用Cypress公司提供的固件函数库Ezusb.lib和固件框架以提高开发效率。固件函数库提供了一系列与USB协议有关的函数,固件框架已经实现了初始化、重枚举、电源管理等功能。
固件程序由以下文件组成[5]:
FX2.h共同的FX2常数、宏、数据类型以及函数库内库函数的原型框架。
FX2regs.h FX2寄存器的声明及位屏蔽常数
Fw.c 框架源代码
Ti6713HPI2cy13.c 用户函数挂钩的相关定义
Gpif.c 由GPIF_Designer生成,用以匹配HPIC、HPIA、HPID时序
Dscr.a51 USB描述符表的范例
Ezusb.libEZ-USB函数库目标代码
USBJmpTb.OBJUSB中断向量表和GPIF中断源
其中Fw.c、Ti6713HPI2cy13.c和Gpif.c是固件程序的核心内容。
在Fw.c中主要包括任务分配器(TD)函数和设备请求(DR)函数。Ti6713HPI2cy13.c中定义这些关键函数。Gpif.c由GPIF_Designer生成,本设计将GPIF_Designer的4组波形分别定义为:第一半字写、第二半字写、FIFO写和FIFO读。其中前两组波形配合任务分配器函数TD_Poll()完成DSP中寄存器HPIC和HPIA的写,后两组波形配合TD_Poll()完成自增模式下HPID的读写。波形的设计要严格遵守HPI总线访问时序。
在TD_Init()中设置整体状态变量的初始值并规定各种端点资源的使用(包含中断)以及配置外围接口的输入输出。为匹配HPI通信所需数据总线宽度,寄存器EPxFIFOCFG中 WORDWIDE位置1。PORTB配置为FD[7:0],PORTD配置为FD[15:8]。为了达到最大的USB2.0带宽,设计中将AUTOOUT/AUTOIN位置1。主机与主控制器被直接连接,CPU被旁路,OUT FIFO自动从主机提交到FIFO。
TD_Init()定义中的程序片段:
……
EP2CFG=0xA0; //端点2可用、输出、数据流、512 B、
//4倍缓冲模式
SYNCDELAY;
EP4CFG=0x00; //端点4不可用
SYNCDELAY;
EP6CFG=0xE0; //端点2可用、输入、数据流、512 B、4倍缓冲模式
SYNCDELAY;
EP8CFG=0x00; //端点8不可用
SYNCDELAY;
FIFORESET=0x80; //暂不接受主机请求
SYNCDELAY;
FIFORESET=0x02; //将EP2 FIFO恢复为缺省状态
SYNCDELAY;
FIFORESET=0x06; //将EP6 FIFO恢复为缺省状态
SYNCDELAY;
FIFORESET=0x00; //重新开放主机请求
SYNCDELAY;
EP2FIFOCFG=0x01; //
SYNCDELAY;
EP2FIFOCFG=0x11; //数据宽度16 bit、AUTOOUT模式
SYNCDELAY;
EP6FIFOCFG=0x09; //数据宽度16 bit、AUTOIN模式
SYNCDELAY;
……
TD_Poll()中最核心部分在于完成写HPIC寄存器、写HPIA寄存器、以自增模式读写HPID。
(1)写HPIC寄存器。
EP0BCL=0; //激活EP0缓冲器以接收主机的下一个请求
while(EP01STAT bmEP0BSY);//等待EP0空闲可用
while(!HPI_RDY); //等待HPI准备好接收数据
IOA=bmHPIC; //PA2、PA3选通HPIC
GPIFWFSELECT=0xB9; //选择写入第一个半字的GPIF波形
GPIF_SingleByteWrite(EP0BUF[0],EP0BUF[1]);
//写入一个16 bit半字
其中GPIF_SingleByteWrite()定义为:
void GPIF_SingleByteWrite(BYTE gdatah,BYTE gdatal)
{
while( !(GPIFTRIG 0x80) ) {;} //轮询GPIFTRIG.7
//Done位查看上一次事务是否完成
XGPIFSGLDATLX=gdatal; //高8位写入XGPIFSGLDATLX
XGPIFSGLDATH=gdatah; //低8位写入XGPIFSGLDATH
}
对于16位模式,把高8位写入XGPIFSGLDATLX,低8位写入XGPIFSGLDATH就可以自动启动一个单向写事务。当这个事务完成时,GPIFTRIG.7 Done置1,触发GPIFdone中断,68013使XGPIFSGLDATLX和XGPIFSGLDATH中的数据出现在16位数据总线FD[15:0]上。
(2)写HPIA寄存器。
与写HPIC基本相同,只是将IOA=bmHPIA,使PA2、PA3选通HPIA。
(3)自增模式下写HPID。
if(GPIFTRIG 0x80) //检查当前GIPF是否空闲
{
if (!(EP24FIFOFLGS 0x02 ) ) //检查外围是否有
//数据等待传入EP2,EP2非空
{
IOA=bmHPID_AUTO; //PA2、PA3选通自增模式HPID
while(!HPI_RDY); //等待HPI准备好传输数据
SYNCDELAY;
GPIFTCB1=EP2FIFOBCH;
SYNCDELAY;
GPIFTCB0=EP2FIFOBCL; //将EP2FIFO中字节数设置为TC的值
SYNCDELAY;
GPIFTRIG=GPIF_EP2; //写寄存器GPIFTRIG触发 EP2 OUT事务
SYNCDELAY;
while( !( GPIFTRIG 0x80 ) ); //等待本次事务处理完毕
SYNCDELAY;
}
}
(4)自增模式下读HPID。
与自增模式下写HPID写过程基本相同。不同点在于:事务计数器的值不是端点6中字节的个数,而是应当由主机方通过控制端点EP0告知FX2;读EP6前要检查EP6 FIFO非满,触发时将GPIFTRIG设置成EP6IN。
- 基于改进的遗传算法软硬件划分方法研究(07-20)
- 基于人工免疫算法的变压器故障诊断方法(11-11)
- 基于遗传算法的复杂无源滤波器参数设计(01-16)
- 单级倒立摆控制系统的稳定性算法设计(03-02)
- 基于分类算法的双三相感应电机SVPWM(08-03)
- (算法研究)如何对电机进行精确控制?(03-06)