專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

分享一些FPGA學(xué)習(xí)的經(jīng)驗(yàn)

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2012年01月19日   【字體:

     從開(kāi)始學(xué)FPGA到現(xiàn)在粗略算來(lái)的話(huà),已經(jīng)有3個(gè)多月了,就目前而言,我并不確定自己算不算高手們所說(shuō)的入門(mén)了。但是不管現(xiàn)在的水平如何,今天就總結(jié)一下自己學(xué)習(xí)它的感受或一些認(rèn)識(shí)吧。

       首先,先說(shuō)一下自己的在學(xué)習(xí)中所發(fā)現(xiàn)自己的不足之處:

1.      不會(huì)總結(jié)。

2.      學(xué)習(xí)的良好習(xí)慣沒(méi)養(yǎng)成。

   在寫(xiě)FPGA的基本模塊時(shí),遇到的問(wèn)題有許多,譬如,寫(xiě)代碼時(shí)的警告,特別是一些不能忽視的警告,每次遇到時(shí),總是還要檢查一會(huì)兒才能改過(guò)來(lái),或者有的警告已經(jīng)出現(xiàn)了幾次,但是就是解決不掉。每次在學(xué)一個(gè)模塊時(shí),只要是看懂了,它的一些重點(diǎn)就沒(méi)有及時(shí)的記錄在本子上,只有個(gè)別的想起來(lái)時(shí),才會(huì)做筆記。每做完一個(gè)模塊,沒(méi)有及時(shí)記錄下自己從這個(gè)模塊中學(xué)到了什么。上面的不足,都是在寫(xiě)模塊的過(guò)程中,自己逐漸暴露出來(lái)的。我很慶幸自己的一些問(wèn)題能及時(shí)的被發(fā)現(xiàn),雖然年前的學(xué)習(xí)將暫告一段落,但是,在年后的學(xué)習(xí)中,我一定會(huì)時(shí)刻記得自己以前在學(xué)習(xí)上出現(xiàn)了怎樣的不足,避免類(lèi)似的事情再次發(fā)生。像遇到警告時(shí),都要記錄下來(lái),通過(guò)改正后,要注釋?zhuān)瑢?xiě)下警告的原因,定期看一下。我上次寫(xiě)的一個(gè)代碼就沒(méi)有注釋現(xiàn)在自己都看不懂了 http://www.torrancerestoration.com/mcu/967.html ,每次寫(xiě)模塊的時(shí)候,都要記下重點(diǎn)知識(shí),即使是自己懂得的,好記性都是比不過(guò)爛筆頭的。

       其次,就談一下自己在學(xué)習(xí)FPGA中,截止目前,學(xué)到了什么,認(rèn)識(shí)到那些。

   FPGA簡(jiǎn)單的說(shuō),就是現(xiàn)場(chǎng)可編程邏輯陣列。它的內(nèi)部是邏輯單元,它們之間可以用線(xiàn)連接,至于以怎樣的形式相連,則可以根據(jù)應(yīng)用者寫(xiě)入的邏輯決定。每次布線(xiàn)都會(huì)重新組合邏輯單元,從而可以任意的編寫(xiě)不同的邏輯。當(dāng)然,前提是定義的邏輯塊不超出它可讀寫(xiě)的最大值?赡茏约赫f(shuō)的術(shù)語(yǔ)并不專(zhuān)業(yè),又或者是理解或表達(dá)的不透徹,但隨著學(xué)習(xí)的加深,一定會(huì)有更加透徹的理解吧。學(xué)習(xí)FPGA ,雖然資料很多,但是看的資料并不是很多,除了看夏宇聞編寫(xiě)的語(yǔ)法書(shū)外,看的最多的就是特權(quán)同學(xué)的,一個(gè)年輕的電子工程師,他就是通過(guò)自己的努力和堅(jiān)持不懈有了現(xiàn)在的水平,雖然不能說(shuō)是最好的工程師,但是,他在這條路上的成長(zhǎng)歷程,卻代表著更廣大的青年的奮斗軌跡。他的《深入淺出玩轉(zhuǎn)FPGA》這本書(shū),以前只聽(tīng)網(wǎng)友說(shuō)不錯(cuò),等到自己開(kāi)始看后,發(fā)現(xiàn)里面的內(nèi)容確實(shí)是值得學(xué)習(xí),不僅是學(xué)習(xí)的層次性,同時(shí)里面的方法也是很不錯(cuò)的。通過(guò)看書(shū)和做模塊,自己對(duì)FPGA中的幾個(gè)學(xué)習(xí)重點(diǎn)或者說(shuō)菜鳥(niǎo)必須清楚了解的知識(shí),有了一些自己的看法,首先是阻塞與非阻塞賦值的區(qū)別,阻塞賦值是只要你給一個(gè)寄存器賦值了,它在此語(yǔ)句結(jié)束后,其值立馬就改變,而非阻塞賦值卻不同,賦值后,寄存器存儲(chǔ)的值并沒(méi)有改變,還是上次所賦得值,只有當(dāng)此過(guò)程塊結(jié)束后,下一次脈沖來(lái)時(shí),輸出才會(huì)改變,確切的說(shuō),某些情況下,可以將阻塞賦值理解為移位寄存器。它們的不同之處可以有下圖看出:
 



圖一:非阻塞賦值 

 

圖二:阻塞賦值

       當(dāng)想把a(bǔ)先賦給b,然后賦給c時(shí),阻塞賦值是b和c在同一個(gè)脈沖下,一起等于a,而非阻塞賦值則是先把a(bǔ)賦給b,在下一個(gè)脈沖時(shí),再將b賦給c,這才符合設(shè)計(jì)的初衷。所以,在運(yùn)用時(shí),要注意到它們的不同之處。在時(shí)序邏輯中,用非阻塞賦值,而在組合邏輯中用阻塞賦值。

       除了阻塞與非阻塞賦值的區(qū)別要理解清楚外,狀態(tài)機(jī)又是一個(gè)重點(diǎn),會(huì)運(yùn)用狀態(tài)機(jī)非常重要,這是在寫(xiě)可調(diào)時(shí)鐘時(shí),自己深刻意識(shí)到的,當(dāng)時(shí)寫(xiě)可調(diào)時(shí)鐘時(shí),想要調(diào)節(jié)它的不同模式,但是又不能在不同的過(guò)程塊中,對(duì)同一個(gè)變量賦值(和C51的不同之處),所以,當(dāng)時(shí)寫(xiě)此代碼的時(shí)候,走了彎路。這幾次寫(xiě)的幾個(gè)代碼中也用到了狀態(tài)機(jī),如:矩陣鍵盤(pán)的掃描,串入并出和并入串出,AD0832。它讓我越來(lái)越感覺(jué)到,要想控制好一個(gè)層次分明的工作流程,狀態(tài)機(jī)不可少。而要想寫(xiě)好一個(gè)狀態(tài)機(jī),首先要做的就是要確定若干個(gè)狀態(tài),明確各個(gè)狀態(tài)之間的邏輯關(guān)系,轉(zhuǎn)移條件等等。雖然,到目前為止,自己還有幾個(gè)模塊沒(méi)寫(xiě)完,但是,自己對(duì)狀態(tài)機(jī)已經(jīng)不再是不知道怎樣用,而變?yōu)橛龅揭粋(gè)問(wèn)題時(shí),總是想到狀態(tài)機(jī)是否能解決這個(gè)問(wèn)題。我想這也是自己在這方面踏出的第一步吧。除了這兩點(diǎn)外,讓我感觸很大的就是除法器的編寫(xiě),以前在單片機(jī)中,用到除法,只需要一個(gè)符號(hào):“/”就能搞定,但是,現(xiàn)在讓自己寫(xiě)一個(gè)除法器,要弄懂它的原理,這讓我意識(shí)到,往往看起來(lái)很簡(jiǎn)單的一件事,在其背后,總有許多需要我們?nèi)ネ诰蚧蛘哒f(shuō)是去認(rèn)識(shí)和學(xué)習(xí)的地方。除此之外,我感覺(jué)有幾種編程技巧挺不錯(cuò)的,例如:“Wire    keysign=cnt[19]”這種置標(biāo)志位的方法,只有當(dāng)位寬為19的寄存器“cnt”計(jì)數(shù)計(jì)滿(mǎn)時(shí),keysign才變?yōu)?,同時(shí)只保留一個(gè)周期,而寄存器“cnt”計(jì)滿(mǎn)后,自動(dòng)清零,當(dāng)下次計(jì)滿(mǎn)時(shí),keysign才再次被賦值為1;這在矩陣鍵盤(pán)的掃描中,是非常重要的。還有就是移位寄存器的應(yīng)用,包括位拼接等等,都挺經(jīng)典的。

       在學(xué)習(xí)的過(guò)程中,通過(guò)學(xué)習(xí)到的這幾種相對(duì)較好的編程方法后,我也意識(shí)到了自己在學(xué)習(xí)中的一些不正確的思想,如:以前總感覺(jué)既然是寫(xiě)代碼的,最好還是自己寫(xiě),這樣才比較好,照著別人寫(xiě)好的代碼看,感覺(jué)好像少點(diǎn)什么似的,這可能是心理作用在做怪,而這幾次模塊寫(xiě)下來(lái),自己體悟挺深的,剛開(kāi)始總是自己想著寫(xiě),進(jìn)度不僅慢,效率也不是很高。這讓我郁悶不已,后來(lái)看別人都是看著別人的代碼改寫(xiě)的,我想了挺多的?磩e人的代碼,能看懂其實(shí)也是一種本事,作為初級(jí)者,首先就是一個(gè)學(xué)習(xí)的過(guò)程,不可能什么東西都是“自來(lái)熟”,只有先學(xué)習(xí)別人的長(zhǎng)處,掌握了一定的基礎(chǔ),才能去創(chuàng)新。這一點(diǎn),在我看了網(wǎng)上一些人寫(xiě)的代碼后更加相信:大多數(shù)的基本模塊代碼,大家的編程思路都是非常一樣。只有在編寫(xiě)一些大型的代碼時(shí),才會(huì)在原有的基礎(chǔ)上去進(jìn)行改進(jìn)和融合。而這些技能離不開(kāi)平時(shí)的積累。

       關(guān)于以上的總結(jié),我相信在以后的學(xué)習(xí)中一定會(huì)對(duì)自己有莫大的幫助,它會(huì)時(shí)刻警醒自己,在以前的學(xué)習(xí)中,自己有哪些不足,以后千萬(wàn)不能再去犯同樣的錯(cuò)誤,不斷地糾正,不斷地進(jìn)步,相信自己一定會(huì)學(xué)好FPGA的。

 

關(guān)閉窗口

相關(guān)文章