第一篇:學(xué)習(xí)FPGA的幾點心得
1、首先要明白的是軟件設(shè)計和邏輯設(shè)計的不同,并理解什么是硬件意識。
軟件代碼的執(zhí)行是一個順序的過程,編繹以后的機器碼放在存儲器里,等著CPU一條一條的取指并執(zhí)行;因此軟件設(shè)計中經(jīng)常會帶有順序處理的思維。而邏輯設(shè)計則不同,我們設(shè)計的是數(shù)字電路,它是由很多很多的與非門及D觸發(fā)器構(gòu)成的,上電之后所有與非門和D觸發(fā)器都同時工作,不會因為A觸發(fā)器的代碼描述在B觸發(fā)器之前A觸發(fā)器就是先工作,事實上,RTL級代碼的代碼先后順序在綜合成網(wǎng)表文件后這種順序就消失了,取代的是基本邏輯電路之間的互聯(lián)關(guān)系描述;因此邏輯設(shè)計需要的是一種并發(fā)的思維,我們也需要用并發(fā)的思維去考慮電路的設(shè)計。
當(dāng)然,我們設(shè)計的電路功能一般都有先后順序的關(guān)系,如果這種順序不能通過代碼的先后順序來實現(xiàn),那么要怎么完成這一功能呢?在邏輯設(shè)計中,我們所說的先后順序都是基于時間軸來實現(xiàn):它的承載體就是時序邏輯,也就是那些觸發(fā)器。
2、其次就是要熟悉基本電路的設(shè)計。基本的電路不是很多,也就是D觸發(fā)器、計數(shù)器、移位寄存器、狀態(tài)機、多路選擇器、譯碼器等幾種,所有復(fù)雜的電路都可由這些基本的電路構(gòu)成。高手水平高的體現(xiàn)并不是他能寫出一些很奇特的電路,相反,水平高是體現(xiàn)在他們總能將復(fù)雜的電路用這些很樸素的基本電路去描述。甚至,你會發(fā)現(xiàn)他們的代碼基本上是由if...else、case這些語句構(gòu)成的,樸素的讓
你覺得奇怪。
初學(xué)者在入門的時候,對于基本電路的設(shè)計應(yīng)該固定化、標(biāo)準(zhǔn)化,每種電路該用什么樣的代碼描述,應(yīng)該要固定、統(tǒng)一,盡量少一些花哨的東西。說來這里我舉個例子。
以前有幾個朋友因為仿真有問題請我?guī)兔φ覇栴}。他們的代碼寫的很亂,出現(xiàn)了很多種稀奇古怪的電路,一看頭都大了,只好建議他們按照標(biāo)準(zhǔn)的電路重新寫下代碼。結(jié)果過了半天,他們就和我說問題不見了。
所以,高手們喜歡用簡單的代碼是有道理的,電路的標(biāo)準(zhǔn)化和規(guī)范化可以減少許多稀奇古怪的問題,問題少了他們也就能在別人加班的時候回家多睡回覺,呵呵??傊唵蔚?、樸素的就是最好的。
3、最后是代碼的規(guī)范化。
代碼規(guī)范主要是代碼書寫、命名等規(guī)范。比如不能用TAB鍵空格、低電平有效信號命名時加_n(如rst_n等)、每行只能寫一行代碼等。這些東西網(wǎng)上也很多,這里只是強烈建議大家要嚴(yán)格遵守,像華為等公司如果代碼不規(guī)范的話肯定是要打回去重寫的。
入門階段要學(xué)的有:設(shè)計時序;理解約束的原理及如何加約束。先談?wù)勗O(shè)計時序。
正確的做法是我們要先對整個設(shè)計有一些規(guī)劃--時時刻刻都要有設(shè)計時序的思想。設(shè)計時序最重要的是做好方案,這里說的方案絕不是
只是擺幾個框圖在那里。我們在做設(shè)計的時候需要做總體設(shè)計方案、邏輯詳細(xì)設(shè)計方案。這兩種方案包括了很多東西,邏輯總體方案主要是一級模塊的劃分及接口時序的定義,而邏輯詳細(xì)方案就是代碼的文字及圖形描述!
另一個就是約束。
這里的約束是針對綜合軟件和布局布線軟件而言的。
為什么會有約束這個東西出現(xiàn)呢?主要原因是EDA軟件比較笨,難以明白我們的心思,如果我們不把更詳細(xì)的信息告訴它的話它就干不好活,比如需要將輸出寄存器放的與輸出管腳近一點,如果不加約束,EDA軟件可能布通之后就不管了,導(dǎo)致Tco狂大,一點也不善解人意。所以我們需要約束這個東西,告訴EDA軟件要怎么干活,工程驗收的標(biāo)準(zhǔn)又是什么。
在加約束之前,我們首先要定義一些術(shù)語好告訴EDA軟件我們想干什么,這些術(shù)語便是Fmax、Tsu、Tco等等這些東西。這些東西的含義這里就不多說了,網(wǎng)上的討論已經(jīng)很多了。
有了術(shù)語,還要有一種通信方式與EDA軟件通信,腳本語言充當(dāng)了這一角色。不過現(xiàn)在像quartus這類軟件做的比較智能化了,提供了圖形化界面,但是這背后支撐的還是些腳本語言,大家可以用UltraEdit打加*.qsf文件去看看我們加的約束用腳本語言是怎么寫的。在加了約束之后,EDA工具就可以更好地按照我們的意愿去干活了,比較我們加了Fmax的約束,它就會盡可能地將關(guān)鍵路徑放的靠近一些,以提高電路工作頻率。當(dāng)然,這是有代價的,尋找路徑
是需要時間的,要求越苛刻,時間花的越多,因此加約束的原則的適用就行。如果約束加的過高,就相當(dāng)于讓EDA工具去做一件不可能完成的事,找更短的路徑的時候說不定找著找著就掉下懸崖了,效果反而更差。
雖然有約束這個好東西,不過提醒一下,在項目之前千萬對它抱有太多的幻想,把希望寄托在別人的身上并不是每一次都很可靠的,出了問題還是要麻煩自己,加約束只能做一些錦上添花的事情。所以,我們在做方案的時候就需要對關(guān)鍵路徑進行預(yù)估,要通過設(shè)計而不是約束解決這些問題。
第二篇:淺談FPGA學(xué)習(xí)
為什么大量的人會覺得FPGA難學(xué)?一位高人決心開貼來詳細(xì)講一下菜鳥覺得FPGA難學(xué)的幾大原因。
1、不熟悉FPGA的內(nèi)部結(jié)構(gòu),不了解可編程邏輯器件的基本原理。
FPGA為什么是可以編程的?恐怕很多菜鳥不知道,他們也不想知道。因為他們覺得這是無關(guān)緊要的。他們潛意識的認(rèn)為可編程嘛,肯定就是像寫軟件一樣啦。軟件編程的思想根深蒂固,看到Verilog或者VHDL就像看到C語言或者其它軟件編程語言一樣。一條條的讀,一條條的分析。如果這些菜鳥們始終拒絕去了解為什么FPGA是可以編程的,不去了解FPGA的內(nèi)部結(jié)構(gòu),要想學(xué)會FPGA恐怕是天方夜譚。雖然現(xiàn)在EDA軟件已經(jīng)非常先進,像寫軟件那樣照貓畫虎也能綜合出點東西,但也許只有天知道EDA軟件最后綜合出來的到底是什么。也許點個燈,跑個馬還行。這樣就是為什么很多菜鳥學(xué)了N久以后依然是一個菜鳥的原因。那么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)時序邏輯電路怎么辦?這不又D觸發(fā)器嘛,任何的時序邏輯都可以轉(zhuǎn)換為組合邏輯+D觸發(fā)器來完成。但這畢竟只實現(xiàn)了4輸入1輸出的邏輯電路而已,通常邏輯電路的規(guī)模那是相當(dāng)?shù)拇笈丁D窃趺崔k呢?這個時候就需要用到可編程連線了。在這些連線上有很多用存儲器控制的連接點,通過改寫對應(yīng)存儲器的值就可以確定哪些線是連上的而哪些線是斷開的。這就可以把很多可編程邏輯單元組合起來形成大型的邏輯電路。最后就是可編程的IO,這其實是FPGA作為芯片級使用必須要注意的。任何芯片都必然有輸入引腳和輸出引腳。有可編程的IO可以任意的定義某個非專用引腳(FPGA中有專門的非用戶可使用的測試、下載用引腳)為輸入還是輸出,還可以對IO的電平標(biāo)準(zhǔn)進行設(shè)置??倸w一句話,F(xiàn)PGA之所以可編程是因為可以通過特殊的01代碼制作成一張張“真值表”,并將這些“真值表”組合起來以實現(xiàn)大規(guī)模的邏輯功能。不了解FPGA內(nèi)部結(jié)構(gòu),就不能明白最終代碼如何變到FPGA里面去的。也就無法深入的了解如何能夠充分運用FPGA?,F(xiàn)在的FPGA,不單單是有前面講的那三塊,還有很多專用的硬件功能單元,如何利用好這些單元實現(xiàn)復(fù)雜的邏輯電路設(shè)計,是從菜鳥邁向高手的路上必須要克服的障礙。而這一切,還是必須先從了解FPGA內(nèi)部邏輯及其工作原理起。
2、錯誤理解HDL語言,怎么看都看不出硬件結(jié)構(gòu)。
HDL語言的英語全稱是:Hardware Description Language,注意這個單詞Description,而不是Design。老外為什么要用Description這個詞而不是Design呢?因為HDL確實不是用來設(shè)計硬件的,而僅僅是用來描述硬件的。描述這個詞精確地反映了HDL語言的本質(zhì),HDL語言不過是已知硬件電路的文本表現(xiàn)形式而已,只是將以后的電路用文本的形式描述出來而已。而在編寫語言之前,硬件電路應(yīng)該已經(jīng)被設(shè)計出來了。語言只不過是將這種設(shè)計轉(zhuǎn)化為文字表達形式而已。但是很多人就不理解了,既然硬件都已經(jīng)被設(shè)計出來了,直接拿去制作
部就完了,為什么還要轉(zhuǎn)化為文字表達形式再通過EDA工具這些麻煩的流程呢?其實這就是很多菜鳥沒有了解設(shè)計的抽象層次的問題,任何設(shè)計包括什么服裝、機械、廣告設(shè)計都有一個抽象層次的問題。就拿廣告設(shè)計來說吧,最初的設(shè)計也許就是一個概念,設(shè)計出這個概念也是就是一個點子而已,離最終拍成廣告還差得很遠(yuǎ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)化為問題1中所述的FPGA內(nèi)部邏輯功能實現(xiàn)形式。HDL也可以描述更高的抽象層級如算法級或者是體系結(jié)構(gòu)級,但目前受限于EDA軟件的發(fā)展,EDA軟件還無法理解這么高的抽象層次,所以HDL描述這樣抽象層級是無法被轉(zhuǎn)化為較低的抽象層級的,這也就是所謂的不可綜合。所以在閱讀或編寫HDL語言,尤其是可綜合的HDL,不應(yīng)該看到的是語言本身,而是要看到語言背后所對應(yīng)的硬件電路結(jié)構(gòu)。如果看到的HDL始終是一條條的代碼,那么這種人永遠(yuǎn)擺脫不了菜鳥的宿命。假如哪一天看到的代碼不再是一行行的代碼而是一塊一塊的硬件模塊,那么恭喜脫離了菜鳥的級別,進入不那么菜的鳥級別。
3、FPGA本身不算什么,一切皆在FPGA之外這一點恐怕也是很多學(xué)FPGA的菜鳥最難理解的地方。
FPGA是給誰用的?很多學(xué)校解釋為給學(xué)微電子專業(yè)或者集成電路設(shè)計專業(yè)的學(xué)生用的,其實這不過是很多學(xué)校受資金限制,買不起專業(yè)的集成電路設(shè)計工具而用FPGA工具替代而已。其實FPGA是給設(shè)計電子系統(tǒng)的工程師使用的。這些工程師通常是使用已有的芯片搭配在一起完成一個電子設(shè)備,如基站、機頂盒、視頻監(jiān)控設(shè)備等。當(dāng)現(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知識就遠(yuǎn)遠(yuǎn)不夠了。因為最終要讓FPGA里面的資源如何組合,實現(xiàn)何種功能才能滿足系統(tǒng)的需要,那就需要懂得更多更廣泛的知識。
目前FPGA的應(yīng)用主要是三個方向:
第一個方向,也是傳統(tǒng)方向主要用于通信設(shè)備的高速接口電路設(shè)計,這一方向主要是用FPGA處理高速接口的協(xié)議,并完成高速的數(shù)據(jù)收發(fā)和交換。這類應(yīng)用通常要求采用具備高速收發(fā)接口的FPGA,同時要求設(shè)計者懂得高速接口電路設(shè)計和高速數(shù)字電路板級設(shè)計,具備EMC/EMI設(shè)計知識,以及較好的模擬電路基礎(chǔ),需要解決在高速收發(fā)過程中產(chǎn)生的信號完整性問題。FPGA最初以及到目前最廣的應(yīng)用就是在通信領(lǐng)域,一方面通信領(lǐng)域需要高速的通信協(xié)議處理方式,另一方面通信協(xié)議隨時在修改,非常不適合做成專門的芯片。因此能夠靈活改變功能的FPGA就成為首選。到目前為止FPGA的一半以上的應(yīng)用也是在通信行業(yè)。
第二個方向,可以稱為數(shù)字信號處理方向或者數(shù)學(xué)計算方向,因為很大程度上這一方向已經(jīng)大大超出了信號處理的范疇。例如早就在2006年就聽說老美將FPGA用于金融數(shù)據(jù)分析,后來又見到有將FPGA用于醫(yī)學(xué)數(shù)據(jù)分析的案例。在這一方向要求FPGA設(shè)計者有一定的數(shù)學(xué)功底,能夠理解并改進較為復(fù)雜的數(shù)學(xué)算法,并利用FPGA內(nèi)部的各種資源使之能夠變?yōu)閷嶋H的運算電路。目前真正投入實用的還是在通信領(lǐng)域的無線信號處理、信道編解碼以及圖像信號處理等領(lǐng)域,其它領(lǐng)域的研究正在開展中,之所以沒有大量實用的主要原因還是因為學(xué)金融的、學(xué)醫(yī)學(xué)的不了解這玩意。不過最近發(fā)現(xiàn)歐美有很多電子工程、計算機類的博士轉(zhuǎn)入到金融行業(yè),開展金融信號處理,相信隨著轉(zhuǎn)入的人增加,F(xiàn)PGA在其它領(lǐng)域的數(shù)學(xué)計算功能會更好的發(fā)揮出來,而我也有意做一些這些方面的研究。不過國內(nèi)學(xué)金融的、學(xué)醫(yī)的恐怕連數(shù)學(xué)都很少用到,就不用說用FPGA來幫助他們完成數(shù)學(xué)_運算了,這個問題只有再議了。
第三個方向,就是所謂的SOPC方向,其實嚴(yán)格意義上來說這個已經(jīng)在FPGA設(shè)計的范疇之外,只不過是利用FPGA這個平臺搭建的一個嵌入式系統(tǒng)的底層硬件環(huán)境,然后設(shè)計者主要是在上面進行嵌入式軟件開發(fā)而已。設(shè)計對于FPGA本身來說是相當(dāng)少的。但如果涉及到需要在FPGA做專門的算法加速,實際上需要用到第二個方向的知識,而如果需要設(shè)計專用的接口電路則需要用到第一個方向的知識。
就目前SOPC方向發(fā)展其實遠(yuǎn)不如第一和第二個方向,其主要原因是因為SOPC以FPGA為主,或者是在FPGA內(nèi)部的資源實現(xiàn)一個“軟”的處理器,或者是在FPGA內(nèi)部嵌入一個處理器核。但大多數(shù)的嵌入式設(shè)計卻是以軟件為核心,以現(xiàn)有的硬件發(fā)展情況來看,多數(shù)情況下的接口都已經(jīng)標(biāo)準(zhǔn)化,并不需要那么大的FPGA邏輯資源去設(shè)計太過復(fù)雜的接口。而且就目前看來SOPC相關(guān)的開發(fā)工具還非常的不完善,以ARM為代表的各類嵌入式處理器開發(fā)工具早已深入人心,大多數(shù)以ARM為核心的SOC芯片提供了大多數(shù)標(biāo)準(zhǔn)的接口,大量成系列的單片機/嵌入式處理器提供了相關(guān)行業(yè)所需要的硬件加速電路,需要專門定制硬件場合確實很少。通常是在一些特種行業(yè)才會在這方面有非常迫切的需求。即使目前Xilinx將ARM的硬核加入到FPGA里面,相信目前的情況不會有太大改觀,不要忘了很多老掉牙的8位單片機還在嵌入式領(lǐng)域混呢,嵌入式主要不是靠硬件的差異而更多的是靠軟件的差異來體現(xiàn)價值的。我曾經(jīng)看好的是cypress的Psoc這一想法。和SOPC系列不同,Psoc的思想是在SOC芯片里面去嵌入那么一小塊FPGA,那這樣其實可以滿足嵌入式的那些微小的硬件接口差異,比如某個運用需要4個USB,而通常的處理器不會提供那么多,就可以用這么一塊FPGA來提供多的USB接口。而另一種運用需要6個UART,也可以用同樣的方法完成。對于嵌入式設(shè)計公司來說他們只需要備貨一種芯片,就可以滿足這些設(shè)計中各種微小的差異變化。其主要的差異化仍然是通過軟件來完成。但目前cypress過于封閉,如果其采用ARM作為處理器內(nèi)核,借助其完整的工具鏈。同時開放IP合作,讓大量的第三方為它提供IP設(shè)計,其實是很有希望的。但目前cypress的日子怕不太好過,Psoc的思想也不知道何時能夠發(fā)光。
4、數(shù)字邏輯知識是根本。
無論是FPGA的哪個方向,都離不開數(shù)字邏輯知識的支撐。FPGA說白了是一種實現(xiàn)數(shù)
字邏輯的方式而已。如果連最基本的數(shù)字邏輯的知識都有問題,學(xué)習(xí)FPGA的愿望只是空中樓閣而已。而這,恰恰是很多菜鳥最不愿意去面對的問題。數(shù)字邏輯是任何電子電氣類專業(yè)的專業(yè)基礎(chǔ)知識,也是必須要學(xué)好的一門課。很多人無非是學(xué)習(xí)了,考個試,完了。如果不能將數(shù)字邏輯知識爛熟于心,養(yǎng)成良好的設(shè)計習(xí)慣,學(xué)FPGA到最后仍然是霧里看花水中望月,始終是一場空的。以上四條只是我目前總結(jié)菜鳥們在學(xué)習(xí)FPGA時所最容易跑偏的地方,F(xiàn)PGA的學(xué)習(xí)其實就像學(xué)習(xí)圍棋一樣,學(xué)會如何在棋盤上落子很容易,成為一位高手卻是難上加難。
第三篇:FPGA學(xué)習(xí)概述
FPGA學(xué)習(xí)
我常年擔(dān)任多個有關(guān)FPGA學(xué)習(xí)研討的QQ群管理員,長期以來很多新入群的菜鳥們總是在重復(fù)的問一些非常簡單但是又讓新手困惑不解的問題。作為管理員經(jīng)常要給這些菜鳥們普及基礎(chǔ)知識,但是非常不幸的是很多菜鳥懷著一種浮躁的心態(tài)來學(xué)習(xí)FPGA,總是急于求成。再加上國內(nèi)大量有關(guān)FPGA的垃圾教材的誤導(dǎo),所以很多菜鳥始終無法入門。
為什么大量的人會覺得FPGA難學(xué)?作為著名FPGA提供商Altera授權(quán)的金牌培訓(xùn)師,本管理員決心開貼來詳細(xì)講一下菜鳥覺得FPGA難學(xué)的幾大原因。
1、不熟悉FPGA的內(nèi)部結(jié)構(gòu),不了解可編程邏輯器件的基本原理。
FPGA為什么是可以編程的?恐怕很多菜鳥不知道,他們也不想知道。因為他們覺得這是無關(guān)緊要的。他們潛意識的認(rèn)為可編程嘛,肯定就是像寫軟件一樣啦。軟件編程的思想根深蒂固,看到Verilog或者VHDL就像看到C語言或者其它軟件編程語言一樣。一條條的讀,一條條的分析。如果這些菜鳥們始終拒絕去了解為什么FPGA是可以編程的,不去了解FPGA的內(nèi)部結(jié)構(gòu),要想學(xué)會FPGA恐怕是天方夜譚。雖然現(xiàn)在EDA軟件已經(jīng)非常先進,像寫軟件那樣照貓畫虎也能綜合出點東西,但也許只有天知道EDA軟件最后綜合出來的到底是什么。也許點個燈,跑個馬還行。這樣就是為什么很多菜鳥學(xué)了N久以后依然是一個菜鳥的原因。
那么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)時序邏輯電路怎么辦?這不又D觸發(fā)器嘛,任何的時序邏輯都可以轉(zhuǎn)換為組合邏輯+D觸發(fā)器來完成。但這畢竟只實現(xiàn)了4輸入1輸出的邏輯電路而已,通常邏輯電路的規(guī)模那是相當(dāng)?shù)拇笈?。那怎么辦呢?這個時候就需要用到可編程連線了。在這些連線上有很多用存儲器控制的鏈接點,通過改寫對應(yīng)存儲器的值就可以確定哪些線是連上的而哪些線是斷開的。者就可以把很多可編程邏輯單元組合起來形成大型的邏輯電路。最后就是可編程的IO,這其實是FPGA作為芯片級使用必須要注意的。任何芯片都必然有輸入引腳和輸出引腳。有可編程的IO可以任意的定義某個非專用引腳(FPGA中有專門的非用戶可使用的測試、下載用引腳)為輸入還是輸出,還可以對IO的電平標(biāo)準(zhǔn)進行設(shè)置。
總歸一句話,F(xiàn)PGA之所以可編程是因為可以通過特殊的01代碼制作成一張張“真值表”,并將這些“真值表”組合起來以實現(xiàn)大規(guī)模的邏輯功能。不了解FPGA內(nèi)部結(jié)構(gòu),就不能明白最終代碼如何變到FPGA里面去的。也就無法深入的了解如何能夠充分運用FPGA?,F(xiàn)在的FPGA,不單單是有前面講的那三塊,還有很多專用的硬件功能單元,如何利用好這些單元實現(xiàn)復(fù)雜的邏輯電路設(shè)計,是從菜鳥邁向高手的路上必須要克服的障礙。而這一切,還是必須先從了解FPGA內(nèi)部邏輯及其工作原理做起。
2、錯誤理解HDL語言,怎么看都看不出硬件結(jié)構(gòu)。
HDL語言的英語全稱是:Hardware Description Language,注意這個單詞Description,而不是Design。老外為什么要用Description這個詞而不是Design呢?因為HDL確實不是用用來設(shè)計硬件的,而僅僅是用來描述硬件的。描述這個詞精確地反映了HDL語言的本質(zhì),HDL語言不過是已知硬件電路的文本表現(xiàn)形式而已,只是將以后的電路用文本的形式描述出來而已。而在編寫語言之前,硬件電路應(yīng)該已經(jīng)被設(shè)計出來了。語言只不過是將這種設(shè)計轉(zhuǎn)化為文字表達形式而已。但是很多人就不理解了,既然硬件都已經(jīng)被設(shè)計出來了,直接拿去制作部就完了,為什么還要轉(zhuǎn)化為文字表達形式再通過EDA工具這些麻煩的流程呢?其實這就
是很多菜鳥沒有了解設(shè)計的抽象層次的問題,任何設(shè)計包括什么服裝、機械、廣告設(shè)計都有一個抽象層次的問題。就拿廣告設(shè)計來說吧,最初的設(shè)計也許就是一個概念,設(shè)計出這個概念也是就是一個點子而已,離最終拍成廣告還差得很遠(yuǎ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)化為問題1中所述的FPGA內(nèi)部邏輯功能實現(xiàn)形式。HDL也可以描述更高的抽象層級如算法級或者是體系結(jié)構(gòu)級,但目前受限于EDA軟件的發(fā)展,EDA軟件還無法理解這么高的抽象層次,所以HDL描述這樣抽象層級是無法被轉(zhuǎn)化為較低的抽象層級的,這也就是所謂的不可綜合。
所以在閱讀或編寫HDL語言,尤其是可綜合的HDL,不應(yīng)該看到的是語言本身,而是要看到語言背后所對應(yīng)的硬件電路結(jié)構(gòu)。如果看到的HDL始終是一條條的代碼,那么這種人永遠(yuǎn)擺脫不了菜鳥的宿命。假如哪一天看到的代碼不再是一行行的代碼而是一塊一塊的硬件模塊,那么恭喜脫離了菜鳥的級別,進入不那么菜的鳥級別。
3、FPGA本身不算什么,一切皆在FPGA之外
這一點恐怕也是很多學(xué)FPGA的菜鳥最難理解的地方。FPGA是給誰用的?很多學(xué)校解釋為給學(xué)微電子專業(yè)或者集成電路設(shè)計專業(yè)的學(xué)生用的,其實這不過是很多學(xué)校受資金限制,賣不起專業(yè)的集成電路設(shè)計工具而用FPGA工具替代而已。其實FPGA是給設(shè)計電子系統(tǒng)的工程師使用的。這些工程師通常是使用已有的芯片搭配在一起完成一個電子設(shè)備,如基站、機頂盒、視頻監(jiān)控設(shè)備等。當(dāng)現(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知識就遠(yuǎn)遠(yuǎn)不夠了。因為最終要讓FPGA里面的資源如何組合,實現(xiàn)何種功能才能滿足系統(tǒng)的需要,那就需要懂得更多更廣泛的知識。
目前FPGA的應(yīng)用主要是三個方向:第一個方向,也是傳統(tǒng)方向主要用于通信設(shè)備的高速接口電路設(shè)計,這一方向主要是用FPGA處理高速接口的協(xié)議,并完成高速的數(shù)據(jù)收發(fā)和交換。這類應(yīng)用通常要求采用具備高速收發(fā)接口的FPGA,同時要求設(shè)計者懂得高速接口電路設(shè)計和高速數(shù)字電路板級設(shè)計,具備EMC/EMI設(shè)計知識,以及較好的模擬電路基礎(chǔ),需要解決在高速收發(fā)過程中產(chǎn)生的信號完整性問題。FPGA最初以及到目前最廣的應(yīng)用就是在通信領(lǐng)域,一方面通信領(lǐng)域需要高速的通信協(xié)議處理方式,另一方面通信協(xié)議隨時在修改,非常不適合做成專門的芯片。因此能夠靈活改變功能的FPGA就成為首選。到目前為止FPGA的一半以上的應(yīng)用也是在通信行業(yè)。
第二個方向,可以稱為數(shù)字信號處理方向或者數(shù)學(xué)計算方向,因為很大程度上這一方向已經(jīng)大大超出了信號處理的范疇。例如早就在2006年就聽說老美將FPGA用于金融數(shù)據(jù)分析,后來又見到有將FPGA用于醫(yī)學(xué)數(shù)據(jù)分析的案例。在這一方向要求FPGA設(shè)計者有一定的數(shù)學(xué)功底,能夠理解并改進較為復(fù)雜的數(shù)學(xué)算法,并利用FPGA內(nèi)部的各種資源使之能夠變?yōu)閷嶋H的運算電路。目前真正投入實用的還是在通信領(lǐng)域的無線信號處理、信道編解碼以及圖像信號處理等領(lǐng)域,其它領(lǐng)域的研究正在開展中,之所以沒有大量實用的主要原因還是因為學(xué)金融的、學(xué)醫(yī)學(xué)的不了解這玩意。不過最近發(fā)現(xiàn)歐美有很多電子工程、計算機類的博士轉(zhuǎn)入到金融行業(yè),開展金融信號處理,相信隨著轉(zhuǎn)入的人增加,F(xiàn)PGA在其它領(lǐng)域的數(shù)學(xué)計算功能會更好的發(fā)揮出來,而我也有意做一些這些方面的研究。不過國內(nèi)學(xué)金融的、學(xué)醫(yī)的恐怕連數(shù)學(xué)都很少用到,就不用說用FPGA來幫助他們完成數(shù)學(xué)運算了,這個問題只有再議了。
第三個方向就是所謂的SOPC方向,其實嚴(yán)格意義上來說這個已經(jīng)在FPGA設(shè)計的范疇之內(nèi),只不過是利用FPGA這個平臺搭建的一個嵌入式系統(tǒng)的底層硬
件環(huán)境,然后設(shè)計者主要是在上面進行嵌入式軟件開發(fā)而已。設(shè)計對于FPGA本身的設(shè)計時相當(dāng)少的。但如果涉及到需要在FPGA做專門的算法加速,實際上需要用到第二個方向的知識,而如果需要設(shè)計專用的接口電路則需要用到第一個方向的知識。就目前SOPC方向發(fā)展其實遠(yuǎn)不如第一和第二個方向,其主要原因是因為SOPC以FPGA為主,或者是在FPGA內(nèi)部的資源實現(xiàn)一個“軟”的處理器,或者是在FPGA內(nèi)部嵌入一個處理器核。但大多數(shù)的嵌入式設(shè)計卻是以軟件為核心,以現(xiàn)有的硬件發(fā)展情況來看,多數(shù)情況下的接口都已經(jīng)標(biāo)準(zhǔn)化,并不需要那么大的FPGA邏輯資源去設(shè)計太過復(fù)雜的接口。而且就目前看來SOPC相關(guān)的開發(fā)工具還非常的不完善,以ARM為代表的各類嵌入式處理器開發(fā)工具卻早已深入人心,大多數(shù)以ARM為核心的SOC芯片提供了大多數(shù)標(biāo)準(zhǔn)的接口,大量成系列的單片機/嵌入式處理器提供了相關(guān)行業(yè)所需要的硬件加速電路,需要專門定制硬件場合確實很少。通常是在一些特種行業(yè)才會在這方面有非常迫切的需求。即使目前Xilinx將ARM的硬核加入到FPGA里面,相信目前的情況不會有太大改觀,不要忘了很多老掉牙的8位單片機還在嵌入式領(lǐng)域混呢,嵌入式主要不是靠硬件的差異而更多的是靠軟件的差異來體現(xiàn)價值的。我曾經(jīng)看好的是cypress的Psoc這一想法。和SOPC系列不同,Psoc的思想史載SOC芯片里面去嵌入那么一小塊FPGA,那這樣其實可以滿足嵌入式的那些微小的硬件接口差異,比如某個運用需要4個USB,而通常的處理器不會提供那么多,就可以用這么一塊FPGA來提供多的USB接口。而另一種運用需要6個UART,也可以用同樣的方法完成。對于嵌入式設(shè)計公司來說他們只需要備貨一種芯片,就可以滿足這些設(shè)計中各種微小的差異變化。其主要的差異化仍然是通過軟件來完成。但目前cypress過于封閉,如果其采用ARM作為處理器內(nèi)核,借助其完整的工具鏈。同時開放IP合作,讓大量的第三方為它提供IP設(shè)計,其實是很有希望的。但目前cypress的日子怕不太好過,Psoc的思想也不知道何時能夠發(fā)光。
4、數(shù)字邏輯知識是根本。
無論是FPGA的哪個方向,都離不開數(shù)字邏輯知識的支撐。FPGA說白了是一種實現(xiàn)數(shù)字邏輯的方式而已。如果連最基本的數(shù)字邏輯的知識都有問題,學(xué)習(xí)FPGA的愿望只是空中樓閣而已。而這,恰恰是很多菜鳥最不愿意去面對的問題。數(shù)字邏輯是任何電子電氣類專業(yè)的專業(yè)基礎(chǔ)知識,也是必須要學(xué)好的一門課。很
多人無非是學(xué)習(xí)了,考個試,完了。如果不能將數(shù)字邏輯知識爛熟于心,養(yǎng)成良好的設(shè)計習(xí)慣,學(xué)FPGA到最后仍然是霧里看花水中望月,始終是一場空的。
以上四條只是我目前總結(jié)菜鳥們在學(xué)習(xí)FPGA時所最容易跑偏的地方,F(xiàn)PGA的學(xué)習(xí)其實就像學(xué)習(xí)圍棋一樣,學(xué)會如何在棋盤上落子很容易,成為一位高手卻是難上加難。要真成為李昌鎬那樣的神一般的選手,除了靠刻苦專研,恐怕還確實得要一點天賦。
第四篇:FPGA學(xué)習(xí)步驟
FPGA學(xué)習(xí)步驟,我的體會
FPGA學(xué)習(xí)步驟,我的體會
FPGA在目前應(yīng)用領(lǐng)域非常,在目前的單板設(shè)計里面,幾乎都可以看到它的身影。從簡單的邏輯組合,到高端的圖像、通信協(xié)議處理,從單片邏輯到復(fù)雜的ASIC原型驗證,從小家電到航天器,都可以看到FPGA應(yīng)用,它的優(yōu)點在這里無庸贅述。從個人實用角度看,對于學(xué)生,掌握FPGA可以找到一份很好的工作,對于有經(jīng)驗的工作人員,使用fgpa可以讓設(shè)計變得非常有靈活性。掌握了fpga的設(shè)計,單板硬件設(shè)計就非常容易(不是系統(tǒng)設(shè)計),特別是上大學(xué)時如同天書的邏輯時序圖,看起來就非常親切。但fpga的入門卻有一定難度,因為它不像軟件設(shè)計,只要有一臺計算機,幾乎就可以完成所有的設(shè)計。fpga的設(shè)計與硬件直接相關(guān),需要實實在在的調(diào)試儀器,譬如示波器等。這些硬件設(shè)備一般比較昂貴,這就造成一定的入門門檻,新人在入門時遇到一點問題或者困難,由于沒有調(diào)試設(shè)備,無法定位問題,最后可能就會放棄。其實這時如果有人稍微指點一下,這個門檻很容易就過去。
我用FPGA做設(shè)計很多年了,遠(yuǎn)達不到精通的境界,只是熟悉使用,在這里把我對fpga的學(xué)習(xí)步驟理解寫出來,僅是作為一個參考,不對的地方,歡迎大家討論和指正。
1、工欲善其事,必先利其器。
計算機必不可少。目前FPGA應(yīng)用較多的是Altera和xilinx這兩個公司,可以選擇安裝quartusII或者ISE軟件。這是必備的軟件環(huán)境。
硬件環(huán)境還需要下載器、目標(biāo)板。雖然有人說沒有下載器和目標(biāo)板也可學(xué)習(xí)fpga,但那總是紙上談兵。這就像談女朋友,總是嘴上說說,通個電話,連個手都沒牽,能說人家是你朋友?雖說搭建硬件環(huán)境需要花費,但想想,硬件環(huán)境至多幾百元錢,你要真的掌握FPGA的設(shè)計,起薪比別人都不止高出這么多。這點花費算什么?
2、熟悉verilog語言或者vhdl語言,熟練使用quartusII或者ISE軟件。
VHDL和verilog各有優(yōu)點,選擇一個,建議選擇verilog。熟練使用設(shè)計軟件,知道怎樣編譯、仿真、下載等過程。
起步階段不希望報一些培訓(xùn)班,除非你有錢,或者運氣好,碰到一個水平高、又想把自己的經(jīng)驗和別人共享的培訓(xùn)老師,不然的話,培訓(xùn)完后總會感覺自己是一個冤大頭。入門階段可以在利用網(wǎng)絡(luò)資源完成。
3、設(shè)計一個小代碼,下載到目標(biāo)板看看結(jié)果
此時可以設(shè)計一個最簡答的程序,譬如點燈。如果燈在閃爍了,表示基本入門了。如果此時能夠下載到fpga外掛的flash,fpga程序能夠從flash啟動,表明fpga的最簡單設(shè)計你已經(jīng)成功,可以到下一步。
4、設(shè)計稍微復(fù)雜的代碼,下載到目標(biāo)板看看結(jié)果。
可以設(shè)計一個UART程序,網(wǎng)上有參考,你要懂RS232協(xié)議和fpga內(nèi)置的邏輯分
析儀。網(wǎng)上下載一個串口調(diào)試助手,調(diào)試一番,如果通信成功了,恭喜,水平有提高。進入下一步。
5、設(shè)計復(fù)雜的代碼,下載到目標(biāo)板看看結(jié)果。
譬如sdram的程序,網(wǎng)上也有參考,這個設(shè)計難度有點大??捎么趤碚{(diào)試sdram,把串口的數(shù)據(jù)存儲到sdram,然后讀回,如果成功,那你就比較熟悉fpga的設(shè)計餓了
6、設(shè)計高速接口,譬如ddr2或者高速串行接口
這要對fpga的物理特性非常了解,而且要懂得是時序約束等設(shè)計方法,要看大量的原廠文檔,這部分成功了,那就對fpga的物理接口掌握很深,你就是設(shè)計高手了
7、設(shè)計一個復(fù)雜的協(xié)議
譬如USB、PCIexpress、圖像編解碼等,鍛煉對系統(tǒng)的整體把握和邏輯劃分。完成這些,你就是一個一流的高手、8、學(xué)習(xí)再學(xué)習(xí)
學(xué)習(xí)什么,我也不知道,我只知道“學(xué)無止境,山外有山”。
上述只是一些簡單的學(xué)習(xí)步驟,希望能對大家有所幫助!
第五篇:如何學(xué)習(xí)fpga
如何學(xué)習(xí)FPGA
關(guān)鍵詞:工作人員, 硬件, 設(shè)計, FPGA
掌握FPGA可以找到一份很好的工作,對于有經(jīng)驗的工作人員,使用FPGA可以讓設(shè)計變得非常有靈活性。掌握了FPGA設(shè)計,單板硬件設(shè)計就非常容易(不是系統(tǒng)設(shè)計),特別是上大學(xué)時如同天書的邏輯時序圖,看起來就非常親切。但FPGA入門卻有一定難度,因為它不像軟件設(shè)計,只要有一臺計算機,幾乎就可以完成所有的設(shè)計。FPGA設(shè)計與硬件直接相關(guān),需要實實在在的調(diào)試儀器,譬如示波器等。這些硬件設(shè)備一般比較昂貴,這就造成一定的入門門檻,新人在入門時遇到一點問題或者困難,由于沒有調(diào)試設(shè)備,無法定位問題,最后可能就會放棄。其實這時如果有人稍微指點一下,這個門檻很容易就過去。我用FPGA做設(shè)計很多年了,遠(yuǎn)達不到精通的境界,只是熟悉使用,在這里把我對FPGA學(xué)習(xí)步驟理解寫出來,僅是作為一個參考,不對的地方,歡迎大家討論和指正。
FPGA學(xué)習(xí)步驟
1、工欲善其事,必先利其器。
計算機必不可少。目前FPGA應(yīng)用較多的是Altera和xilinx這兩個公司,可以選擇安裝quartusII或者ISE軟件。這是必備的軟件環(huán)境。
硬件環(huán)境還需要下載器、目標(biāo)板。雖然有人說沒有下載器和目標(biāo)板也可學(xué)習(xí)fpga,但那總是紙上談兵。這就像談女朋友,總是嘴上說說,通個電話,連個手都沒牽,能說人家是你朋友?雖說搭建硬件環(huán)境需要花費,但想想,硬件環(huán)境至多幾百元錢,你要真的掌握FPGA的設(shè)計,起薪比別人都不止高出這么多。這點花費算什么?
FPGA學(xué)習(xí)步驟
2、熟悉verilog語言或者vhdl語言,熟練使用quartusII或者ISE軟件。
VHDL和verilog各有優(yōu)點,選擇一個,建議選擇verilog。熟練使用設(shè)計軟件,知道怎樣編譯、仿真、下載等過程。
起步階段不希望報一些培訓(xùn)班,除非你有錢,或者運氣好,碰到一個水平高、又想把自己的經(jīng)驗和別人共享的培訓(xùn)老師,不然的話,培訓(xùn)完后總會感覺自己是一個冤大頭。入門階段可以在利用網(wǎng)絡(luò)資源完成。
FPGA學(xué)習(xí)步驟
3、設(shè)計一個小代碼,下載到目標(biāo)板看看結(jié)果
此時可以設(shè)計一個最簡答的程序,譬如點燈。如果燈在閃爍了,表示基本入門了。如果此時能夠下載到FPGA外掛的flash,F(xiàn)PGA程序能夠從flash啟動,表明FPGA的最簡單設(shè)計你已經(jīng)成功,可以到下一步。
FPGA學(xué)習(xí)步驟
4、設(shè)計稍微復(fù)雜的代碼,下載到目標(biāo)板看看結(jié)果。
可以設(shè)計一個UART程序,網(wǎng)上有參考,你要懂RS232協(xié)議和FPGA內(nèi)置的邏輯分析儀。網(wǎng)上下載一個串口調(diào)試助手,調(diào)試一番,如果通信成功了,恭喜,水平有提高。進入下一步。
FPGA學(xué)習(xí)步驟
5、設(shè)計復(fù)雜的代碼,下載到目標(biāo)板看看結(jié)果。
譬如sdram的程序,網(wǎng)上也有參考,這個設(shè)計難度有點大??捎么趤碚{(diào)試sdram,把串口的數(shù)據(jù)存儲到sdram,然后讀回,如果成功,那你就比較熟悉FPGA設(shè)計了
FPGA學(xué)習(xí)步驟
6、設(shè)計高速接口,譬如ddr2或者高速串行接口
這要對FPGA的物理特性非常了解,而且要懂得是時序約束等設(shè)計方法,要看大量的原廠文檔,這部分成功了,那就對FPGA的物理接口掌握很深,你就是設(shè)計高手了
FPGA學(xué)習(xí)步驟
7、設(shè)計一個復(fù)雜的協(xié)議
譬如USB、PCIexpress、圖像編解碼等,鍛煉對系統(tǒng)的整體把握和邏輯劃分。完成這些,你就是一個一流的高手、FPGA學(xué)習(xí)步驟
8、學(xué)習(xí)再學(xué)習(xí)
學(xué)習(xí)什么,我也不知道,我只知道“學(xué)無止境,山外有山”。
現(xiàn)在很多FPGA工程師,沒找到合適,我覺得很多人從開始的時候就誤入歧途了,對新手學(xué)習(xí)FPGA設(shè)計我也說一點看法吧。我認(rèn)為要從基礎(chǔ)開始做,基礎(chǔ)牢,才有成為高手的可能。
我覺得FPGA學(xué)習(xí)有以下幾步必須要走:
第一步:學(xué)習(xí)了解FPGA結(jié)構(gòu),F(xiàn)PGA到底是什么東西,芯片里面有什么,不要開始就拿個開發(fā)板照著別人的東西去編程。很多開發(fā)板的程序?qū)懙暮軤€,我也做過一段時間的開發(fā)板設(shè)計,我覺得很大程度上,開發(fā)板在誤人子弟。不過原廠提供的正品開發(fā)板,代碼很優(yōu)秀的,可以借鑒。只有了解了FPGA內(nèi)部的結(jié)構(gòu)才能明白為什么寫Verilog和寫C整體思路是不一樣的。
第二步:掌握FPGA設(shè)計的流程。了解每一步在做什么,為什么要那么做。很多人都是不就是那幾步嗎,有什么奇怪的?呵呵,我想至少有一半以上的人不知道synthesize和traslate的區(qū)別吧。
了解了FPGA的結(jié)構(gòu)和設(shè)計流程才有可能知道怎么去優(yōu)化設(shè)計,提高速度,減少資源,不要急躁,不要去在為選擇什么語言和選擇哪個公司的芯片上下功夫。語言只是一個表達的方式,重要的是你的思維,沒有一個好的指導(dǎo)思想,語言用得再好,不過是個懂語言的人。
第三步:開始學(xué)習(xí)代碼了。我建議要學(xué)代碼的人都去Altera或Xilinx的網(wǎng)站上下原廠工程師的代碼學(xué)習(xí)。不要一開始就走入誤區(qū)。
第四步:template很重要。能不能高效利用FPGA資源,一是了解fpga結(jié)構(gòu),二是了解欲實現(xiàn)的邏輯功能和基本機構(gòu),三是使用正確的模板。FPGA內(nèi)部器件種類相對較單一,用好模板,你的邏輯才能被高效的綜合成FPGA擅長表達的結(jié)構(gòu):)
做FPGA主要是要有電路的思想,作為初學(xué)者,往往對器件可能不是熟悉,那么應(yīng)該對于數(shù)字電路的知識很熟悉吧,F(xiàn)PGA中是由觸發(fā)器和查找表以及互聯(lián)線等基本結(jié)構(gòu)組成的,其實在我們在代碼里面能夠看到的就是與非門以及觸發(fā)器,不要把verilog和c語言等同起來,根本就是不同的東西,沒有什么可比性,在寫一句程序的時候應(yīng)該想到出來的是一個什么樣的電路,計數(shù)
器 選擇器 三態(tài)門等等,理解時序,邏輯是一拍一拍的東西,在設(shè)計初期想的不是很清楚的時候可以畫畫時序圖,這樣思路會更加的清晰,還有就是仿真很重要,不要寫完程序就去往FPGA中去加載,首先要仿真,尤其是對比較大型一點的程序,想像自己是在做asic,是沒有二次機會的,所以一定要把仿真做好,還有很多新手對于語言的學(xué)習(xí)不知道選vhdl好還是verilog好,個人偏好verilog,當(dāng)然不是說vhdl不好,反正寫出來的都是電路,那當(dāng)然就不要在語言的語法上面花太多的功夫了,verilog 言簡意賅assign always case if else 掌握這些幾乎可以寫出90%的電路了,上面是我對FPGA學(xué)習(xí)的一些愚見,希望對大家有所幫助。