1. 程式人生 > >【轉】為什麼FPGA難學?是因為你還沒搞清背後的根源

【轉】為什麼FPGA難學?是因為你還沒搞清背後的根源

經常看到有初學者的提問,本人零基礎,想學FPGA,求有經驗的人說說,我應該從哪入手,應該看什麼教程,應該用什麼學習板和開發板,看什麼書等,希望有經驗的好心人能夠給我一些引導。

FPGA到底怎麼學呢?

如果想速成,那就上網看視訊吧,這樣主要是面對應用的,一個小時內讓你的板子執行起來。早期起來的快,活學活用,就是後期沒有系統理論支援,會有些吃力,特別是大專案,那完全是個悲劇。國內做的可以的,我知道的就是周立功了,艾米電子也可以吧。這兩家都有學習板,不過後者的教程抄襲的前者的。前者功底深厚些,資金不緊張就買前者吧。速成的話,數電書一定一定必備,邊看邊學比較好。其餘的書可以適量買點。

其實只要有興趣,慢慢學,入門也不難,板子就去網購吧,我去華強北逛了好多次了,都沒什麼好板子。網購大把的!

總結幾點

1、看程式碼,建模型

只有在腦海中建立了一個個邏輯模型,理解FPGA內部邏輯結構實現的基礎,才能明白為什麼寫Verilog和寫C整體思路是不一樣的,才能理解順序執行語言和並行執行語言的設計方法上的差異。在看到一段簡單程式的時候應該想到是什麼樣的功能電路。

2、用數學思維來簡化設計邏輯

學習FPGA不僅邏輯思維很重要,好的數學思維也能讓你的設計化繁為簡,所以啊,那些看見高數就頭疼的童鞋需要重視一下這門課哦。舉個簡單的例子,比如有兩個32bit的資料X[31:0]與Y[31:0]相乘。當然,無論Altera還是Xilinx都有現成的乘法器IP核可以呼叫,這也是最簡單的方法,但是兩個32bit的乘法器將耗費大量的資源。那麼有沒有節省資源,又不太複雜的方式來實現呢?我們可以稍做修改:

將X[31:0]拆成兩部分X1[15:0]和X2[15:0],令X1[15:0]=X[31:16],X2[15:0]=X[15:0],則X1左移16位後與X2相加可以得到X;同樣將Y[31:0]拆成兩部分Y1[15:0]和Y2[15:0],令 Y1[15:0]=Y[31:16],Y2[15:0]=Y[15:0],則Y1左移16位後與Y2相加可以得到Y;則X與Y的相乘可以轉化為X1和X2 分別與Y1和Y2相乘,這樣一個32bit*32bit的乘法運算轉換成了四個16bit*16bit的乘法運算和三個32bit的加法運算。轉換後的佔用資源將會減少很多,有興趣的童鞋,不妨綜合一下看看,看看兩者差多少。

3、時鐘與觸發器的關係

“時鐘是時序電路的控制者”這句話太經典了,可以說是FPGA設計的聖言。FPGA的設計主要是以時序電路為主,因為組合邏輯電路再怎麼複雜也變不出太多花樣,理解起來也不沒太多困難。但是時序電路就不同了,它的所有動作都是在時鐘一拍一拍的節奏下轉變觸發,可以說時鐘就是整個電路的控制者,控制不好,電路功能就會混亂。

打個比方,時鐘就相當於人體的心臟,它每一次的跳動就是觸發一個 CLK,向身體的各個器官供血,維持著機體的正常運作,每一個器官體統正常工作少不了組織細胞的構成,那麼觸發器就可以比作基本單元組織細胞。時序邏輯電路的時鐘是控制時序邏輯電路狀態轉換的“發動機”,沒有它時序邏輯電路就不能正常工作,因為時序邏輯電路主要是利用觸發器儲存電路的狀態,而觸發器狀態變換需要時鐘的上升或下降沿!由此可見時鐘在時序電路中的核心作用!

最後簡單說一下體會吧,歸結起來就是多實踐、多思考、多問。實踐出真知,看100遍別人的方案不如自己去實踐一下。實踐的動力一方面來自興趣,一方面來自壓力,我個人覺得後者更重要。有需求會容易形成壓力,也就是說最好能在實際的專案開發中鍛鍊,而不是為了學習而學習。在實踐的過程中要多思考,多想想問題出現的原因,問題解決後要多問幾個為什麼,這也是經驗積累的過程,如果有寫專案日誌的習慣更好,把問題及原因、解決的辦法都寫進去。最後還要多問,遇到問題思索後還得不到解決就要問了,畢竟個人的力量是有限的,問同學同事、問搜尋引擎、問網友都可以,一篇文章、朋友們的點撥都可能幫助自己快速解決問題。

為什麼大量的人會覺得FPGA難學?

1、不熟悉FPGA的內部結構,不瞭解可程式設計邏輯器件的基本原理

FPGA為什麼是可以程式設計的?恐怕很多菜鳥不知道,他們也不想知道。因為他們覺得這是無關緊要的。他們潛意識的認為可程式設計嘛,肯定就是像寫軟體一樣啦。軟體程式設計的思想根深蒂固,看到Verilog或者VHDL就像看到C語言或者其它軟體程式語言一樣。一條條的讀,一條條的分析。如果這些菜鳥們始終拒絕去了解為什麼FPGA是可以程式設計的,不去了解FPGA的內部結構,要想學會FPGA 恐怕是天方夜譚。雖然現在EDA軟體已經非常先進,像寫軟體那樣照貓畫虎也能綜合出點東西,但也許只有天知道EDA軟體最後綜合出來的到底是什麼。也許點個燈,跑個馬還行。這樣就是為什麼很多菜鳥學了N久以後依然是一個菜鳥的原因。那麼FPGA為什麼是可以“程式設計”的呢?首先來了解一下什麼叫“程”。啟示 “程”只不過是一堆具有一定含義的01編碼而已。

程式設計,其實就是編寫這些01編碼。只不過我們現在有了很多開發工具運算或者是其它操作。所以軟體是一條一條的,通常都不是直接編寫這些01編碼,而是以高階語言的形式來編寫,最後由開發工具轉換為這種01編碼而已。對於軟體程式設計而言,處理器會有一個專門的譯碼電路逐條把這些01編碼翻譯為各種控制訊號,然後控制其內部的電路完成一個個的讀,因為軟體的操作是一步一步完成的。而FPGA的可程式設計,本質也是依靠這些01編碼實現其功能的改變,但不同的是FPGA之所以可以完成不同的功能,不是依靠像軟體那樣將01編碼翻譯出來再去控制一個運算電路,FPGA裡面沒有這些東西。

FPGA內部主要三塊:可程式設計的邏輯單元、可程式設計的連線和可程式設計的IO模組。可程式設計的邏輯單元是什麼?其基本結構某種儲存器(SRAM、 FLASH等)製成的4輸入或6輸入1輸出地“真值表”加上一個D觸發器構成。任何一個4輸入1輸出組合邏輯電路,都有一張對應的“真值表”,同樣的如果用這麼一個儲存器製成的4輸入1輸出地“真值表”,只需要修改其“真值表”內部值就可以等效出任意4輸入1輸出的組合邏輯。這些“真值表”內部值是什麼?就是那些01編碼而已。如果要實現時序邏輯電路怎麼辦?這不又D觸發器嘛,任何的時序邏輯都可以轉換為組合邏輯+D觸發器來完成。但這畢竟只實現了4輸入1輸出的邏輯電路而已,通常邏輯電路的規模那是相當的大哦。

那怎麼辦呢?這個時候就需要用到可程式設計連線了。在這些連線上有很多用儲存器控制的連結點,通過改寫對應儲存器的值就可以確定哪些線是連上的而哪些線是斷開的。這就可以把很多可程式設計邏輯單元組合起來形成大型的邏輯電路。最後就是可程式設計的IO,這其實是FPGA作為晶片級使用必須要注意的。

任何晶片都必然有輸入引腳和輸出引腳。有可程式設計的IO可以任意的定義某個非專用引腳(FPGA中有專門的非使用者可使用的測試、下載用引腳)為輸入還是輸出,還可以對IO的電平標準進行設定。總歸一句話,FPGA之所以可程式設計是因為可以通過特殊的01程式碼製作成一張張 “真值表”,並將這些“真值表”組合起來以實現大規模的邏輯功能。

不瞭解FPGA內部結構,就不能明白最終程式碼如何變到FPGA裡面去的。也就無法深入的瞭解如何能夠充分運用FPGA。現在的FPGA,不單單是有前面講的那三塊,還有很多專用的硬體功能單元,如何利用好這些單元實現複雜的邏輯電路設計,是從菜鳥邁向高手的路上必須要克服的障礙。而這一切,還是必須先從瞭解FPGA內部邏輯及其工作原理做起。

2、錯誤理解HDL語言,怎麼看都看不出硬體結構

HDL語言的英語全稱是:Hardware Deion Language,注意這個單詞Deion,而不是Design。老外為什麼要用Deion這個詞而不是Design呢?因為HDL確實不是用用來設計硬體的,而僅僅是用來描述硬體的。描述這個詞精確地反映了HDL語言的本質,HDL語言不過是已知硬體電路的文字表現形式而已,只是將以後的電路用文字的形式描述出來而已。而在編寫語言之前,硬體電路應該已經被設計出來了。語言只不過是將這種設計轉化為文字表達形式而已。但是很多人就不理解了,既然硬體都已經被設計出來了,直接拿去製作部就完了,為什麼還要轉化為文字表達形式再通過EDA工具這些麻煩的流程呢?其實這就是很多菜鳥沒有了解設計的抽象層次的問題,任何設計包括什麼服裝、機械、廣告設計都有一個抽象層次的問題。就拿廣告設計來說吧,最初的設計也許就是一個概念,設計出這個概念也是就是一個點子而已,離最終拍成廣告還差得很遠。

硬體設計也是有不同的抽象層次,每一個層次都需要設計。最高的抽象層次為演算法級、然後依次是體系結構級、暫存器傳輸級、門級、物理版圖級。使用HDL的好處在於我們已經設計好了一個暫存器傳輸級的電路,那麼用HDL描述以後轉化為文字的形式,剩下的向更低層次的轉換就可以讓EDA工具去做了,這就大大的降低了工作量。這就是可綜合的概念,也就是說在對這一抽象層次上硬體單元進行描述可以被EDA工具理解並轉化為底層的門級電路或其他結構的電路。

在FPGA設計中,就是在將這以抽象層級的意見描述成HDL語言,就可以通過FPGA開發軟體轉化為問題1中所述的FPGA內部邏輯功能實現形式。HDL也可以描述更高的抽象層級如演算法級或者是體系結構級,但目前受限於EDA軟體的發展,EDA軟體還無法理解這麼高的抽象層次,所以 HDL描述這樣抽象層級是無法被轉化為較低的抽象層級的,這也就是所謂的不可綜合。所以在閱讀或編寫HDL語言,尤其是可綜合的HDL,不應該看到的是語言本身,而是要看到語言背後所對應的硬體電路結構。如果看到的HDL始終是一條條的程式碼,那麼這種人永遠擺脫不了菜鳥的宿命。假如哪一天看到的程式碼不再是一行行的程式碼而是一塊一塊的硬體模組,那麼恭喜脫離了菜鳥的級別,進入不那麼菜的鳥級別。

3、FPGA本身不算什麼,一切皆在FPGA之外,這一點恐怕也是很多學FPGA的菜鳥最難理解的地方

FPGA是給誰用的?很多學校解釋為給學微電子專業或者積體電路設計專業的學生用的,其實這不過是很多學校受資金限制,買不起專業的積體電路設計工具而用FPGA工具替代而已。其實FPGA是給設計電子系統的工程師使用的。這些工程師通常是使用已有的晶片搭配在一起完成一個電子裝置,如基站、機頂盒、視訊監控裝置等。當現有晶片無法滿足系統的需求時,就需要用FPGA來快速的定義一個能用的晶片。

前面說了,FPGA裡面無法就是一些“真值表”、觸發器、各種連線以及一些硬體資源,電子系統工程師使用FPGA進行設計時無非就是考慮如何將這些以後資源組合起來實現一定的邏輯功能而已,而不必像IC設計工程師那樣一直要關注到最後晶片是不是能夠被製造出來。本質上和利用現有晶片組合成不同的電子系統沒有區別,只是需要關注更底層的資源而已。要想把FPGA用起來還是簡單的,因為無非就是那些資源,在理解了前面兩點再搞個實驗板,跑跑實驗,做點簡單的東西是可以的。而真正要把FPGA用好,那光懂點FPGA知識就遠遠不夠了。因為最終要讓FPGA裡面的資源如何組合,實現何種功能才能滿足系統的需要,那就需要懂得更多更廣泛的知識。

目前FPGA的應用主要是三個方向:

第一個方向,也是傳統方向主要用於通訊裝置的高速介面電路設計,這一方向主要是用FPGA處理高速介面的協議,並完成高速的資料收發和交換。這類應用通常要求採用具備高速收發介面的 FPGA,同時要求設計者懂得高速介面電路設計和高速數字電路板級設計,具備EMC/EMI設計知識,以及較好的類比電路基礎,需要解決在高速收發過程中產生的訊號完整性問題。FPGA最初以及到目前最廣的應用就是在通訊領域,一方面通訊領域需要高速的通訊協議處理方式,另一方面通訊協議隨時在修改,非常不適合做成專門的晶片。因此能夠靈活改變功能的FPGA就成為首選。到目前為止FPGA的一半以上的應用也是在通訊行業。

第二個方向,可以稱為數字訊號處理方向或者數學計算方向,因為很大程度上這一方向已經大大超出了訊號處理的範疇。例如早就在2006年就聽說老美將FPGA用於金融資料分析,後來又見到有將FPGA用於醫學資料分析的案例。在這一方向要求FPGA設計者有一定的數學功底,能夠理解並改進較為複雜的數學演算法,並利用FPGA內部的各種資源使之能夠變為實際的運算電路。目前真正投入實用的還是在通訊領域的無線訊號處理、通道編解碼以及影象訊號處理等領域,其它領域的研究正在開展中,之所以沒有大量實用的主要原因還是因為學金融的、學醫學的不瞭解這玩意。不過最近發現歐美有很多電子工程、計算機類的博士轉入到金融行業,開展金融訊號處理,相信隨著轉入的人增加,FPGA在其它領域的數學計算功能會更好的發揮出來,而我也有意做一些這些方面的研究。不過國內學金融的、學醫的恐怕連數學都很少用到,就不用說用FPGA來幫助他們完成數學_運算了,這個問題只有再議了。

第三個方向就是所謂的SOPC方向,其實嚴格意義上來說這個已經在FPGA設計的範疇之內,只不過是利用FPGA這個平臺搭建的一個嵌入式系統的底層硬體環境,然後設計者主要是在上面進行嵌入式軟體開發而已。設計對於FPGA本身的設計時相當少的。但如果涉及到需要在FPGA做專門的演算法加速,實際上需要用到第二個方向的知識,而如果需要設計專用的介面電路則需要用到第一個方向的知識。就目前SOPC方向發展其實遠不如第一和第二個方向,其主要原因是因為SOPC以FPGA為主,或者是在FPGA內部的資源實現一個“軟”的處理器,或者是在FPGA內部嵌入一個處理器核。但大多數的嵌入式設計卻是以軟體為核心,以現有的硬體發展情況來看,多數情況下的介面都已經標準化,並不需要那麼大的FPGA邏輯資源去設計太過複雜的介面。

而且就目前看來SOPC相關的開發工具還非常的不完善,以ARM為代表的各類嵌入式處理器開發工具卻早已深入人心,大多數以ARM為核心的SOC晶片提供了大多數標準的介面,大量成系列的微控制器/嵌入式處理器提供了相關行業所需要的硬體加速電路,需要專門定製硬體場合確實很少。

通常是在一些特種行業才會在這方面有非常迫切的需求。即使目前Xilinx將ARM的硬核加入到FPGA裡面,相信目前的情況不會有太大改觀,不要忘了很多老掉牙的8位微控制器還在嵌入式領域混呢,嵌入式主要不是靠硬體的差異而更多的是靠軟體的差異來體現價值的。

我曾經看好的是 cypress的Psoc這一想法。和SOPC系列不同,Psoc的思想史載SOC晶片裡面去嵌入那麼一小塊FPGA,那這樣其實可以滿足嵌入式的那些微小的硬體介面差異,比如某個運用需要4個USB,而通常的處理器不會提供那麼多,就可以用這麼一塊FPGA來提供多的USB介面。而另一種運用需要6個 UART,也可以用同樣的方法完成。

對於嵌入式設計公司來說他們只需要備貨一種晶片,就可以滿足這些設計中各種微小的差異變化。其主要的差異化仍然是通過軟體來完成。但目前cypress過於封閉,如果其採用ARM作為處理器核心,藉助其完整的工具鏈。同時開放IP合作,讓大量的第三方為它提供IP設計,其實是很有希望的。但目前cypress的日子怕不太好過,Psoc的思想也不知道何時能夠發光。

4、數字邏輯知識是根本。無論是FPGA的哪個方向,都離不開數字邏輯知識的支撐。FPGA說白了是一種實現數字邏輯的方式而已。如果連最基本的數字邏輯的知識都有問題,學習FPGA的願望只是空中樓閣而已。而這,恰恰是很多菜鳥最不願意去面對的問題。數字邏輯是任何電子電氣類專業的專業基礎知識,也是必須要學好的一門課。很多人無非是學習了,考個試,完了。

如果不能將數字邏輯知識爛熟於心,養成良好的設計習慣,學FPGA到最後仍然是霧裡看花水中望月,始終是一場空的。以上四條只是我目前總結菜鳥們在學習FPGA時所最容易跑偏的地方,FPGA的學習其實就像學習圍棋一樣,學會如何在棋盤上落子很容易,成為一位高手卻是難上加難。要真成為李昌鎬那樣的神一般的選手,除了靠刻苦專研,恐怕還確實得要一點天賦。

薦讀:如何學習FPGA?為什麼你會覺得FPGA難學?

1、入門首先要掌握HDL(HDL=verilog+VHDL)

第一句話是:還沒學數電的先學數電。然後你可以選擇verilog或者VHDL,有C語言基礎的,建議選擇VHDL。因為verilog太像C了,很容易混淆,最後你會發現,你花了大量時間去區分這兩種語言,而不是在學習如何使用它。當然,你思維能轉得過來,也可以選verilog,畢竟在國內verilog用得比較多。

接下來,首先找本例項抄程式碼。抄程式碼的意義在於熟悉語法規則和編譯器(這裡的編譯器是矽編譯器又叫綜合器,常用的編譯器有:Quartus、ISE、Vivado、Design Compiler 、Synopsys的VCS、iverilog、Lattice的Diamond、Microsemi/Actel的Libero、Synplify pro),然後再模仿著寫,最後不看書也能寫出來。編譯完程式碼,就開啟RTL圖,看一下綜合出來是什麼樣的電路。

HDL是硬體描述語言,突出硬體這一特點,所以要用數電的思維去思考HDL,而不是用C語言或者其它高階語言,如果不能理解這句話的,可以看《什麼是硬體以及什麼是軟體》。在這一階段,推薦的教材是《Verilog傳奇》、《Verilog HDL高階數字設計》或者是《用於邏輯綜合的VHDL》。不看書也能寫出個三段式狀態機就可以進入下一階段了。

此外,你手上必須準備Verilog或者VHDL的官方文件,《verilog_IEEE官方標準手冊-2005_IEEE_P1364》、《IEEE Standard VHDL Language_2008》,以便遇到一些語法問題的時候能查一下。

2、獨立完成中小規模的數位電路設計

現在,你可以設計一些數位電路了,像交通燈、電子琴、DDS等等,推薦的教材是夏老《Verilog 數字系統設計教程》(第三版)。在這一階段,你要做到的是:給你一個指標要求或者時序圖,你能用HDL設計電路去實現它。這裡你需要一塊開發板,可以選Altera的cyclone IV系列,或者Xilinx的Spantan 6。還沒掌握HDL之前千萬不要買開發板,因為你買回來也沒用。這裡你沒必要每次編譯通過就下載程式碼,咱們用modelsim模擬(此外還有QuestaSim、NC verilog、Diamond的Active-HDL、VCS、Debussy/Verdi等模擬工具),如果模擬都不能通過那就不用下載了,肯定不行的。在這裡先掌握簡單的testbench就可以了。推薦的教材是《WRITING TESTBENCHES Functional Verification of HDL Models》。

3、掌握設計方法和設計原則

你可能發現你綜合出來的電路儘管沒錯,但有很多警告。這個時候,你得學會同步設計原則、優化電路,是速度優先還是面積優先,時鐘樹應該怎樣設計,怎樣同步兩個異頻時鐘等等。推薦的教材是《FPGA權威指南》、《IP核芯志-數字邏輯設計思想》、《Altera FPGA/CPLD設計》第二版的基礎篇和高階篇兩本。學會加快編譯速度(增量式編譯、LogicLock),靜態時序分析(timequest),嵌入式邏輯分析儀(signaltap)就算是通關了。如果有不懂的地方可以暫時跳過,因為這部分還需要足量的實踐,才能有較深刻的理解。

4、學會提高開發效率

因為Quartus和ISE的編輯器功能太弱,影響了開發效率。所以建議使用Sublime text編輯器中程式碼片段的功能,以減少重複性勞動。Modelsim也是常用的模擬工具,學會TCL/TK以編寫適合自己的DO檔案,使得模擬變得自動化,推薦的教材是《TCL/TK入門經典》。你可能會手動備份程式碼,但是專業人士都是用版本控制器的,所以,為了提高工作效率,必須掌握GIT。檔案比較器Beyond Compare也是個比較常用的工具。此外,你也可以使用System Verilog來替代testbench,這樣效率會更高一些。如果你是做IC驗證的,就必須掌握System Verilog和驗證方法學(UVM)。推薦的教材是《Writing Testbenches using SystemVerilog》、《The UVM Primer》、《System Verilog1800-2012語法手冊》。

掌握了TCL/TK之後,可以學習虛擬Jtag(ISE也有類似的工具)製作屬於自己的除錯工具,此外,有時間的話,最好再學個python。指令碼,意味著一勞永逸。

5、增強理論基礎

這個時候,你已經會使用FPGA了,但是還有很多事情做不了(比如,FIR濾波器、PID演算法、OFDM等),因為理論沒學好。我大概地分幾個方向供大家參考,後面跟的是要掌握的理論課。

  • 訊號處理——訊號與系統、數字訊號處理、數字影象處理、現代數字訊號處理、盲訊號處理、自適應濾波器原理、雷達訊號處理

  • 介面應用——如:UART、SPI、IIC、USB、CAN、PCIE、Rapid IO、DDR、TCP/IP、SPI4.2(10G乙太網介面)、SATA、光纖、DisplayPort

  • 無線通訊——訊號與系統、數字訊號處理、通訊原理、行動通訊基礎、隨機過程、資訊理論與編碼

  • CPU設計——計算機組成原理、微控制器、計算機體系結構、編譯原理

  • 儀器儀表——類比電子技術、高頻電子線路、電子測量技術、智慧儀器原理及應用

  • 控制系統——自動控制原理、現代控制理論、過程控制工程、模糊控制器理論與應用

  • 壓縮、編碼、加密——數論、抽象代數、現代編碼技術、資訊理論與編碼、資料壓縮導論、應用密碼學、音訊資訊處理技術、數字視訊編碼技術原理

現在你發現,原來FPGA會涉及到那麼多知識,你可以選一個感興趣的方向,但是工作中很有可能用到其中幾個方向的知識,所以理論還是學得越多越好。如果你要更上一層,數學和英語是不可避免的。

6、學會使用MATLAB模擬

設計FPGA演算法的時候,多多少少都會用到MATLAB,比如CRC的係數矩陣、數字濾波器係數、各種表格和文字處理等。此外,MATLAB還能用於除錯HDL(用MATLAB的計算結果跟用HDL算出來的一步步對照,可以知道哪裡出問題)。推薦的教材是《MATLAB寶典》和杜勇的《數字濾波器的MATLAB與FPGA實現》。

7、足量的實踐

這個時候你至少讀過幾遍晶片手冊(官網有),然後可以針對自己的方向,做一定量的實踐了(期間要保持良好的程式碼風格,增加元件例化語句的可讀性,繪製流程圖/時序圖,撰寫文件的習慣)。比如:通訊類的可以做調製解調演算法,儀表類的可以做匯流排分析儀等等。不過這些演算法,在書上只是給了個公式、框圖而已,跟實際的差距很大,你甚至會覺得書上的東西都很膚淺。那麼,你可以在知網、百度文庫、EETOP論壇、opencores、ChinaAET、Q群共享、部落格上面找些相關資料(校外的朋友可以在淘寶買個知網賬號)。其實,當你到了這個階段,你已經達到了職業級水平,有空就多瞭解一些前沿技術,這將有助於你的職業規劃。

在工作當中,或許你需要關注很多協議和行業標準,協議可以在EETOP上面找到,而標準(如:國家標準GB和GB/T,國際標準ISO)就推薦《標準網》和《標準分享網》。

8、影象處理(這部分只寫給想學影象處理的朋友,也是由淺入深的路線)

  • Photoshop。花一、兩週的時間學習PS,對影象處理有個大概的瞭解,知道各種圖片格式、直方圖、色相、通道、濾鏡、拼接等基本概念,並能使用它。這部分是0基礎,目的讓大家對影象處理有個感性的認識,而不是一上來就各種各樣的公式推導。推薦《Photoshop CS6完全自學教程》。

  • 基於MATLAB或OpenCV的影象處理。有C/C++基礎的可以學習OpenCV,否則的話,建議學MATLAB。這個階段下,只要學會簡單的呼叫函式即可,暫時不用深究實現的細節。推薦《數字影象處理matlab版》、《學習OpenCV》。

  • 影象處理的基礎理論。這部分的理論是需要高數、復變、線性代數、訊號與系統、數字訊號處理等基礎,基礎不好的話,建議先補補基礎再來。看不懂的理論也可以暫時先放下,或許學到後面就自然而然地開竅了。推薦《數字影象處理》。

  • 基於FPGA的影象處理。把前面學到的理論運用到FPGA上面,如果這時你有前面第七個階段的水平,你將輕鬆地獨立完成影象演算法設計(影象處理是離不開介面的,上面第五個階段有講)。推薦《基於FPGA的嵌入式影象處理系統設計》、《基於FPGA的數字影象處理原理及應用》。

  • 進一步鑽研數學。要在演算法上更上一層,必然需要更多的數學,所以這裡建議學習實分析、泛涵分析、小波分析等。

下面這兩個階段是給感興趣的朋友介紹的。

9、數電的盡頭是模電

現在FPGA內部的事情是難不倒你的,但是訊號出了FPGA,你就沒法控制了。這個時候必須學好模電。比如:電路分析、類比電子技術、高頻電子線路、PCB設計、EMC、SI、PI等等,能設計出一塊帶兩片DDR3的FPGA開發板,就算通關了。

10、學無止境

能到這個境界,說明你已經很厲害了,但是還有很多東西要學的,因為FPGA常常要跟CPU互動,也就是說你得經常跟軟體工程師交流,所以也得懂點軟體方面的知識。比如ARM(Xilinx的ZYNQ和Altera的SOC會用到ARM的硬核)、DSP、Linux、安卓、上位機(QT、C#、JAVA)都可以學一下,反正學無止境的。

11、其它問題

a、為什麼不推薦學習NIOS II和MicroBlaze等軟核?

  • 價效比不高,一般的軟核效能大概跟Cortex M3或M4差不多,用FPGA那麼貴的東西去做一個性能一般的CPU,在工程上是非常不划算的。不如另外加一塊M3。

  • 加上軟核,可能會影響到其它的邏輯的功能。這是在資源並不十分充足的情況下,再加上軟核,導致佈局佈線變得相當困難。

  • 軟核不開源,出現Bug的時候,不容易除錯。

  • 工程上很少使用,極有可能派不上用場。

b、為什麼不推薦0基礎學習ZYNQ或SOC?

  • 容易讓人有傍同心理。傍同心理是指一個人通過渲染與自己有親近關係的人的傑出,來掩蓋和彌補自己在這方面的不足,從而獲得心理上的平衡。自己在學習很厲害的東西,然後也感覺自己很厲害,但這只是錯覺而已。

  • 入門應該學習儘量簡單的東西,要麼專心學習ARM,要麼專心學習FPGA。這樣更容易有成就感,增強信心。

  • ZYNQ和SOC的應用領域並不廣,還有很多人沒聽過這種東西,導致求職的不利。

  • 開發工具編譯時間長,浪費較多時間。

  • 絕大多數工作,都只是負責一方面,也就是說另一方面,很有可能派不上用場。

c、為什麼已經存在那麼多IP核,仍然需要寫HDL?

  • 問這種問題的,一般是學生,他們沒有做過產品,沒有遇到過工程上的問題。

  • IP核並非萬能,不能滿足所有需求。

  • 儘量少用閉源IP核,一旦出問題,這種黑匣子很可能讓產品難產。

  • 深入理解底一層次,可以更好地使用高一層次。該法則可以適用於所有程式語言。

免責宣告:本文系網路轉載,版權歸原作者所有。