航天南湖電子信息技術(shù)股份有限公司 彭小雨
基于FPGA的雙CPU雷達(dá)監(jiān)控平臺(tái)的設(shè)計(jì)
航天南湖電子信息技術(shù)股份有限公司 彭小雨
探討了一種基于FPGA的雙CPU雷達(dá)監(jiān)控平臺(tái)的設(shè)計(jì)方法,主要介紹了雙CPU的設(shè)計(jì)方法,以及雙CPU在監(jiān)控平臺(tái)的處理過程,該設(shè)計(jì)隔離了常規(guī)監(jiān)控與波束控制,且能實(shí)現(xiàn)資源共享,大大提高了處理器性能,保證了波束控制的實(shí)時(shí)性。
FPGA;波束控制;互斥核
雷達(dá)的監(jiān)控平臺(tái)是整個(gè)雷達(dá)系統(tǒng)的監(jiān)控中心,實(shí)現(xiàn)雷達(dá)開關(guān)機(jī)、工作狀態(tài)、工作參數(shù)和工作方式的調(diào)整與顯示;實(shí)現(xiàn)高低波束控制;具有全機(jī)BIT功能,實(shí)現(xiàn)全機(jī)故障報(bào)警、相關(guān)、定位、隔離。雷達(dá)工作周期分為發(fā)射周期和接收周期,最短工作周期不到1ms,發(fā)射周期更短,所以對(duì)波束的控制必須在發(fā)射周期內(nèi)完成。這就對(duì)處理器的性能有很高的要求,這就要求必須與常規(guī)的監(jiān)控處理分開進(jìn)行。由于生產(chǎn)技術(shù)的限制,傳統(tǒng)通過提升工作頻率來提升處理器性能的作法目前面臨嚴(yán)重的阻礙,高頻CPU的耗電量和發(fā)熱量越來越大,已經(jīng)給整機(jī)散熱帶來十分嚴(yán)峻的考驗(yàn)。雙核技術(shù)可以很好的避免這一點(diǎn)。增加一個(gè)內(nèi)核,處理器每個(gè)時(shí)鐘周期內(nèi)可執(zhí)行的單元數(shù)將增加一倍。所以設(shè)計(jì)考慮采用兩個(gè)處理器分別來處理這兩種不同的任務(wù)。Nios II系列嵌入式處理器使用32位的指令集結(jié)構(gòu)ISA,完全與二進(jìn)制代碼兼容,它是Altera公司的第二代軟核嵌入式處理器,性能超過200DMIPS。是Altera公司特有的基于通用FPGA架構(gòu)的軟CPU內(nèi)核。SOPC(System on Programmable Chip,簡(jiǎn)稱為可編程片上系統(tǒng))技術(shù),即用大規(guī)??删幊唐骷腇PGA來實(shí)現(xiàn)SOC的功能。SOPC Builder是一個(gè)革命性的系統(tǒng)級(jí)開發(fā)工具,可以用來構(gòu)建包括處理器、存儲(chǔ)器接口和I/O外設(shè)的嵌入式系統(tǒng)。使嵌入式系統(tǒng)在硬件結(jié)構(gòu)、功能特點(diǎn)、資源占用等方面全面滿足監(jiān)控平臺(tái)設(shè)計(jì)的要求。Altera公司的NiosII處理器和SOPC Builder開發(fā)工具能快速地設(shè)計(jì)并實(shí)現(xiàn)資源共享的多處理器系統(tǒng)。
(1)資源共享的雙處理器系統(tǒng)如圖1所示:
圖1 共享資源的雙處理器系統(tǒng)
首要考慮的是資源共享的問題,因?yàn)楣蚕淼馁Y源能被一個(gè)以上處理器所訪問。決定系統(tǒng)中的哪些資源被共享,以及不同處理器之間如何共同使用這個(gè)資源是非常關(guān)鍵的問題。其中共享資源分為存儲(chǔ)器和外設(shè)。通常情況下,Nios II多處理器系統(tǒng)并不支持非存儲(chǔ)設(shè)備的共享。
(2)存儲(chǔ)器的共享。存儲(chǔ)器的共享既能用來在兩個(gè)處理器之間進(jìn)行簡(jiǎn)單的狀態(tài)通信,
也能同時(shí)被兩個(gè)處理器共同進(jìn)行復(fù)雜的數(shù)據(jù)結(jié)構(gòu)運(yùn)算。如果存儲(chǔ)器中包含不只一個(gè)處理器的程序代碼,則每個(gè)處理器須有不同的存儲(chǔ)器地址。對(duì)于程序空間,處理器不能共享存儲(chǔ)器的同一區(qū)域。每個(gè)處理器必須有自己獨(dú)一無二的text、rodata、rwdata、heap和stack段。
在資源共享的雙處理器系統(tǒng)中,當(dāng)存儲(chǔ)器用來在兩個(gè)處理器之間共享數(shù)據(jù)的話,必須謹(jǐn)慎的進(jìn)行操作,因?yàn)閿?shù)據(jù)是可以讀也可以寫的。如果一個(gè)處理器在對(duì)存儲(chǔ)器的某一地址寫數(shù)據(jù)的同時(shí),另一處理器也在對(duì)同一地址進(jìn)行讀寫操作的話,那么就可能發(fā)生數(shù)據(jù)沖突,進(jìn)而導(dǎo)致程序錯(cuò)誤,最嚴(yán)重的是可能造成系統(tǒng)的崩潰,必須使用一種機(jī)制來告知其他的處理器,以免發(fā)生沖突。系統(tǒng)中的硬件互斥核就能滿足這個(gè)要求。
(3)硬件互斥核。硬件互斥核可以確保在共享資源時(shí)不發(fā)生沖突?;コ夂耸亲鳛橐环N共享資源來使用的,提供了一種測(cè)試和設(shè)置的操作,每個(gè)處理器在使用共享資源前,必須先測(cè)試互斥核是否可用,如果可用的話,就獲得了共享資源的使用權(quán),當(dāng)處理器使用完后,釋放互斥核。與此同時(shí),另一個(gè)處理器就可以獲得互斥核并使用共享資源了。如果沒有這個(gè)互斥核,實(shí)現(xiàn)上述功能的話就需要兩個(gè)單獨(dú)的測(cè)試和設(shè)置指令,這時(shí),有可能發(fā)生"死鎖"的情況。
互斥內(nèi)核有一個(gè)簡(jiǎn)單的Avalon從控制器接口,包含兩個(gè)32位存儲(chǔ)器映射寄存器mutex和reset。表1所列為互斥內(nèi)核寄存器映射。
互斥內(nèi)核有以下基本操作(假設(shè)多個(gè)處理器對(duì)一個(gè)互斥內(nèi)核進(jìn)行訪問,并且每個(gè)處理器都有一個(gè)獨(dú)特的系統(tǒng)標(biāo)識(shí)符ID):
表1 互斥內(nèi)核寄存器映射
a) VALUE字段的值為0x0000時(shí),互斥體可用(互斥體解除鎖定);否則,互斥體不可用(互斥體被鎖定)。
b) mutex寄存器總是可讀的。一個(gè)處理器(或任何Avalon主控制器外設(shè))可通過讀取mutex寄存器來確定其當(dāng)前的狀態(tài)。
c) mutex寄存器只在特定的條件下可寫。只有滿足下面的其中一個(gè)條件或兩個(gè)條件都滿足,才能通過寫操作來更改mutex寄存器的內(nèi)容:即mutex寄存器的VALUE字段的值為0或者mutex寄存器OWNER字段與被寫入數(shù)據(jù)的OWNER字段相匹配。
d) 處理器可通過將它的ID寫入OWNER字段和向VALUE字段寫入一個(gè)非零值來獲取互斥體。然后處理器再通過驗(yàn)證OWNER字段來檢查是否成功地獲得了互斥體。
e) 系統(tǒng)復(fù)位后,reset寄存器的RESET位為高。該位通過向其寫入1來清除。
在雙處理器系統(tǒng)中設(shè)計(jì)并運(yùn)行軟件與單處理器系統(tǒng)很類似,僅僅需要考慮以下幾個(gè)方面:
(1)程序存儲(chǔ)器
在雙處理器系統(tǒng)中,基于每個(gè)處理器的軟件設(shè)計(jì)必須擁有自己獨(dú)有的一段存儲(chǔ)空間,而這些存儲(chǔ)空間又必須同時(shí)存放在同一個(gè)物理存儲(chǔ)設(shè)備上。在一個(gè)雙核系統(tǒng)中,兩個(gè)處理器都運(yùn)行在SDRAM上,對(duì)于第一個(gè)處理器的軟件設(shè)計(jì)需要128K的程序空間,對(duì)于第二個(gè)處理器的軟件設(shè)計(jì)需要64K的空間,這時(shí),第一個(gè)處理器使用SDRAM中0x0到0x1FFFF之間的地址空間,第二個(gè)處理器使用0x20000到0x2FFFF之間的地址空間。
NiosⅡ和SOPC Builder提供了一個(gè)簡(jiǎn)單的存儲(chǔ)分配原則來滿足上述要求,這個(gè)分配原則使用異常地址來決定運(yùn)行哪個(gè)處理器上的軟件設(shè)計(jì)。
Nios II IDE最終負(fù)責(zé)鏈接處理器的軟件設(shè)計(jì)并映射到存儲(chǔ)器中,并為每個(gè)處理器提供其擁有的段空間來運(yùn)行軟件設(shè)計(jì)。如果多個(gè)處理器的軟件設(shè)計(jì)被映射到同一個(gè)物理存儲(chǔ)設(shè)備上,此時(shí)每個(gè)處理器的異常地址就用來決定哪一個(gè)處理器的軟件設(shè)計(jì)能占據(jù)空間的基地址。
對(duì)任何一個(gè)單處理器或多處理器系統(tǒng)來說,
有5個(gè)主要的代碼段需要映射到存儲(chǔ)器的同定地址中,這些代碼段是:
a)text--存放實(shí)際的執(zhí)行代碼
b)rodata--存放實(shí)際執(zhí)行代碼中所使用的常量
c)rwdata--存放讀/寫變量和指針
d)Heap--自動(dòng)分配的空間
e)Stack--存放函數(shù)調(diào)用的參數(shù)和其他臨時(shí)的數(shù)據(jù)
在雙處理器系統(tǒng)中,可能需要僅僅使用一個(gè)存儲(chǔ)器來存放每個(gè)處理器的所有代碼段。在這時(shí),每個(gè)處理器的異常地址就用來指定各個(gè)處理器之間的邊界,如圖2所示:
圖2 雙處理器的存儲(chǔ)器映像分區(qū)
(2)啟動(dòng)地址
在雙處理器系統(tǒng)中,每個(gè)處理器必須從自己的程序段中啟動(dòng),對(duì)于一個(gè)非易失性存儲(chǔ)器的同一地址空間上的可執(zhí)行代碼的相同位,不可能啟動(dòng)兩個(gè)處理器。啟動(dòng)存儲(chǔ)器和程序存儲(chǔ)器一樣也能被分區(qū),但每段空間的概念和映射就不一樣了,啟動(dòng)代碼通常只需要把程序代碼拷貝到所映射的存儲(chǔ)器中,然后跳轉(zhuǎn)到程序代碼就可以了。在同一個(gè)非易失性存儲(chǔ)器設(shè)備的不同段空間上啟動(dòng)雙處理器,只需要在存儲(chǔ)器上簡(jiǎn)單的設(shè)置每個(gè)存儲(chǔ)器的復(fù)位地址就可以了,在啟動(dòng)地址之間要留出足夠的空間存放啟動(dòng)代碼。Nios II Programmer能將多個(gè)處理器的啟動(dòng)代碼編程到一個(gè)Flash器件中,F(xiàn)lash Programmer根據(jù)每個(gè)處理器的復(fù)位地址計(jì)算Flash內(nèi)的編程地址。下圖3為從一片F(xiàn)lash中啟動(dòng)兩個(gè)處理器的存儲(chǔ)器映像。
圖3 啟動(dòng)兩個(gè)處理器的存儲(chǔ)器映像
(3)運(yùn)行和調(diào)試雙處理器系統(tǒng)
Nios II IDE中包含許多幫助開發(fā)多處理器系統(tǒng)軟件的工具。最重要的是對(duì)多處理器具有可同時(shí)進(jìn)行在線調(diào)試的能力。在多處理器系統(tǒng)上,多個(gè)調(diào)試可同時(shí)運(yùn)行,每個(gè)處理器可以單獨(dú)暫停和恢復(fù),也可以單獨(dú)設(shè)置每個(gè)處理器的斷點(diǎn)。如果某個(gè)處理器停在一個(gè)斷點(diǎn)處,將不影響其它處理器的操作。每個(gè)調(diào)試通道也可以單獨(dú)打開和停止。在Nios II IDE中,利用一個(gè)稱之為multiprocessor collections的功能,一個(gè)操作就可以打開多個(gè)處理器的調(diào)試通道。multiprocessor collections是被連接在一個(gè)配置名字下的每個(gè)處理器的調(diào)試配置組。使用multiprocessor collections的好處是,無論何時(shí)打開collections,Nios II IDE均打開每個(gè)debug通道。不用分別打開每個(gè)處理器通道。也可以用一個(gè)操作停止multiprocessor collections,但同時(shí)暫停和恢復(fù)multiprocessor collections目前不被支持。
multiprocessor collections的打開和停止不是同時(shí)的,這意味著在collections中的處理器不能在同一時(shí)鐘周期開始執(zhí)行代碼。事實(shí)上,不同處理器的啟動(dòng)可能有幾秒鐘的延遲。
在Nios II IDE中,創(chuàng)建兩個(gè)C/C++應(yīng)用工程,hello_word_0和hello_word_1,然后選擇Windows->Preferences,選擇Nios II,選中Allow muiliple active run/debug sessions,單擊OK按鈕就可以激活多個(gè)處理器的run/debug通道,然后創(chuàng)建多處理器集合。
在每次調(diào)試時(shí)選擇Nios II multiprocessor collections,點(diǎn)擊Debug按鈕就可以實(shí)現(xiàn)雙處理器的調(diào)試。
(4)基于Nios II雙處理器系統(tǒng)的API函數(shù)
對(duì)于Nios II處理器用戶,Altera提供了可用來訪問互斥內(nèi)核硬件的驅(qū)動(dòng)程序,利用驅(qū)動(dòng)程序
可以直接對(duì)低層的硬件進(jìn)行操作。以下為API函數(shù)的說明。
a) altera_avalon_mutex_is_mine()
功能:判斷CPU是否獲得了互斥核的使用權(quán);
b) altera_avalon_mutex_f i rst_lock()
功能:判斷自從復(fù)位后互斥核是否已被釋放;
c) altera_avalon_mutex_lock()
功能:獲得硬件互斥核,同時(shí)用參數(shù)裝載互斥核;
d) altera_avalon_mutex_open()
功能:檢索指向硬件互斥核的設(shè)備結(jié)構(gòu)指針;
e) altera_avalon_mutex_trylock()
功能:嘗試鎖定硬件互斥核并立即返回;
f) altera_avalon_mutex_trylock()
功能:釋放硬件互斥核。并把存在互斥核中的值設(shè)為0。
Nios II多處理器系統(tǒng)的工作流程大致如下:先使用函數(shù)d)打開互斥核,然后使用函數(shù)b)來判斷是否已經(jīng)有處理器獲得了互斥核,使用函數(shù)e)來判斷互斥核此時(shí)是否可用,并嘗試獲得互斥核,使用函數(shù)c)來獲得互斥核的使用權(quán),并把其cpuid控制寄存器的值寫入mutex寄存器的OWNER字段來鎖定互斥核。隨后,使用函數(shù)a)來判斷鎖定是否成功,在使用完互斥核之后,必須使用函數(shù)f)來釋放互斥核。
FPGA采用的是Altera公司的Stratix Ⅱ系列的EP2S60F672I4N器件,該器件具有多處理器功能,且存儲(chǔ)空間有2544192bits,用戶I/ O接口數(shù)達(dá)492pins,速度等級(jí)為4ns,能夠滿足監(jiān)控平臺(tái)的需求。
監(jiān)控平臺(tái)的工作流程圖如下圖4示,監(jiān)控板上的晶振產(chǎn)生時(shí)鐘給FPGA,F(xiàn)PGA內(nèi)的PLL(時(shí)鐘鎖相環(huán))產(chǎn)生兩個(gè)處理器工作所需的時(shí)鐘,同時(shí)產(chǎn)生波控觸發(fā)時(shí)鐘的原始信號(hào),經(jīng)觸發(fā)時(shí)鐘產(chǎn)生器生成周期性的波控觸發(fā)時(shí)鐘信號(hào),如下圖5示,高電平區(qū)域?yàn)椴ㄊ刂茀^(qū),低電平區(qū)域?yàn)楸O(jiān)控天饋線通訊時(shí)間,即波束控制指令必須在320us內(nèi)全部發(fā)送出去。而且必須保證天饋線在雷達(dá)PIN方波的第一個(gè)接收區(qū)接收到指令,以便在第二個(gè)接收區(qū)將波控指令發(fā)送到T/R組件上去,已保證下一周期天饋線能發(fā)射最新的波束指向。
圖4 監(jiān)控平臺(tái)工作流程
圖5 波控觸發(fā)時(shí)鐘信號(hào)
波控觸發(fā)寄存器觸發(fā)設(shè)置為沿觸發(fā),當(dāng)觸發(fā)時(shí)鐘上升沿來時(shí)發(fā)送波束控制指令,當(dāng)下降沿來時(shí)提取共享緩存內(nèi)存放的天饋線查詢指令發(fā)送到天饋線分系統(tǒng)查詢天饋線狀態(tài),提取指令前必須讀取互斥核的狀態(tài),當(dāng)互斥核沒有被任意一處理器使用時(shí)即可提取指令進(jìn)行查詢工作。同樣將天饋線返回的狀態(tài)數(shù)據(jù)放入共享緩存的數(shù)據(jù)區(qū),放入共享緩存前同樣需要查詢互斥核的狀態(tài),當(dāng)可用時(shí)才能放入數(shù)據(jù)。上述即為CPU2工作的情況。與CPU2并行工作的CPU1主要完成雷達(dá)系統(tǒng)的監(jiān)控工作,通過監(jiān)控板上的串口接收人機(jī)界面發(fā)送的分系統(tǒng)狀態(tài)控制指令,天饋分系統(tǒng)的控制指令同樣存放到共享緩存的指令區(qū)域,同時(shí)將存放在共享緩存的天饋線狀態(tài)提取出來送人機(jī)界面顯示,在操作共享緩存時(shí)堅(jiān)持一個(gè)原則,保證互斥核是可用的。
(1)定義共享緩存
#def i ne share_trrbuf_base SHARE_MEM_BASE //0x4000
#def i ne share_trtbuf_base 0x4400
//SHARE_MEM_BASE+0x400
volatile share_trtbuffer_struct *trtbuf;
volatile share_trrbuffer_struct *trrbuf;
(2)初始化
mut=altera_avalon_mutex_open (“/dev/mutex”);
trrbuf=(volatile share_trrbuffer_struct *)
share_trrbuf_base;
trtbuf=(volatile share_trtbuffer_struct *)
share_trtbuf_base;
(3)指令緩存
#def i ne LOCK_SUCCESS 0#def i ne ERROR_ALLOWED_ACCESS_WITHOUT_ OWNING_MUTEX 2
void cpyinstru(char *dest,char *source,int len,
alt_mutex_dev *mutex,alt_u32 value )
{ unsigned int error_code = 0;
// Try and aquire the mutex (non-blocking).
if(altera_avalon_mutex_trylock(mutex, value) == LOCK_SUCCESS)
{ // Just make sure we own the mutex
if(altera_avalon_mutex_is_mine(mutex))
{ memcpy(dest,source,len);
}
else
{
error_code = ERROR_ALLOWED_ACCESS_WITHOUT_OWNING_MUTEX;
}
// Release the mutex
altera_avalon_mutex_unlock(mutex);
}
}
(4)狀態(tài)緩存
與指令緩存處理類似。
void mutwrite(char *dest,char *source,alt_mutex_dev * mutex,alt_u32 value,alt_ fd *fd,int len)
{
unsigned int error_code = 0;
// Try and aquire the mutex (non-blocking).
if(altera_avalon_mutex_trylock(mutex, value) == LOCK_SUCCESS)
{
// Just make sure we own the mutex
if(altera_avalon_mutex_is_mine(mutex))
{
memcpy(dest,source,len);
}
else
{
error_code = ERROR_ALLOWED_ACCESS_WITHOUT_OWNING_MUTEX;
}
// Release the mutex
altera_avalon_mutex_unlock(mutex);
}
}
設(shè)計(jì)完成后在天饋線輸入端通過Quartus自帶的SignalTap Ⅱ工具進(jìn)行驗(yàn)證調(diào)試,測(cè)試結(jié)果滿足要求。
本文所設(shè)計(jì)的雙處理器系統(tǒng)是基于Altera公司的FPGA,因?yàn)槠銷ios II軟核的特點(diǎn),除了具有一般FPGA的優(yōu)勢(shì)之外,只要在成本允許的情況下,可以很方便對(duì)原系統(tǒng)進(jìn)行升級(jí),即可以實(shí)現(xiàn)3核、4核等多核系統(tǒng),獲得更高水平的計(jì)算能力和性能。
[1]潘松,黃繼業(yè),等.SOPC技術(shù)使用教程[M].北京:清華大學(xué)出版社,2005.
[2]彭澄廉,等.挑戰(zhàn)SOC——基于NIOS的SOPC設(shè)計(jì)與實(shí)踐[M].北京:清華大學(xué)出版社,2004.
[3]Altera Corp.Nios II Processor Reference Handbook.Altera,2005.
[4]Altera Corp.Creating Multiprocessor Nios II Systems Tutorial. Altera,2005.