導讀:如果想快速學習,那么可以進入明德?lián)P官網(wǎng)進行免費課程系列學習,這樣可以讓你的開發(fā)板盡快動起來,早點拿起開發(fā)板用起來,掌握的也快,但是后期沒有系統(tǒng)理論支持,以及企業(yè)級實操項目訓練,麻煩就比較大,只能自己摸索,花大量的時間。這樣你需要找專業(yè)的FPGA培訓機構(gòu)來做系統(tǒng)的學習還有實操項目,F(xiàn)PGA學習最關(guān)鍵的就是項目的實操。理論學的再好要談實戰(zhàn),否則你自學的再好還是個菜鳥,因為沒辦法應(yīng)對實際工作中遇到的各種問題的。
一、FPGA學習重點是什么?
1、 看代碼,建模型(fpga邏輯模型)
只有在腦海中建立了一個個邏輯模型,理解FPGA內(nèi)部邏輯結(jié)構(gòu)實現(xiàn)的基礎(chǔ),才能明白為什么寫Verilog和寫C整體思路是不一樣的,才能理解順序執(zhí)行語言和并行執(zhí)行語言的設(shè)計方法上的差異。在看到一段簡單程序的時候應(yīng)該想到是什么樣的功能電路。
2、 用數(shù)學思維來簡化設(shè)計邏輯(FPGA設(shè)計技巧)
學習FPGA不僅邏輯思維很重要,好的數(shù)學思維也能讓你的設(shè)計化繁為簡,所以啊,那些看見高數(shù)就頭疼的童鞋需要重視一下這門課哦。舉個簡單的例子,比如有兩個32bit的數(shù)據(jù)X[31;0]與Y[31;0]相乘。當然,無論Altera還是Xilinx都有現(xiàn)成的乘法器IP核可以調(diào)用,這也是最簡單的方法,但是兩個32bit的乘法器將耗費大量的資源。那么有沒有節(jié)省資源,又不太復雜的方式來實現(xiàn)呢?我們可以稍做修改:
將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(jié),則X與Y的相乘可以轉(zhuǎn)化為X1和X2分別與Y1和Y2相乘,這樣一個32bit*32bit的乘法運算轉(zhuǎn)換成了四個16bit*16bit的乘法運算和三個32bit的加法運算。轉(zhuǎn)換后的占用資源將會減少很多,有興趣的童鞋,不妨綜合一下看看,看看兩者差多少。
3、 時鐘與觸發(fā)器的關(guān)系(fpga時序應(yīng)用)
“時鐘是時序電路的控制者”這句話太經(jīng)典了,可以說是FPGA設(shè)計的圣言。FPGA的設(shè)計主要是以時序電路為主,因為組合邏輯電路再怎么復雜也變不出太多花樣,理解起來也不沒太多困難。但是時序電路就不同了,它的所有動作都是在時鐘一拍一拍的節(jié)奏下轉(zhuǎn)變觸發(fā),可以說時鐘就是整個電路的控制者,控制不好,電路功能就會混亂。
打個比方,時鐘就相當于人體的心臟,它每一次的跳動就是觸發(fā)一個CLK,向身體的各個器官供血,維持著機體的正常運作,每一個器官體統(tǒng)正常工作少不了組織細胞的構(gòu)成,那么觸發(fā)器就可以比作基本單元組織細胞。
時序邏輯電路的時鐘是控制時序邏輯電路狀態(tài)轉(zhuǎn)換的“發(fā)動機”,沒有它時序邏輯電路就不能正常工作。因為時序邏輯電路主要是利用觸發(fā)器存儲電路的狀態(tài),而觸發(fā)器狀態(tài)變換需要時鐘的上升或下降沿,由此可見時鐘在時序電路中的核心作用。
最后簡單說一下體會吧,歸結(jié)起來就是多實踐、多思考、多問。實踐出真知,看100遍別人的方案不如自己去實踐一下。實踐的動力一方面來自興趣,一方面來自壓力。有需求會容易形成壓力,也就是說最好能在實際的項目開發(fā)中鍛煉,而不是為了學習而學習。
二、有時候你會覺得FPGA難學,是有原因的
1、 不熟悉FPGA的內(nèi)部結(jié)構(gòu)
FPGA為什么是可以編程的?恐怕很多初學者不知道,他們也不想知道。因為他們覺得這是無關(guān)緊要的。他們潛意識的認為可編程嘛,肯定就是像寫軟件一樣啦。軟件編程的思想根深蒂固,看到Verilog或者VHDL就像看到C語言或者其它軟件編程語言一樣。一條條的讀,一條條的分析。
拒絕去了解為什么FPGA是可以編程的,不去了解FPGA的內(nèi)部結(jié)構(gòu),要想學會FPGA恐怕是天方夜譚。那么FPGA為什么是可以“編程”的呢?首先來了解一下什么叫“程”。啟示“程”只不過是一堆具有一定含義的01編碼而已。
編程,其實就是編寫這些01編碼。只不過我們現(xiàn)在有了很多開發(fā)工具運算或者是其它操作。所以軟件是一條一條的,通常都不是直接編寫這些01編碼,而是以高級語言的形式來編寫,最后由開發(fā)工具轉(zhuǎn)換為這種01編碼而已。對于軟件編程而言,處理器會有一個專門的譯碼電路逐條把這些01編碼翻譯為各種控制信號,然后控制其內(nèi)部的電路完成一個個的讀,因為軟件的操作是一步一步完成的。
而FPGA的可編程,本質(zhì)也是依靠這些01編碼實現(xiàn)其功能的改變,但不同的是FPGA之所以可以完成不同的功能,不是依靠像軟件那樣將01編碼翻譯出來再去控制一個運算電路,F(xiàn)PGA里面沒有這些東西。
FPGA內(nèi)部主要三塊:可編程的邏輯單元、可編程的連線和可編程的IO模塊。
可編程的邏輯單元
其基本結(jié)構(gòu)某種存儲器(SRAM、FLASH等)制成的4輸入或6輸入1輸出地“真值表”加上一個D觸發(fā)器構(gòu)成。任何一個4輸入1輸出組合邏輯電路,都有一張對應(yīng)的“真值表”,同樣的如果用這么一個存儲器制成的4輸入1輸出地“真值表”,只需要修改其“真值表”內(nèi)部值就可以等效出任意4輸入1輸出的組合邏輯,這些“真值表”內(nèi)部值就是那些01編碼。
如果要實現(xiàn)時序邏輯電路怎么辦?任何的時序邏輯都可以轉(zhuǎn)換為組合邏輯+D觸發(fā)器來完成。但這畢竟只實現(xiàn)了4輸入1輸出的邏輯電路而已,通常邏輯電路的規(guī)模那是相當?shù)拇蟆?
可編程連線
那怎么辦呢?這個時候就需要用到可編程連線了。在這些連線上有很多用存儲器控制的鏈接點,通過改寫對應(yīng)存儲器的值就可以確定哪些線是連上的而哪些線是斷開的。這就可以把很多可編程邏輯單元組合起來形成大型的邏輯電路。
可編程的IO
任何芯片都必然有輸入引腳和輸出引腳。有可編程的IO可以任意的定義某個非專用引腳(FPGA中有專門的非用戶可使用的測試、下載用引腳)為輸入還是輸出,還可以對IO的電平標準進行設(shè)置。
總歸一句話,F(xiàn)PGA之所以可編程是因為可以通過特殊的01代碼制作成一張張“真值表”,并將這些“真值表”組合起來以實現(xiàn)大規(guī)模的邏輯功能。
不了解FPGA內(nèi)部結(jié)構(gòu),就不能明白最終代碼如何變到FPGA里面去的,也就無法深入的了解如何能夠充分運用FPGA。現(xiàn)在的FPGA,不單單是有前面講的那三塊,還有很多專用的硬件功能單元,如何利用好這些單元實現(xiàn)復雜的邏輯電路設(shè)計,是從菜鳥邁向高手的路上必須要克服的障礙。而這一切,還是必須先從了解FPGA內(nèi)部邏輯及其工作原理做起。
2、 錯誤理解HDL語言,怎么看都看不出硬件結(jié)構(gòu)
HDL語言的英語全稱是:HardwareDeionLanguage,注意這個單詞Deion,而不是Design。老外為什么要用Deion這個詞而不是Design呢?因為HDL確實不是用用來設(shè)計硬件的,而僅僅是用來描述硬件的。
描述這個詞精確地反映了HDL語言的本質(zhì),HDL語言不過是已知硬件電路的文本表現(xiàn)形式而已,只是將以后的電路用文本的形式描述出來而已。而在編寫語言之前,硬件電路應(yīng)該已經(jīng)被設(shè)計出來了。語言只不過是將這種設(shè)計轉(zhuǎn)化為文字表達形式而已。
硬件設(shè)計也是有不同的抽象層次,每一個層次都需要設(shè)計。最高的抽象層次為算法級、然后依次是體系結(jié)構(gòu)級、寄存器傳輸級、門級、物理版圖級。
使用HDL的好處在于我們已經(jīng)設(shè)計好了一個寄存器傳輸級的電路,那么用HDL描述以后轉(zhuǎn)化為文本的形式,剩下的向更低層次的轉(zhuǎn)換就可以讓EDA工具去做了,這就大大的降低了工作量。這就是可綜合的概念,也就是說在對這一抽象層次上硬件單元進行描述可以被EDA工具理解并轉(zhuǎn)化為底層的門級電路或其他結(jié)構(gòu)的電路。
在FPGA設(shè)計中,就是在將這以抽象層級的意見描述成HDL語言,就可以通過FPGA開發(fā)軟件轉(zhuǎn)化為上一點中所述的FPGA內(nèi)部邏輯功能實現(xiàn)形式。HDL也可以描述更高的抽象層級如算法級或者是體系結(jié)構(gòu)級,但目前受限于EDA軟件的發(fā)展,EDA軟件還無法理解這么高的抽象層次,所以HDL描述這樣抽象層級是無法被轉(zhuǎn)化為較低的抽象層級的,這也就是所謂的不可綜合。
所以在閱讀或編寫HDL語言,尤其是可綜合的HDL,不應(yīng)該看到的是語言本身,而是要看到語言背后所對應(yīng)的硬件電路結(jié)構(gòu)。
3、 FPGA本身不算什么,一切皆在FPGA之外
FPGA是給誰用的?很多學校是為給學微電子專業(yè)或者集成電路設(shè)計專業(yè)的學生用的,其實這不過是很多學校受資金限制,買不起專業(yè)的集成電路設(shè)計工具而用FPGA工具替代而已。其實FPGA是給設(shè)計電子系統(tǒng)的工程師使用的。這些工程師通常是使用已有的芯片搭配在一起完成一個電子設(shè)備,如基站、機頂盒、視頻監(jiān)控設(shè)備等。當現(xiàn)有芯片無法滿足系統(tǒng)的需求時,就需要用FPGA來快速的定義一個能用的芯片。
前面說了,F(xiàn)PGA里面無法就是一些“真值表”、觸發(fā)器、各種連線以及一些硬件資源,電子系統(tǒng)工程師使用FPGA進行設(shè)計時無非就是考慮如何將這些以后資源組合起來實現(xiàn)一定的邏輯功能而已,而不必像IC設(shè)計工程師那樣一直要關(guān)注到最后芯片是不是能夠被制造出來。
本質(zhì)上和利用現(xiàn)有芯片組合成不同的電子系統(tǒng)沒有區(qū)別,只是需要關(guān)注更底層的資源而已。要想把FPGA用起來還是簡單的,因為無非就是那些資源,在理解了前面兩點再搞個實驗板,跑跑實驗,做點簡單的東西是可以的。而真正要把FPGA用好,那光懂點FPGA知識就遠遠不夠了。因為最終要讓FPGA里面的資源如何組合,實現(xiàn)何種功能才能滿足系統(tǒng)的需要,那就需要懂得更多更廣泛的知識。
4、 數(shù)字邏輯知識是根本
無論是FPGA的哪個方向,都離不開數(shù)字邏輯知識的支撐。FPGA說白了是一種實現(xiàn)數(shù)字邏輯的方式而已。如果連最基本的數(shù)字邏輯的知識都有問題,學習FPGA的愿望只是空中樓閣而已。數(shù)字邏輯是任何電子電氣類專業(yè)的專業(yè)基礎(chǔ)知識,也是必須要學好的一門課。
如果不能將數(shù)字邏輯知識爛熟于心,養(yǎng)成良好的設(shè)計習慣,學FPGA到最后仍然是霧里看花水中望月,始終是一場空的。以上四條只是我目前總結(jié)菜鳥們在學習FPGA時所最容易跑偏的地方,F(xiàn)PGA的學習其實就像學習圍棋一樣,學會如何在棋盤上落子很容易,成為一位高手卻是難上加難。要真成為李昌鎬那樣的神一般的選手,除了靠刻苦專研,恐怕還確實得要一點天賦。
綜上所述:FPGA如何入門?這個需要理論和實戰(zhàn)的同步結(jié)合,可以先認識FPGA行業(yè)和應(yīng)用利于參考本網(wǎng)站文章《FPGA入門》,然后學習培訓課程,接受專業(yè)的系統(tǒng)FPGA培訓班,這里不管是個人還是企業(yè)培訓特別推薦明德?lián)P,國內(nèi)專業(yè)FPGA培訓機構(gòu),他們有什么優(yōu)勢呢?
選擇明德?lián)P進行FPGA培訓,有如下優(yōu)勢
a) 明德?lián)P具備豐富的個人或者企業(yè)培訓經(jīng)驗;
b) 明德?lián)P快速幫助學員入門到精通或者公司建立企業(yè)規(guī)范;
c) 明德?lián)P可快速提高研發(fā)實力;
d) 明德?lián)P在新員工和學員入職培訓上有豐富的經(jīng)驗;
e) 明德?lián)P設(shè)計技巧方面有獨特的優(yōu)勢;
f) 明德?lián)PFPGA課程內(nèi)容豐富,包括時序約束、數(shù)字信息處理、高速接口等等方面有豐富的培訓經(jīng)驗,都是華為、中國電子研究院級別項目(潘老師曾任職于這些企業(yè))
教學特點:明德?lián)P采用核心自主知識產(chǎn)權(quán)的《潘文明至簡設(shè)計法》,用獨創(chuàng)的“八步法”,并結(jié)合企業(yè)的實際需求,把FPGA設(shè)計步驟標準化。所有項目只需要依據(jù)規(guī)范,按照標準化步驟進行設(shè)計。建立了成熟完整的設(shè)計規(guī)范體系,而且細化到對整個項目的所有流程和操作,如架構(gòu)設(shè)計、模塊劃分、代碼編寫、仿真驗證等均有實用的規(guī)范。
教學方法:《潘文明至簡設(shè)計法》來源于華為海思的大量經(jīng)典案例,是眾多業(yè)內(nèi)一流工程師的經(jīng)驗、技巧的結(jié)晶。通過該方法,結(jié)合企業(yè)實際需求,將FPGA設(shè)計規(guī)范和標準化,眾多設(shè)計的技巧實用化。最后形成一整套適用于具體企業(yè)的通用、高效、實用、易學的設(shè)計方法。