基於OpenCL標準的FPGA設計

2021-09-07 00:06:10 字數 2759 閱讀 8169

在可程式設計技術發展的最初階段,可程式設計能力出現了兩個極端。乙個極端的代表是單核cpu和dsp單元。這些器件使用含有一系列可執行指令的軟體來進行程式設計。對於程式設計人員,在概念上以連續的方式來開發這些指令,而高階處理器能夠對指令重新排序,在執行時從這些連續程式中提取出指令級並行處理操作。作為對比,可程式設計技術另一極端的代表是fpga.通過開發可配置硬體電路對這些器件程式設計,完全並行執行。使用fpga的設計人員實際上是大規模開發粒度非常精細的並行應用。多年以來,這兩個極端同時存在,每一型別的可程式設計功能適用於不同的應用領域。但是,最近的技術發展趨勢表明,有更好的技術同時實現了可程式設計和並行處理操作。

軟體可程式設計器件的第二種趨勢是複雜硬體的出現,從順序程式中提取出指令級並行處理操作。單核體系結構輸入指令流,在器件中執行它們,這些器件會有很多並行功能單元。處理器硬體的很大一部分必須專門用於從順序**中動態提取出並行處理操作。此外,硬體還會嘗試去補償儲存器延時。一般而言,程式設計人員開發程式時沒有考慮處理器的底層儲存器結構,好像只有大規模的統一快速儲存器。相比較而言,處理器必須處理實際延時,以及與外部儲存器的有限頻寬鏈結。為保持功能單元能夠傳送資料,處理器必須從外部儲存器中預先獲取資料,放入片內快取記憶體中,這樣,資料更接近要進行計算的地方。使用這些技術,效能經過多年的提高後,這類體系結構的改動已經不大了。

圖1.可程式設計和並行技術最近的發展趨勢

在傳統處理器體系結構上,這兩種趨勢的優勢日益減小,我們開始尋找各種軟體可程式設計器件,這些器件的發展非常快,如圖1所示。重點是從執行時自動提取指令級並行處理操作,發展到在編碼時明確的找到執行緒級並行處理操作。開始出現高度並行的多核器件,一般趨勢是含有多個簡單處理器,很多電晶體專門用於計算,而不是採用快取記憶體,提取並行處理操作。這些器件一般包括含有2、4或者8個核心的多核cpu,以及含有數百個適用於資料平行計算的簡單核心的gpu等。為能夠在這些多核器件上實現高效能,程式設計人員必須以並行方式清晰的對實際應用進行程式設計。每一核心都必須分配一定的工作,這樣,所有核心能夠協同工作,執行某一計算。這也是fpga設計人員在開發其高階系統體系結構時所做的工作。

考慮到多核新時代開發並行程式的需求,開發了opencl (開放計算語言),以便開發跨平台並行程式設計標準。opencl標準還能夠自然的描述在fpga中實現的並行演算法,其抽象級要比vhdl或者verilog等硬體描述語言(hdl)高得多。雖然有很多高階綜合工具能夠實現高等級的抽象功能,但是都存在同樣的基本問題。這些工具會採用連續c程式,產生並行hdl實現。在開發hdl時,困難還不是很明顯,但是,提取出線程級並行處理操作在fpga中實現以提高效能時,困難卻非常大。而fpga的並行功能非常強大,與其他器件相比,在盡可能提取並行功能時出現任何失敗的後果都非常嚴重。opencl標準能夠解決很多這類問題,它支援程式設計人員明確的設定並控制並行處理操作。與純c語言描述的連續程式相比,opencl標準能夠更自然的匹配fpga的高度並行特性。

opencl應用程式含有兩部分。opencl主程式是純軟體例程,以標準c/c++編寫,可以執行在任何型別的微處理器上。例如,這類處理器可以是fpga中的嵌入式軟核處理器、硬核arm處理器或者外接x86處理器。

在這一主軟體例程執行期間的某一點,某一功能有可能需要進行大量的計算,這就可以受益於並行器件的高度並行加速功能,例如cpu、gpu、fpga等器件。要加速的功能被稱為opencl核心。採用標準c編寫這些核心;但是,採用結構對其進行注釋,以設定並行處理操作和儲存器等級。圖2中的例子對兩個陣列a和b進行向量加法,將結果寫回輸出陣列應答中。向量的每一元素都採用了並行執行緒,當採用像fpga這類具有大量精細粒度並行單元的器件進行加速時,能夠很快的計算出結果。主程式使用標準opencl api,支援將資料傳送至fpga,呼叫fpga核心,傳回得到的資料。

圖2.在fpga上實現的opencl例子

在fpga中,可以把核心功能傳送到專用深度流水線硬體電路中,它使用了流水線並行處理概念,在本質上就是多執行緒的。這些流水線的每一條都可以複製多次,與一條流水線相比,提供更強的並行處理功能。

在fpga上實現opencl標準的優勢

使用opencl描述來開發fpga設計,與基於hdl設計的傳統方法相比,具有很多優勢。開發軟體可程式設計器件的流程一般包括進行構思、在c等高階語言中對演算法程式設計,然後使用自動編譯器來建立指令流。面向opencl的altera sdk提供了設計環境,很容易在fpga上實現opencl應用。如圖3所示。

圖3.面向opencl的altera sdk簡介

可以把這一方法與傳統的fpga設計方法相比較,在傳統方法中,設計人員的主要工作是對硬體按照每個週期進行描述,用於實現其演算法。傳統流程涉及到建立資料通路,通過狀態機來控制這些資料通路,使用系統級工具連線至底層ip核心,由於必須要滿足外部介面帶來的約束,因此,需要處理時序收斂問題。面向opencl的altera sdk幫助設計人員自動完成所有這些步驟,使他們能夠集中精力定義演算法,而不是重點關注乏味的硬體設計。以這種方式進行設計,設計人員很容易移植到新fpga,效能更好,功能更強,這是因為opencl編譯器將相同的高階描述轉換為流水線,從而發揮了fpga新器件的優勢。

在fpga上使用opencl標準,與目前的硬體體系結構(cpu、gpu,等)相比,能夠大幅度提高效能,同時降低了功耗。此外,與使用verilog或者vhdl等底層硬體描述語言(hdl)的傳統fpga開發方法相比,使用opencl標準、基於fpga的混合系統(cpu + fpga)具有明顯的產品及時面市優勢。

基於FPGA的秒錶

功能 四位數碼管顯示,從零開始計數,前兩位顯示秒 0 59 後兩位顯示0.01秒 0 99 計滿後從零開始,有開始鍵 暫停鍵 復位鍵。當第一次按下開始鍵,秒錶從初始開始計數,led顯示器上顯示當前計時值 當緊按下 按住 暫停鍵時,秒錶暫停計時,led上顯示當前計時值,放開則繼續計時 當按下復位鍵時,...

FPGA學習 基於FPGA的簡易音訊採集系統

本篇部落格記錄乙個小專案的開發 基於fpga的簡易音訊採集系統,專案 是乙個寒假的活動的題目,直接購買了設計好的板卡,專案的基本要求如下 使用的板卡是lattice的ice40up5k,這裡首先記錄一下在lattice的軟體中開發fpga的簡單流程 參考 windows 下 ice40 fpga 開...

基於FPGA的 powerPC 串列埠擴充套件

本人與硬體合作完成ppc405ep 串列埠擴充套件,主要負責vxworks串列埠驅動的工作。工具 tornado 2.2 vxworks核心的編譯 ultraedit 編寫 bdi3000 bootrom的燒寫 步驟 1,建立開發環境,如下圖所示 2,搞清vxworks下串列埠驅動的架構,如下圖示 ...