黃禹銘
(中國(guó)電子科技集團(tuán)公司第二十九研究所 成都 610036)
隨著電磁環(huán)境的日益復(fù)雜,為改善嚴(yán)重雜波背景下檢測(cè)小運(yùn)動(dòng)目標(biāo)的性能,動(dòng)目標(biāo)顯示(MTI)及動(dòng)目標(biāo)檢測(cè)(MTD)在雷達(dá)信號(hào)處理中獲得比較普遍的應(yīng)用。MTD是一種利用相參積累來提高信噪比,從而提高雷達(dá)在雜波背景下檢測(cè)動(dòng)目標(biāo)能力的技術(shù)。回波信號(hào)要進(jìn)行MTD處理,需要將雷達(dá)回波信號(hào)進(jìn)行存儲(chǔ)和重排。
FPGA處理速度快,數(shù)據(jù)吞吐量大,常作為雷達(dá)平臺(tái)上信號(hào)處理的主處理器,但FPGA是以硬件實(shí)現(xiàn)的系統(tǒng),內(nèi)部的存儲(chǔ)容量有限,不能滿足回波信號(hào)存儲(chǔ)需求,因此必須外接存儲(chǔ)芯片。目前常用的芯片有DDR和QDR兩類??紤]到需要儲(chǔ)存的數(shù)據(jù)量和價(jià)格成本等兩方面因素,大多數(shù)雷達(dá)系統(tǒng)使用存儲(chǔ)容量大且價(jià)格低的DDR作為外接存儲(chǔ)芯片,特別是以DDR3作為主流的外接存儲(chǔ)芯片。
DDR3利用雙數(shù)據(jù)速率實(shí)現(xiàn)高速工作,采用了bit預(yù)讀取技術(shù),數(shù)據(jù)傳輸效率高,多Bank的設(shè)計(jì)可使存儲(chǔ)容量更大。但是DDR3工作時(shí)需要刷新和預(yù)充電,會(huì)產(chǎn)生一定的時(shí)間損耗,且對(duì)跳變地址的讀寫,存在頻繁換頁(yè)操作,會(huì)導(dǎo)致讀寫速率大幅降低。
根據(jù)重排原理可知,重排過程中需要頻繁的跳變地址,由于DDR3跳變地址讀寫速率低的器件特性,導(dǎo)致使用DDR3進(jìn)行重排時(shí),重排速率受限于跳變地址的讀寫速率,且速率往往較低。以DDR3-1333 / 8Gbit為例,對(duì)512個(gè)脈沖重復(fù)周期(PRI),7500個(gè)距離單元進(jìn)行重排,48Bit位寬的數(shù)據(jù),實(shí)測(cè)最大速率僅為19.23MHz。
隨著雷達(dá)技術(shù)的發(fā)展,雷達(dá)的信號(hào)帶寬和數(shù)據(jù)率也在逐步提升,因此對(duì)雷達(dá)信號(hào)處理能力、速度提出了更高的要求和挑戰(zhàn)。但由于當(dāng)前使用DDR3進(jìn)行重排的速率低,已不能滿足現(xiàn)代大帶寬、高數(shù)據(jù)率雷達(dá)信號(hào)處理的需求。如一部信號(hào)帶寬5MHz,基帶采樣率6.25MHz,有和、方位差、俯仰差、輔助四個(gè)波束的雷達(dá),其對(duì)重排速率的最低要求為6.25MHz×4 = 25MHz,大于當(dāng)前重排的最大速率,因此本文提出一種基于FPGA+DDR3的雷達(dá)數(shù)據(jù)高速重排方法,可有效提高重排的速率,解決當(dāng)前重排速率不能滿足現(xiàn)代雷達(dá)要求的問題。
根據(jù)上述可知,當(dāng)前使用DDR3進(jìn)行重排速率低主要原因是重排過程中頻繁的跳變地址所導(dǎo)致,想要提升DDR3重排速率,可從以下兩方面入手:一是提升跳變地址讀寫速率;二是減少跳變地址次數(shù)。
跳變地址讀寫速率主要是由器件性能和跳變地址步進(jìn)決定,器件性能是固有屬性,無法從使用層面上進(jìn)行優(yōu)化和提升;跳變地址步進(jìn)跟雷達(dá)波形參數(shù)和基帶采樣率有關(guān),一旦確定,不能隨意變更,否則影響雷達(dá)性能。因此無法通過使用層面提升跳變地址讀寫速率。
由此只能通過減少跳變地址次數(shù)來提升重排速率,根據(jù)DDR3器件特點(diǎn),為充分利用DDR3數(shù)據(jù)總線位寬大、順序地址讀寫速率高等優(yōu)點(diǎn),可從以下三點(diǎn)進(jìn)行優(yōu)化改進(jìn),以減少跳變地址次數(shù),提升重排速率:
1)輸入數(shù)據(jù)拼位,充分利用總線位寬。通常輸入數(shù)據(jù)的位寬較DDR3的數(shù)據(jù)位寬小很多,可將多個(gè)數(shù)據(jù)拼接成一個(gè)寫入DDR3的數(shù)據(jù)總線中,以此減少讀寫次數(shù)。
2)按塊讀取,減少重排讀數(shù)時(shí)地址跳變次數(shù)。重排讀數(shù)時(shí)不再是按單個(gè)存儲(chǔ)單元讀取,而是將相鄰的多個(gè)存儲(chǔ)單元視為一塊,按塊進(jìn)行讀取,以此減少地址跳變次數(shù),提升DDR3訪問效率。
3)設(shè)計(jì)同時(shí)讀寫時(shí)序,減少地址跳變次數(shù)。由于重排采用乒乓方式存儲(chǔ)數(shù)據(jù),可能會(huì)同時(shí)產(chǎn)生讀寫請(qǐng)求,且由于乒乓存儲(chǔ)區(qū)域地址相隔較遠(yuǎn),產(chǎn)生的讀寫請(qǐng)求地址存在跳變,因此需要合理設(shè)計(jì)MIG總線控制時(shí)序,在保證讀請(qǐng)求按塊操作的同時(shí),均衡的響應(yīng)讀寫請(qǐng)求,高效率的訪問總線,以提升重排速率。
根據(jù)上述改進(jìn)思路,對(duì)重排流程進(jìn)行重新設(shè)計(jì),由于按塊讀取出的數(shù)據(jù)不滿足重排輸出數(shù)據(jù)格式要求,因此需要將DDR3讀取出的數(shù)據(jù)再緩存至RAM,進(jìn)行二次重排,以輸出正確數(shù)據(jù)格式,由此將重排過程分割成一次重排和二次重排兩個(gè)步驟完成,具體流程如圖1所示。
圖1 重排流程圖
一次重排主要包含數(shù)據(jù)拼接、DDR3讀寫控制、數(shù)據(jù)拆分等三部分,各部分詳細(xì)介紹如下:
數(shù)據(jù)拼接是將個(gè)距離單元數(shù)據(jù)拼接成一個(gè)位寬接近或者等于DDR3數(shù)據(jù)總線的數(shù)據(jù),然后以此數(shù)據(jù)寫入DDR3數(shù)據(jù)總線,從而實(shí)現(xiàn)多個(gè)距離單元數(shù)據(jù)寫入到一個(gè)DDR3地址中,充分利用DDR3數(shù)據(jù)總線的同時(shí),也節(jié)約了數(shù)據(jù)的存儲(chǔ)空間。原本單個(gè)PRI內(nèi)個(gè)距離單元需要占據(jù)個(gè)存儲(chǔ)單元和進(jìn)行次總線操作,在進(jìn)行數(shù)據(jù)拼接后均縮減為原來的1,一次讀寫可操作個(gè)距離單元,等效于DDR3的讀寫效率提升了倍。
DDR3讀寫控制主要實(shí)現(xiàn)功能為:
1)根據(jù)DDR3型號(hào)和參數(shù)設(shè)置Memory Interface Generator(MIG)核,實(shí)現(xiàn)FPGA對(duì)DDR3的總線控制。FPGA與DDR3的高速接口通過Xilinx公司開發(fā)提供的MIG IP核來實(shí)現(xiàn),在產(chǎn)生MIG IP核時(shí),可通過圖形界面設(shè)置相關(guān)參數(shù)來產(chǎn)生一個(gè)存儲(chǔ)器模型。用戶不需要設(shè)計(jì)存儲(chǔ)器內(nèi)部復(fù)雜的讀寫操作時(shí)序,只需設(shè)計(jì)MIG核的讀寫控制邏輯,就可以完成對(duì)DDR3讀寫操作。
2)設(shè)計(jì)同時(shí)讀寫時(shí)序,減少地址跳變次數(shù),以此提升重排速率。在實(shí)現(xiàn)重排時(shí),主要包含用戶層和MIG時(shí)序控制層兩部分邏輯,用戶層根據(jù)輸入數(shù)據(jù)控制乒乓讀寫時(shí)序,產(chǎn)生MIG讀寫請(qǐng)求(讀請(qǐng)求包含讀使能和讀地址,寫請(qǐng)求包含寫使能、地址和數(shù)據(jù)),并存入相應(yīng)的FIFO中;MIG時(shí)序控制層根據(jù)時(shí)序讀取FIFO中的讀寫請(qǐng)求,并控制MIG總線狀態(tài),從而實(shí)現(xiàn)DDR3讀寫操作。
在MIG時(shí)序控制層中,為保證讀取操作按塊進(jìn)行,不被其他地址操作所打斷,只有當(dāng)讀請(qǐng)求FIFO中請(qǐng)求個(gè)數(shù)大于等于時(shí),才執(zhí)行讀操作;當(dāng)已經(jīng)連續(xù)讀了個(gè)地址,且FIFO中剩余請(qǐng)求個(gè)數(shù)小于時(shí),則停止讀操作。而寫操作則不需要按塊進(jìn)行約束,因?yàn)閷懙刂愤B續(xù),不論寫操作在何處被讀操作打斷,其執(zhí)行期間的地址均為連續(xù),所以寫操作是否按塊進(jìn)行不會(huì)導(dǎo)致地址跳變次數(shù)的減少或增加。但如果寫操作也按塊約束,當(dāng)讀寫請(qǐng)求均不足個(gè)時(shí),會(huì)出現(xiàn)總線閑置,導(dǎo)致總線資源時(shí)間上的浪費(fèi),因此寫操作采用寫請(qǐng)求FIFO非空即執(zhí)行的方式。MIG時(shí)序控制狀態(tài)圖和時(shí)序圖如圖2、圖3所示。
圖2 MIG時(shí)序控制狀態(tài)圖
圖3 k=4時(shí),MIG時(shí)序控制時(shí)序圖
圖3中Wr_En、Wr_Addr、Wr_Data為用戶層產(chǎn)生的寫請(qǐng)求使能、地址和數(shù)據(jù);Wr_Empty為寫請(qǐng)求FIFO空標(biāo)志位;Rd_En、Rd_Addr為用戶層產(chǎn)生的讀請(qǐng)求使能和地址;Rd_Count為讀請(qǐng)求FIFO中剩余請(qǐng)求個(gè)數(shù);Rd_Timer為連續(xù)執(zhí)行讀操作次數(shù);Mig_State為時(shí)序控制機(jī)狀態(tài),0x0-空閑,0x1-寫狀態(tài),0x2-讀狀態(tài);app_rdy表示DDR3已經(jīng)準(zhǔn)備好接收命令,高有效;app_en為命令使能,高有效;app_cmd為當(dāng)前請(qǐng)求命令,0x0-寫請(qǐng)求,0x1-讀請(qǐng)求;app_addr為當(dāng)前請(qǐng)求操作的地址;app_wdf_wren為當(dāng)前要寫入DDR3的數(shù)據(jù)使能,高有效;app_wdf_data為當(dāng)前要寫入DDR3的數(shù)據(jù)。
由此,MIG的時(shí)序?qū)崿F(xiàn)了從按單個(gè)存儲(chǔ)地址進(jìn)行跳變讀取到僅塊間跳變地址讀取的優(yōu)化。地址跳變次數(shù)由原來的每個(gè)地址跳變,縮減到連續(xù)執(zhí)行次后才跳變,地址跳變次數(shù)縮減為原來的1/。
數(shù)據(jù)拆分是對(duì)應(yīng)于數(shù)據(jù)拼接的逆操作,主要是將DDR3讀出的大位寬數(shù)據(jù)拆分成個(gè)距離單元,以方便二次重排時(shí)使用。
一次重排輸出數(shù)據(jù)格式如圖4所示,圖中(,)表示第個(gè)PRI內(nèi)的第個(gè)距離單元回波數(shù)據(jù)。
圖4 一次重排輸出數(shù)據(jù)流
由于一次重排輸出的為重排不完全的數(shù)據(jù)流,每個(gè)多普勒維中均還包含大小為×的連續(xù)距離單元,由于有個(gè)PRI,因此需要在FPGA內(nèi)開辟兩個(gè)深度為××的RAM,用于進(jìn)行二次重排,以將數(shù)據(jù)完全轉(zhuǎn)換成多普勒維。
二次重排按照常規(guī)方式進(jìn)行,即按單個(gè)距離單元地址跳變讀取數(shù)據(jù),每當(dāng)RAM中寫滿××個(gè)數(shù)據(jù)后,乒乓讀寫切換,同時(shí)啟動(dòng)上一寫滿RAM的讀數(shù)。每完成一次RAM數(shù)據(jù)讀取,則完成了×個(gè)距離單元的多普勒維數(shù)據(jù)輸出,當(dāng)執(zhí)行完(×)次RAM數(shù)據(jù)讀取后,即完成了CPI內(nèi)所有數(shù)據(jù)從距離維到多普勒維的重排。
由此,通過上述步驟,可實(shí)現(xiàn)重排的優(yōu)化和速率提升,但值得注意的是,方法中重排的速度提升跟數(shù)據(jù)拼接個(gè)數(shù)和分塊的地址個(gè)數(shù)有關(guān),當(dāng)= 1且= 1時(shí),本方法與常規(guī)重排一致,為重排速度最慢的情況。隨著、數(shù)值的增加,重排速度也會(huì)逐步提高。但、的取值也不能任意取值和增加,存在一些限制條件:
1)為了讓時(shí)序控制簡(jiǎn)化,、的取值應(yīng)使和(×)均為整數(shù);
2)由于二次重排中需要在FPGA內(nèi)開辟兩個(gè)深度為××的RAM,但FPGA片內(nèi)RAM資源有限,、的取值需考慮片內(nèi)資源情況。
使用Vivado 2016.2創(chuàng)建工程并編碼實(shí)現(xiàn),在硬件平臺(tái)中進(jìn)行驗(yàn)證,其中使用FPGA 1片,型號(hào)為XC7K325T-2FFG900I;使用DDR3 4片,型號(hào)為DDR3-1333 / 8Gbit,4片DDR3并聯(lián)接入FPGA中,從而構(gòu)建出64Bit位寬的DDR3數(shù)據(jù)總線。讀寫請(qǐng)求FIFO緩存深度為512,MIG IP核設(shè)置參數(shù)為:Clock Period=625MHz,Input Clock Period=156.25MHz,Data Width=64。
輸入數(shù)據(jù)為512個(gè)PRI,每個(gè)PRI有7500個(gè)距離單元,每個(gè)距離單元為I、Q復(fù)數(shù),I、Q均為24Bit,取值范圍為0~7499的遞增數(shù),I、Q按從高到低進(jìn)行拼位,由此構(gòu)成48Bit的輸入信號(hào)。
驗(yàn)證時(shí),所有信號(hào)均在250MHz的時(shí)鐘下進(jìn)行觀測(cè),通過Virtual Input Output(VIO)設(shè)置不同的讀寫速率,并校驗(yàn)輸出數(shù)據(jù)是否正確,來驗(yàn)證、取值不同情況下的最大重排速率。詳細(xì)驗(yàn)證結(jié)果如下:
1)=1,=1,此時(shí)為常規(guī)重排,最大無錯(cuò)誤輸入輸出速率為13個(gè)時(shí)鐘周期輸入輸出1個(gè)數(shù)據(jù),因此當(dāng)前最大重排速率為重排速率為250MHz/13=19.23MHz,驗(yàn)證結(jié)果圖如圖5所示。
圖5 j=1,k=1驗(yàn)證結(jié)果圖
2)=10,=1,此時(shí)僅進(jìn)行數(shù)據(jù)拼位,最大無錯(cuò)誤輸入輸出速率為13個(gè)時(shí)鐘周期輸入輸出10個(gè)數(shù)據(jù),因此當(dāng)前最大重排速率為250MHz×10/13=192.3MHz,驗(yàn)證結(jié)果圖如圖6所示。
圖6 j=10,k=1驗(yàn)證結(jié)果圖
3)=1,=10,此時(shí)僅進(jìn)行按塊讀取,最大無錯(cuò)誤輸入輸出速率為40個(gè)時(shí)鐘周期輸入輸出10個(gè)數(shù)據(jù),因此當(dāng)前最大重排速率為250MHz×10/40=62.5MHz,驗(yàn)證結(jié)果圖如圖7所示。
圖7 j=1,k=10驗(yàn)證結(jié)果圖
對(duì)比1)和2)的驗(yàn)證結(jié)果,2)中輸入輸出數(shù)據(jù)速率雖然是1)的10倍,但由于2)將10個(gè)數(shù)據(jù)拼接成1個(gè)大位寬的數(shù)送入MIG總線,對(duì)于MIG總線來說,均為13個(gè)時(shí)鐘周期操作1次總線,因此數(shù)據(jù)拼接個(gè)數(shù)可實(shí)現(xiàn)不增加MIG總線操作的前提下,將重排速率提升倍。
對(duì)比1)和3)的驗(yàn)證結(jié)果,重排速率提升了3.25倍,說明按塊讀取可有效提升重排速率,由于頻繁操作總線導(dǎo)致訪問效率下降,因此雖不能將重排速率提升倍,但隨著分塊地址個(gè)數(shù)的增加,對(duì)重排速率的提升也會(huì)越發(fā)明顯。
綜上所述,在使用同一硬件平臺(tái)、相同設(shè)置參數(shù)、輸入數(shù)據(jù)位寬和格式一致的前提下,改進(jìn)后不同取值情況下重排速率對(duì)比如表1所示。
表1 重排速率對(duì)比
本文中提出了一種基于FPGA+DDR3的雷達(dá)數(shù)據(jù)高速重排方法,該方法以使用FPGA部分RAM資源和增加重排復(fù)雜度為代價(jià),充分利用DDR3順序地址讀寫效率高、FPGA片內(nèi)RAM訪問速度快等優(yōu)點(diǎn),盡可能地規(guī)避DDR3跳變地址讀寫效率低的缺點(diǎn),最大程度地減少了DDR3跳變地址的次數(shù),有效提升了重排速率,能滿足現(xiàn)代雷達(dá)信號(hào)處理數(shù)據(jù)量不斷增加,數(shù)據(jù)率不斷提升的需求。