文獻(xiàn)標(biāo)識碼: B
文章編號: 0258-7998(2013)06-0014-03
軟件無線電的基本思想是通過構(gòu)造一個通用、標(biāo)準(zhǔn)、模塊化的硬件平臺并加載不同的軟件來實(shí)現(xiàn)不同的通信功能,使用不同的通信標(biāo)準(zhǔn)(如工作頻段、調(diào)制解調(diào)類型、數(shù)據(jù)格式、加密模式、通信協(xié)議等),構(gòu)成具有高度靈活性的通信設(shè)備(如多模手機(jī)、多功能基站、多波形電臺等)[1]。
典型的軟件無線電通信設(shè)備包含CPU、DSP和FPGA等波形處理單元。一般來說,CPU完成系統(tǒng)控制與波形的網(wǎng)絡(luò)協(xié)議功能,而DSP和FPGA完成波形的物理層和部分協(xié)議功能。軟件無線電通信設(shè)備具有波形可動態(tài)加載的特點(diǎn),這對系統(tǒng)設(shè)備的軟硬件設(shè)計提出了要求,要求CPU能夠?qū)SP和FPGA波形組件程序進(jìn)行動態(tài)加載。
BCNG-SDR-2012是自主研發(fā)的軟件無線電通信平臺,由一片Samsung公司的S3C2440 ARM920T CPU、一片TI公司的TMS320C6455 DSP和兩片Xilinx公司的高性能FPGA(VIRTEX-5和SPARTAN-6)以及可配置的寬頻段射頻模塊組成,具有強(qiáng)大的通信信號處理能力。本文利用TMS320C6455 HPI口,在上述平臺上實(shí)現(xiàn)了ARM對DSP的程序動態(tài)加載功能,從而為軟件無線電的實(shí)現(xiàn)提供了有力的支撐。
1 TMS320C6455 HPI啟動流程
1.1 TMS320C6455 DSP簡介
TMS320C6455是TI公司推出的高性能定點(diǎn)數(shù)字信號處理器[2],最高主頻為1.2 GHz,在該主頻下最高性能可達(dá)9 600 MIPS(Million Instructions Per Second)。該芯片的外設(shè)包括用于處理器間通信的 Serial RapidIO總線、千兆以太網(wǎng)存儲接入控制器(MAC) 、66 MHz外設(shè)組件互連(PCI)總線接口、用戶可配置的16 bit或者32 bit的主機(jī)接口HPI等。C6455 DSP建立在增強(qiáng)型C64x+DSP內(nèi)核基礎(chǔ)之上,該內(nèi)核添加了專用的新指令,與基于TI的高級C64x DSP架構(gòu)的代碼相比,其代碼尺寸平均縮短了20%~30%,周期效率提高了20%。
該芯片集成了大量的片上存儲器,這些存儲器被組織為一個兩級存儲系統(tǒng)。其中,第一級(L1)為2個32 KB存儲器,可配置為數(shù)據(jù)Cache和程序Cache;第二級(L2)為一塊2 MB的存儲器,可作為程序或者數(shù)據(jù)存儲器。
1.2 TMS320C6455 DSP的HPI特性
主機(jī)接口HPI(Host Port Interface)是一個并行端口,主要用于DSP與其他總線或CPU進(jìn)行連接,可實(shí)現(xiàn)高速、并行的數(shù)據(jù)通信。HPI使一個外部主機(jī)可以通過16 bit或者32 bit的并行接口直接訪問DSP的內(nèi)部或外部存儲器。HPI有3個寄存器,分別為HPIC控制寄存器、HPIA地址寄存器、HPID數(shù)據(jù)寄存器,均為32 bit。如圖1顯示了HPI在主機(jī)與DSP數(shù)據(jù)交互中的位置[3],通過HPI DMA邏輯以及資源交換控制邏輯,主機(jī)CPU可以訪問DSP的內(nèi)存、EMIF以及其他設(shè)備。
1.3 使用HPI的啟動流程
TMS320C6455復(fù)位和上電時的引導(dǎo)模式[4]主要有NO BOOT模式、HPI引導(dǎo)模式、Flash引導(dǎo)模式等。具體采用哪種引導(dǎo)模式是由復(fù)位或上電時管腳BOOTMODE[3:0]的狀態(tài)決定的[5]。本文使用的平臺中,BOOTMODE[3:0]管腳可通過撥碼開關(guān)來設(shè)置。
如圖2顯示了使用HPI的啟動流程。系統(tǒng)上電復(fù)位后,首先采樣管腳BOOTMODE[3:0]的狀態(tài)確定啟動方式(即引導(dǎo)模式)。由于本文采用的是HPI引導(dǎo)模式,上電后DSP內(nèi)核處于掛起狀態(tài);接下來外部主機(jī)通過HPI口直接將代碼和數(shù)據(jù)加載到DSP的內(nèi)存中,在這期間DSP內(nèi)核保持掛起狀態(tài)不變;當(dāng)主機(jī)完成程序加載后,主機(jī)向HPIC中的DSPINT位寫1,向DSP發(fā)出中斷;DSP收到中斷后,DSP內(nèi)核從掛起狀態(tài)喚醒,從L2的基地址(0x800000)處開始執(zhí)行程序。
2 硬件設(shè)計與寄存器讀寫驅(qū)動
在本文的硬件平臺設(shè)計中,ARM與DSP HPI的接口連線如圖3所示。從ARM端看,由數(shù)據(jù)線、地址線、讀寫控制線和片選線組成,其中數(shù)據(jù)線通過162245總線隔離器進(jìn)行雙向傳輸。
本文使用地址線作為HPI的控制信號,各信號對應(yīng)的地址線如圖3所示。表1顯示了信號線的組合對應(yīng)的訪問類型。
需要特別注意的是,由于本文中的數(shù)據(jù)總線是16 bit的,使得ARM訪問的地址必須是偶數(shù),因此不使用ADDR[0],從而有了表1中的偶數(shù)偏移地址??紤]到這一點(diǎn),結(jié)合表1,下面以HPIC為例,給出其在ARM加載程序中的地址定義,其中_F和_S對應(yīng)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;
根據(jù)上述定義,從ARM來看,對于每個寄存器都有4個地址,在數(shù)據(jù)訪問中必須選擇正確的地址來操作。上述定義中,CS3_BASE_ADDR對應(yīng)著DSP HPI的片選基地址,由于HPI 掛到了ARM的nGCS3片選上,根據(jù)S3C2440數(shù)據(jù)手冊[6]可知其為0x18000000。
對HPIA和HPID的地址定義類似。定義了寄存器的地址后,再定義如下宏函數(shù)[7]來實(shí)現(xiàn)對相應(yīng)寄存器的讀寫操作:
#define IOWrite(reg, data) *(unsigned short *)(reg)=data
//寫寄存器宏定義
#define IORead(reg) *(unsigned short *)(reg)
//讀寄存器宏定義
3 HPI啟動軟件實(shí)現(xiàn)流程
主機(jī)通過HPIC、HPIA、HPID和16 bit數(shù)據(jù)線與DSP進(jìn)行數(shù)據(jù)交換和中斷控制。HPI加載軟件實(shí)現(xiàn)流程如圖4所示。
(1)初始化HPIC
設(shè)置相應(yīng)比特位,在這里僅僅設(shè)置了HPIC的HWOB位,該比特位設(shè)置第一個半字是所傳32 bit數(shù)據(jù)的高16 bit(MSB16)還是低16 bit(LSB16)。在這里需要注意HHWIL信號線與HWOB位所起作用的不同,兩者的共同協(xié)作才能確保數(shù)據(jù)的正確傳輸。操作如下:
temp1=IORead(Read_HPIC_F_ADDR);
//讀HPIC的第1個半字
temp2=IORead(Read_HPIC_S_ADDR);
//讀HPIC的第2個半字
IOWrite(Write_HPIC_F_ADDR,temp1|0x1);
//設(shè)置HPIC中的HWOB位
IOWrite(Write_HPIC_S_ADDR,temp2|0x1);
//設(shè)置HPIC中的HWOB位
需要注意的是,HPIC的高16 bit和低16 bit內(nèi)容是相同的,所以寫入相同的數(shù)據(jù)進(jìn)行設(shè)置。
(2)初始化HPIA
將操作地址寫到HPIA中,由前所述,DSP要從L2的基地址(0x800000)處開始執(zhí)行程序。因此需要將程序加載到從L2的基地址開始的內(nèi)存中。對于TMS320C6455,L2的基地址為0x800000,芯片要求HPIA中寫入32 bit的字地址,因此要將字節(jié)地址轉(zhuǎn)為字地址,即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++);
根據(jù)TMS320C6455的芯片手冊,HPIA的2個半字的寫操作之間需要增加一定的延時。因此,上面的代碼中設(shè)定了延時。具體時間參考TMS320C6455的芯片手冊[2]。
(3)向HPID中寫入數(shù)據(jù)
存取HPID時,通過控制HCNTL[1:0]信號可選擇帶地址自增的讀寫操作或是不帶地址自增的讀寫操作。當(dāng)訪問連續(xù)的DSP存儲空間時,使用帶地址自增的讀寫操作只需要對HPIA寄存器賦值一次即可,能夠給數(shù)據(jù)存取操作帶來很大的方便。本文操作的是連續(xù)地址,因此使用帶地址自增的HPID,這樣僅需要進(jìn)行一次設(shè)置HPIA,之后便不用再對其進(jìn)行設(shè)置。
(4)向HPIC中的DSPINT位寫入1,向DSP發(fā)出中斷
至此,加載數(shù)據(jù)全部寫入內(nèi)存。接下來通知DSP數(shù)據(jù)加載完畢,這需要通過設(shè)置HPIC中的DSPINT位來完成,實(shí)現(xiàn)代碼如下:
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);
這樣當(dāng)主機(jī)向DSP發(fā)送了DSPINT中斷后,DSP會從L2基地址處開始執(zhí)行。但是對于DSP的C程序來說,是要從_c_int00處開始執(zhí)行,因此需要在L2基地址處增加跳轉(zhuǎn)指令,使得程序跳轉(zhuǎn)到_c_int00處,這樣程序便可以正確運(yùn)行,從而實(shí)現(xiàn)DSP程序的動態(tài)加載。
需要注意的是,由于項目中電路板設(shè)計使用HPI16模式,因此對HPI任何一個寄存器的訪問,主機(jī)都需在HPI總線上進(jìn)行2次半字存取,否則可能會引起整個數(shù)據(jù)的丟失或是其他不可預(yù)料的錯誤。
4 格式轉(zhuǎn)換
使用DSP集成開發(fā)環(huán)境CCS生成的文件一般為.out文件,該文件是通用目標(biāo)文件格式(COFF)的目標(biāo)文件,COFF文件中包含一些定位符號以及一些頭信息等,而本文加載到內(nèi)存中的數(shù)據(jù)是CPU能夠直接運(yùn)行的代碼,不能包含任何的其他冗余信息,因此不能直接將COFF文件加載到內(nèi)存中。本文使用TI公司提供的工具h(yuǎn)ex6x.exe和hex2aray.exe進(jìn)行格式的轉(zhuǎn)換,其中hex6x.exe將COFF文件轉(zhuǎn)換為hex文件,hex2aray.exe將hex文件轉(zhuǎn)換為一個數(shù)組,這樣,直接讀取數(shù)組中的數(shù)據(jù)并將其加載到內(nèi)存中即可。
本文在介紹DSP主機(jī)接口并通過HPI接口啟動流程的基礎(chǔ)上,詳細(xì)介紹了在項目平臺上ARM通過DSP的HPI口動態(tài)加載DSP的硬件設(shè)計與軟件實(shí)現(xiàn),同時詳細(xì)描述了設(shè)計的注意事項、啟動跳轉(zhuǎn)以及格式轉(zhuǎn)換等問題。實(shí)際的測試表明,加載1 MB的內(nèi)存數(shù)據(jù)僅需要0.28 s,可見該加載方法加載速度快,靈活性好,很好地解決了軟件無線電設(shè)備對DSP波形組件可重構(gòu)的要求。
參考文獻(xiàn)
[1] MITOLA J.The software radio architecture[J].IEEE Communications Magazine,1995,15(5):26-38.
[2] Texas Instruments.TMS320C6455 fixed-point digital signal processor[EB/OL].[2012-10-10].http://www.ti.com.
[3] Texas Instruments.TMS320C645x DSP host port interface (HPI) user′s guide[EB/OL].[2012-10-10].http://www.ti.com.
[4] 吳海洲,劉恒甫,黃克武.基于TMS320C6455的DSP加載模式研究[J].電子測量技術(shù),2008,31(6):155-162.
[5] Texas Instruments.TMS320C645x/C647x DSP bootloader user′s guide[EB/OL].[2012-10-10].http://www.ti.com.
[6] Texas Instruments.S3C2440A 32-BIT CMOS Microcontroller user′s manual[EB/OL].[2012-10-10].http://www.samsungsemi.com.
[7] Texas Instruments.TMS320C6000 programmer′s guide[EB/OL].[2012-10-10].http://www.ti.com.