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