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