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