软件无线电的基本思想是通过构造一个通用、标准、模块化的硬件平台并加载不同的软件来实现不同的通信功能,使用不同的通信标准(如工作频段、调制解调类型、数据格式、加密模式、通信协议等),构成具有高度灵活性的通信设备(如多模手机、多功能基站、多波形电台等)[1]。
典型的软件无线电通信设备包含CPU、DSP和FPGA等波形处理单元。一般来说,CPU完成系统控制与波形的网络协议功能,而DSP和FPGA完成波形的物理层和部分协议功能。软件无线电通信设备具有波形可动态加载的特点,这对系统设备的软硬件设计提出了要求,要求CPU能够对DSP和FPGA波形组件程序进行动态加载。
BCNG-SDR-2012是自主研发的软件无线电通信平台,由一片Samsung公司的S3C2440 ARM920T CPU、一片TI公司的TMS320C6455 DSP和两片Xilinx公司的高性能FPGA(VIRTEX-5和SPARTAN-6)以及可配置的宽频段射频模块组成,具有强大的通信信号处理能力。本文利用TMS320C6455 HPI口,在上述平台上实现了ARM对DSP的程序动态加载功能,从而为软件无线电的实现提供了有力的支撑。
1 TMS320C6455 HPI启动流程
1.1 TMS320C6455 DSP简介
TMS320C6455是TI公司推出的高性能定点数字信号处理器[2],最高主频为1.2 GHz,在该主频下最高性能可达9 600 MIPS(Million Instructions Per Second)。该芯片的外设包括用于处理器间通信的 Serial RapidIO总线、千兆以太网存储接入控制器(MAC) 、66 MHz外设组件互连(PCI)总线接口、用户可配置的16 bit或者32 bit的主机接口HPI等。C6455 DSP建立在增强型C64x+DSP内核基础之上,该内核添加了专用的新指令,与基于TI的高级C64x DSP架构的代码相比,其代码尺寸平均缩短了20%~30%,周期效率提高了20%。
该芯片集成了大量的片上存储器,这些存储器被组织为一个两级存储系统。其中,第一级(L1)为2个32 KB存储器,可配置为数据Cache和程序Cache;第二级(L2)为一块2 MB的存储器,可作为程序或者数据存储器。
1.2 TMS320C6455 DSP的HPI特性
主机接口HPI(Host Port Interface)是一个并行端口,主要用于DSP与其他总线或CPU进行连接,可实现高速、并行的数据通信。HPI使一个外部主机可以通过16 bit或者32 bit的并行接口直接访问DSP的内部或外部存储器。HPI有3个寄存器,分别为HPIC控制寄存器、HPIA地址寄存器、HPID数据寄存器,均为32 bit。如图1显示了HPI在主机与DSP数据交互中的位置[3],通过HPI DMA逻辑以及资源交换控制逻辑,主机CPU可以访问DSP的内存、EMIF以及其他设备。
1.3 使用HPI的启动流程
TMS320C6455复位和上电时的引导模式[4]主要有NO BOOT模式、HPI引导模式、Flash引导模式等。具体采用哪种引导模式是由复位或上电时管脚BOOTMODE[3:0]的状态决定的[5]。本文使用的平台中,BOOTMODE[3:0]管脚可通过拨码开关来设置。
如图2显示了使用HPI的启动流程。系统上电复位后,首先采样管脚BOOTMODE[3:0]的状态确定启动方式(即引导模式)。由于本文采用的是HPI引导模式,上电后DSP内核处于挂起状态;接下来外部主机通过HPI口直接将代码和数据加载到DSP的内存中,在这期间DSP内核保持挂起状态不变;当主机完成程序加载后,主机向HPIC中的DSPINT位写1,向DSP发出中断;DSP收到中断后,DSP内核从挂起状态唤醒,从L2的基地址(0x800000)处开始执行程序。
2 硬件设计与寄存器读写驱动
在本文的硬件平台设计中,ARM与DSP HPI的接口连线如图3所示。从ARM端看,由数据线、地址线、读写控制线和片选线组成,其中数据线通过162245总线隔离器进行双向传输。
本文使用地址线作为HPI的控制信号,各信号对应的地址线如图3所示。表1显示了信号线的组合对应的访问类型。
需要特别注意的是,由于本文中的数据总线是16 bit的,使得ARM访问的地址必须是偶数,因此不使用ADDR[0],从而有了表1中的偶数偏移地址。考虑到这一点,结合表1,下面以HPIC为例,给出其在ARM加载程序中的地址定义,其中_F和_S对应HHWIL信号,指明是第1个半字还是第2个半字。
unsigned long Write_HPIC_F_ADDR=CS3_BASE_ADDR+0x0;
unsigned long Write_HPIC_S_ADDR=CS3_BASE_ADDR+0x2;
unsigned long Read_HPIC_F_ADDR=CS3_BASE_ADDR+0x4;
unsigned long Read_HPIC_S_ADDR=CS3_BASE_ADDR+0x6;
根据上述定义,从ARM来看,对于每个寄存器都有4个地址,在数据访问中必须选择正确的地址来操作。上述定义中,CS3_BASE_ADDR对应着DSP HPI的片选基地址,由于HPI 挂到了ARM的nGCS3片选上,根据S3C2440数据手册[6]可知其为0x18000000。
对HPIA和HPID的地址定义类似。定义了寄存器的地址后,再定义如下宏函数[7]来实现对相应寄存器的读写操作:
#define IOWrite(reg, data) *(unsigned short *)(reg)=data
//写寄存器宏定义
#define IORead(reg) *(unsigned short *)(reg)
//读寄存器宏定义
3 HPI启动软件实现流程
主机通过HPIC、HPIA、HPID和16 bit数据线与DSP进行数据交换和中断控制。HPI加载软件实现流程如图4所示。
(1)初始化HPIC
设置相应比特位,在这里仅仅设置了HPIC的HWOB位,该比特位设置第一个半字是所传32 bit数据的高16 bit(MSB16)还是低16 bit(LSB16)。在这里需要注意HHWIL信号线与HWOB位所起作用的不同,两者的共同协作才能确保数据的正确传输。操作如下:
temp1=IORead(Read_HPIC_F_ADDR);
//读HPIC的第1个半字
temp2=IORead(Read_HPIC_S_ADDR);
//读HPIC的第2个半字
IOWrite(Write_HPIC_F_ADDR,temp1|0x1);
//设置HPIC中的HWOB位
IOWrite(Write_HPIC_S_ADDR,temp2|0x1);
//设置HPIC中的HWOB位
需要注意的是,HPIC的高16 bit和低16 bit内容是相同的,所以写入相同的数据进行设置。
(2)初始化HPIA
将操作地址写到HPIA中,由前所述,DSP要从L2的基地址(0x800000)处开始执行程序。因此需要将程序加载到从L2的基地址开始的内存中。对于TMS320C6455,L2的基地址为0x800000,芯片要求HPIA中写入32 bit的字地址,因此要将字节地址转为字地址,即0x200000,所以写HPIA寄存器代码如下:
IOWrite(Write_HPIA_F_ADDR,0x0000);
for(time_out=0;time_out<HRDY_TIMEOUT;time_out++);
IOWrite(Write_HPIA_S_ADDR,0x20);
for(time_out=0;time_out<HRDY_TIMEOUT;time_out++);
根据TMS320C6455的芯片手册,HPIA的2个半字的写操作之间需要增加一定的延时。因此,上面的代码中设定了延时。具体时间参考TMS320C6455的芯片手册[2]。
(3)向HPID中写入数据
存取HPID时,通过控制HCNTL[1:0]信号可选择带地址自增的读写操作或是不带地址自增的读写操作。当访问连续的DSP存储空间时,使用带地址自增的读写操作只需要对HPIA寄存器赋值一次即可,能够给数据存取操作带来很大的方便。本文操作的是连续地址,因此使用带地址自增的HPID,这样仅需要进行一次设置HPIA,之后便不用再对其进行设置。
(4)向HPIC中的DSPINT位写入1,向DSP发出中断
至此,加载数据全部写入内存。接下来通知DSP数据加载完毕,这需要通过设置HPIC中的DSPINT位来完成,实现代码如下:
temp3=IORead(Read_HPIC_F_ADDR);
temp4=IORead(Read_HPIC_S_ADDR);
IOWrite(Write_HPIC_F_ADDR,temp3|0x2);
IOWrite(Write_HPIC_S_ADDR,temp4|0x2);
这样当主机向DSP发送了DSPINT中断后,DSP会从L2基地址处开始执行。但是对于DSP的C程序来说,是要从_c_int00处开始执行,因此需要在L2基地址处增加跳转指令,使得程序跳转到_c_int00处,这样程序便可以正确运行,从而实现DSP程序的动态加载。
需要注意的是,由于项目中电路板设计使用HPI16模式,因此对HPI任何一个寄存器的访问,主机都需在HPI总线上进行2次半字存取,否则可能会引起整个数据的丢失或是其他不可预料的错误。
4 格式转换
使用DSP集成开发环境CCS生成的文件一般为.out文件,该文件是通用目标文件格式(COFF)的目标文件,COFF文件中包含一些定位符号以及一些头信息等,而本文加载到内存中的数据是CPU能够直接运行的代码,不能包含任何的其他冗余信息,因此不能直接将COFF文件加载到内存中。本文使用TI公司提供的工具hex6x.exe和hex2aray.exe进行格式的转换,其中hex6x.exe将COFF文件转换为hex文件,hex2aray.exe将hex文件转换为一个数组,这样,直接读取数组中的数据并将其加载到内存中即可。
本文在介绍DSP主机接口并通过HPI接口启动流程的基础上,详细介绍了在项目平台上ARM通过DSP的HPI口动态加载DSP的硬件设计与软件实现,同时详细描述了设计的注意事项、启动跳转以及格式转换等问题。实际的测试表明,加载1 MB的内存数据仅需要0.28 s,可见该加载方法加载速度快,灵活性好,很好地解决了软件无线电设备对DSP波形组件可重构的要求。