文獻(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è)計(jì)提出了要求,,要求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è)計(jì)與寄存器讀寫驅(qū)動
在本文的硬件平臺設(shè)計(jì)中,,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)加載,。
需要注意的是,由于項(xiàng)目中電路板設(shè)計(jì)使用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ì)介紹了在項(xiàng)目平臺上ARM通過DSP的HPI口動態(tài)加載DSP的硬件設(shè)計(jì)與軟件實(shí)現(xiàn),,同時詳細(xì)描述了設(shè)計(jì)的注意事項(xiàng)、啟動跳轉(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.