張 培1,2,尚 麗2 ,劉 韜2,汪一鳴
(1. 江蘇省現(xiàn)代企業(yè)信息化應(yīng)用支撐軟件工程技術(shù)研發(fā)中心,江蘇 蘇州 215104;2. 蘇州職業(yè)大學(xué), 江蘇 蘇州 215104;3. 蘇州大學(xué),江蘇 蘇州 215021)
隨著FPGA平均門成本的下降,在基于FPGA的硬件平臺上開發(fā)應(yīng)用程序成為高性能嵌入式系統(tǒng)設(shè)計者的一種新選擇。但是,由于過去割裂了硬件和軟件開發(fā)工具、開發(fā)方法之間的關(guān)系,在面向軟件應(yīng)用中的FPGA技術(shù),較之傳統(tǒng)處理器所具有的優(yōu)勢并沒有體現(xiàn)出來。
傳統(tǒng)的硬件描述語言(HDL)主要用于描述數(shù)字系統(tǒng)的結(jié)構(gòu)、行為、功能和接口,對較為復(fù)雜的算法設(shè)計實現(xiàn)則支持不夠。面對當(dāng)今數(shù)字系統(tǒng)設(shè)計中涉及的越來越多、越來越復(fù)雜的算法描述和建模,開始出現(xiàn)了描述硬件的C語言。對比相同功能的傳統(tǒng)硬件描述語言,大部分計算密集型的算法如果用C代碼描述,其硬件規(guī)模相對會較小,性能卻很接近。
Impulse C 語言是目前比較新的一種硬件C語言,是一種基于C語言的FPGA開發(fā)語言,并且能夠很好地與VHDL語言相融合。Impulse C的目標(biāo)是允許C語言能被用來描述一個或多個處理單元(進程),并且將這些處理單元連接,組成一個能夠?qū)崿F(xiàn)于硬件中的完整的并行應(yīng)用(如映射到FPGA的邏輯)。這種多進程并行方法非常適用于基于FPGA的嵌入式系統(tǒng),也適用于很多與傳統(tǒng)的處理器相連接的FPGA模塊所組成的大型高性能計算平臺[1]。同時,CoDeveloper設(shè)計平臺允許設(shè)計師開發(fā)C語言算法,與HDL設(shè)計輸入相比,可以使FPGA設(shè)計過程更加快捷。
LDPC碼是一種新的高性能線性糾錯碼,其譯碼復(fù)雜度低,且可實行并行操作,非常適合于FPGA的并行計算。因此,本文基于最新一代從Impulse C編程到硬件編譯的便捷技術(shù),提出了一種對LDPC碼譯碼器進行FPGA設(shè)計的新方案。
Impulse C編程模型如圖1所示,它是一個針對面向流的、軟硬件混合式應(yīng)用程序的通信順序進程模型。從軟件到硬件編譯器的過程是實現(xiàn)快速開發(fā)的關(guān)鍵,它保證了應(yīng)用程序直接編譯到FPGA。通過將C語言編譯導(dǎo)入現(xiàn)有設(shè)計流程,設(shè)計者能夠迅速創(chuàng)建和評估不同的軟硬件劃分策略,建立工作產(chǎn)品原型。
圖1 Impulse C編程模型Fig.1 Impulse C programming model
LDPC碼的譯碼算法有多種,為了在譯碼性能和復(fù)雜度之間達到更好的平衡,同時基于硬件實現(xiàn)方面的考慮,本設(shè)計選擇采用最小和算法(Min Sum Algorithm,MSA)[2-4],從而避免了進行復(fù)雜的計算和查表,復(fù)雜度得到了明顯降低,而且譯碼性能也較好,適合硬件實現(xiàn)。其基本流程如圖2所示。
圖2 譯碼算法流程圖Fig.2 Decoding algorithm flow
Impulse C編程的核心是進程和流。通信順序進程編程模型是通過一組數(shù)據(jù)類型和內(nèi)部庫函數(shù)來實現(xiàn)的。這些庫函數(shù)用來在進程之間進行流和信號的數(shù)據(jù)通信,還可以將進程分配到目標(biāo)編程平臺的實際硬件資源上??梢?,多個進程之間的相互通信和同步主要通過數(shù)據(jù)流方式完成。如果一個應(yīng)用程序具有設(shè)計良好的流接口,那么當(dāng)它被映射到實際硬件和軟件時,就能高效運行。本次設(shè)計中讀取待譯碼數(shù)據(jù)的一段程序如下:
for ( i =0;i { pragma CO PIPELINE if( co_stream_read(InDataF, &nSample, sizeof(float))==co_err_none); IF_SIM(samplesread++;); Lc[i] = nSample; } 這里使用了CO PIPELINE流水線指令,因為流水線技術(shù)允許循環(huán)的多重迭代并行執(zhí)行。假設(shè)N取1,若不使用流水線,處理100個數(shù)據(jù)需要200個時鐘周期?,F(xiàn)在使用流水線后,將產(chǎn)生一個二級流水線。當(dāng)?shù)谝粋€數(shù)據(jù)被讀進來以后,第一級立刻開始讀取第二個數(shù)據(jù),與此同時,第二級使用剛讀進來的數(shù)據(jù)進行計算,這樣只需要101個周期就能處理100個輸入數(shù)據(jù)了??梢?,以數(shù)據(jù)流的形式來讀取數(shù)據(jù)和輸出數(shù)據(jù),應(yīng)用程序可以一邊從外部接收數(shù)據(jù),一邊處理數(shù)據(jù),效率更高,也能大大簡化硬件軟件系統(tǒng)的設(shè)計和調(diào)試。 編譯器首先確定應(yīng)用中的硬件和軟件進程,將相應(yīng)的循環(huán)轉(zhuǎn)化為等價的并行語句,再生成可仿真的HDL文件。底層模塊描述了原來用co_process_config聲明的硬件進程,頂層實體引用了包含LDPC譯碼器實際功能的底層實體,這些功能是用寄存器傳輸級(RTL)代碼表示的。實際上,硬件生成器把每一個進程當(dāng)作一個獨立的狀態(tài)機來實現(xiàn)。在LDPC譯碼算法的狀態(tài)機中,共有195個狀態(tài),分別描述譯碼算法的初始化和迭代部分,以及用來驅(qū)動狀態(tài)機的時鐘邏輯。構(gòu)造規(guī)則(3,6)LDPC碼,取125×250的校驗矩陣,將經(jīng)過AGWN信道后的數(shù)據(jù)作為譯碼前數(shù)據(jù),每次讀取一組250 bit數(shù)據(jù)進行譯碼,共讀取10次。在CoDeveloper開發(fā)環(huán)境下進行桌面仿真,結(jié)果包含一個生產(chǎn)者測試進程、一個代表LDPC碼譯碼算法的Impulse C進程和一個消費者測試進程。數(shù)據(jù)流在系統(tǒng)各個不同進程的流動情況,以及譯碼輸出桌面仿真結(jié)果如圖3所示。 圖3 數(shù)據(jù)流在不同進程的流動及桌面仿真結(jié)果Fig.3 Data flow of the different process and the decoding output of the desktop simulation 最大迭代次數(shù)分別取5次和10次時的BER性能比較如圖4所示??梢?,由于迭代次數(shù)增多,在相同時間內(nèi)所得誤碼率明顯下降,這在一定程度上彌補了標(biāo)準(zhǔn)最小和算法由于采用近似計算而帶來的性能損失。 圖4 不同迭代次數(shù)下的性能比較Fig.4 Performance comparison with different iteration number 本次設(shè)計中選用的FPGA芯片是XC2V2000-4-bf957,這是由于該芯片的片內(nèi)資源豐富,無需外部緩沖就可實現(xiàn)高速數(shù)據(jù)采集,而且適合進行浮點運算和數(shù)據(jù)存儲操作。當(dāng)時鐘頻率為50 MHz,迭代次數(shù)為10次,本設(shè)計耗費了5 493個LUT,譯碼速率為10 Mbit/s, 功耗為367 mW。 基于傳統(tǒng)的HDL硬件描述方法,當(dāng)時鐘頻率為50 MHz,譯碼迭代次數(shù)為10次,文獻[5-7]分別采用3種不同的結(jié)構(gòu)在FPGA上實現(xiàn)了3種碼率為1/2的LDPC碼譯碼器芯片。其中,采用串行結(jié)構(gòu)實現(xiàn)的譯碼器耗費了3 039個LUT,速率僅為1 Mbit/s。采用全并行結(jié)構(gòu)實現(xiàn)的譯碼器速率可達1 Gbit/s,卻是以增加極高的芯片復(fù)雜度為代價的。采用半并行結(jié)構(gòu)實現(xiàn)的譯碼器速率為54 Mbit/s,是譯碼速率和資源消耗的一種折中,但由于構(gòu)造方法的限制,現(xiàn)有的大多數(shù)LDPC碼并不適合采用半并行結(jié)構(gòu)。 譯碼器的譯碼速率和硬件資源消耗是考慮 LDPC 碼譯碼器硬件實現(xiàn)時兩個重要的因素,較高的譯碼速率往往意味著更大的資源消耗。對比相同功能的傳統(tǒng)硬件描述方法,在本設(shè)計中由于Impulse C庫可以有效地利用Streams-C編譯器提供的“流式編程”方法,芯片內(nèi)部并行譯碼結(jié)構(gòu)采用流水線結(jié)構(gòu),降低了邏輯單元的使用量,硬件規(guī)模相對較?。煌瑫r,有些系統(tǒng)并不要求很高的譯碼速率,例如第三代移動通信系統(tǒng)要求達到的最高譯碼速率為10 Mbit/s。 因而本設(shè)計實現(xiàn)的譯碼器占有較低的資源利用率,數(shù)據(jù)吞吐量也能夠滿足實際工程的需要,具有良好的工程應(yīng)用能力。 本文基于Impulse C語言的FPGA編程技術(shù)的優(yōu)勢,創(chuàng)建實現(xiàn)了一個面向數(shù)據(jù)流的LDPC譯碼硬件算法,為軟件工程師從C到開發(fā)基于FPGA 的嵌入式硬件系統(tǒng)提供了一種快捷的新思路。面向FPGA性能,進一步優(yōu)化Impulse C代碼,從而提高其糾錯性能;采用系統(tǒng)級并行改善吞吐率,從而得到更高的譯碼速率以及更低的資源利用率將是下一步的研究方向。 參考文獻: [1] Davide Pellerin,Scott Thibault. Pratical FPGA Programming in C[M].New York: Prentice Hall PTR,2007:19-51. [2] 朱嘉,張海濱,潘宇.一種低復(fù)雜度的LDPC碼迭代譯碼算法[J].電訊技術(shù),2006,46(5):94-97. ZHU Jia, ZHANG Hai-Bin, Pan Yu. A Low-complexity Iterative Decoding Algorithm for LDPC Codes[J]. Telecommunication Engineering,2006,46(5):94-97.(in Chinese) [3] 鄧炯.幾種LDPC碼的性能比較[J].電訊技術(shù),2009,49(5):82-85. DENG Jiong. Performance Comparison of Several LDPC Codes[J]. Telecommunication Engineering,2009,49(5):82-85.(in Chinese) [4] Thomas J Richardson,Rudiger L Urbanke.Efficient Encoding of Low-Density Parity-Check Codes[J].IEEE Transactions on Information Theory,2001,47(2):638-656. [5] Levine B, Taylor R,Schmit H. Implementation of near Shannon limit error-correct codes using reconfigurable hardware[C]//Proceedings of IEEE Symposium on FCCM. Los Alamitos:IEEE,2000:217-226. [6] Andrew J Blanksby,Chris J Howland. A 690mW 1Gbit/s 1024bit, rate-1/2 low-density parity-check code decoder[J].Journal of Solid-State Circuits,2002,37(3):404-412. [7] Zhang T,Parhi K K. A 54Mbit/s (3, 6)-regular FPGA LDPC decoder[C]//Proceedings of IEEE SIPS.[S.l.]:IEEE,2002:127-132.2.3 硬件實現(xiàn)
3 結(jié)果分析
4 結(jié)論