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