1. 前言
在工程師實(shí)際開發(fā)過程中,可能會(huì)經(jīng)常遇到這樣的需求:數(shù)據(jù)從數(shù)據(jù)源端不斷地持續(xù)輸入FPGA,F(xiàn)PGA需要對(duì)數(shù)據(jù)進(jìn)行處理,最后將處理好的數(shù)據(jù)輸出至客戶端。
在數(shù)據(jù)處理過程中,可能需要一系列的處理步驟。比如常規(guī)的信號(hào)進(jìn)行處理步驟有(這里的處理步驟只是舉個(gè)例子):信號(hào)解調(diào)、濾波、傅里葉變換。
假如數(shù)據(jù)源每10ns輸入一個(gè)數(shù)據(jù),一個(gè)采用數(shù)據(jù)經(jīng)過信號(hào)解調(diào)需要10ns,完成濾波需20ns,傅里葉變換需要30ns。我們?cè)撊绾斡胿erilog語言設(shè)計(jì)硬件電路使得數(shù)據(jù)處理效率高效?
2. 面臨問題
FPGA一個(gè)較大的優(yōu)勢(shì)是其并行處理機(jī)制,即利用并行架構(gòu)實(shí)現(xiàn)信號(hào)/數(shù)據(jù)處理的功能。
大家首先想到的方法就是復(fù)制多份數(shù)據(jù)處理電路,如下圖所示:
將數(shù)據(jù)處理電路復(fù)制6份,這樣即便每路數(shù)據(jù)處理需要60ns,也能保證整個(gè)由6路處理鏈路組成的數(shù)據(jù)模塊能處理每10ns輸出一個(gè)數(shù)據(jù)的數(shù)據(jù)源。
這種解決方案的確利用了FPGA獨(dú)特的優(yōu)勢(shì),但面臨的問題是顯而易見的,它需要消耗大量的硬件資源。比如當(dāng)處理算法較復(fù)雜時(shí),一條處理鏈路可能就用掉了FPGA相應(yīng)60%的資源,這樣除非換更大容量的FPGA,否則在當(dāng)前FPGA上即使復(fù)制兩遍處理鏈路的電路都是不支持的。
此外,我們深入分析會(huì)發(fā)現(xiàn),電路雖然被復(fù)制了6份,但在同一時(shí)刻電路被使用率是很低的。假設(shè)輸入一個(gè)數(shù)據(jù)時(shí)刻為0ns,則在第50ns時(shí),真正處于工作狀態(tài)的電路如下圖所示(黃色標(biāo)的區(qū)域):
可見同一時(shí)刻,工作的電路比例很低,其它白色的電路模塊都是閑置的未工作的電路。
3. Pipeline解決方案
所謂流水線(pipeline)處理,如同生產(chǎn)裝配線一樣,將操作執(zhí)行工作量分成若干個(gè)時(shí)間上均衡的操作段,從流水線的起點(diǎn)連續(xù)地輸入,流水線的各操作段以重疊方式執(zhí)行。
這使得操作執(zhí)行速度只與流水線輸入的速度有關(guān),而與處理所需的時(shí)間無關(guān)。這樣,在理想的流水操作狀態(tài)下,其運(yùn)行效率很高。
比如仍然以上面信號(hào)處理例子為例,我們不需要去復(fù)制6份同樣的電路,而是去優(yōu)化我們單條信號(hào)處理電路。利用pipeline的設(shè)計(jì)理念,我們需要把處理時(shí)間大于10ns的電路模塊拆分成多個(gè)小于等于10ns的子電路(操作信號(hào)處理工作量分成若干個(gè)時(shí)間上均衡的處理段),并且每個(gè)子電路的輸入是前一級(jí)子電路的輸出,每一級(jí)子電路都能鎖存當(dāng)前時(shí)鐘周期的輸出結(jié)果。改造后的電路如下圖所示:
對(duì)于一個(gè)輸入數(shù)據(jù)的樣本來說,數(shù)據(jù)是串行被處理的,但對(duì)于多個(gè)輸入數(shù)據(jù)來說,各個(gè)處理階段是并行執(zhí)行的,所以數(shù)據(jù)處理從整體上看是并行執(zhí)行的,由于是并行執(zhí)行,所以能夠充分利用FPGA資源。
需要注意的是,在工作時(shí)鐘頻率一定的情況下,pipeline的設(shè)計(jì)思路并不會(huì)提高對(duì)單個(gè)數(shù)據(jù)的處理速度,但該設(shè)計(jì)方式可以極大提高數(shù)據(jù)的吞吐率。同時(shí)由于pipeline的設(shè)計(jì)方式降低了FPGA寄存器間的傳播延時(shí),反而又使得設(shè)計(jì)出來的電路能以更高的系統(tǒng)時(shí)鐘進(jìn)行工作,某種程度上又會(huì)提高FPGA系統(tǒng)的工作速度獲取更快的計(jì)算處理速率。
由于網(wǎng)上pipeline示例代碼資源很多,本文就不提供pipeline的示例代碼了。
4. 小結(jié)
利用pipeline的設(shè)計(jì)方法,可以提高FPGA系統(tǒng)的工作速度。這種方法可廣泛運(yùn)用于各種設(shè)計(jì),特別是大型的、對(duì)速度要求較高的系統(tǒng)設(shè)計(jì)。雖然有時(shí)候采用流水線反而會(huì)增大對(duì)資源的使用,但是它可降低寄存器間的傳播延時(shí),保證系統(tǒng)維持高的系統(tǒng)時(shí)鐘速度。
在實(shí)際應(yīng)用中,考慮到資源的使用和速度的要求,可以根據(jù)實(shí)際情況來選擇流水線的級(jí)數(shù)以滿足設(shè)計(jì)需要。
參考文獻(xiàn)
[1]《多線程優(yōu)化-pipeline模式》, https://zhuanlan.zhihu.com/p/51152731
[2]《流水線技術(shù)原理和Verilog HDL實(shí)現(xiàn)》, https://www.cnblogs.com/shengansong/archive/2011/05/23/2054414.html文章來源:http://www.zghlxwxcb.cn/news/detail-473805.html
對(duì)我們發(fā)布文章感興趣的小伙伴,請(qǐng)關(guān)注我們公眾號(hào) “FpgaHome” 吧。文章來源地址http://www.zghlxwxcb.cn/news/detail-473805.html
到了這里,關(guān)于Verilog流水線設(shè)計(jì)——Pipeline的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!