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