作者前言:我學(xué)習(xí)FPGA是因?yàn)?a target="_blank">公司需要,同時(shí)自己也想接觸這方面的知識(shí),在大規(guī)模、高速信號(hào)領(lǐng)域還是有一定的優(yōu)勢(shì),總而言之出于共贏的想法吧。自學(xué)的話,因?yàn)槲沂菚?huì)跟著項(xiàng)目學(xué)習(xí)的,所以就是用到哪部分再去補(bǔ)充哪部分的知識(shí)。我的思路是先把基礎(chǔ)的語(yǔ)法熟悉,數(shù)電和信號(hào)處理的知識(shí)再扎實(shí)一下,同時(shí)了解下FPGA代碼的規(guī)范寫(xiě)法,至于開(kāi)發(fā)工具的話就先大體了解下流程操作,應(yīng)用的時(shí)候再逐漸熟悉。然后在實(shí)踐中提高實(shí)際設(shè)計(jì)的能力。
可能有些是在校自學(xué)的,那么我覺(jué)得手頭寬裕的可以買(mǎi)塊開(kāi)發(fā)板來(lái)練習(xí)效果會(huì)更直觀,不寬裕的話找學(xué)校從事這方面的老師去當(dāng)個(gè)助理,或者在外實(shí)習(xí),都是可行的步驟。另外就是堅(jiān)持(自古以來(lái)說(shuō)的容易做的難)。
從零開(kāi)始大戰(zhàn)FPGA——第一天(盲人摸象)
之前一直接觸ARM,單片機(jī)多一些,大多是裸機(jī)開(kāi)發(fā),由于公司需要FPGA這塊的工作,只好硬著頭皮去學(xué)。哎,真是什么都是被逼出來(lái)的,我的興趣本來(lái)是想走偏軟一點(diǎn)的方向的,現(xiàn)在看來(lái),又遠(yuǎn)了一步啦,只好有時(shí)間了再慢慢學(xué)習(xí)。打算把每天學(xué)習(xí)的內(nèi)容記下來(lái),希望一方面能鞭策自己,另一方面也是將來(lái)可以回顧下當(dāng)初走的路。
由于是個(gè)人學(xué)習(xí)記錄,難免有錯(cuò)誤之處,望各位看到的親們可以指正、共勉!
FPGA第一天:
首先,知道了什么叫FPGA(不要鄙視我,雖然我本科時(shí)也有集電路和cpld這些課,但純粹是混過(guò)來(lái)的,老師名字都不知道),F(xiàn)PGA就是現(xiàn)場(chǎng)可編程門(mén)陣列,在我的理解看來(lái)就是FPGA里面有非常多的邏輯單元,幾十幾百萬(wàn)門(mén),然后以編程的手段讓這些邏輯單元組成各種各樣的電路,實(shí)現(xiàn)指定的功能。
了解了FPGA的基本概念后就開(kāi)始看 Verilog了,(Verilog跟C語(yǔ)言有點(diǎn)像,看起來(lái)比較容易,在亞洲用的比較多,也比較靈活。VHDL語(yǔ)法更嚴(yán)謹(jǐn),美國(guó)軍方開(kāi)發(fā)的,不好入門(mén),但是可以自定義類(lèi)型等等,不是很熟悉,在歐洲美洲用的多些?不太確定)公司是做軍品的,后期可能需要學(xué)習(xí)VHDL想想頭都大。
抱著書(shū),看了一整天,看完了語(yǔ)法部分,了解了基本數(shù)據(jù)類(lèi)型,運(yùn)算符,語(yǔ)法等等。有以下幾點(diǎn)感觸:
Verilog本質(zhì)還是硬件操作。C語(yǔ)言是順序進(jìn)行的,Verilog是并行的,這點(diǎn)很重要!
Verilog的精髓感覺(jué)是模塊化思想(廢話,其實(shí)所有語(yǔ)言都是模塊化...)
wire型變量和reg變量這兩個(gè)區(qū)分比較糾結(jié),現(xiàn)在是記住了,但是并沒(méi)有理解透(太理論了,需要在實(shí)踐中區(qū)分?。?/span>
initial,assign,always,這幾個(gè)也有點(diǎn)繞哈哈。
然后看了ISE這個(gè)軟件的使用(用的片子是Xilinx的多些),一句話,比較繁瑣,功能強(qiáng)勁。。。
說(shuō)說(shuō)這個(gè)軟件的流程吧,看了好久才理解的,首先設(shè)計(jì)大體框架,然后代碼編寫(xiě),然后代碼編仿真,然后仿真,仿真完以后把編好的代碼整成一張網(wǎng)表,然后用這張網(wǎng)表映射到FPGA的電路上去,然會(huì)就會(huì)神奇的由代碼變成了硬件電路(好偉大啊是吧),然后就是各種約束規(guī)則,布線布局。再然后就是再仿真,這個(gè)仿真是真實(shí)反映實(shí)際電路的,再再然后就可以把代碼下載到片子啦。
這是我自己的理解和總結(jié),人家官方給每個(gè)步驟起了個(gè)好聽(tīng)的名字:什么設(shè)計(jì)文檔、仿真、綜合、實(shí)現(xiàn)、布局布線、仿真、下載,很繞口,反正了解這個(gè)軟件怎么用就行了,我這只是剛剛接觸,根本沒(méi)有仔細(xì)了解其功能,待日后發(fā)掘之!
好吧,今天的FPGA就看了這么多,效率不是很高,關(guān)鍵是手頭還有其他任務(wù),是關(guān)于IC卡的,13.56Mhz的數(shù)據(jù)收發(fā),頭疼,芯片手冊(cè)看半天也沒(méi)看懂,明天繼續(xù),歡迎大牛們提出寶貴的學(xué)習(xí)建議,歡迎小牛們指正錯(cuò)誤之處,歡迎大伙共勉!
從零開(kāi)始大戰(zhàn)FPGA——第二天(朝花夕拾)
夜深人靜的時(shí)候最適合總結(jié)和學(xué)習(xí)新東西了有木有啊,嘿嘿。FPGA之旅的第二天,走你! 今天看的東西不是特別多,主要是公司還有其他活要干(說(shuō)點(diǎn)小感悟:公司是給你錢(qián)讓你產(chǎn)生效益的,而學(xué)校是你花錢(qián)買(mǎi)教育的,這是我看來(lái)本質(zhì)的區(qū)別,后來(lái)者一定要轉(zhuǎn)變好心態(tài)和思維),但是學(xué)習(xí)還得繼續(xù)。廢話結(jié)束!
回顧:昨天主要看了一些基本的語(yǔ)法(我是以夏宇聞的書(shū)為參考書(shū),其他的用到時(shí)再去拓展),首先復(fù)習(xí)吧(年紀(jì)大了一下就忘了)。
wire和reg的區(qū)別(自己的理解,望大牛批評(píng)指正):從仿真角度看,wire對(duì)應(yīng)的連續(xù)的賦值,比如assign;reg對(duì)應(yīng)過(guò)程賦值,比如always、initial;從綜合的角度來(lái)看,要對(duì)應(yīng)實(shí)際的電路,wire綜合出來(lái)的結(jié)果就是一根導(dǎo)線,就起連接作用。reg比如在always中綜合的結(jié)果就是邏輯電路,比如or、and這些門(mén)電路,沒(méi)有時(shí)鐘的邊沿。另一個(gè)結(jié)果是帶有時(shí)鐘邊沿的,綜合出來(lái)就是帶時(shí)序的邏輯,比如觸發(fā)器這種。
還有,一個(gè)模塊在輸入的時(shí)候,我應(yīng)該不知道上級(jí)的輸出是什么,那么對(duì)本模塊來(lái)說(shuō),他就是一根導(dǎo)線,也就是wire型,輸出則由我決定是wire還是 reg。一般而言,整個(gè)設(shè)計(jì)的外部模塊輸出,也就是最頂層,要求是寄存器輸出,reg,較穩(wěn)定,扇出能力也好(這句話不理解)。
例子來(lái)啦:
一:
reg a,b;
wire and_result;
...
assign and_result =a&&b;
你可以試試把wire定義成reg。綜合器會(huì)報(bào)錯(cuò)。
二:
wire按照國(guó)外的教材上面的定義:
wire為無(wú)邏輯連線。只做連線,wire本身是不帶邏輯性的,所以輸入什么輸出就是什么。所以你嘗試著用always語(yǔ)句對(duì)wire變量賦值。綜合器就會(huì)報(bào)錯(cuò)。
那么你可能會(huì)問(wèn)。assign and_result =a&&b不是就是對(duì)wire的賦值嗎?
其實(shí)并非如此。綜合器綜合時(shí)將a&&b綜合成ab經(jīng)過(guò)一個(gè)與門(mén)。而and_result只是連接到與門(mén)輸出的線。正真綜合出與門(mén)的是&&。而不是result,是不是有點(diǎn)神奇啊哈哈。
好了,復(fù)習(xí)到此結(jié)束。
今天主要看的還是Verilog的基本知識(shí):Task和Function的基本知識(shí),一個(gè)是任務(wù),一個(gè)是函數(shù),跟C語(yǔ)言有點(diǎn)像。需要注意的是,函數(shù)和主模塊共用仿真單位時(shí)間,任務(wù)可以自定義仿真時(shí)間單位;函數(shù)要有返回值,任務(wù)木有,而是通過(guò)輸出端口輸出(有點(diǎn)繞,不過(guò)一看書(shū)上的例子就懂了)
接著看了一下有限狀態(tài)機(jī),格雷碼、獨(dú)熱碼的概念,對(duì)著書(shū)上的例子,看了下計(jì)數(shù)器、移位寄存器、觸發(fā)器等等的Verilog代碼,感覺(jué)代碼還是挺好看懂的,但是自己動(dòng)手寫(xiě)起來(lái)有點(diǎn)困難,所以還是多動(dòng)手,最最簡(jiǎn)單的例子自己寫(xiě)起來(lái)感覺(jué)到處是問(wèn)題(用我們那的方言就是:眼眼巧,手手拙)哈哈。
由于是個(gè)學(xué)渣,當(dāng)初的數(shù)電也是皮毛,連基本的觸發(fā)器,狀態(tài)機(jī),卡諾圖都忘得一干二凈,所以又回頭看了半天數(shù)電(突出一個(gè)囧),感覺(jué)這些基本電路設(shè)計(jì)的代碼倒是好看,但是對(duì)電路硬件本身不是很熟悉的話,心里特不踏實(shí)。一句話,用到啥看啥,沒(méi)必要從頭翻,畢竟時(shí)間有限啊。
今天就看了這么點(diǎn)知識(shí),然后跑了簡(jiǎn)單的例子(不得不說(shuō),F(xiàn)PGA綜合和布線咋就這么慢呢?聽(tīng)同事說(shuō)大點(diǎn)的項(xiàng)目光是邏輯綜合、布局布線都要花十幾個(gè)小時(shí),我在心里默念,I am too young too simple)。
為什么叫朝花夕拾呢?因?yàn)楫?dāng)初丟掉的數(shù)電知識(shí)需要拾起來(lái)呀。
現(xiàn)在主要在想,F(xiàn)PGA內(nèi)部沒(méi)有像單片機(jī),arm 那些邏輯處理單元,和運(yùn)算的東西,怎么去實(shí)現(xiàn)一個(gè)比如像串口啊、IIC、USB、AD、網(wǎng)絡(luò)這些功能呢,抱著這些疑問(wèn),先去休息了哈哈。明天打算直接看實(shí)例項(xiàng)目代碼——AD采集卡,看看怎么實(shí)現(xiàn)的。到時(shí)候再寫(xiě)點(diǎn)總結(jié)(希望能看懂),當(dāng)然代碼是不會(huì)貼出來(lái)的(保密嘛,職業(yè)操守還是要有的嘿嘿)。
從零開(kāi)始大戰(zhàn)FPGA——第三天(管中窺豹)
上周搬家,家里的網(wǎng)絡(luò)剛剛修好,更新耽擱了很久啊,接下來(lái)繼續(xù)FPGA從零前進(jìn),走你。
上次說(shuō)要看FPGA的AD采集卡實(shí)例。
在看了Verilog的基本語(yǔ)法后,就開(kāi)始迫不及待的想看看實(shí)例怎么應(yīng)用的。打開(kāi)工程后傻眼了,這個(gè)project是用VHDL編寫(xiě)的而不是我前段時(shí)間看的Verilog啊。。。無(wú)奈,只好找了一本VHDL的電子書(shū)看一看,這次我是直接看的代碼,遇到不認(rèn)識(shí)的標(biāo)識(shí)符,語(yǔ)法等等,就回去看電子書(shū)。所以效率非常低,這就是所謂的空中樓閣啊。(還是不建議像我一樣的初學(xué)者剛開(kāi)始就看兩種語(yǔ)言,大牛除外,先把基本的設(shè)計(jì)思想,代碼是怎么跑的這些搞懂,語(yǔ)言的話只是工具,當(dāng)你了解了FPGA具體在干什么的時(shí)候,再來(lái)挑選所需語(yǔ)言)
在了解了每一行的代碼的意思后,又回過(guò)頭來(lái)看這個(gè)工程,還是看不懂(不能用學(xué)單片機(jī)、ARM的思維去學(xué)FPGA),以前跑AD在單片機(jī)或者ARM上調(diào)用一下庫(kù)函數(shù)就OK,根本不理會(huì)什么時(shí)序的東西,現(xiàn)在發(fā)現(xiàn)走不通。
調(diào)整了下思維,F(xiàn)PGA的設(shè)計(jì)是非常模塊化的感覺(jué),那就先搞懂每個(gè)模塊的用途。
這個(gè)AD片子是個(gè)50MSPS,14位8通道的一個(gè)小東西。然后大體看了下datasheet的時(shí)序圖和引腳定義。大體包含了模擬輸入,數(shù)字輸出,時(shí)鐘(由FPGA提供),數(shù)據(jù)輸出時(shí)鐘(用來(lái)讀取采樣的數(shù)據(jù)),幀數(shù)據(jù)輸出時(shí)鐘(也就是輸出1幀1幀的數(shù)據(jù),也就是14位),串行時(shí)鐘和數(shù)據(jù)。
這時(shí)候就有點(diǎn)了解了,工程里先進(jìn)行最頂層模塊的的設(shè)計(jì)(VHDL用實(shí)體entity這么個(gè)關(guān)鍵詞,我表示快混淆概念了啊...),主要是端口的說(shuō)明,也就是與AD片子的接口,時(shí)鐘(各種時(shí)鐘)、8路數(shù)據(jù)輸入等等,反正這個(gè)就對(duì)應(yīng)了與AD的接口關(guān)系。
可以把實(shí)體這部分看做一個(gè)系統(tǒng)的大方框,主要用來(lái)定義方框與外設(shè)的接口,相當(dāng)于main函數(shù)。(都是個(gè)人理解,僅供參考,歡迎指正)
接下來(lái)是結(jié)構(gòu)體的定義(用來(lái)說(shuō)明實(shí)體這個(gè)大方框中的東西具體怎么工作的)。
包含這么幾部分:
1:信號(hào)說(shuō)明
2:元器件定義
3:進(jìn)程(邏輯關(guān)系說(shuō)明)
4:元器件例化(感覺(jué)元器件就像定義了有個(gè)水果,這個(gè)例化具體說(shuō)明這個(gè)水果是叫什么名字,蘋(píng)果、桃子等等)
over,整體框架就出來(lái)了,主要是FPGA和AD的接口對(duì)應(yīng)關(guān)系,還有頂層的邏輯關(guān)系(選擇讀取哪個(gè)通道的數(shù)據(jù))
然后就納悶了,這就能控制AD讀取數(shù)據(jù)了?什么時(shí)候讀取AD采樣的值?什么時(shí)候把每一幀數(shù)據(jù)讀過(guò)來(lái)?當(dāng)然不夠。
所以,就有了下面的步驟:
再單獨(dú)寫(xiě)一個(gè)文件,把每個(gè)通道看做一個(gè)單獨(dú)的AD元件,再寫(xiě)一個(gè)小框架,并把每個(gè)小框架的端口對(duì)應(yīng)到大框架中的那個(gè)元件的端口。
然后再這個(gè)小框架中就可以定義邏輯電路了,對(duì)著AD時(shí)序圖,比如在數(shù)據(jù)時(shí)鐘上升沿采集數(shù)據(jù)等等。
從大到小,一步一步定義模塊。
最后編寫(xiě)一個(gè)約束文件,把定義的端口,映射到FPGA管腳上。
總結(jié)下:
就像C程序中的多文件一樣,main函數(shù)調(diào)用子函數(shù),一級(jí)一級(jí)編寫(xiě)。
困惑:
1:類(lèi)屬性generic是嘛玩意,沒(méi)有這個(gè)會(huì)有什么影響?
AD這個(gè)暫時(shí)看到這,主要是想了解下FPGA的工程是怎么實(shí)現(xiàn)具體應(yīng)用的,準(zhǔn)備回歸夏宇聞的書(shū)本,和ISE的使用階段。
最后一點(diǎn),資料不要下了一大堆不看,抓住一個(gè)合適的再延伸(后來(lái)者引以為戒阿,不過(guò)有時(shí)還是控制不住,下載一大堆在那蒙灰...)
?
TO BE CONTINUE!歡迎持續(xù)關(guān)注哦~
如果你想與原作者交流學(xué)習(xí)FPGA的心得體會(huì),趕快參與到論壇熱烈討論吧~ Midas Elecfans用戶名:ThreeYear
評(píng)論
查看更多