利用AutoESL高級綜合工具可實現(xiàn)在 Xilinx Virtex-5器件中構(gòu)建復雜的寬帶無線系統(tǒng)接收器。
空分復用MIMO處理技術(shù)可顯著提高無線通信系統(tǒng)的頻譜效率,進而大幅增加無線通信系統(tǒng)的容量。正因如此,它已成為新一代WiMAX以及其它基于OFDM無線通信系統(tǒng)的核心組成部分。空分復用MIMO處理技術(shù)是一項計算密集型應用,可實現(xiàn)高要求的信號處理算法。
在MIMO系統(tǒng)中,空分復用技術(shù)的一個具體實例是球形解碼。球形解碼是一種解決MIMO檢測問題的有效方法,其在比特誤碼率 (BER) 性能方面能與最佳的最大似然檢測算法相媲美。但是,DSP處理器的計算能力有限,不足以滿足球形解碼實時性方面的要求。
現(xiàn)場可編程門陣列 (FPGA) 是一個極具吸引力的平臺,可實現(xiàn)如球形解碼器這樣的復雜DSP密集型算法?,F(xiàn)代FPGA 是一種高性能并行計算平臺,可在保持可編程DSP處理器靈活性的同時,為系統(tǒng)提供所需的專用硬件。多項研究表明在多個信號處理應用中,F(xiàn)PGA的性能比傳統(tǒng) DSP 處理器高100倍,性價比可提高30倍。
盡管FPGA的性能具有相當大的優(yōu)勢,但通常無法應用于無線信號處理,主要因為傳統(tǒng)的DSP程序員認為它們不容易處理。事實上,造成FPGA無法在無線應用中得到廣泛使用的真正阻礙是以硬件為中心的傳統(tǒng)設計流程與工具。
目前,要想利用FPGA來進行設計,需要具備豐富的硬件設計經(jīng)驗,包括熟悉VHDL與Verilog等硬件描述語言。最近,新型高級綜合工具可以作為FPGA的輔助設計工具。這些設計工具將高級算法描述作為輸入,并生成可與標準FPGA實現(xiàn)工具(例如 Xilinx? ISE?design suite 與嵌入式開發(fā)套件)一起使用的RTL。該工具可提高設計效率,縮短開發(fā)時間,同時實現(xiàn)高質(zhì)量的設計。
我們可利用該工具設計基于 FPGA 的復雜無線算法應用,即802.16e系統(tǒng)下的空分復用MIMO球形檢測器。我們專門選擇AutoESL的AutoPilot高級綜合工具作為時鐘頻率為225MHz的Xilinx Virtex?-5的輔助設計工具。
球形解碼
球形檢測作為解碼過程的一部分,是一種用于簡化空分復用系統(tǒng)檢測復雜程度的有效方法,在 BER 性能方面可與復雜度更高的最佳最大似然 (ML) 檢測算法相媲美。
如圖1所示,在MIMO 802.16e無線接收器的方框圖中,我們假設接收器可以準確估計信道矩陣,該假設條件可通過傳統(tǒng)的信道估算方法來實現(xiàn)。該實現(xiàn)的流水線具有 3 個構(gòu)建模塊:信道重新排序、QR分解以及球形檢測器 (SD)。我們通過計算檢測到的比特對數(shù)似然比(LLR) 來產(chǎn)生軟輸出,從而為軟輸入、軟輸出信道解碼器(比如渦輪解碼器)的
使用做準備。
圖 1 球形解碼器方框圖
信道矩陣重排序
球形檢測器處理天線的順序可對BER的性能產(chǎn)生較大影響。在進行球形檢測之前,首先執(zhí)行信道重排序。檢測器利用信道矩陣預處理器實現(xiàn)了類似貝爾實驗室分層空時 (BLAST) 結(jié)構(gòu)上采用的連續(xù)干擾抵消處理技術(shù),最終達到了接近ML性能。
該方法利用信道重排序處理來實現(xiàn),通過多次迭代確定復雜信道矩陣最佳列檢測次序。該算法根據(jù)迭代次數(shù)來選擇范數(shù)最大或最小的行。歐幾里德范數(shù)最小的行表示天線影響最強,而歐幾里德范數(shù)最大的行表示天線影響最弱。這種新穎的方案首先處理最弱的數(shù)據(jù)流,隨后依次迭代處理功率從高到低的數(shù)據(jù)流。
為了滿足應用對高數(shù)據(jù)速率的要求,我們實現(xiàn)了圖2所示的基于流水線架構(gòu)的信道排序模塊。該模塊可以在時分復用 (TDM) 模式下同時處理5條信道。這種方案延長了同一信道不同矩陣元素之間的處理時間,同時可保持高數(shù)據(jù)吞吐量。
在圖2中,G矩陣計算是要求最高的組成部分。該過程的核心是矩陣求逆,可通過QR分解 (QRD) 來實現(xiàn)。實現(xiàn)QRD的常用方法是使用吉文斯旋轉(zhuǎn)。
圖 2 迭代信道矩陣重排序算法
該方法可執(zhí)行對角線單元和非對角線單元的復雜旋轉(zhuǎn),這些單元都是我們所使用脈動陣列的基本計算單元。改進的實數(shù)矩陣QRD在獲取信道矩陣列的最佳排序之后,下一步應對實數(shù)矩陣系數(shù)進行QR分解。用于該QRD處理的功能單元與計算逆矩陣的QRD引擎類似,但有一些不同之處。本例子的輸入數(shù)據(jù)是實數(shù),因此脈動陣列結(jié)構(gòu)的維數(shù)會相應更高(即8×8實數(shù)值而不是4×4復數(shù)值)。
為了滿足時序約束的要求,輸入數(shù)據(jù)消耗速率必須保持在每時鐘周期1個輸入采樣。這種要求給處理時延帶來了挑戰(zhàn),即我們無法在5條信道的TDM結(jié)構(gòu)中處理該問題。因此,在TDM組中將信道數(shù)量增加至 15 條,以延長同一信道矩陣中連續(xù)元素之間的處理時間。
球形檢測器設計
您可以將迭代球形檢測算法視為遍歷樹過程,樹 i 的每一層對應于第 i 個天線的處理符號。實現(xiàn)遍歷樹有幾種可選方法。我們選擇的是廣度優(yōu)先搜索法,因為該方案具有備受歡迎的硬件友好特征。在每一層,只選擇具有最小部分歐氏距離的K節(jié)點來計算擴展情況。這類檢測器稱為 K-best 檢測器。范數(shù)計算是在球形檢測器的部分歐氏距離 (PED) 模塊中完成的。根據(jù)樹的層次,我們可以利用3種不同的PED模塊。根節(jié)點PED模塊計算所有可能的PED(樹層次指數(shù)是 i = M = 8)。
第二層PED模塊分別對第一層計算得出的8個幸存路徑進行計算,計算每個幸存路徑的8個可能PED。在樹層次指數(shù) i = 7的情況下,將得出64個生成PED。第三類PED模塊用于樹的其它層次,負責為上一級計算得出的所有PED計算出最近節(jié)點的PED。這會將每一層的分支數(shù)量固定為 K = 64,如此傳播至最后一層 i = 1 ,并產(chǎn)生64個最終PED以及它們的檢測符號序列。SD流水線架構(gòu)可允許在每個時鐘周期中進行數(shù)據(jù)處理。因此,樹的每一層只需要 1 個 PED 模塊,從而使PED模塊總數(shù)量與樹的層數(shù)量相等。這樣對4×4 64-QAM調(diào)制方式而言,PED的總數(shù)量為 8。圖 3為 SD 結(jié)構(gòu)圖。
圖 3 球形檢測器處理流水線
FPGA性能實現(xiàn)目標
目標FPGA器件為Xilinx Virtex-5,其目標時鐘頻率是225MHz。如果為每個數(shù)據(jù)副載波估計信道矩陣,就會限制每個信道矩陣的處理時間。對于選定的時鐘頻率和5MHz通信帶寬(在WiMAX系統(tǒng)中相當于360個數(shù)據(jù)副載波),我們可以按如下公式計算每個信道矩陣間隔的可用處理時鐘周期數(shù):
如前所述,我們設計了計算量要求最高的 4×4 天線與 64-QAM 調(diào)制方案的配置結(jié)構(gòu)。本方案的原始數(shù)據(jù)速率可達到 83.965Mb/s。
針對 FPGA 的高級綜合
高級綜合工具將具體算法的高級描述作為其輸入,可執(zhí)行并生成基于FPGA實現(xiàn)的 RTL 描述,如圖4所示。該RTL描述可與參考設計、IP核或已有RTL代碼結(jié)合在一起,利用傳統(tǒng)Xilinx ISE/EDK工具來創(chuàng)建完整的FPGA實現(xiàn)方案。
圖 4 – 針對 FPGA 的高級綜合
現(xiàn)代高級綜合工具將非定時C/C++描述作為輸入規(guī)范。該工具對同一C/C++ 代碼執(zhí)行 2 種解讀:輸入/輸出行為的順序語義與基于 C/C++ 代碼與編譯器指令的架構(gòu)規(guī)范。這些高級綜合工具根據(jù) C/C++ 代碼、編譯器指令以及目標吞吐量的要求來生成高性能的流水線架構(gòu)。高級綜合工具還具有流水線級數(shù)的自動插入與資源共享等其它功能,這樣可減少 FPGA資源的消耗。基本上講,高級綜合工具提高了FPGA設計的抽象級,并將耗時且容易發(fā)生錯誤的RTL設計任務實現(xiàn)透明化。
我們將重點集中在 C++ 描述的使用,其目標是利用 C++ 模板類來代表任意精度的整數(shù)類型以及利用模板功能來代表架構(gòu)中參數(shù)化的模塊。
圖5給出總體設計方案,出發(fā)點是從MATLAB?功能描述中獲得的C/C++參考代碼。如圖所示,在任何硬件目標平臺中實現(xiàn)應用的第一步通常是重組C/C++ 參考代碼。我們將“重組”表示為將原始C/C++ 代碼以一種更適合目標處理引擎的格式進行重寫(通常是為了使代碼清晰明了、易于概念理解而不考慮最優(yōu)性能)。例如,必須重新排列DSP處理器中的應用代碼,以便算法可以高效地利用緩存。當目標器件是FPGA時,重組可能包括:重寫代碼用以表示可達到預期吞吐量的架構(gòu)規(guī)范,或重寫代碼以高效利用FPGA的特定功能,例如嵌入式DSP宏。
圖 5 C/C++ 改進型迭代設計方案
我們通過利用傳統(tǒng)C/C++編譯器(例如 gcc),并重新利用適用于C/C++參考代碼校驗的C/C++級測試臺,可實現(xiàn)對 C/C++ 執(zhí)行代碼的功能校驗。C/C++執(zhí)行代碼是高級綜合工具的主要輸入。但是,額外輸入會顯著影響生成硬件、及其性能和FPGA資源的使用數(shù)量。因此存在 2 個基本約束條件,分別為目標FPGA系列產(chǎn)品與目標時鐘頻率,它們都會影響生成架構(gòu)中流水線級數(shù)的數(shù)量。
此外,高級綜合工具可接受編譯器指令(例如,在C/C++ 代碼中插入注解),使設計者可以在不同C/C++代碼段中應用不同的指令類型。例如,應用于循環(huán)(例如,循環(huán)展開)和其它數(shù)組(例如,指定哪些 FPGA 資源必須用于執(zhí)行數(shù)組操作)的指令。
根據(jù)這些輸入,高級綜合工具生成輸出架構(gòu) (RTL),并報告其吞吐量。然后設計者根據(jù)吞吐量的大小來修改指令,執(zhí)行C/C++代碼。如果生成的架構(gòu)滿足吞吐量方面的要求,則RTL輸出用于FPGA實現(xiàn)工具 (ISE/EDK) 的輸入。
只有在完成邏輯綜合和布局布線之后,才報告可實現(xiàn)的最終時鐘頻率和FPGA資源使用數(shù)量。如果該設計不能滿足時序和FPGA資源限制這2方面要求,則該設計與預期設計不相符,那么設計者應修改C/C++執(zhí)行代碼或編譯器指令。
SD高級綜合實現(xiàn)
我們已經(jīng)利用A u t o E S L的AutoPilot 2010.07.ft 工具實現(xiàn)了圖1所示的WiMAX球形解碼器的3個關(guān)鍵構(gòu)建模塊。需要重點強調(diào)的是,本方案所選擇的算法與最近SDR會議論文中的算法一致,因此可以實現(xiàn)相同的BER。
在本節(jié)中,我們給出了用于該特殊實現(xiàn)的代碼重寫與編譯器指令的具體示例。從MATLAB功能描述中獲得的原始C參考代碼大約有2000行,包括綜合C代碼與驗證C代碼。
代碼只包括使用C內(nèi)置數(shù)據(jù)類型的定點運算。一個對FPGA友好的實現(xiàn)幾乎可以完成所有要求的浮點運算(例如 sqrt)。除了描述 FPGA 綜合功能的C參考代碼之外,還有一個完整的C級驗證測試平臺。我們從MATLAB描述中生成輸入測試矢量和重要的輸出參考文件。
原始C / C + +參考代碼符合MATLAB 規(guī)范的比特精度要求,并可通過由多個數(shù)據(jù)集構(gòu)成的回歸分析套件。該C/C++參考代碼經(jīng)歷了不同類型的代碼重組。例如,圖5顯示了3個我們已經(jīng)實現(xiàn)的代碼重組的例子。我們重新使用 C 級驗證設施來檢驗 C/C++代碼執(zhí)行中的任何變化。而且,我們是在 C 級執(zhí)行所有驗證,而不是在寄存器傳送級,這樣可避免非常耗時的RTL仿真,從而有助于減少總體開發(fā)時間。
宏架構(gòu)說明
代碼重構(gòu)的最重要部分是重寫C/C++代碼,以描述可有效實現(xiàn)特定功能的宏架構(gòu)。換句話說,設計人員負責宏架構(gòu)說明,而高級綜合工具負責宏架構(gòu)的生成。這類代碼重組對得到的吞吐量和質(zhì)量結(jié)果具有重大影響。就球形解碼器而言,有幾個這類代碼重組的實例。例如,為了滿足信道排序模塊的高吞吐量要求,設計人員應使用C/C++來描述圖2所示的宏架構(gòu)。
這類C/C++代碼由幾個以數(shù)組為傳遞參數(shù)的函數(shù)構(gòu)成。該高級綜合工具可自動調(diào)用乒乓緩沖器中的數(shù)組,以實現(xiàn)在流
水線中并行執(zhí)行多個矩陣計算模塊。本級代碼重組的另一個實例是決定特定模塊的TDM結(jié)構(gòu)中所使用信道的數(shù)量(例如,信道矩陣重排序模塊使用5條信道,修正后的實部QR分解模塊使用15條信道)。
圖6是宏架構(gòu)說明的一個實例。圖3為描述球形檢測器的C++代碼片段框圖。我們注意到圖中有一條調(diào)用9個函數(shù)的流水線,其中每個函數(shù)代表圖3中的一個模塊。函數(shù)之間的通信通過傳遞數(shù)組來完成,這些數(shù)組被第5行和第7行的適當指令 (pragmas) 映射至數(shù)據(jù)流接口(不是 FPGA 嵌入式 BRAM 存儲器)。
圖 6 球形檢測器宏架構(gòu)描述
參數(shù)化的重要性
參數(shù)化是代碼重寫的另一個關(guān)鍵實例。我們廣泛利用C++模板函數(shù)來表示架構(gòu)中的參數(shù)化模塊。在球形解碼器的實現(xiàn)過程中,該類代碼重寫有幾個不同實例。一個具體實例是應用于信道重排序模塊的不同類型矩陣操作。圖2所示的矩陣計算模塊(4×4, 3×3與2×2)就包含不同類型的矩陣操作,例如矩陣求逆或矩陣相乘。將這些模塊進行編碼并作為 C++ 模板函數(shù),模板參數(shù)即矩陣的行數(shù)與列數(shù)。
圖7為矩陣相乘的C++模板函數(shù)。除了矩陣行數(shù)和列數(shù)這兩個參數(shù)之外,該模板函數(shù)還有第三個參數(shù),即MM_II(矩陣相乘初始化間隔),該參數(shù)用于指定二次連續(xù)循環(huán)迭代之間的時鐘周期數(shù)量。第 9 行的指令 (pragma)用于對具體實例所需吞吐量進行參數(shù)化。這是一項很重要的功能,原因是它可對生成的微體系架構(gòu)產(chǎn)生重要影響—也就是高級綜合工具具備充分利用資源共享的能力,從而可以減少用于具體實現(xiàn)中的 FPGA 資源數(shù)量。例如,高級綜合工具僅僅通過修改初始化間隔 (Initiation Interval) 參數(shù)并使用相同的 C++ 代碼,即可在執(zhí)行不同矩陣求逆(4×4, 3×3, 2×2) 模塊的過程中自動實現(xiàn)不同層面的資源共享。
圖 7 代碼參數(shù)化實例
FPGA最優(yōu)化
FPGA最優(yōu)化是代碼重寫的最后一個實例。設計人員可以重寫C/C++代碼,以更高效地利用特定FPGA資源,從而可以改善時序并減小存儲區(qū)域的使用。該類最優(yōu)化方面的兩個具體實例是比特寬度最優(yōu)化與嵌入式DSP模塊 (DSP48) 的高效使用。高效利用DSP48可以改善時序并提高FPGA資源利用率。
我們利用內(nèi)置C/C++數(shù)據(jù)類型(例如short、int)來編寫C/C++參考代碼,同時利用18位定點數(shù)據(jù)類型來表示矩陣元素。我們已經(jīng)利用C++模板類來表示任意精度的定點數(shù)據(jù)類型,因此可減少FPGA資源的使用并將時序影響最小化。
圖8是一個先執(zhí)行乘法后執(zhí)行減法的C++模板函數(shù),而輸入操作數(shù)寬度是需要設置的參數(shù)。可將這兩個運算操作映射至嵌入式DSP48模塊中。在圖8中,有兩條指令指示高級綜合工具用最多兩個時鐘周期來調(diào)度這些操作并使用寄存器來存儲輸出返回值。
圖 8 針對 DSP48 有效利用的 FPGA 性能最優(yōu)化
生產(chǎn)力度量指標
在圖9中,我們繪出利用AutoESL的AutoPilot所生成設計的規(guī)模大?。碏PGA資源使用情況)隨時間變化的曲線,并與傳統(tǒng)系統(tǒng)生成器 (RTL)的實現(xiàn)過程相比較。利用高級綜合工具,我們可以實現(xiàn)很多有效的解決方案,且這些解決方案的規(guī)模隨時間而變化。因此,設計人員可根據(jù)代碼重組的數(shù)量,在獲取解決方案的速度與解決方案的規(guī)模大小之間做出權(quán)衡。另外,RTL 解決方案只有一種,而且開發(fā)周期較長。
?
圖 9 FPGA 資源用量隨著開發(fā)時間增加而下降
我們已經(jīng)觀察到可以用相對較少的時間來獲得幾個明顯比傳統(tǒng)RTL解決方案使用更多FPGA資源(例如區(qū)域)的綜合解決方案。另一方面,設計人員也可自行決定在工具專家等級下工作,通過執(zhí)行更高級的C/C++代碼重組技術(shù)(例如特定FPGA的最優(yōu)化),實現(xiàn)用更少的FPGA資源生成更多的解決方案。
最后,因為我們是在C/C++級執(zhí)行所有驗證,從而可以避免耗時的RTL。因此,在 C/C++ 級執(zhí)行設計驗證將明顯縮短總體開發(fā)時間。
質(zhì)量結(jié)果
在圖10中,我們對比了分別利用高級綜合工具與系統(tǒng)參考生成器(基本屬于結(jié)構(gòu)化的RTL設計,顯示使用如DSP48模塊的FPGA基元)這兩種不同方法來實現(xiàn)的完整球形解碼器,在其最終FPGA資源使用量和總體開發(fā)時間這兩方面進行了比較。AutoESL開發(fā)時間包括工具學習、產(chǎn)生結(jié)果、設計空間探測與詳細驗證所需要的時間。
圖 10 質(zhì)量結(jié)果的度量標準體現(xiàn)了 AutoESL 優(yōu)勢。
為了更精確地比較,我們利用針對Virtex-5 FPGA的最新Xilinx ISE 12.1工具重新實現(xiàn)RTL參考設計。同樣,我們利用針對同類FPGA的ISE 12.1來執(zhí)行由AutoESL AutoPilot生成的RTL。圖10顯示AutoESL AutoPilot節(jié)約FPGA資源效果明顯,主要是因為在實現(xiàn)矩陣求逆模塊時實現(xiàn)了資源共享。
我們也觀察到寄存器的使用數(shù)量明顯減少,查找表 (LUT) 的使用量略有提高。產(chǎn)生這種結(jié)果的部分原因在于 AutoESL
實現(xiàn)過程中延遲線被映射至 SRL16(例如 LUT),而在系統(tǒng)生成器方案中,則利用寄存器實現(xiàn)上述功能。在其它模塊中, 我們交替使用BRAM 與 LUTRAM,導致信道預處理器的 BRAM 使用率較低。
AutoESL AutoPilot完成對底層FPGA實現(xiàn)細節(jié)的抽象(例如時序與流水線設計)。與使用傳統(tǒng)RTL設計方案相比,其產(chǎn)生的質(zhì)量結(jié)果更具競爭力。C/C++級驗證避免使用耗時的RTL仿真,從而可以減少總體開發(fā)時間。但是,對于具有挑戰(zhàn)性的復雜設計而言,如果想取得卓越的效果,則必須給出優(yōu)異的宏架構(gòu)定義,且必須具備扎實的FPGA設計工具知識,還要有理解與解釋FPGA工具報告的能力。
評論