1. 程式人生 > >學習 FPGA 經驗與書籍分享。

學習 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 Description Language,注意這個單詞Description,而不是Design。老外為什麼要用Description這個詞而不是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,同時要求設計者懂得高速介面電路設計和高速數字電路板級設計,具備EMCEMI設計知識,以及較好的類比電路基礎,需要解決在高速收發過程中產生的訊號完整性問題。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例項,到最後能獨立完成專案,一路走來,感受頗多,拿出來和大家分享,順便介紹下自己的一點經驗所得,希望對初學者有所幫助。

  廢話不說了,下面進入正題,學習FPGA我主要經歷了這麼幾個階段:

    ①、Verilog語言的學習,熟悉Verilog語言的各種語法。
    ②、FPGA的學習,熟悉QuartusII軟體的各種功能,各種邏輯演算法設計,介面模組(RS232,LCD,VGA,SPI,I2c等)的設計,時序分析,硬體優化等,自己開始設計簡單的FPGA板子。
    ③、NiosII的學習,熟悉NiosII的開發流程,熟悉開發軟體(SOPC,NiosII IDE),瞭解NiosII的基本結構,設計NiosII開發板,編寫NiosII C語言程式除錯板子各模組功能。

        先來說說第一個階段,現在主要的硬體描述語言有VHDL,Verilog兩種,在本科時老師一般教VHDL,不過現在

        Verilog用的人越來越多,其更容易上手(與C語言語法比較類似),也更靈活,現在的IC設計基本都用Verilog。像 systemC,systemVerilog之類的應該還在萌芽階段,以後可能會有較大發展。鑑於以上原因我選擇了Verilog作為我學習的硬體描述語 言。
        其實有C語言的基礎,學起Verilog的語言很簡單,關鍵要有並行的概念,所有的module,assign,always都是並行的,這一點與軟體語言有明顯不同。這裡推薦幾本評價比較好的學習Verilog的書籍:
    ①、《verilog 數字系統設計教程》,這本書對於入門是一本很好的書,通俗易懂,讓人很快上手,它裡面的例子也不錯。但本書對於資源優化方面的程式設計沒有多少涉及到。
    ②、《設計與驗證Verilog HDL》,這本書雖然比較薄,但是相當精闢,講解的也很深入,很多概念看了這本書有種豁然開朗的感覺,呵呵。
        學習Verilog其實不用看很多書,基本的語法部分大家都一樣,關鍵是要自己會靈活應用,多做練習。

        Verilog語言學了一段時間,感覺自己可以編點東西,希望自己編的程式在板子上執行看看結果,下面就介紹我學習的第二個階段。
        剛開始我拿了實驗室一塊CPLD的開發板做練習,熟悉QuartusII的各種功能,比如IP的呼叫,各種約束設定,時序分析,Logiclock設計方 法等,不過做到後面發現CPLD的資源不太夠(沒有內嵌的RAM、不能用SignalTapII,LE太少等),而實驗室沒有FPGA開發板,所以就萌生 了自己做FPGA開發板的意圖,剛好Cadence我也學的差不多了,就花了幾天時間主要研究了FPGA配置電路的設計,在板子上做了Jtag和AS下載 口,在做了幾個使用者按鍵和LED,其他的口全部引出作為IO口,電路比較簡單,板子焊好後一調就通了(心裡那個爽啊...)。我選的FPGA是 cycloneII系列的EP2C5,資源比以前的FPGA多了好幾倍,還有PLL,內嵌的RAM,可以試試SignalTapII,用內嵌的邏輯分析儀 測試引腳波形,對於FPGA的除錯,邏輯分析儀是至關重要的。利用這塊板子我完成了專案中的幾個主要功能:RS232通訊,指令譯碼,配置DDS,AD數 據快取記憶體,電子開關狀態設定等,在實踐中學習起來真的比平時快很多,用到什麼學什麼動力更大。這個時候我主要看的資料有這幾本感覺比較好:
    ①、《Altera FPGA/CPLD 設計(基礎篇)》:講解一些基本的FPGA設計技術,以及QuartusII中各個工具的用法 (IP,RTL,SignalProbe,SignalTapII,Timing Closure Floorplan,chip Editor等),對於入門非常好。
    ②、《Altera FPGA/CPLD 設計(高階篇)》:講解了一些高階工具的應用,LogicLock,時序約束很分析,設計優化,也講述了一些硬體程式設計的思想,作為提高用。
    ③、《FPGA設計指南--器件,工具和流程》:這本書看了他的目錄忍不住就買了,這本書講述了FPGA設計的各個方面,雖然每個方面都是點到為止,但能讓你有個整體的概念,瞭解FPGA的所有設計功能,瞭解FPGA開發的整個流程。
    ④、在這裡也推薦幾個學習FPGA比較好的論壇
        http://www.edacn.net/bbs
        http://www.eetop.cn/
    ⑤、其實最好的學習網站莫過於Altera的官方網站www.altera.com,不過很多人一看到英語就不想看,其實上面的英文很簡單,很多時候不敢看是因為對自己沒信心或心靜不下來看。不過官方網站上資料很多,剛開始可能會覺得資料安排的有點亂,不方便查詢,以後有時間我列個資料的連結目錄,整理一下,方便大家查詢。
   
        到這裡,自己最FPGA的學習有一段時間了,練習了很多例項,自己也編寫了不少程式,也有了一些專案經驗,算是對FPGA有些瞭解了。在不斷的學習中發現 FPGA不僅可以做邏輯設計,演算法設計等,還能做嵌入式開發,altera先後開發了Nios,NiosII兩款FPGA的嵌入式軟核,並有配套的軟體, 剛開始看到這些我真是心中突然豁然開朗,學習真的是無止境,又一個全新的領域擺在我面前,我決定學習NiosII,要學就要學最好。
        剛開始入門是很痛苦的,嵌入式設計需要從硬體到驅動到軟體全部熟悉,硬體系統問題還不是很大(以前做過微控制器DSP等MCU),處理器的架構心裡還有點 數,對於驅動和軟體工程,剛開始學習真的很頭痛。NiosII應該還算比較新的內容(應該是2004年出的),國內的書籍不算很多,網上這方面的資料也比 較零碎,所以我就開始將Altera網站上這方面的資料系統的看一邊,這裡推薦幾本網站上的handbook:
    ①、Embedded Design Handbook
    ②、Nios II Processor Reference Handbook
    ③、Nios II Software Developer's Handbook
    ④、Quartus II Handbook, Volume 4: SOPC Builder
    ⑤、Quartus II Handbook, Volume 5: Embedded Peripherals
        看完這些handbook,總算基本明白整個架構,軟硬體設計方法,驅動的編寫等,感覺自己可以編一些嵌入式的程式了,不過雖然前面做的那塊ep2c5的 板子支援NiosII系統,不過對於嵌入式設計來說還是顯得單薄了一點,沒有SDRAM,Flash這兩個比較基本的模組,Ep2C5內嵌的RAM太小, 程式寫不大,而且每次總要絞盡腦汁優化程式程式碼大小,很多時候優化了後函式功能會受到限制,不利於初學者,也不利於除錯。所以到這裡我有產生了自己做一塊 Nios開發板的想法(直接買比較貴,自己做便宜,而且還能鍛鍊自己,一舉兩得),通過借鑑其他開發板,選擇自己開發板上需要包含什麼模組,確定各個模組 使用什麼晶片,閱讀各個晶片的datasheet,畫出原理圖並做出PCB圖,這塊板子我選的是Ep2c8Q208,比上一塊資源又將近多了一倍,板子上 還有以下模組:SDRAM,Flash,EPCS4,RS232,USB,VGA,PS2,AD,DA,LCD等,滿足了一般開發板的配置要求。板子回來 以後除錯了四五天,(flash工作了,LCD顯示了,RS232通了,USB通了,AD,DA工作了,SDRAM正常了...),真是每天都有驚喜,每 個模組都編寫了NiosII軟體測試程式,除錯硬體的時候對軟體的執行也更熟悉了。在這次除錯的過程中真的學到了很多,為此專門寫了好幾頁除錯筆記,下次 拿出來和大家一起分享。現在硬體平臺有了,NiosII也瞭解的差不多了,終於可以自己編寫一些規模大一點的程式了。
    以後的路還很長,不過也有很多驚喜在等著我們......