從開始學FPGA到現在粗略算來的話,已經有3個多月了,就目前而言,我并不確定自己算不算高手們所說的入門了。但是不管現在的水平如何,今天就總結一下自己學習它的感受或一些認識吧。
首先,先說一下自己的在學習中所發現自己的不足之處:
1. 不會總結。
2. 學習的良好習慣沒養成。
在寫FPGA的基本模塊時,遇到的問題有許多,譬如,寫代碼時的警告,特別是一些不能忽視的警告,每次遇到時,總是還要檢查一會兒才能改過來,或者有的警告已經出現了幾次,但是就是解決不掉。每次在學一個模塊時,只要是看懂了,它的一些重點就沒有及時的記錄在本子上,只有個別的想起來時,才會做筆記。每做完一個模塊,沒有及時記錄下自己從這個模塊中學到了什么。上面的不足,都是在寫模塊的過程中,自己逐漸暴露出來的。我很慶幸自己的一些問題能及時的被發現,雖然年前的學習將暫告一段落,但是,在年后的學習中,我一定會時刻記得自己以前在學習上出現了怎樣的不足,避免類似的事情再次發生。像遇到警告時,都要記錄下來,通過改正后,要注釋,寫下警告的原因,定期看一下。我上次寫的一個代碼就沒有注釋現在自己都看不懂了 http://www.xiaowoshenghuoquan.cn/mcu/967.html ,每次寫模塊的時候,都要記下重點知識,即使是自己懂得的,好記性都是比不過爛筆頭的。
其次,就談一下自己在學習FPGA中,截止目前,學到了什么,認識到那些。
FPGA簡單的說,就是現場可編程邏輯陣列。它的內部是邏輯單元,它們之間可以用線連接,至于以怎樣的形式相連,則可以根據應用者寫入的邏輯決定。每次布線都會重新組合邏輯單元,從而可以任意的編寫不同的邏輯。當然,前提是定義的邏輯塊不超出它可讀寫的最大值?赡茏约赫f的術語并不專業,又或者是理解或表達的不透徹,但隨著學習的加深,一定會有更加透徹的理解吧。學習FPGA ,雖然資料很多,但是看的資料并不是很多,除了看夏宇聞編寫的語法書外,看的最多的就是特權同學的,一個年輕的電子工程師,他就是通過自己的努力和堅持不懈有了現在的水平,雖然不能說是最好的工程師,但是,他在這條路上的成長歷程,卻代表著更廣大的青年的奮斗軌跡。他的《深入淺出玩轉FPGA》這本書,以前只聽網友說不錯,等到自己開始看后,發現里面的內容確實是值得學習,不僅是學習的層次性,同時里面的方法也是很不錯的。通過看書和做模塊,自己對FPGA中的幾個學習重點或者說菜鳥必須清楚了解的知識,有了一些自己的看法,首先是阻塞與非阻塞賦值的區別,阻塞賦值是只要你給一個寄存器賦值了,它在此語句結束后,其值立馬就改變,而非阻塞賦值卻不同,賦值后,寄存器存儲的值并沒有改變,還是上次所賦得值,只有當此過程塊結束后,下一次脈沖來時,輸出才會改變,確切的說,某些情況下,可以將阻塞賦值理解為移位寄存器。它們的不同之處可以有下圖看出:
當想把a先賦給b,然后賦給c時,阻塞賦值是b和c在同一個脈沖下,一起等于a,而非阻塞賦值則是先把a賦給b,在下一個脈沖時,再將b賦給c,這才符合設計的初衷。所以,在運用時,要注意到它們的不同之處。在時序邏輯中,用非阻塞賦值,而在組合邏輯中用阻塞賦值。
除了阻塞與非阻塞賦值的區別要理解清楚外,狀態機又是一個重點,會運用狀態機非常重要,這是在寫可調時鐘時,自己深刻意識到的,當時寫可調時鐘時,想要調節它的不同模式,但是又不能在不同的過程塊中,對同一個變量賦值(和C51的不同之處),所以,當時寫此代碼的時候,走了彎路。這幾次寫的幾個代碼中也用到了狀態機,如:矩陣鍵盤的掃描,串入并出和并入串出,AD0832。它讓我越來越感覺到,要想控制好一個層次分明的工作流程,狀態機不可少。而要想寫好一個狀態機,首先要做的就是要確定若干個狀態,明確各個狀態之間的邏輯關系,轉移條件等等。雖然,到目前為止,自己還有幾個模塊沒寫完,但是,自己對狀態機已經不再是不知道怎樣用,而變為遇到一個問題時,總是想到狀態機是否能解決這個問題。我想這也是自己在這方面踏出的第一步吧。除了這兩點外,讓我感觸很大的就是除法器的編寫,以前在單片機中,用到除法,只需要一個符號:“/”就能搞定,但是,現在讓自己寫一個除法器,要弄懂它的原理,這讓我意識到,往往看起來很簡單的一件事,在其背后,總有許多需要我們去挖掘或者說是去認識和學習的地方。除此之外,我感覺有幾種編程技巧挺不錯的,例如:“Wire keysign=cnt[19]”這種置標志位的方法,只有當位寬為19的寄存器“cnt”計數計滿時,keysign才變為1,同時只保留一個周期,而寄存器“cnt”計滿后,自動清零,當下次計滿時,keysign才再次被賦值為1;這在矩陣鍵盤的掃描中,是非常重要的。還有就是移位寄存器的應用,包括位拼接等等,都挺經典的。
在學習的過程中,通過學習到的這幾種相對較好的編程方法后,我也意識到了自己在學習中的一些不正確的思想,如:以前總感覺既然是寫代碼的,最好還是自己寫,這樣才比較好,照著別人寫好的代碼看,感覺好像少點什么似的,這可能是心理作用在做怪,而這幾次模塊寫下來,自己體悟挺深的,剛開始總是自己想著寫,進度不僅慢,效率也不是很高。這讓我郁悶不已,后來看別人都是看著別人的代碼改寫的,我想了挺多的?磩e人的代碼,能看懂其實也是一種本事,作為初級者,首先就是一個學習的過程,不可能什么東西都是“自來熟”,只有先學習別人的長處,掌握了一定的基礎,才能去創新。這一點,在我看了網上一些人寫的代碼后更加相信:大多數的基本模塊代碼,大家的編程思路都是非常一樣。只有在編寫一些大型的代碼時,才會在原有的基礎上去進行改進和融合。而這些技能離不開平時的積累。
關于以上的總結,我相信在以后的學習中一定會對自己有莫大的幫助,它會時刻警醒自己,在以前的學習中,自己有哪些不足,以后千萬不能再去犯同樣的錯誤,不斷地糾正,不斷地進步,相信自己一定會學好FPGA的。