fpga開發的疑問?(關於高層次綜合)
畢業後接觸fpga,,我個人感覺,在fpga上面實現一些演算法似乎異常困難。
比如,我嘗試遞歸一次。quartus提示: failed to elaborate task or function "fft"ise提示:Function "fft" has iterated 64 times. Use "set -recursion_iteration_limit XX" to iterate more.再比如,我嘗試循環一次。
ISE提示:Loop has iterated 64 times. Use "set -loop_iteration_limit XX" to iterate more.諸如此類。。。。控制只能跑跑狀態機。我知道,肯定會有人回答fpga是硬體不能和寫軟體一樣。可是我想問的是高層次綜合,比如之前聽說的C轉換成hdl。還有傳說中的opencl等等。比如說更高綜合層次的開發方式成熟後,可以很流暢的無顧忌的開發fpga。(就像寫軟體一樣)還有,fpga的瓶頸在哪裡。(項目中為什麼少用到fpga)是因為價格?(太貴了)開發方式?(會hdl的遠比寫軟體的少)
報錯就是告訴你,你所調用的fft這個task沒有實現,hdl設計也能直接調用fft,不過是調用fft的ip核;本質上是吧一個別人已經設計好的模塊直接加入你的設計中。
關於HLS的問題,學界一直挺熱門,對於你的疑問,我覺得關鍵在於要理解你的工作在什麼層面上:比如verilog,你是在設計硬體,是在組合那些晶體管的連接來完成你的設計;比如C語言,你是在設計軟體,是用已經組合好的晶體管,來指揮這些已經連接好的晶體管完成一定的動作。
至於你覺著verilog設計困難而C語言設計簡單,這還是你的工作層面的問題;C相對verilog的簡單主要是因為工作是基於已經設計好的CPU來開展的,C的簡單是由CPU設計的極端複雜換來的,這就好比說你覺著坐飛機去美國很輕鬆,走著去特別累一樣,飛去美國的輕鬆背後隱藏著設計飛機的複雜。
關於什麼時候用verilog什麼時候用C的問題,我覺著要根據你的目的來選擇自己工作的層面;還舉飛機的例子;如果你想從北京去紐約,那肯定要選擇坐飛機,但是如果你想去樓下吃頓飯,然後順路去超市買點東西,那你肯定要走著去;因為這麼近的距離飛機不划算(要買票,去機場etc)而且不方便(飛機是不可能中途給你一個人停下的)。同理,選擇C語言的前提是要有一款CPU,但是CPU都是針對通用的場合來設計的,對於同時控制100個串口,同時做1024位寬的乘法這種極端的應用肯定是沒有照顧到的(就好比是你打算下樓吃頓飯,然後順便買點東西這麼個性化的需求是沒人給你專門規劃航線的);這個時候就需要用硬體來實現這個系統了。用硬體實現一個系統的時候也有兩個選擇:ASIC或者FPGA,ASIC性能最佳,成本最低,但是這個成本低是有條件的,它是建立在巨大的出貨量來均攤研發和流片成本上的,對於ASIC這種東西起碼得10w級別的出貨量才是經濟的選擇;如果說你的系統也就做個10幾個,那麼對於ASIC這種動輒千萬級別的流片費來說那就得不償失了,這個時候FPGA就成為上選。
所以,說FPGA貴,要看跟誰比,跟現成的CPU和ASIC比,那肯定是貴,但前面說了,CPU可能不適合你的應用,市面上也沒有合適的ASIC;但是跟從頭設計一款ASIC比,那肯定是很便宜的。說FPGA開發難度高,也要看跟誰比;跟CPU上的軟體方案比,確實開發難度高,但是跟從頭設計一款ASIC比(需要前端、後端、測試、封裝以及複雜的EDA工具支持),這個開發難度還是很低的。
總而言之,我覺著做設計的時候,一定不要把自己限制在軟體工程師,硬體工程師或者某種專門的器件上,永遠記著我是在設計一個數字系統,軟體 or 硬體都是實現手段而已,綜合需求、成本、研發周期等等因素,選合適的那個當你說出遞歸這個詞的時候我就立刻明白你的問題所在了,都不知道你是怎麼通過FPGA職位面試的……樓上的高分答案說得很好,仔細看看吧
*) My judgement is that price is the real bottle neck that prevents FPGA from being universal.
*) There are two things that FPGA can do much better than CPU : parallelism and pipeline. With those two, FPGA can always build a customized solution with high performance. On the other hand, CPU may have some hardware accelerator, but they can not be customized to target a specific situation. No two snowflakes are the same in this world.
*) I don"t expect high level synthesis can solve everything although the EDA industry may have made good process on this regard. HLS might be something to begin with for your initial estimation, but I don"t think it can be used as an easy way out.C,opencl,可以開發,是因為有人做了對應的語言翻譯工作。然後你調了他的庫,就可以用軟體實現。但是不是所有軟體函數都有對應庫的。因為軟體是運行在程序存儲器里的,所有的數據都在,可以迅速的查找,執行。fpga裡頭可沒有那麼大的存儲器,所以很多函數要翻譯過來會很浪費資源--它根本就不是為純軟體編程而設計的--所以沒人去翻譯,翻譯了也沒人用。
以後高層次綜合還會繼續發展,可以像寫軟體那樣來開發,但是這個軟體和你理解的狹隘的軟體不太一樣,更接近彙編的設計思路吧。
說到用得少,是因為需求少,只有特定場合比如專業設備商等才會用到,離老百姓比較遠,所以需求少。需求少所以貴,所以知道的就更少。
瓶頸在於1.功耗2.價格.3開發難度4.開發周期HLS,關注的順序卻應該是S,L,H
能夠正確理解Synthesis,是FPGA工程師的核心,不管用的HDL是VHDL,Verilog HDL……哪怕AHDL(這個骨灰級的東西大概得10年前的學生才見過了吧),還是用Scheme方式正確理解Synthesis對於正確理解FPGA的工作方式有極大的幫助理解FPGA的工作方式之後,會發現,HLS的出現,不是改變FPGA的開發模式,而是通過高級的語言,改進FPGA的開發效率
所以不管是HDL,還是system C,system verilog等等,是要用高級語言的方式,來適配FPGA的開發但是會有人覺得反過來,認為HLS,就是把FPGA也裝到高級語言的袋子里
從此軟體開發人員一桶漿糊,世間再無HDL邏輯工程師「可以很流暢的無顧忌的開發fpga。(就像寫軟體一樣)」
八年前一個資深FPGA開發者跟我說:
「15年之內,所有的HDL語言都將消失」我至今仍深以為然FPGA的發展會慢慢告別難以閱讀,效率偏低的HDL開發方式但是需要掌握HLS,依然需要自底向上來了解FPGA因為這是High Level Synthesis,不是High Level Compilation
FPGA沒有瓶頸,其實所有的處理器都不存在所謂的瓶頸,適用場合不同非讓梅西去打籃球中鋒難道可以說身高是梅西的瓶頸么?系統級思維會去針對場合選取最好的解決方案(處理器,介面協議,連接方式,外設……)FPGA是一個很棒的候選人
關於FPGA的開發方法,從硬體描述語言,到高級語言綜合,走了幾十年的路。至今也沒有一個工具能夠實現很好的開發體驗。近幾年比較熱門的工具,像HLS和OpenCL綜合工具仍然有很長的路要走。HLS和以前的工具相比,有了一些進步。比如有很多內置函數,更好的控制綜合目標,選擇電路單元類型,支持了Opencl語言等等。但是仍然有資源使用大,綜合速度慢,事無巨細的人工干預這些缺點。OpenCL規範描述的開發方式,本身只強調了程序的移植性,沒有性能的移植性。在FPGA上要想達到理想的效果,仍然需要大量的人工干預。總之,FPGA的硬體特點,使得一個功能的實現方式千變萬化。從HDL上升到C這一步,走了幾十年還沒走好。未來仍然看不到頭。
我不太清楚你有木有仔細的去了解high level synthesis
首先ISE和Quartus肯定沒法實現你想要的東西。你想想,verilog就是上世紀80年代的產物,就算2001年又更新了一下下,那也是10年前的事兒了,你還來個遞歸,它肯定hold不住。verilog就是讓你搭門電路,寫狀態機用的。而且其實非演算法類的,僅僅用於控制的,用verilog完全可以輕鬆勝任,而且時序很精確。演算法類的,就需要比較仔細的設計,不是那麼輕鬆了。
稍微說的細一點
其實現代的程序結構無非就是三種,順序、分支和循環。你如果弄清楚這三種是如何在verilog,或者說數字電路上實現,那也就成了。順序很簡單,依次執行,弄個狀態機,弄個計數器,1的時候執行第一步,2的時候執行第二步,很容易。就是次數別太多,要不自己寫著感覺很麻煩。
分支更簡單,if else直接寫,對應mux等等。
循環可就有點蛋疼了,事實上for按理說綜合器沒有那麼好綜合的。所以處理循環,在硬體上就需要展開(unroll)或者依次執行(roll),以及加點流水線之類的提高吞吐,提高時鐘速率等等,這裡邊內容比較多,我建議你看看xilinx的HLS user guide(http://www.xilinx.com/support/documentation/sw_manuals/xilinx2014_1/ug902-vivado-high-level-synthesis.pdf),上邊這方面寫的很清楚,圖文並茂,原理清晰。不看書可是真不行的,光查網頁沒法獲得系統性知識。
所謂迭代,其實可以轉化成循環。事實上,我記得xilinx的HLS是支持迭代的,我記得啊。我沒用過,我只用過循環。
你仔細去看看那個HLS UG,真的,說的真心很清楚。這玩意是北大的一個老師整的,這哥們以前應該是在美國,我記著是這樣。大概1、2年前來我們這講座來著,用的很多圖片都是HLS UG裡邊的,他講了很多如何高層次綜合,但事實上,作為用戶,了解基本原理,使用好就成了。我用這個東西做過圖像插值來著,xilinx有個演示是圖像濾波,也就是邊緣提取,做的挺好,照樣是循環、流水都有。
別再欺負verilog了,又還來個迭代。你幸好沒整什麼lambda表達式,verilog該哭了。高層次綜合,你用用xilinx的HLS,挺好的。我也非常同意前邊的這些
1. 題主說畢業後接觸 FPGA 想必對於集成電路設計的概念不是很清楚
現在的 FPGA 更像是一個系統而不是幾十年前的那種 sea of gates 了 不過用的最多的還是作為數字電路驗證題主的這些問題也是關於數字電路設計的
2. 遞歸
軟體上遞歸很好用因為方法的代碼一份就夠 (假設單核單線程處理器) 調用多少次也不會複製這個方法的代碼 所以你只需要告訴編譯器你要使用遞歸 而數字電路的本質是可以同時運行的物理器件 這就決定了遞歸在數字電路設計中是基本不存在的 因為硬體不可能根據數據無限擴充 所以忘了遞歸吧其實當你想用遞歸的時候
你並不是真的想用遞歸 而是軟體開發的習慣套牢了你PS. 我們可以把遞歸演算法映射到串列演算法
比如我們只用一個處理單元 再弄個控制模塊和存儲器來模擬單核單線程處理器 或者映射到使用多個處理單元的演算法 這樣的話確實可以實現遞歸 但是你要告訴 FPGA 最多用幾個處理單元 以及這個映射規則3. FPGA
其實所有的實現選擇都由你的設計目標決定 FPGA 相對於純軟體來說大多數情況下速度快功耗低開發慢 但是相對於 ASIC就是速度慢功耗高開發快的了 正向一開始我說的 FPGA 已經越來越像一個系統了 裡邊集成有 CPU 用來處理要求高的運算或者邏輯 還有專用的 DSP 來處理對速度要求最高的運算 也有FPGA最初的那些 LUT 用來處理中間的那些因為FPGA是一種完全不同於CPU的器件,FPGA的開發不能叫做編程,而應該叫做邏輯搭設計。因此,你應該用FPGA來做合適的事情,比如同時控制100個串口,用邏輯門搭建100個位數不等的靜態乘法器用來做卷積加速。至於你說的更高層次的綜合,我的理解就是把FPGA製作成CPU,並且在上面運行操作系統(比如NIOS II),之後的開發就跟普通軟體的開發一致了。但是我覺的這是一種浪費,FPGA的成本比一般的CPU器件要高,這樣做的效率還不如直接用ARM。-----FPGA的瓶頸我再補充一下吧。。。成本這個其實也不是什麼大問題,現在有些場合用上FPGA反而是更節約的做法(比如上面說的控制100個串口)。我覺得主要的瓶頸是開發工具水平還是比較低下,相較於其他基於CPU的嵌入式開發,FPGA開發所用的編碼語言、編譯(綜合)工具、分析調試工具都是全面落後,當然這個也可能是工種的原因。造成的後果就是FPGA的開發效率明顯要低下,周期漫長。
FPGA的超強並行計算能力以及低功耗是其先天優點,缺點則是開發難度也是最高的,這也是C based HLS工具想要解決的問題。
用HDL來描述演算法的FPGA設計方式,工程師需要描述register與register之間每一個cycle的邏輯,相當於用彙編語言(同樣也是關注register層面的讀寫)來做軟體開發。這樣的設計方法抽象層次、開發效率都很低,開發的難度也會很大。
HLS(high-level synthesis,高層次綜合)技術在最近6、7年獲得了較為廣泛的關注,原因在於它支持設計者使用C/C++/SystemC/OpenCL來做演算法的FPGA實現,用戶無需再關注cycle層次的細節,設計的抽象層次和軟體實現基本是一樣的了。前面有同學說HLS是在FPGA上生成CPU軟核來執行用戶的C代碼,這是完全錯誤的。HLS高層次綜合而是經過複雜的演算法處理(優化、調度、資源分配等),由HLS自動生成HDL語言描述(RTL級實現),性能上遠高於CPU軟核的方式。具體,還可以參考wikipedia高級綜合。
C/C++/SystemC/OpenCL開發的優勢,還體現在基跨平台特性,用戶可以隨意地選擇是用CPU(傳統意義的軟體實現)、DSP、GPU、FPGA(傳統意義的硬體實現),這四種實現方式的並行度一般是逐步提高的。
所以,假定實現難度差不多的情況下(目前當然還沒有達到),FPGA實現相對於CPU實現,一般演算法的並行度、性能都會數個量級的提高。相對於GPU實現來說,並行度、性能一般也會更高,同時功耗上佔有很大優勢。
目前可用的HLS商業產品有:Xilinx Vivado-HLS (原AutoESL), Calypto CatapultC (原Mentor Graphics), Cadence C-to-Silicon和Cynthesizer (原Forte),NEC Cyber-workbench,Synopsys Synphony C compiler(原Synfora)。以目前來看,即使有這種高層次綜合出來的電路,也不會是一個好電路。軟體代碼美在簡潔,FPGA代碼美在高效。
我曾經在博士論文中稍微討論了點HLS,嘗試實現一個適合圖像視覺處理的統一的存儲通道模型,主要是利於數據復用。所以我有點體會。我曾經開玩笑說過,給一個學經濟管的人教會FPGA編程比學C的人可能還要容易,打個比方,一個公司,前台就是干前台的活,職能幹職能的,業務干業務的,銷售干銷售的;高管就是SOPC裡面的處理器,調度調度,處理異常就可以了。純C出來的就是一人有限責任公司的模式,一人單練齊活,公司也做不大。其實運算就是時空中的一個網路,CPU是用一個點去走這個網路,按照時間依賴;GPU是多個點再走;FPGA是4/5維空間,看看星際穿越也許能明白;是平行宇宙,過去的事情沒有過去,新的數據來了也要走過去的路,如果運算分支和數據相關,就會跳到另一個宇宙
個人覺得如果題主是想從verilog/vhdl去解決FPGA的話,並不應該考慮為什麼不能像C那樣用,verilog之類出現的意義就不是那樣的,甚至出現乘除之類的運算都很浪費,不要說循環之類的了(本身就有CLK了為什麼不好好用呢!)。一定要寫的話NIOS挺好用的。。
不請自來。我想說的是,即便HLS工具有了長足發展,一個只有軟體開發思維的人也是不懂得怎麼使用或者會使用的很爛的。像Xilinx 的HLS,即便是可以用高級語言開發,裡面也有諸多地方需要開發人員去指導哪部分代碼用什麼樣的東西來實現。而且,即便是用高級語言開發,此時的高級語言編程風格也會跟單純的軟體開發有很大差異。
例如像(a+b)*c與a*c + b*c這樣的語句,可能目標平台為CPU時所消耗的時間等不會發生太大差異。但是如果目標平台是FPGA,那麼這兩者消耗的邏輯資源以及所花費的時間就會產生很大的差別。再例如像循環或者遞歸這樣的,如果循環次數很大或者遞歸次數很多,那麼對於CPU來說可能只是運行的時間長一點(當然遞歸次數太多的話會耗盡內存,程序會崩潰)而已。但是在FPGA上的循環或者遞歸次數太多時,FPGA上的邏輯資源很有可能是不夠用的,這時綜合的唯一結果就是失敗。
總之,我覺得HLS的出現加快了硬體開發人員的開發效率,但是這決不是單純給軟體人員使用的一個開發工具。
推廣一下新開的公眾號:ICNnotes(有關於FPGA和IC設計的基礎知識分享哦)
硬體沒法遞歸的
FPGA不是這麼玩的,嵌入式的底層開發,高級語言/方法不適合,更別說遞歸了。
先不說verilog,軟體大概也無法肆無忌憚的去開發吧。。
雖然verilog是硬體描述語言,但不能達到抽像的級別,畢竟FPGA裡面是用實在的硬體電路實現的,所以還是要告訴綜合工具比較詳細的實現方法
1、FPGA上面有現成的FFT IP核,你可以直接拿來用。2、FPGA里不建議寫大量的循環,而且,有些循環語句可以模擬,但是不能綜合。3、如果想要寫C on FPGA,那麼,建議學習NiosII,或者研究Xilinx家下一代的工具Vivado。4、FPGA真正適合做的是高速的數據流處理,比如PCIe、千兆乙太網、200M 300M以上的並行ADC、10Gbps 100Gbps以上的差分對,等等。用幾百上千塊錢的一片FPGA,只做一百塊錢不到的ARM就能處理的事情,確實有點點浪費。5、最後,FPGA沒有瓶頸,瓶頸是你自己的水平。FPGA不是用的少,是你見的少。
推薦閱讀:
※怎麼才算是應用層開發和底層開發,調用系統API算是應用層開發嗎?
※如何搭建可靠的嵌入式arm+linux開發環境?
※FPGA與GPU在將來嵌入式應用中誰能更勝一籌?
※一個人,竭盡全力的去做一件事情,結果失敗了,改怎麼辦?
TAG:OpenCL | 嵌入式系統 | 現場可編輯邏輯門陣列FPGA | Verilog | VHDL |