基于DSP的电力线载波OFDM调制解调器
DSP部分选用TI公司的TMS320C6201。TMS320C6201有32位的外部存储接口EMIF,为CPU访问外围设备提供了无缝接口。为了便于多信道数字信号处理,TMS320C6201配备了多信道带缓冲能力的串口McBSP。McBSP的功能非常强大,除具有一般DSP串口功能之外,还可以支持T1/E1、ST-BUS、IOM2、SPI、IIS等不同标准。TMS32C6201提供的16位主机接口(HPI)使得主机设备可以直接访问DSP的存储空间。通过内部或外部存储空间,主机可以与DSP交换信息,也可以利用HPI直接访问映射进存储空间的外围设备。TMS320C6201的DMA控制器有四个独立的可编程通道,可以同时进行四种不同的DMA操作。
javascript:window.open(this.src);" style="cursor:pointer;"/>
4 OFDM在DSP上的软件实现
调制部分的子程序被系统调用前,发送的数据已装入数据存储器。子程序被调用时,数据区的首地址以及长度被作为入口参数传递给子程序。程序执行时首先进行一系列的配置工作,如配置DSP片内外设以及数模转换器的各种参数等。之后,串口中断产生,中断服务程序自动依次读取发送存储器中的内容,经串口输出给数模转换器。然后程序从数据存储区读取一帧数据,并行放入IFFT工作区的相应位置,随后进行IFFT以及加入循环前缀(即复制数据的后若干位插入到数据的前段)。所得数据存入发送存储器以便中断服务程序将其输出。
解调部分的程序首先执行DSP片内外设以及模数转换器的配置,然后开串行口,接收中断,使接收中断程序接收来自模数转换器的采样数据,并将采样数据依次存入接收存储器。每得到一帧数据,程序首先去除循环前缀(即删去数据的前若干位),然后对去除循环前缀后的数据进行FFT变换。
图3 OFDM调制解调器电路原理图
5 FFT在TMS320C6201上的优化算法
表1给出256点Radix2FFT和Radix4FFT在TMS320C6201上所需的指令周期,以及在不同的工作频率下完成FFT所需的时间。
由表1可以看出,在TMS320C6201上采用Raidx4算法比采用Radix2算法更加高效。并且,为了满足系统需求,即在17.07μs之内完成256个复数点的FFT运算,TMS320C6201必须采用200MHz的工作频率。
表1 6201上实现256点FFT所需的时间
TMS320C6201工作频率 | 256点复数FFT运算所需的总指令周期数 | 256点FFT所需时间 | |
R2 | 100MHz | 4225 | 42.25μs |
200MHz | 4225 | 21.1μs | |
R4 | 100MHz | 2763 | 27.63μs |
200MHz | 2763 | 13.8μs |
TMS320C6201的数据通路和流水线工作方式是对算法进行优化从而获得高性能的基础。TMS320C6201有两个可以进行数据处理的数据通路A和B2,每个通路有4个功能单元(.L.S.M.D)和一个包括16个32位寄存器的寄存器组。功能单元执行逻辑、位移、乘法、加法和数据寻址等操作。两个数据寻址单元(.D1和.D2)专门负责寄存器组和存储器之间的数据传递。在同一时刻,这些功能单元能够并行地执行多条指令。TMS320C6201对任何指令的操作都能分为几个子操作,每个子操作由不同单元完成。对每个单元来说,每个时钟周期可进入一条新指令,这样在不同周期内,不同单元可以处理不同的指令,这种工作方式称为“流水线”工作方式。TMS320C6201的特殊结构,可使8条指令同时通过流水线的每个节拍,从而大大提高了机器的吞吐量。
为使代码达到最大效率,程序将尽可能将指令安排为并行执行。为使指令并行操作,程序确定指令间的相关性,即一条指令必须发生在另一条指令之后。根据TMS320C6201的数据通路和流水线工作方式,在此给出一种高效实现16点Radix4FFT的方法。其基本思想是分解传统的FFT蝶型算法循环体,将其分别展开在A、B通路内计算两个FFT蝶型算法。每个蝶型算法分别只分配自己这一侧的寄存器组和功能单元。这样在循环体内两个蝶型算法是完全不相关的,能够并行执行。下面给出基于C.S.Burrus和T.W.Parks的Radix4FFT算法3的优化算法的代码实现。
void radix4int n short x short w
int n1 n2 ie wa1 wa2 wa3 wb1 wb2 wb3 ia0 ia1 ia2 ia3 ib0 ib1 ib2
ib3 j k
short ta tb ra1 ra2 rb1 rb2 sa1 sa2 sb1 sb2 coa1 coa2 coa3 cob1
cob2 cob3 sia1 sia2 sia3 sib1 sib2 sib3
n2=n
ie=1
fork=nk>